]> andersk Git - moira.git/blob - clients/mmoira/queries.c
new user fields for comment, secure passwd & signature
[moira.git] / clients / mmoira / queries.c
1 /* $Header$
2  */
3
4 #include <stdio.h>
5 #include <moira.h>
6 #include <moira_site.h>
7 #include <sys/types.h>
8 #include <netdb.h>
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <Xm/Xm.h>
12 #include "mmoira.h"
13 #ifdef GDSS
14 #include <des.h>
15 #include <krb.h>
16 #include <gdss.h>
17 #endif /* GDSS */
18
19
20 /* Called with moira data that is to be modified. */
21
22 int ModifyCallback(argc, argv, form)
23 int argc;
24 char **argv;
25 EntryForm *form;
26 {
27     EntryForm *f;
28     char *fn;
29     int count, i, offset;
30
31     count = -1;
32     offset = 0;
33     switch (form->menu->operation) {
34     case MM_MOD_USER:
35         count = 0;
36         f = GetAndClearForm("mod_user");
37         if (f == NULL) {
38             display_error("Unknown form in ModifyCallback!\n");
39             return;
40         }
41         f->extrastuff = form->extrastuff;
42         f->menu = form->menu;
43         for (i = 0; i < U_SIGNATURE; i++)
44           if (f->inputlines[i]->type == FT_BOOLEAN)
45             f->inputlines[i]->returnvalue.booleanvalue =
46               strcmp(argv[i + offset], "0") ? 1 : 0;
47           else
48             StoreField(f, i, argv[i + offset]);
49         f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
50         f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
51           strcmp(argv[U_SECURE], "0") ? 1 : 0;
52         f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
53         return;
54     case MM_MOD_FINGER:
55         fn = "mod_finger";
56         count = F_MODTIME - 1;
57         offset = 1;
58         break;
59     case MM_REGISTER:
60         if (form->extrastuff)
61           form->extrastuff = NULL;
62         else
63           form->extrastuff = strsave(argv[U_UID]);
64         return;
65         break;
66     case MM_MOD_LIST:
67         fn = "mod_list";
68         count = L_MODTIME;
69         break;
70     case MM_MOD_FILSYS:
71         fn = "mod_filsys";
72         count = FS_MODTIME;
73         break;
74     case MM_MOD_NFS:
75         f = GetAndClearForm("mod_nfs");
76         if (f == NULL) {
77             display_error("Unknown form in ModifyCallback of mod_nfs\n");
78             return;
79         }
80         f->extrastuff = form->extrastuff;
81         f->menu = form->menu;
82         StoreField(f, 0, argv[0]);
83         StoreField(f, 1, argv[1]);
84         StoreField(f, 2, argv[2]);
85         f->inputlines[3]->keywords = nfs_states;
86         for (i = 0; nfs_states[i]; i++)
87           if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3]))
88             StoreField(f, 3, nfs_states[i]);
89         StoreField(f, 3, argv[3]);
90         if (atoi(argv[3]) && MR_FS_GROUPQUOTA)
91           f->inputlines[4]->returnvalue.booleanvalue = 1;
92         StoreField(f, 5, argv[4]);
93         StoreField(f, 6, argv[5]);
94         return;
95     case MM_MOD_MACH:
96         fn = "mod_machine";
97         count = M_MODTIME;
98         break;
99     case MM_MOD_CLUSTER:
100         fn = "mod_cluster";
101         count = C_MODTIME;
102         break;
103     }
104
105     if (count > 0) {
106         f = GetAndClearForm(fn);
107         if (f == NULL) {
108             display_error("Unknown form in ModifyCallback!\n");
109             return;
110         }
111         f->extrastuff = form->extrastuff;
112         f->menu = form->menu;
113         for (i = 0; i < count; i++)
114           if (f->inputlines[i]->type == FT_BOOLEAN)
115             f->inputlines[i]->returnvalue.booleanvalue =
116               strcmp(argv[i + offset], "0") ? 1 : 0;
117           else
118             StoreField(f, i, argv[i + offset]);
119     } else {
120         display_error("Unknown function in ModifyCallback!\n");
121         return;
122     }
123 }
124
125
126 /* Generate a new cryptographic signature for the user record */
127 SignUser(argv, offset)
128 char **argv;
129 int offset;
130 {
131 #ifdef GDSS
132     char buf[256];
133     SigInfo si;
134     int i;
135
136     if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
137         sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
138         si.rawsig = NULL;
139         i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
140         /* If it's already signed OK, don't resign it. */
141         if (i != GDSS_SUCCESS) {
142             free(argv[U_SIGNATURE + offset]);
143             argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
144         sign_again:
145             i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
146             if (i != GDSS_SUCCESS)
147               com_err(program_name, gdss2et(i),
148                       "Failed to create signature");
149             else {
150                 unsigned char newbuf[256];
151                 si.rawsig = newbuf;
152                 i = GDSS_Verify(buf, strlen(buf),
153                                 argv[U_SIGNATURE + offset], &si);
154                 if (strlen(newbuf) > 68) {
155 #ifdef DEBUG
156                     AppendLog("Signature too long, trying again\n");
157 #endif /* DEBUG */
158                     goto sign_again;
159                 }
160             }
161 #ifdef DEBUG
162             AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
163         } else {
164             AppendLog("Don't need to remake signature\n");
165 #endif /* DEBUG */
166         }
167     }
168 #else /* GDSS */
169     argv[U_SIGNATURE + offset] = strsave("");
170 #endif /* GDSS */
171 }
172
173
174 /* when OK pressed */
175
176 MoiraFormComplete(dummy1, form)
177 int dummy1;
178 EntryForm *form;
179 {
180     process_form(form, TRUE);
181 }
182
183
184 /* when APPLY pressed */
185
186 MoiraFormApply(dummy1, form)
187 int dummy1;
188 EntryForm *form;
189 {
190     UserPrompt **p;
191     int count;
192
193     /* undocumented Motif internal routine to advance in tab group.
194      * In this case we're going backwards because for some reason
195      * the form advances whenever this button is pressed.
196      * However, it doesn't seem to go backwards even though source 
197      * implies that it should.  So we go forward until we wrap.
198      */
199     count = 0;
200     for (p = form->inputlines; *p; p++)
201       count++;
202     while (count-- > 1)
203       _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
204     process_form(form, FALSE);
205 }
206
207
208 int CollectData(argc, argv, form)
209 int argc;
210 char **argv;
211 EntryForm *form;
212 {
213     struct save_queue *sq;
214
215     sq = (struct save_queue *) form->extrastuff;
216     sq_save_data(sq, strsave(argv[0]));
217     return(MR_CONT);
218 }
219
220
221 /* callback when form is complete to process the data */
222
223 process_form(form, remove)
224 EntryForm *form;
225 int remove;
226 {
227     char *qy, *argv[32], buf[256], *s, **aargv;
228     int (*retfunc)(), argc, i;
229     EntryForm *f;
230
231     retfunc = DisplayCallback;
232     argc = -1;
233
234     for (i = 0; form->inputlines[i]; i++)
235       argv[i] = StringValue(form, i);
236     qy = form->menu->query;
237     argc = form->menu->argc;
238
239     switch (form->menu->operation) {
240     case MM_SHOW_USER:
241         if (*stringval(form, 0)) {
242             qy = "get_user_account_by_login";
243             argv[0] = stringval(form, 0);
244             argc = 1;
245         } else if (*stringval(form, 3)) {
246             qy = "get_user_account_by_uid";
247             argv[0] = stringval(form, 3);
248             argc = 1;
249         } else if (*stringval(form, 4)) {
250             qy = "get_user_account_by_class";
251             argv[0] = stringval(form, 4);
252             argc = 1;
253         } else if (*stringval(form, 1) == 0 &&
254                    *stringval(form, 2) == 0) {
255             display_error("Must fill in at least one blank.");
256             return;
257         } else {
258             if (*stringval(form, 1) == 0)
259               StoreField(form, 1, "*");
260             if (*stringval(form, 2) == 0)
261               StoreField(form, 2, "*");
262             qy = "get_user_account_by_name";
263             argv[0] = stringval(form, 1);
264             argv[1] = stringval(form, 2);
265             argc = 2;
266         }
267         break;
268     case MM_ADD_USER:
269         argv[U_STATE][1] = 0;
270         argv[U_SECURE] = argv[U_SIGNATURE];
271         SignUser(argv, 0);
272         argc = U_MODTIME;
273         break;
274     case MM_MOD_USER:
275         if (!strcmp(form->formname, "mod_user")) {
276             qy = "update_user_account";
277             for (i = 0; i < U_SIGNATURE; i++)
278               argv[i + 1] = StringValue(form, i);
279             argv[0] = form->extrastuff;
280             argv[U_STATE + 1][1] = 0;
281             argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
282             argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
283             if (*argv[U_SECURE + 1] == '1')
284               if (atoi(form->inputlines[U_COMMENT]->keyword_name))
285                 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
286               else {
287                   struct timeval tv;
288                   char buf[32];
289                   gettimeofday(&tv, NULL);
290                   printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
291                   sprintf(buf, "%ld", tv.tv_sec);
292                   argv[U_SECURE + 1] = strsave(buf);
293               }
294             SignUser(argv, 1);
295             argc = U_MODTIME + 1;
296             break;
297         }
298         form->extrastuff = (caddr_t) "mod_user";
299         retfunc = ModifyCallback;
300         break;
301     case MM_REGISTER:
302         if (*stringval(form, 2)) {
303             argv[0] = stringval(form, 2);
304         } else {
305             argv[0] = stringval(form, 0);
306             argv[1] = stringval(form, 1);
307             form->extrastuff = NULL;
308             i = MoiraQuery("get_user_account_by_name", 2, argv,
309                            ModifyCallback, (char *)form);
310             if (i) {
311                 com_err(program_name, i, " looking up user by name");
312                 return;
313             }
314             if (form->extrastuff == NULL) {
315                 display_error("Ambiguous user specification");
316                 return;
317             }
318             argv[0] = (char *)form->extrastuff;
319         }
320         qy = "register_user";
321         argv[1] = stringval(form, 3);
322         argv[2] = "1";
323         argc = 3;
324         break;
325     case MM_DEACTIVATE:
326         argv[1] = "3";
327         break;
328     case MM_EXPUNGE:
329         display_error("Expunge is not yet implemented");
330         return;
331         break;
332     case MM_MOD_FINGER:
333         if (!strcmp(form->formname, "mod_finger")) {
334             qy = "update_finger_by_login";
335             for (i = 0; i < F_MODTIME - 1; i++)
336               argv[i + 1] = StringValue(form, i);
337             argv[0] = form->extrastuff;
338             argc = F_MODTIME;
339             break;
340         }
341         form->extrastuff = (caddr_t) "mod_finger";
342         retfunc = ModifyCallback;
343         break;
344     case MM_SHOW_KRBMAP:
345         if (!*stringval(form, 0))
346           argv[0] = "*";
347         if (!*stringval(form, 1))
348           argv[1] = "*";
349         break;
350     case MM_SET_POBOX:
351         if (!strcmp(argv[1], "POP"))
352           argv[2] = stringval(form, 3);
353         break;
354     case MM_SHOW_ACE_USE:
355         if (boolval(form, 2)) {
356             sprintf(buf, "R%s", stringval(form, 0));
357             argv[0] = buf;
358         }
359         break;
360     case MM_MOD_LIST:
361         if (!strcmp(form->formname, "mod_list")) {
362             qy = "update_list";
363             for (i = 0; i < L_MODTIME; i++)
364               argv[i + 1] = StringValue(form, i);
365             argv[0] = form->extrastuff;
366             argc = L_MODTIME + 1;
367             break;
368         }
369         form->extrastuff = (caddr_t) "mod_list";
370         retfunc = ModifyCallback;
371         break;
372     case MM_SHOW_MEMBERS:
373         if (!*stringval(form, 0)) {
374             qy = "get_lists_of_member";
375             argv[0] = stringval(form, 1);
376             sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
377             AppendToLog(buf);
378             if (boolval(form, 3)) {
379                 sprintf(buf, "R%s", stringval(form, 1));
380                 argv[0] = buf;
381             }
382             argv[1] = stringval(form, 2);
383             argc = 2;
384         } else {
385             sprintf(buf, "Members of list: %s\n", argv[0]);
386             AppendToLog(buf);
387         }
388         break;
389     case MM_DEL_ALL_MEMBER:
390         form->extrastuff = (caddr_t) sq_create();
391         retfunc = CollectData;
392         break;
393     case MM_SHOW_FILSYS:
394         if (*stringval(form, 0)) {
395             qy = "get_filesys_by_label";
396             argv[0] = stringval(form, 0);
397             argc = 1;
398         } else if (*stringval(form, 1)) {
399             StoreHost(form, 1, &argv[0]);
400             if (*stringval(form, 2)) {
401                 qy = "get_filesys_by_nfsphys";
402                 argv[1] = stringval(form, 2);
403                 argc = 2;
404             } else {
405                 qy = "get_filesys_by_machine";
406                 argc = 1;
407             }
408         } else if (*stringval(form, 3)) {
409             qy = "get_filesys_by_group";
410             argv[0] = stringval(form, 3);
411             argc = 1;
412         }
413         /* fall through to */
414     case MM_SHOW_FSGROUP:
415         form->extrastuff = (caddr_t) sq_create();
416         break;
417     case MM_ADD_FILSYS:
418         StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
419         if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
420             !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
421             !strcmp(stringval(form, FS_TYPE), "MUL"))
422           argv[FS_MACHINE] = "\\[NONE\\]";
423         break;
424     case MM_MOD_FILSYS:
425         if (!strcmp(form->formname, "mod_filsys")) {
426             qy = "update_filesys";
427             for (i = 0; i < FS_MODTIME; i++)
428               argv[i + 1] = StringValue(form, i);
429             StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
430             argv[0] = form->extrastuff;
431             argc = FS_MODTIME + 1;
432             break;
433         }
434         form->extrastuff = (caddr_t) "mod_filsys";
435         retfunc = ModifyCallback;
436         break;
437     case MM_ADD_FSGROUP:
438         
439         break;
440     case MM_SHOW_FS_ALIAS:
441     case MM_ADD_FS_ALIAS:
442     case MM_DEL_FS_ALIAS:
443         argv[1] = "FILESYS";
444         argv[2] = stringval(form, 1);
445         break;
446     case MM_SHOW_NFS:
447         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
448         if (!*stringval(form, 1))
449           argv[1] = "*";
450         break;
451     case MM_ADD_NFS:
452         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
453         sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
454                 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
455         argv[NFS_STATUS] = buf;
456         argv[NFS_ALLOC] = stringval(form, 5);
457         argv[NFS_SIZE] = stringval(form, 6);
458         break;
459     case MM_MOD_NFS:
460         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
461         if (!strcmp(form->formname, "mod_nfs")) {
462             qy = "update_nfsphys";
463             argc = NFS_MODTIME;
464             break;
465         }
466         form->extrastuff = (caddr_t) "mod_nfs";
467         retfunc = ModifyCallback;
468         break;
469     case MM_DEL_NFS:
470         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
471         break;
472     case MM_SHOW_QUOTA:
473         if (!*stringval(form, 0))
474           argv[0] = "*";
475         if (*stringval(form, 1)) {
476             argv[1] = "USER";
477             argv[2] = stringval(form, 1);
478         } else if (*stringval(form, 2)) {
479             argv[1] = "GROUP";
480             argv[2] = stringval(form, 2);
481         } else if (!*stringval(form, 0)) {
482             display_error("Must specify something.");
483             return;
484         } else {
485             qy = "get_quota_by_filesys";
486             argc = 1;
487         }
488         break;
489     case MM_SHOW_MACH:
490     case MM_ADD_MACH:
491     case MM_DEL_MACH:
492         StoreHost(form, 0, &argv[0]);
493         break;
494     case MM_MOD_MACH:
495         if (!strcmp(form->formname, "mod_machine")) {
496             qy = "update_machine";
497             for (i = 0; i < M_MODTIME; i++)
498               argv[i + 1] = StringValue(form, i);
499             argv[0] = form->extrastuff;
500             argc = M_MODTIME + 1;
501             break;
502         }
503         StoreHost(form, 0, &argv[0]);
504         form->extrastuff = (caddr_t) "mod_machine";
505         retfunc = ModifyCallback;
506         break;
507     case MM_MOD_CLUSTER:
508         if (!strcmp(form->formname, "mod_cluster")) {
509             qy = "update_cluster";
510             for (i = 0; i < C_MODTIME; i++)
511               argv[i + 1] = StringValue(form, i);
512             argv[0] = form->extrastuff;
513             argc = C_MODTIME + 1;
514             break;
515         }
516         form->extrastuff = (caddr_t) "mod_cluster";
517         retfunc = ModifyCallback;
518         break;
519     case MM_SHOW_MCMAP:
520         if (!*stringval(form, 0))
521           argv[0] = "*";
522         else
523           StoreHost(form, 0, &argv[0]);
524         if (!*stringval(form, 1))
525           argv[1] = "*";
526         AppendToLog("Cluster mappings:\n");
527         break;
528     case MM_ADD_MCMAP:
529     case MM_DEL_MCMAP:
530         StoreHost(form, 0, &argv[0]);
531         break;
532     case MM_SHOW_CLDATA:
533         if (!*stringval(form, 1))
534           argv[1] = "*";
535         break;
536     case MM_ADD_PCAP:
537         StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
538         StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
539         break;
540     case MM_SAVE_LOG:
541         if (!write_log_to_file(stringval(form, 0)) && remove)
542           XtUnmanageChild(form->formpointer);
543         return;
544     case MM_NEW_VALUE:
545         argv[0] = form->extrastuff;
546         argv[1] = "TYPE";
547         argv[2] = StringValue(form, 0);
548         for (s = argv[2]; *s; s++)
549           if (islower(*s)) *s = toupper(*s);
550         break;
551     }
552
553     if (argc == -1) {
554         display_error("Unknown function in form callback.\n");
555         return;
556     }
557     i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
558     if (i) {
559         com_err(program_name, i, " executing database query");
560         return;
561     }
562     
563     f = NULL;
564     if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
565         if (form->formpointer)
566           XtUnmanageChild(form->formpointer);
567         f->extrastuff = (caddr_t) strsave(stringval(form, 0));
568         f->menu = form->menu;
569     }
570
571     switch (form->menu->operation) {
572     case MM_MOD_USER:
573         if (f) {
574             f->inputlines[U_STATE]->keywords = user_states;
575             StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
576             GetKeywords(f, U_CLASS, "class");
577         } else
578           AppendToLog("Done.\n");
579         break;
580     case MM_MOD_FINGER:
581     case MM_MOD_CLUSTER:
582         if (!f)
583           AppendToLog("Done.\n");         
584         break;
585     case MM_MOD_LIST:
586         if (f) {
587             GetKeywords(f, L_ACE_TYPE, "ace_type");
588             f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
589             f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
590         } else
591           AppendToLog("Done.\n");         
592         break;
593     case MM_MOD_FILSYS:
594         if (f) {
595             GetKeywords(f, FS_TYPE, "filesys");
596             sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
597             GetKeywords(f, FS_ACCESS, buf);
598             GetKeywords(f, FS_L_TYPE, "lockertype");
599             if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
600               StoreField(f, FS_MACHINE, "\\[NONE\\]");
601             f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
602         } else
603           AppendToLog("Done.\n");         
604         break;
605     case MM_MOD_MACH:
606         if (f)
607           GetKeywords(f, 1, "mac_type");
608         else
609           AppendToLog("Done.\n");         
610         break;
611     case MM_MOD_NFS:
612         if (f)
613           f->inputlines[3]->keywords = nfs_states;
614         else
615           AppendToLog("Done.\n");         
616         break;
617     case MM_DEL_ALL_MEMBER:
618         argv[1] = StringValue(form, 0);
619         argv[2] = StringValue(form, 1);
620         while (sq_get_data(form->extrastuff, &(argv[0]))) {
621             sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
622                     StringValue(form, 1), argv[0]);
623             if (!boolval(form, 2) ||
624                 AskQuestion(buf, "If you answer yes, this member will be deleted from the named list.\n\
625 Answer no to avoid the deletion.  In either case, you will continue to\n\
626 be prompted with the other lists the member belongs to.")) {
627                 i = MoiraQuery("delete_member_from_list", 3, argv,
628                                DisplayCallback, NULL);
629                 if (i)
630                   com_err(program_name, i, " while removing member from list");
631                 else {
632                     sprintf(buf, "Member %s %s removed from list %s.\n",
633                             argv[1], argv[2], argv[0]);
634                     AppendToLog(buf);
635                 }
636             }
637             free(argv[0]);
638         }
639         AppendToLog("Done.\n");
640         break;
641     case MM_SHOW_FILSYS:
642     case MM_SHOW_FSGROUP:
643         while (sq_get_data(form->extrastuff, &aargv)) {
644             ShowFilsys(aargv);
645         }
646         sq_destroy(form->extrastuff);
647         break;
648     case MM_ADD_HOST:
649     case MM_DEL_HOST:
650     case MM_CLEAR_HOST:
651     case MM_RESET_HOST:
652     case MM_ADD_SERVICE:
653     case MM_DEL_SERVICE:
654     case MM_CLEAR_SERVICE:
655     case MM_RESET_SERVICE:
656     case MM_ENABLE_DCM:
657     case MM_TRIGGER_DCM:
658     case MM_ADD_ZEPHYR:
659     case MM_DEL_ZEPHYR:
660     case MM_ADD_PCAP:
661     case MM_DEL_PCAP:
662     case MM_ADD_CLDATA:
663     case MM_DEL_CLDATA:
664     case MM_ADD_MCMAP:
665     case MM_DEL_MCMAP:
666     case MM_ADD_CLUSTER:
667     case MM_DEL_CLUSTER:
668     case MM_ADD_MACH:
669     case MM_DEL_MACH:
670     case MM_ADD_MEMBER:
671     case MM_DEL_MEMBER:
672     case MM_ADD_LIST:
673     case MM_DEL_LIST:
674     case MM_ADD_QUOTA:
675     case MM_DEL_QUOTA:
676     case MM_SET_DQUOTA:
677     case MM_ADD_NFS:
678     case MM_DEL_NFS:
679     case MM_ADD_FS_ALIAS:
680     case MM_DEL_FS_ALIAS:
681     case MM_ADD_FSGROUP:
682     case MM_MOV_FSGROUP:
683     case MM_DEL_FSGROUP:
684     case MM_ADD_FILSYS:
685     case MM_DEL_FILSYS:
686     case MM_ADD_KRBMAP:
687     case MM_DEL_KRBMAP:
688     case MM_SET_POBOX:
689     case MM_DEL_POBOX:
690     case MM_ADD_USER:
691     case MM_REGISTER:
692     case MM_DEACTIVATE:
693     case MM_EXPUNGE:
694     case MM_RESET_POBOX:
695         AppendToLog("Done.\n");
696         break;
697     case MM_NEW_VALUE:
698         CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
699                       form->extrastuff, StringValue(form, 0));
700     }
701
702     if (remove && form->formpointer)
703       XtUnmanageChild(form->formpointer);
704
705     if (f)
706       DisplayForm(f);
707     else
708       AppendToLog("\n");
709 }
710
711
712 MoiraMenuComplete(m)
713 MenuItem *m;
714 {
715     char *qy, *argv[32];
716     int (*retfunc)(), argc, i;
717     EntryForm dummy;
718
719     retfunc = DisplayCallback;
720     argc = -1;
721     dummy.menu = m;
722     qy = m->query;
723     argc = m->argc;
724
725     switch (m->operation) {
726     case MM_SHOW_MAILLIST:
727         argv[0] = argv[1] = argv[3] = "TRUE";
728         argv[2] = "FALSE";
729         argv[4] = "DONTCARE";
730         AppendToLog("Public Mailinglists:\n");
731         break;
732     case MM_SHOW_DQUOTA:
733         argv[0] = "def_quota";
734         break;
735     case MM_SHOW_DCM:
736         AppendToLog("Services and Hosts with failed updates:\n");
737         argv[0] = argv[2] = "DONTCARE";
738         argv[1] = "TRUE";
739         i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
740         if (i && i != MR_NO_MATCH)
741           com_err(program_name, i, " executing database query");
742         argv[0] = "*";
743         argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
744         argv[4] = "TRUE";
745         i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
746         if (i && i != MR_NO_MATCH)
747           com_err(program_name, i, " executing database query");
748         AppendToLog("\n");
749         return;
750     case MM_HELP_MOIRA:
751     case MM_HELP_WILDCARDS:
752     case MM_HELP_AUTHORS:
753     case MM_HELP_BUGS:
754         help(m->query);
755         return;
756     case MM_QUIT:
757         mr_disconnect();
758         exit(0);
759     }
760     if (argc == -1) {
761         display_error("Unknown function in menu callback.\n");
762         return;
763     }
764     i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
765     if (i)
766       com_err(program_name, i, " executing database query");
767     AppendToLog("\n");
768 }
This page took 0.10301 seconds and 5 git commands to generate.