8 #include <moira_site.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
23 /* Called with moira data that is to be modified. */
25 int ModifyCallback(argc, argv, form)
36 switch (form->menu->operation) {
39 f = GetAndClearForm("mod_user");
41 display_error("Unknown form in ModifyCallback!\n");
44 f->extrastuff = form->extrastuff;
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;
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]);
59 count = F_MODTIME - 1;
64 form->extrastuff = NULL;
66 form->extrastuff = strsave(argv[U_UID]);
74 f = GetAndClearForm("mod_filsys");
76 display_error("Unknown form in ModifyCallback!\n");
79 f->extrastuff = form->extrastuff;
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;
88 StoreField(f, i+1, argv[i + offset]);
89 StoreField(f, FS_TYPE+1, argv[FS_L_TYPE + offset]);
93 f = GetAndClearForm("mod_nfs");
95 display_error("Unknown form in ModifyCallback of mod_nfs\n");
98 f->extrastuff = form->extrastuff;
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;
110 f->inputlines[4]->returnvalue.booleanvalue = 0;
111 StoreField(f, 5, argv[4]);
112 StoreField(f, 6, argv[5]);
124 count = PCAP_MODTIME;
127 f = GetAndClearForm("mod_service");
129 display_error("Unknown form in ModifyCallback of mod_service\n");
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]);
142 f = GetAndClearForm("mod_host");
144 display_error("Unknown form in ModifyCallback of mod_host\n");
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]);
160 f = GetAndClearForm(fn);
162 display_error("Unknown form in ModifyCallback!\n");
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;
172 StoreField(f, i, argv[i + offset]);
174 display_error("Unknown function in ModifyCallback!\n");
180 /* Generate a new cryptographic signature for the user record */
181 SignUser(argv, offset)
190 if (strcmp(argv[U_NAME + offset], UNIQUE_LOGIN)) {
191 sprintf(buf, "%s:%s", argv[U_NAME + offset], argv[U_MITID + offset]);
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);
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");
204 unsigned char newbuf[256];
206 i = GDSS_Verify(buf, strlen(buf),
207 argv[U_SIGNATURE + offset], &si);
208 if (strlen(newbuf) > 68) {
210 AppendLog("Signature too long, trying again\n");
216 AppendLog("Made signature:");hex_dump(argv[U_SIGNATURE + offset]);
218 AppendLog("Don't need to remake signature\n");
223 argv[U_SIGNATURE + offset] = strsave("");
228 /* when OK pressed */
230 MoiraFormComplete(dummy1, form)
234 process_form(form, TRUE);
238 /* when APPLY pressed */
240 MoiraFormApply(dummy1, form)
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.
254 for (p = form->inputlines; *p; p++)
255 if (!((*p)->insensitive))
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);
265 int CollectData(argc, argv, form)
270 struct save_queue *sq;
272 sq = (struct save_queue *) form->extrastuff;
273 sq_save_data(sq, strsave(argv[0]));
278 /* callback when form is complete to process the data */
280 process_form(form, remove)
284 char *qy, *argv[32], buf[256], *s, **aargv;
285 int (*retfunc)(), argc, i;
288 retfunc = DisplayCallback;
291 for (i = 0; form->inputlines[i]; i++)
292 argv[i] = StringValue(form, i);
293 qy = form->menu->query;
294 argc = form->menu->argc;
296 switch (form->menu->operation) {
298 if (*stringval(form, 0)) {
299 qy = "get_user_account_by_login";
300 argv[0] = stringval(form, 0);
302 } else if (*stringval(form, 3)) {
303 qy = "get_user_account_by_uid";
304 argv[0] = stringval(form, 3);
306 } else if (*stringval(form, 4)) {
307 qy = "get_user_account_by_class";
308 argv[0] = stringval(form, 4);
310 } else if (*stringval(form, 1) == 0 &&
311 *stringval(form, 2) == 0) {
312 display_error("Must fill in at least one blank.");
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);
326 argv[U_STATE][1] = 0;
327 argv[U_SECURE] = argv[U_SIGNATURE];
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;
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);
352 argc = U_MODTIME + 1;
355 form->extrastuff = (caddr_t) "mod_user";
356 retfunc = ModifyCallback;
359 if (*stringval(form, 2)) {
360 argv[0] = stringval(form, 2);
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);
368 com_err(program_name, i, " looking up user by name");
371 if (form->extrastuff == NULL) {
372 display_error("Ambiguous user specification");
375 argv[0] = (char *)form->extrastuff;
377 qy = "register_user";
378 argv[1] = stringval(form, 3);
386 display_error("Expunge is not yet implemented");
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;
398 form->extrastuff = (caddr_t) "mod_finger";
399 retfunc = ModifyCallback;
402 if (!*stringval(form, 0))
404 if (!*stringval(form, 1))
406 AppendToLog("Kerberos mappings:\n");
409 if (!strcmp(argv[1], "POP"))
410 argv[2] = stringval(form, 3);
412 case MM_SHOW_ACE_USE:
413 if (boolval(form, 2)) {
414 sprintf(buf, "R%s", stringval(form, 0));
415 argv[0] = strsave(buf);
417 sprintf(buf, "Objects %s %s can administer\n",
418 stringval(form, 0), stringval(form, 1));
422 if (!strcmp(form->formname, "mod_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;
430 form->extrastuff = (caddr_t) "mod_list";
431 retfunc = ModifyCallback;
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]);
439 if (boolval(form, 3)) {
440 sprintf(buf, "R%s", stringval(form, 1));
443 argv[1] = stringval(form, 2);
446 if (boolval(form, 3)) {
447 qy = "get_end_members_of_list";
448 sprintf(buf, "Recursive members of list: %s\n", argv[0]);
450 sprintf(buf, "Members of list: %s\n", argv[0]);
454 case MM_DEL_ALL_MEMBER:
455 form->extrastuff = (caddr_t) sq_create();
456 retfunc = CollectData;
459 if (*stringval(form, 0)) {
460 qy = "get_filesys_by_label";
461 argv[0] = stringval(form, 0);
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);
470 qy = "get_filesys_by_machine";
473 } else if (*stringval(form, 3)) {
474 qy = "get_filesys_by_group";
475 argv[0] = stringval(form, 3);
477 } else if (*stringval(form, 4)) {
478 qy = "get_filesys_by_path";
479 argv[0] = stringval(form, 4);
482 /* fall through to */
483 case MM_SHOW_FSGROUP:
484 form->extrastuff = (caddr_t) sq_create();
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\\]";
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;
508 form->extrastuff = (caddr_t) "mod_filsys";
509 retfunc = ModifyCallback;
512 argv[1] = strsave(stringval(form, 1));
513 s = strchr(argv[1], ' ');
515 i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
518 com_err(program_name, i, " removing filesystem from FS group");
522 /* fall through to: */
524 /* find the two keys to sort between */
525 argv[2] = strsave(argv[2]);
526 s = strchr(argv[2], ' ');
529 s = strchr(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.
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))) {
547 if (i < NumChildren(w)) {
548 argv[3] = strsave(XtName(NthChild(w, i)));
549 s = strchr(argv[3], ' ');
552 s = strchr(argv[3], ')');
561 printf("Don't know how to do this\007\007!\n");
563 if (*argv[3] == 0) argv[3] = "Z";
565 printf("Got before key of \"%s\" and after key of \"%s\"\n",
568 /* copy the matching chars */
569 for (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
571 /* and set the last char */
577 if (*argv[3] == 0) *argv[3] = 'Z';
578 if (*argv[3] - *argv[2] > 1) {
579 *s++ = (*argv[3] + *argv[2])/2;
585 argv[2] = strsave(buf);
588 argv[1] = strsave(stringval(form, 1));
589 s = strchr(argv[1], ' ');
592 case MM_SHOW_FS_ALIAS:
593 if (!*stringval(form, 0))
596 argv[2] = stringval(form, 0);
597 if (!*stringval(form, 1))
600 argv[0] = stringval(form, 1);
603 case MM_ADD_FS_ALIAS:
604 case MM_DEL_FS_ALIAS:
605 argv[0] = stringval(form, 1);
607 argv[2] = stringval(form, 0);
610 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
611 if (!*stringval(form, 1))
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);
623 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
624 if (!strcmp(form->formname, "mod_nfs")) {
625 qy = "update_nfsphys";
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);
635 form->extrastuff = (caddr_t) "mod_nfs";
636 retfunc = ModifyCallback;
639 StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
642 if (!*stringval(form, 0))
644 if (*stringval(form, 1)) {
646 argv[2] = stringval(form, 1);
647 } else if (*stringval(form, 2)) {
649 argv[2] = stringval(form, 2);
650 } else if (!*stringval(form, 0)) {
651 display_error("Must specify something.");
654 qy = "get_quota_by_filesys";
661 StoreHost(form, 0, &argv[0]);
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;
672 StoreHost(form, 0, &argv[0]);
673 form->extrastuff = (caddr_t) "mod_machine";
674 retfunc = ModifyCallback;
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;
685 form->extrastuff = (caddr_t) "mod_cluster";
686 retfunc = ModifyCallback;
689 if (!*stringval(form, 0))
692 StoreHost(form, 0, &argv[0]);
693 if (!*stringval(form, 1))
695 AppendToLog("Cluster mappings:\n");
699 StoreHost(form, 0, &argv[0]);
702 if (!*stringval(form, 1))
704 AppendToLog("Cluster data:\n");
707 StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
708 StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
711 if (!strcmp(form->formname, "mod_printer")) {
712 qy = "update_printcap_entry";
716 form->extrastuff = (caddr_t) "mod_printer";
717 retfunc = ModifyCallback;
720 if (!strcmp(form->formname, "mod_service")) {
721 qy = "update_server_info";
725 form->extrastuff = (caddr_t) "mod_service";
726 retfunc = ModifyCallback;
728 case MM_RESET_SERVICE:
729 argv[1] = argv[2] = argv[3] = argv[4] = "0";
733 StoreHost(form, 1, &argv[1]);
734 argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
738 StoreHost(form, 1, &argv[1]);
741 if (!*stringval(form, 0))
743 if (!*stringval(form, 1))
746 StoreHost(form, 1, &argv[1]);
749 if (!strcmp(form->formname, "mod_host")) {
750 qy = "update_server_host_info";
754 StoreHost(form, 1, &argv[1]);
755 form->extrastuff = (caddr_t) "mod_host";
756 retfunc = ModifyCallback;
759 if (!write_log_to_file(stringval(form, 0)) && !tty && remove)
760 XtUnmanageChild(form->formpointer);
763 argv[0] = form->extrastuff;
765 argv[2] = StringValue(form, 0);
766 for (s = argv[2]; *s; s++)
767 if (islower(*s)) *s = toupper(*s);
770 if (form->inputlines[0]->returnvalue.booleanvalue) {
773 com_err(program_name, i, " starting DCM");
775 AppendToLog("DCM started.\n");
778 XtUnmanageChild(form->formpointer);
783 display_error("Unknown function in form callback.\n");
786 i = MoiraQuery(qy, argc, argv, retfunc, (char *)form);
788 com_err(program_name, i, " executing database query");
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;
800 switch (form->menu->operation) {
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");
807 AppendToLog("Done.\n");
812 AppendToLog("Done.\n");
816 GetKeywords(f, L_ACE_TYPE, "ace_type");
817 f->inputlines[L_GROUP]->valuechanged = MoiraValueChanged;
818 f->inputlines[L_ACE_TYPE]->valuechanged = MoiraValueChanged;
820 AppendToLog("Done.\n");
824 GetKeywords(f, SC_TYPE, "service");
825 GetKeywords(f, SC_ACE_TYPE, "ace_type");
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;
838 AppendToLog("Done.\n");
842 GetKeywords(f, 1, "mac_type");
844 AppendToLog("Done.\n");
848 f->inputlines[3]->keywords = nfs_states;
850 AppendToLog("Done.\n");
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);
863 com_err(program_name, i, " while removing member from list");
865 sprintf(buf, "Member %s %s removed from list %s.\n",
866 argv[1], argv[2], argv[0]);
872 AppendToLog("Done.\n");
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");
894 case MM_SHOW_FSGROUP:
895 while (sq_get_data(form->extrastuff, &aargv)) {
898 sq_destroy(form->extrastuff);
906 case MM_CLEAR_SERVICE:
907 case MM_RESET_SERVICE:
931 case MM_ADD_FS_ALIAS:
932 case MM_DEL_FS_ALIAS:
946 AppendToLog("Done.\n");
951 case MM_SHOW_MEMBERS:
954 case MM_SHOW_ACE_USE:
958 CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
959 form->extrastuff, StringValue(form, 0));
962 if (remove && form->formpointer)
963 XtUnmanageChild(form->formpointer);
978 int (*retfunc)(), argc, i;
981 retfunc = DisplayCallback;
987 switch (m->operation) {
988 case MM_SHOW_MAILLIST:
989 argv[0] = argv[1] = argv[3] = "TRUE";
991 argv[4] = "DONTCARE";
992 AppendToLog("Public Mailinglists:\n");
995 argv[0] = "def_quota";
998 AppendToLog("Services and Hosts with failed updates:\n");
999 argv[0] = argv[2] = "DONTCARE";
1001 i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
1003 if (i && i != MR_NO_MATCH)
1004 com_err(program_name, i, " executing database query");
1006 argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
1008 i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
1010 if (i && i != MR_NO_MATCH)
1011 com_err(program_name, i, " executing database query");
1015 case MM_HELP_WILDCARDS:
1016 case MM_HELP_AUTHORS:
1019 case MM_HELP_KEYBOARD:
1027 display_error("Unknown function in menu callback.\n");
1030 i = MoiraQuery(qy, argc, argv, retfunc, (char *)&dummy);
1032 com_err(program_name, i, " executing database query");