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