]> andersk Git - moira.git/blob - clients/mmoira/queries.c
move focus correctly when some fields are insensitive
[moira.git] / clients / mmoira / queries.c
1 /* $Header$
2  */
3
4 #include <stdio.h>
5 #include <strings.h>
6 #include <ctype.h>
7 #include <moira.h>
8 #include <moira_site.h>
9 #include <sys/types.h>
10 #include <sys/time.h>
11 #include <netdb.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
14 #include <Xm/Xm.h>
15 #include "mmoira.h"
16 #ifdef GDSS
17 #include <des.h>
18 #include <krb.h>
19 #include <gdss.h>
20 #endif /* GDSS */
21
22
23 /* Called with moira data that is to be modified. */
24
25 int ModifyCallback(argc, argv, form)
26 int argc;
27 char **argv;
28 EntryForm *form;
29 {
30     EntryForm *f;
31     char *fn;
32     int count, i, offset;
33
34     count = -1;
35     offset = 0;
36     switch (form->menu->operation) {
37     case MM_MOD_USER:
38         count = 0;
39         f = GetAndClearForm("mod_user");
40         if (f == NULL) {
41             display_error("Unknown form in ModifyCallback!\n");
42             return;
43         }
44         f->extrastuff = form->extrastuff;
45         f->menu = form->menu;
46         for (i = 0; i < U_SIGNATURE; i++)
47           if (f->inputlines[i]->type == FT_BOOLEAN)
48             f->inputlines[i]->returnvalue.booleanvalue =
49               strcmp(argv[i + offset], "0") ? 1 : 0;
50           else
51             StoreField(f, i, argv[i + offset]);
52         f->inputlines[U_SIGNATURE]->keyword_name = strsave(argv[U_SIGNATURE]);
53         f->inputlines[U_SIGNATURE]->returnvalue.booleanvalue =
54           strcmp(argv[U_SECURE], "0") ? 1 : 0;
55         f->inputlines[U_COMMENT]->keyword_name = strsave(argv[U_SECURE]);
56         return;
57     case MM_MOD_FINGER:
58         fn = "mod_finger";
59         count = F_MODTIME - 1;
60         offset = 1;
61         break;
62     case MM_REGISTER:
63         if (form->extrastuff)
64           form->extrastuff = NULL;
65         else
66           form->extrastuff = strsave(argv[U_UID]);
67         return;
68         break;
69     case MM_MOD_LIST:
70         fn = "mod_list";
71         count = L_MODTIME;
72         break;
73     case MM_MOD_FILSYS:
74         fn = "mod_filsys";
75         count = FS_MODTIME;
76         break;
77     case MM_MOD_NFS:
78         f = GetAndClearForm("mod_nfs");
79         if (f == NULL) {
80             display_error("Unknown form in ModifyCallback of mod_nfs\n");
81             return;
82         }
83         f->extrastuff = form->extrastuff;
84         f->menu = form->menu;
85         StoreField(f, 0, argv[0]);
86         StoreField(f, 1, argv[1]);
87         StoreField(f, 2, argv[2]);
88         f->inputlines[3]->keywords = nfs_states;
89         for (i = 0; nfs_states[i]; i++)
90           if (atoi(nfs_states[i]) & atoi(argv[3]))
91             StoreField(f, 3, nfs_states[i]);
92         if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
93           f->inputlines[4]->returnvalue.booleanvalue = 1;
94         else
95           f->inputlines[4]->returnvalue.booleanvalue = 0;
96         StoreField(f, 5, argv[4]);
97         StoreField(f, 6, argv[5]);
98         return;
99     case MM_MOD_MACH:
100         fn = "mod_machine";
101         count = M_MODTIME;
102         break;
103     case MM_MOD_CLUSTER:
104         fn = "mod_cluster";
105         count = C_MODTIME;
106         break;
107     case MM_MOD_PCAP:
108         fn = "mod_printer";
109         count = PCAP_MODTIME;
110         break;
111     case MM_MOD_SERVICE:
112         f = GetAndClearForm("mod_service");
113         if (f == NULL) {
114             display_error("Unknown form in ModifyCallback of mod_service\n");
115             return;
116         }
117         f->extrastuff = form->extrastuff;
118         f->menu = form->menu;
119         for (i = 0; i < 4; i++) StoreField(f, i, argv[i]);
120         StoreField(f, 4, argv[6]);
121         f->inputlines[5]->returnvalue.booleanvalue = atoi(argv[7]);
122         StoreField(f, 6, argv[11]);
123         StoreField(f, 7, argv[12]);
124         return;
125         break;
126     case MM_MOD_HOST:
127         f = GetAndClearForm("mod_host");
128         if (f == NULL) {
129             display_error("Unknown form in ModifyCallback of mod_host\n");
130             return;
131         }
132         f->extrastuff = form->extrastuff;
133         f->menu = form->menu;
134         StoreField(f, 0, argv[0]);
135         StoreField(f, 1, argv[1]);
136         f->inputlines[2]->returnvalue.booleanvalue = atoi(argv[2]);
137         StoreField(f, 3, argv[10]);
138         StoreField(f, 4, argv[11]);
139         StoreField(f, 5, argv[12]);
140         return;
141         break;
142     }
143
144     if (count > 0) {
145         f = GetAndClearForm(fn);
146         if (f == NULL) {
147             display_error("Unknown form in ModifyCallback!\n");
148             return;
149         }
150         f->extrastuff = form->extrastuff;
151         f->menu = form->menu;
152         for (i = 0; i < count; i++)
153           if (f->inputlines[i]->type == FT_BOOLEAN)
154             f->inputlines[i]->returnvalue.booleanvalue =
155               strcmp(argv[i + offset], "0") ? 1 : 0;
156           else
157             StoreField(f, i, argv[i + offset]);
158     } else {
159         display_error("Unknown function in ModifyCallback!\n");
160         return;
161     }
162 }
163
164
165 /* Generate a new cryptographic signature for the user record */
166 SignUser(argv, offset)
167 char **argv;
168 int offset;
169 {
170 #ifdef GDSS
171     char buf[256];
172     SigInfo si;
173     int i;
174
175     if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
176         sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
177         si.rawsig = NULL;
178         i = GDSS_Verify(buf, strlen(buf), argv[U_SIGNATURE + offset], &si);
179         /* If it's already signed OK, don't resign it. */
180         if (i != GDSS_SUCCESS) {
181             free(argv[U_SIGNATURE + offset]);
182             argv[U_SIGNATURE + offset] = (char *) malloc(GDSS_Sig_Size() * 2);
183         sign_again:
184             i = GDSS_Sign(buf, strlen(buf), argv[U_SIGNATURE + offset]);
185             if (i != GDSS_SUCCESS)
186               com_err(program_name, gdss2et(i),
187                       "Failed to create signature");
188             else {
189                 unsigned char newbuf[256];
190                 si.rawsig = newbuf;
191                 i = GDSS_Verify(buf, strlen(buf),
192                                 argv[U_SIGNATURE + offset], &si);
193                 if (strlen(newbuf) > 68) {
194 #ifdef DEBUG
195                     AppendLog("Signature too long, trying again\n");
196 #endif /* DEBUG */
197                     goto sign_again;
198                 }
199             }
200 #ifdef DEBUG
201             AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
202         } else {
203             AppendLog("Don't need to remake signature\n");
204 #endif /* DEBUG */
205         }
206     }
207 #else /* GDSS */
208     argv[U_SIGNATURE + offset] = strsave("");
209 #endif /* GDSS */
210 }
211
212
213 /* when OK pressed */
214
215 MoiraFormComplete(dummy1, form)
216 int dummy1;
217 EntryForm *form;
218 {
219     process_form(form, TRUE);
220 }
221
222
223 /* when APPLY pressed */
224
225 MoiraFormApply(dummy1, form)
226 int dummy1;
227 EntryForm *form;
228 {
229     UserPrompt **p;
230     int count;
231
232     /* undocumented Motif internal routine to advance in tab group.
233      * In this case we're going backwards because for some reason
234      * the form advances whenever this button is pressed.
235      * However, it doesn't seem to go backwards even though source 
236      * implies that it should.  So we go forward until we wrap.
237      */
238     count = 0;
239     for (p = form->inputlines; *p; p++)
240       if (!((*p)->insensitive))
241         count++;
242     while (count-- > 1)
243       _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
244     MoiraFocusOut(form->inputlines[0]->mywidget,
245                   (XEvent *)NULL, (String *)NULL, 0);
246     process_form(form, FALSE);
247 }
248
249
250 int CollectData(argc, argv, form)
251 int argc;
252 char **argv;
253 EntryForm *form;
254 {
255     struct save_queue *sq;
256
257     sq = (struct save_queue *) form->extrastuff;
258     sq_save_data(sq, strsave(argv[0]));
259     return(MR_CONT);
260 }
261
262
263 /* callback when form is complete to process the data */
264
265 process_form(form, remove)
266 EntryForm *form;
267 int remove;
268 {
269     char *qy, *argv[32], buf[256], *s, **aargv;
270     int (*retfunc)(), argc, i;
271     EntryForm *f;
272
273     retfunc = DisplayCallback;
274     argc = -1;
275
276     for (i = 0; form->inputlines[i]; i++)
277       argv[i] = StringValue(form, i);
278     form->extrastuff = NULL;
279     qy = form->menu->query;
280     argc = form->menu->argc;
281
282     switch (form->menu->operation) {
283     case MM_SHOW_USER:
284         if (*stringval(form, 0)) {
285             qy = "get_user_account_by_login";
286             argv[0] = stringval(form, 0);
287             argc = 1;
288         } else if (*stringval(form, 3)) {
289             qy = "get_user_account_by_uid";
290             argv[0] = stringval(form, 3);
291             argc = 1;
292         } else if (*stringval(form, 4)) {
293             qy = "get_user_account_by_class";
294             argv[0] = stringval(form, 4);
295             argc = 1;
296         } else if (*stringval(form, 1) == 0 &&
297                    *stringval(form, 2) == 0) {
298             display_error("Must fill in at least one blank.");
299             return;
300         } else {
301             if (*stringval(form, 1) == 0)
302               StoreField(form, 1, "*");
303             if (*stringval(form, 2) == 0)
304               StoreField(form, 2, "*");
305             qy = "get_user_account_by_name";
306             argv[0] = stringval(form, 1);
307             argv[1] = stringval(form, 2);
308             argc = 2;
309         }
310         break;
311     case MM_ADD_USER:
312         argv[U_STATE][1] = 0;
313         argv[U_SECURE] = argv[U_SIGNATURE];
314         SignUser(argv, 0);
315         argc = U_MODTIME;
316         break;
317     case MM_MOD_USER:
318         if (!strcmp(form->formname, "mod_user")) {
319             qy = "update_user_account";
320             for (i = 0; i < U_SIGNATURE; i++)
321               argv[i + 1] = StringValue(form, i);
322             argv[0] = form->extrastuff;
323             argv[U_STATE + 1][1] = 0;
324             argv[U_SIGNATURE + 1] = form->inputlines[U_SIGNATURE]->keyword_name;
325             argv[U_SECURE + 1] = StringValue(form, U_SIGNATURE);
326             if (*argv[U_SECURE + 1] == '1')
327               if (atoi(form->inputlines[U_COMMENT]->keyword_name))
328                 argv[U_SECURE + 1] = form->inputlines[U_COMMENT]->keyword_name;
329               else {
330                   struct timeval tv;
331                   char buf[32];
332                   gettimeofday(&tv, NULL);
333                   printf("Got %ld, %ld\n", tv.tv_sec, tv.tv_usec);
334                   sprintf(buf, "%ld", tv.tv_sec);
335                   argv[U_SECURE + 1] = strsave(buf);
336               }
337             SignUser(argv, 1);
338             argc = U_MODTIME + 1;
339             break;
340         }
341         form->extrastuff = (caddr_t) "mod_user";
342         retfunc = ModifyCallback;
343         break;
344     case MM_REGISTER:
345         if (*stringval(form, 2)) {
346             argv[0] = stringval(form, 2);
347         } else {
348             argv[0] = stringval(form, 0);
349             argv[1] = stringval(form, 1);
350             form->extrastuff = NULL;
351             i = MoiraQuery("get_user_account_by_name", 2, argv,
352                            ModifyCallback, (char *)form);
353             if (i) {
354                 com_err(program_name, i, " looking up user by name");
355                 return;
356             }
357             if (form->extrastuff == NULL) {
358                 display_error("Ambiguous user specification");
359                 return;
360             }
361             argv[0] = (char *)form->extrastuff;
362         }
363         qy = "register_user";
364         argv[1] = stringval(form, 3);
365         argv[2] = "1";
366         argc = 3;
367         break;
368     case MM_DEACTIVATE:
369         argv[1] = "3";
370         break;
371     case MM_EXPUNGE:
372         display_error("Expunge is not yet implemented");
373         return;
374         break;
375     case MM_MOD_FINGER:
376         if (!strcmp(form->formname, "mod_finger")) {
377             qy = "update_finger_by_login";
378             for (i = 0; i < F_MODTIME - 1; i++)
379               argv[i + 1] = StringValue(form, i);
380             argv[0] = form->extrastuff;
381             argc = F_MODTIME;
382             break;
383         }
384         form->extrastuff = (caddr_t) "mod_finger";
385         retfunc = ModifyCallback;
386         break;
387     case MM_SHOW_KRBMAP:
388         if (!*stringval(form, 0))
389           argv[0] = "*";
390         if (!*stringval(form, 1))
391           argv[1] = "*";
392         AppendToLog("Kerberos mappings:\n");
393         break;
394     case MM_SET_POBOX:
395         if (!strcmp(argv[1], "POP"))
396           argv[2] = stringval(form, 3);
397         break;
398     case MM_SHOW_ACE_USE:
399         if (boolval(form, 2)) {
400             sprintf(buf, "R%s", stringval(form, 0));
401             argv[0] = strsave(buf);
402         }
403         sprintf(buf, "Objects %s %s can administer\n",
404                 stringval(form, 0), stringval(form, 1));
405         AppendToLog(buf);
406         break;
407     case MM_MOD_LIST:
408         if (!strcmp(form->formname, "mod_list")) {
409             qy = "update_list";
410             for (i = 0; i < L_MODTIME; i++)
411               argv[i + 1] = StringValue(form, i);
412             argv[0] = form->extrastuff;
413             argc = L_MODTIME + 1;
414             break;
415         }
416         form->extrastuff = (caddr_t) "mod_list";
417         retfunc = ModifyCallback;
418         break;
419     case MM_SHOW_MEMBERS:
420         if (!*stringval(form, 0)) {
421             qy = "get_lists_of_member";
422             argv[0] = stringval(form, 1);
423             sprintf(buf, "Lists of %s %s:\n", stringval(form, 1), argv[2]);
424             AppendToLog(buf);
425             if (boolval(form, 3)) {
426                 sprintf(buf, "R%s", stringval(form, 1));
427                 argv[0] = buf;
428             }
429             argv[1] = stringval(form, 2);
430             argc = 2;
431         } else {
432             if (boolval(form, 3)) {
433                 qy = "get_end_members_of_list";
434                 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
435             } else 
436               sprintf(buf, "Members of list: %s\n", argv[0]);
437             AppendToLog(buf);
438         }
439         break;
440     case MM_DEL_ALL_MEMBER:
441         form->extrastuff = (caddr_t) sq_create();
442         retfunc = CollectData;
443         break;
444     case MM_SHOW_FILSYS:
445         if (*stringval(form, 0)) {
446             qy = "get_filesys_by_label";
447             argv[0] = stringval(form, 0);
448             argc = 1;
449         } else if (*stringval(form, 1)) {
450             StoreHost(form, 1, &argv[0]);
451             if (*stringval(form, 2)) {
452                 qy = "get_filesys_by_nfsphys";
453                 argv[1] = stringval(form, 2);
454                 argc = 2;
455             } else {
456                 qy = "get_filesys_by_machine";
457                 argc = 1;
458             }
459         } else if (*stringval(form, 3)) {
460             qy = "get_filesys_by_group";
461             argv[0] = stringval(form, 3);
462             argc = 1;
463         } else if (*stringval(form, 4)) {
464             qy = "get_filesys_by_path";
465             argv[0] = stringval(form, 4);
466             argc = 1;
467         }
468         /* fall through to */
469     case MM_SHOW_FSGROUP:
470         form->extrastuff = (caddr_t) sq_create();
471         break;
472     case MM_ADD_FILSYS:
473         StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
474         if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
475             !strcmp(stringval(form, FS_TYPE), "MUL"))
476           argv[FS_MACHINE] = "\\[NONE\\]";
477         break;
478     case MM_MOD_FILSYS:
479         if (!strcmp(form->formname, "mod_filsys")) {
480             qy = "update_filesys";
481             for (i = 0; i < FS_MODTIME; i++)
482               argv[i + 1] = StringValue(form, i);
483             StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
484             argv[0] = form->extrastuff;
485             argc = FS_MODTIME + 1;
486             break;
487         }
488         form->extrastuff = (caddr_t) "mod_filsys";
489         retfunc = ModifyCallback;
490         break;
491     case MM_MOV_FSGROUP:
492         argv[1] = strsave(stringval(form, 1));
493         s = index(argv[1], ' ');
494         if (s) *s = 0;
495         i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
496                        (char *)form);
497         if (i) {
498             com_err(program_name, i, " removing filesystem from FS group");
499             return;
500         }
501         argc = 3;
502         /* fall through to: */
503     case MM_ADD_FSGROUP:
504         /* find the two keys to sort between */
505         argv[2] = strsave(argv[2]);
506         s = index(argv[2], ' ');
507         if (s) {
508             argv[2] = s+2;
509             s = index(argv[2], ')');
510             if (s) *s = 0;
511         } else
512           argv[2] = "";
513         if (*argv[2] == 0) argv[2] = "A";
514         /* Finding the after key is gross.  We look through the widgets
515          * in the radiobox to find the one selected and the one after
516          * it.  The name of the widget is also the member name.
517          */
518         if (!tty) { 
519             Widget w, kid;
520
521             argv[3] = "";
522             w = form->inputlines[2]->mywidget;
523             for (i = 0; i < NumChildren(w); i++) {
524                 kid = NthChild(w, i);
525                 if (!strcmp(XtName(kid), stringval(form, 2))) {
526                     i++;
527                     if (i < NumChildren(w)) {
528                         argv[3] = strsave(XtName(NthChild(w, i)));
529                         s = index(argv[3], ' ');
530                         if (s) {
531                             argv[3] = s+2;
532                             s = index(argv[3], ')');
533                             if (s) *s = 0;
534                         } else
535                           argv[3] = "";
536                     }
537                     break;
538                 }
539             }
540         } else {
541             printf("Don't know how to do this\007\007!\n");
542         }
543         if (*argv[3] == 0) argv[3] = "Z";
544 #ifdef DEBUG
545         printf("Got before key of \"%s\" and after key of \"%s\"\n",
546                argv[2], argv[3]);
547 #endif /* DEBUG */
548         /* copy the matching chars */
549         for  (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
550           *s++ = *argv[2]++;
551         /* and set the last char */
552         if (*argv[2] == 0)
553           *argv[2] = i = 'A';
554         else
555           i = argv[2][1];
556         if (i == 0) i = 'A';
557         if (*argv[3] == 0) *argv[3] = 'Z';
558         if (*argv[3] - *argv[2] > 1) {
559             *s++ = (*argv[3] + *argv[2])/2;
560         } else {
561             *s++ = *argv[2];
562             *s++ = (i + 'Z')/2;
563         }
564         *s = 0;
565         argv[2] = strsave(buf);
566         break;
567     case MM_DEL_FSGROUP:
568         argv[1] = strsave(stringval(form, 1));
569         s = index(argv[1], ' ');
570         if (s) *s = 0;
571         break;
572     case MM_SHOW_FS_ALIAS:
573         if (!*stringval(form, 0))
574           argv[2] = "*";
575         else
576           argv[2] = stringval(form, 0);
577         if (!*stringval(form, 1))
578           argv[0] = "*";
579         else
580           argv[0] = stringval(form, 1);
581         argv[1] = "FILESYS";
582         break;
583     case MM_ADD_FS_ALIAS:
584     case MM_DEL_FS_ALIAS:
585         argv[0] = stringval(form, 1);
586         argv[1] = "FILESYS";
587         argv[2] = stringval(form, 0);
588         break;
589     case MM_SHOW_NFS:
590         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
591         if (!*stringval(form, 1))
592           argv[1] = "*";
593         break;
594     case MM_ADD_NFS:
595         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
596         sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
597                 (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
598         argv[NFS_STATUS] = buf;
599         argv[NFS_ALLOC] = stringval(form, 5);
600         argv[NFS_SIZE] = stringval(form, 6);
601         break;
602     case MM_MOD_NFS:
603         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
604         if (!strcmp(form->formname, "mod_nfs")) {
605             qy = "update_nfsphys";
606             argc = NFS_MODTIME;
607             StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
608             sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
609                     (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
610             argv[NFS_STATUS] = buf;
611             argv[NFS_ALLOC] = stringval(form, 5);
612             argv[NFS_SIZE] = stringval(form, 6);
613             break;
614         }
615         form->extrastuff = (caddr_t) "mod_nfs";
616         retfunc = ModifyCallback;
617         break;
618     case MM_DEL_NFS:
619         StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
620         break;
621     case MM_SHOW_QUOTA:
622         if (!*stringval(form, 0))
623           argv[0] = "*";
624         if (*stringval(form, 1)) {
625             argv[1] = "USER";
626             argv[2] = stringval(form, 1);
627         } else if (*stringval(form, 2)) {
628             argv[1] = "GROUP";
629             argv[2] = stringval(form, 2);
630         } else if (!*stringval(form, 0)) {
631             display_error("Must specify something.");
632             return;
633         } else {
634             qy = "get_quota_by_filesys";
635             argc = 1;
636         }
637         break;
638     case MM_SHOW_MACH:
639     case MM_ADD_MACH:
640     case MM_DEL_MACH:
641         StoreHost(form, 0, &argv[0]);
642         break;
643     case MM_MOD_MACH:
644         if (!strcmp(form->formname, "mod_machine")) {
645             qy = "update_machine";
646             for (i = 0; i < M_MODTIME; i++)
647               argv[i + 1] = StringValue(form, i);
648             argv[0] = form->extrastuff;
649             argc = M_MODTIME + 1;
650             break;
651         }
652         StoreHost(form, 0, &argv[0]);
653         form->extrastuff = (caddr_t) "mod_machine";
654         retfunc = ModifyCallback;
655         break;
656     case MM_MOD_CLUSTER:
657         if (!strcmp(form->formname, "mod_cluster")) {
658             qy = "update_cluster";
659             for (i = 0; i < C_MODTIME; i++)
660               argv[i + 1] = StringValue(form, i);
661             argv[0] = form->extrastuff;
662             argc = C_MODTIME + 1;
663             break;
664         }
665         form->extrastuff = (caddr_t) "mod_cluster";
666         retfunc = ModifyCallback;
667         break;
668     case MM_SHOW_MCMAP:
669         if (!*stringval(form, 0))
670           argv[0] = "*";
671         else
672           StoreHost(form, 0, &argv[0]);
673         if (!*stringval(form, 1))
674           argv[1] = "*";
675         AppendToLog("Cluster mappings:\n");
676         break;
677     case MM_ADD_MCMAP:
678     case MM_DEL_MCMAP:
679         StoreHost(form, 0, &argv[0]);
680         break;
681     case MM_SHOW_CLDATA:
682         if (!*stringval(form, 1))
683           argv[1] = "*";
684         AppendToLog("Cluster data:\n");
685         break;
686     case MM_ADD_PCAP:
687         StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
688         StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
689         break;
690     case MM_MOD_PCAP:
691         if (!strcmp(form->formname, "mod_printer")) {
692             qy = "update_printcap_entry";
693             argc = PCAP_MODTIME;
694             break;
695         }
696         form->extrastuff = (caddr_t) "mod_printer";
697         retfunc = ModifyCallback;
698         break;
699     case MM_MOD_SERVICE:
700         if (!strcmp(form->formname, "mod_service")) {
701             qy = "update_server_info";
702             argc = SC_END;
703             break;
704         }
705         form->extrastuff = (caddr_t) "mod_service";
706         retfunc = ModifyCallback;
707         break;
708     case MM_RESET_SERVICE:
709         argv[1] = argv[2] = argv[3] = argv[4] = "0";
710         argv[5] = "";
711         break;
712     case MM_RESET_HOST:
713         StoreHost(form, 1, &argv[1]);
714         argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
715         argv[6] = "";
716         break;
717     case MM_CLEAR_HOST:
718         StoreHost(form, 1, &argv[1]);
719         break;
720     case MM_SHOW_HOST:
721         if (!*stringval(form, 0))
722           argv[0] = "*";
723         if (!*stringval(form, 1))
724           argv[1] = "*";
725         else
726           StoreHost(form, 1, &argv[1]);
727         break;
728     case MM_MOD_HOST:
729         if (!strcmp(form->formname, "mod_host")) {
730             qy = "update_server_host_info";
731             argc = SHI_END;
732             break;
733         }
734         StoreHost(form, 1, &argv[1]);
735         form->extrastuff = (caddr_t)  "mod_host";
736         retfunc = ModifyCallback;
737         break;
738     case MM_SAVE_LOG:
739         if (!write_log_to_file(stringval(form, 0)) && remove)
740           XtUnmanageChild(form->formpointer);
741         return;
742     case MM_NEW_VALUE:
743         argv[0] = form->extrastuff;
744         argv[1] = "TYPE";
745         argv[2] = StringValue(form, 0);
746         for (s = argv[2]; *s; s++)
747           if (islower(*s)) *s = toupper(*s);
748         break;
749     case MM_TRIGGER_DCM:
750         if (boolvalue(form, 0)) {
751             status = mr_do_update();
752             if (status)
753               com_err(program_name, status, " starting DCM");
754             else
755               AppendToLog("DCM started.\n");
756         }
757         if (remove)
758           XtUnmanageChild(form->formpointer);
759         return;
760     }
761
762     if (argc == -1) {
763         display_error("Unknown function in form callback.\n");
764         return;
765     }
766     i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
767     if (i) {
768         com_err(program_name, i, " executing database query");
769         return;
770     }
771     
772     f = NULL;
773     if (form->extrastuff && (f = GetForm((char *)(form->extrastuff)))) {
774         if (form->formpointer)
775           XtUnmanageChild(form->formpointer);
776         f->extrastuff = (caddr_t) strsave(stringval(form, 0));
777         f->menu = form->menu;
778     }
779
780     switch (form->menu->operation) {
781     case MM_MOD_USER:
782         if (f) {
783             f->inputlines[U_STATE]->keywords = user_states;
784             StoreField(f, U_STATE, user_states[atoi(stringval(f, U_STATE))]);
785             GetKeywords(f, U_CLASS, "class");
786         } else
787           AppendToLog("Done.\n");
788         break;
789     case MM_MOD_FINGER:
790     case MM_MOD_CLUSTER:
791         if (!f)
792           AppendToLog("Done.\n");         
793         break;
794     case MM_MOD_LIST:
795         if (f) {
796             GetKeywords(f, L_ACE_TYPE, "ace_type");
797             f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
798             f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
799         } else
800           AppendToLog("Done.\n");         
801         break;
802     case MM_MOD_SERVICE:
803         if (f) {
804             GetKeywords(f, SC_TYPE, "service");
805             GetKeywords(f, SC_ACE_TYPE, "ace_type");
806         }
807         break;
808     case MM_MOD_FILSYS:
809         if (f) {
810             GetKeywords(f, FS_TYPE, "filesys");
811             sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
812             GetKeywords(f, FS_ACCESS, buf);
813             GetKeywords(f, FS_L_TYPE, "lockertype");
814             if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
815               StoreField(f, FS_MACHINE, "\\[NONE\\]");
816             f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
817         } else
818           AppendToLog("Done.\n");         
819         break;
820     case MM_MOD_MACH:
821         if (f)
822           GetKeywords(f, 1, "mac_type");
823         else
824           AppendToLog("Done.\n");         
825         break;
826     case MM_MOD_NFS:
827         if (f)
828           f->inputlines[3]->keywords = nfs_states;
829         else
830           AppendToLog("Done.\n");         
831         break;
832     case MM_DEL_ALL_MEMBER:
833         argv[1] = StringValue(form, 0);
834         argv[2] = StringValue(form, 1);
835         while (sq_get_data(form->extrastuff, &(argv[0]))) {
836             sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
837                     StringValue(form, 1), argv[0]);
838             if (!boolval(form, 2) ||
839                 AskQuestion(buf, "confirm_del_all")) {
840                 i = MoiraQuery("delete_member_from_list", 3, argv,
841                                DisplayCallback, NULL);
842                 if (i)
843                   com_err(program_name, i, " while removing member from list");
844                 else {
845                     sprintf(buf, "Member %s %s removed from list %s.\n",
846                             argv[1], argv[2], argv[0]);
847                     AppendToLog(buf);
848                 }
849             }
850             free(argv[0]);
851         }
852         AppendToLog("Done.\n");
853         break;
854     case MM_SHOW_FILSYS:
855     case MM_SHOW_FSGROUP:
856         while (sq_get_data(form->extrastuff, &aargv)) {
857             ShowFilsys(aargv);
858         }
859         sq_destroy(form->extrastuff);
860         break;
861     case MM_ADD_HOST:
862     case MM_DEL_HOST:
863     case MM_CLEAR_HOST:
864     case MM_RESET_HOST:
865     case MM_ADD_SERVICE:
866     case MM_DEL_SERVICE:
867     case MM_CLEAR_SERVICE:
868     case MM_RESET_SERVICE:
869     case MM_ENABLE_DCM:
870     case MM_ADD_ZEPHYR:
871     case MM_DEL_ZEPHYR:
872     case MM_ADD_PCAP:
873     case MM_DEL_PCAP:
874     case MM_ADD_CLDATA:
875     case MM_DEL_CLDATA:
876     case MM_ADD_MCMAP:
877     case MM_DEL_MCMAP:
878     case MM_ADD_CLUSTER:
879     case MM_DEL_CLUSTER:
880     case MM_ADD_MACH:
881     case MM_DEL_MACH:
882     case MM_ADD_MEMBER:
883     case MM_DEL_MEMBER:
884     case MM_ADD_LIST:
885     case MM_DEL_LIST:
886     case MM_ADD_QUOTA:
887     case MM_DEL_QUOTA:
888     case MM_SET_DQUOTA:
889     case MM_ADD_NFS:
890     case MM_DEL_NFS:
891     case MM_ADD_FS_ALIAS:
892     case MM_DEL_FS_ALIAS:
893     case MM_ADD_FSGROUP:
894     case MM_MOV_FSGROUP:
895     case MM_DEL_FSGROUP:
896     case MM_ADD_FILSYS:
897     case MM_DEL_FILSYS:
898     case MM_ADD_KRBMAP:
899     case MM_DEL_KRBMAP:
900     case MM_SET_POBOX:
901     case MM_DEL_POBOX:
902     case MM_ADD_USER:
903     case MM_REGISTER:
904     case MM_DEACTIVATE:
905     case MM_EXPUNGE:
906     case MM_RESET_POBOX:
907         AppendToLog("Done.\n");
908         break;
909     case MM_SHOW_KRBMAP:
910     case MM_SHOW_CLDATA:
911     case MM_SHOW_MCMAP:
912     case MM_SHOW_MEMBERS:
913     case MM_STATS:
914     case MM_CLIENTS:
915     case MM_SHOW_ACE_USE:
916         AppendToLog("\n");
917         break;
918     case MM_NEW_VALUE:
919         CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
920                       form->extrastuff, StringValue(form, 0));
921     }
922
923     if (remove && form->formpointer)
924       XtUnmanageChild(form->formpointer);
925
926     if (f) {
927         if (tty)
928           TtyForm(f);
929         else
930           DisplayForm(f);
931     }
932 }
933
934
935 MoiraMenuComplete(m)
936 MenuItem *m;
937 {
938     char *qy, *argv[32];
939     int (*retfunc)(), argc, i;
940     EntryForm dummy;
941
942     retfunc = DisplayCallback;
943     argc = -1;
944     dummy.menu = m;
945     qy = m->query;
946     argc = m->argc;
947
948     switch (m->operation) {
949     case MM_SHOW_MAILLIST:
950         argv[0] = argv[1] = argv[3] = "TRUE";
951         argv[2] = "FALSE";
952         argv[4] = "DONTCARE";
953         AppendToLog("Public Mailinglists:\n");
954         break;
955     case MM_SHOW_DQUOTA:
956         argv[0] = "def_quota";
957         break;
958     case MM_SHOW_DCM:
959         AppendToLog("Services and Hosts with failed updates:\n");
960         argv[0] = argv[2] = "DONTCARE";
961         argv[1] = "TRUE";
962         i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
963                        (char *)&dummy);
964         if (i && i != MR_NO_MATCH)
965           com_err(program_name, i, " executing database query");
966         argv[0] = "*";
967         argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
968         argv[4] = "TRUE";
969         i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
970                        (char *)&dummy);
971         if (i && i != MR_NO_MATCH)
972           com_err(program_name, i, " executing database query");
973         AppendToLog("\n");
974         return;
975     case MM_HELP_MOIRA:
976     case MM_HELP_WILDCARDS:
977     case MM_HELP_AUTHORS:
978     case MM_HELP_BUGS:
979     case MM_HELP_MOUSE:
980     case MM_HELP_KEYBOARD:
981         help(m->query);
982         return;
983     case MM_QUIT:
984         mr_disconnect();
985         exit(0);
986     }
987     if (argc == -1) {
988         display_error("Unknown function in menu callback.\n");
989         return;
990     }
991     i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
992     if (i)
993       com_err(program_name, i, " executing database query");
994     AppendToLog("\n");
995 }
This page took 0.120608 seconds and 5 git commands to generate.