]> andersk Git - moira.git/blame - clients/mailmaint/mailmaint.c
Initial revision
[moira.git] / clients / mailmaint / mailmaint.c
CommitLineData
3b3cb07f 1/*
2 * $Source$
3 * $Header$
4 */
5
6#ifndef lint
7static char *rcsid_mailmaint_c = "$Header$";
8#endif lint
9
10#ifndef lint
11static char rcsid_mailmaint_c[] = "$Header$";
12
13#endif lint
14
15/***********************************************************************/
16/* mailmaint.c - pjlevine - 20 August 1987
17
18*/
19/***********************************************************************/
20#include <stdio.h>
21#include <pwd.h>
22#include <menu.h>
23#include <signal.h>
24#include <strings.h>
25#include <curses.h>
26#include </usr/include/sys/types.h>
27#include <ctype.h>
28#include "mit-copyright.h"
29
30#define STARTCOL 0
31#define STARTROW 3
32#define SECONDCOL 30
33#define DISPROW 15
34#define LISTMAX 50
35#define LISTSIZE 32
36#define CTL(ch) ((ch) & 037)
37#define MAX(A,B) ((A) > (B) ? (A) : (B))
38
39static char *whoami;
40static int status;
41static void scream();
42char *ds();
43static int bool_answer();
44
45typedef struct list_info {
46 char *acl;
47 char *desc;
48 char *expdate;
49} List_info;
50
51static char *ascbuff={"0123456789"};
52static int print_2(), print_1();
53static List_info *current_li = (List_info *) NULL;
54static int get_list_info();
55static int fetch_list_info();
56
57char *malloc();
58char *rindex();
59char *strcpy();
60char *getlogin();
61char *strsave();
62char *getenv();
63
64typedef struct _menu {
65 int num_items;
66 char *title;
67 char **items;
68}MENU;
69
70MENU *main_menu, *help_menu;
71
72int position[2], oldpos[2];
73int level, found_some, currow, page, num_members;
74int moreflg, toggle, first_time;
75char *uname;
76
77
78/****************************************************/
79main(argc, argv)
80 int argc;
81 char *argv[];
82
83{
84
85 int use_menu = 1;
86 char buf[BUFSIZ];
87
88 init_sms_err_tbl();
89 init_krb_err_tbl();
90
91 if (getenv("TERM") == (char *) NULL) {
92 printf("Please set your TERM environment variable\n");
93 goto punt;
94 }
95 if (getenv("TERMCAP") == (char *) NULL) {
96 printf("Please set your TERMCAP environment variable\n");
97 goto punt;
98 }
99 if ((whoami = rindex(argv[0], '/')) == NULL)
100 whoami = argv[0];
101 else
102 whoami++;
103 uname = (char *) calloc(20, 1);
104 if ((current_li = (List_info *) malloc(sizeof(List_info)))
105 == (List_info *) NULL) {
106 (void) sprintf(buf, ": allocating list info");
107 goto punt;
108 } else {
109 current_li->acl = (char *) NULL;
110 current_li->desc = (char *) NULL;
111 current_li->expdate = (char *) NULL;
112 }
113 if ((uname = getlogin()) == NULL) {
114 struct passwd *getpwuid();
115 uname = getpwuid(getuid())->pw_name;
116 }
117 uname = (uname && strlen(uname))? ds(uname): "";
118
119 printf("Connecting to database for %s...please hold on.\n", uname);
120
121 status = sms_connect();
122 if (status) {
123 (void) sprintf(buf, "\nConnection to SMS server failed");
124 goto punt;
125 }
126
127 status = sms_auth();
128 if (status) {
129 (void) sprintf(buf, "\nAuthorization failed.\n");
130 goto punt;
131 }
132
133 if (use_menu) {
134 initscr();
135 if ((LINES < 24) || (COLS < 60)) {
136 printf("Display window too small.\n\n");
137
138 printf("Current window parameters are (%d lines, %d columns)\n", LINES, COLS);
139 printf("Please resize your window\n");
140 printf("to at least 24 lines and 60 columns.\n");
141 exit(0);
142 }
143 raw();
144 noecho();
145 position[0] = oldpos[0] = 1;
146 level = 0;
147 pack_main_menu();
148 pack_help_menu();
149 display_menu(main_menu);
150 get_main_input();
151 cls();
152 endwin();
153 }
154 sms_disconnect();
155 exit(0);
156
157punt:
158 com_err(whoami, status, buf);
159/* sms_disconnect(); */
160 exit(1);
161}
162
163/****************************************************/
164get_main_input()
165{
166int c;
167int retflg;
168
169 while(1) {
170 oldpos[level] = position[level];
171 retflg = 0;
172 currow = DISPROW+2;
173 page = 1;
174 toggle = num_members = moreflg = 0;
175 c = getchar();
176 if (c == 13) {
177 if (position[level] == 7)
178 c = 'q';
179 else
180 c = ascbuff[position[level]];
181 retflg = 1;
182 }
183 switch(c) {
184 case 'L' & 037: /* clear screen */
185 display_menu(main_menu);
186 break;
187 case 'q': case 'Q': /*quit*/
188 position[level] = 7;
189 highlight(main_menu);
190 if (retflg) {
191 cls();
192 return;
193 }
194 break;
195 case '1': /* show all lists */
196 position[level] = 1;
197 if (retflg) {
198 show_all();
199 }
200 break;
201 case '2': /* get all members of a list */
202 position[level] = 2;
203 if (retflg) {
204 list_members();
205 }
206 break;
207 case '3': /* display list which user is a recipient */
208 position[level] = 3;
209 if (retflg) {
210 list_by_member();
211 }
212 break;
213 case '4': /* show description */
214 position[level] = 4;
215 if (retflg) {
216 show_list_info();
217 }
218 break;
219 case '5': /* add to list */
220 position[level] = 5;
221 if (retflg) {
222 add_member();
223 }
224 break;
225 case '6': /* delete */
226 position[level] = 6;
227 if (retflg) {
228 delete_member();
229 }
230 break;
231 case 27: /* up arrow */
232 c = getchar();
233 if (c == 91) {
234 c = getchar();
235 if (c == 65) {
236 position[level]--;
237 if (!position[level])
238 position[level] = 7;
239 }
240 else {
241 if (c == 66) {
242 position[level]++;
243 if (position[level] > 7)
244 position[level] = 1;
245 }
246 }
247 }
248 break;
249 default:
250 printf("%c", 7);
251 break;
252 }
253 highlight(main_menu);
254 }
255}
256/****************************************************/
257show_list_info()
258{
259char *argv[2];
260char *buf;
261char c;
262
263 show_text(DISPROW, STARTCOL, "Show information about a list.\n\r");
264 buf = (char *) calloc(1024, 1);
265 if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
266 printf("\n\r");
267 if (fetch_list_info(buf, current_li) == 0) {
268 (void) sprintf(buf, "Description: %s\n\r", current_li->desc);
269 if (strlen(buf) > 60)
270 display_buff(buf);
271 else
272 show_text(currow, STARTCOL, buf);
273 currow++;
274 (void) sprintf(buf, "List Administrator: %s", current_li->acl);
275 show_text(currow, STARTCOL, buf);
276 currow++;
277 (void) sprintf(buf, "Expiration date: %s", current_li->expdate);
278 show_text(currow, STARTCOL, buf);
279 currow++;
280 }
281 else {
282 show_text(currow, STARTCOL, "madm: No such list found.");
283 currow++;
284 }
285 show_text(currow, STARTCOL, "Press any Key to continue...");
286 c = getchar();
287 }
288 clrwin(DISPROW);
289}
290/****************************************************/
291display_buff(buf)
292char *buf;
293{
294 int i, cnt;
295 char *printbuf;
296 int maxcol;
297
298 maxcol = COLS;
299 if (maxcol >= 80)
300 maxcol = 80;
301
302 cnt = 0;
303 printbuf = (char *) calloc(maxcol, 1);
304 for(i=0; i<=strlen(buf); i++) {
305 printbuf[cnt] = buf[i];
306 cnt++;
307 if (cnt >= maxcol) {
308 start_display_buff(printbuf);
309 cnt = 0;
310 free(printbuf);
311 printbuf = (char *) calloc(maxcol, 1);
312 }
313 }
314 if (strlen(buf)%maxcol != 0) {
315 start_display_buff(printbuf);
316 free(printbuf);
317 }
318 return(0);
319}
320/****************************************************/
321start_display_buff(buff)
322char *buff;
323{
324char c;
325char buffer[5];
326
327 num_members++;
328 if (moreflg)
329 return;
330 if (currow >= LINES-2) {
331 page++;
332 currow++;
333 mvcur(0,0,currow,STARTCOL);
334 refresh();
335 if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1) == 0) {
336 printf("Flushing query...");
337 moreflg = 1;
338 return(0);
339 }
340 clrwin(DISPROW+2);
341 currow = DISPROW+2;
342 show_text(currow, STARTCOL, "continued");
343 currow++;
344 }
345 show_text(currow, STARTCOL, buff);
346 currow++;
347}
348/****************************************************/
349add_member()
350{
351char *argv[3];
352char *buf;
353char c;
354
355 show_text(DISPROW, STARTCOL, "Add yourself to a list\n\r");
356 buf = (char *) calloc(LISTMAX, 1);
357 if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
358 printf("\r\n");
359 argv[0] = strsave(buf);
360 argv[1] = strsave("user");
361 argv[2] = strsave(uname);
362 if (status = sms_query("add_member_to_list", 3, argv,
363 scream, (char *) NULL)) {
364 printf("\r\n");
365 com_err(whoami, status, " found.\n");
366 }
367 else {
368 sprintf(buf, "User %s added to list\r", uname);
369 show_text(DISPROW+3, STARTCOL, buf);
370 }
371 currow = DISPROW+4;
372 show_text(DISPROW+4, STARTCOL, "Press any Key to continue...");
373 c = getchar();
374 }
375 clrwin(DISPROW);
376}
377
378/****************************************************/
379delete_member()
380{
381char *argv[3];
382char *buf;
383char c;
384
385 show_text(DISPROW, STARTCOL, "Remove yourself from a list\n\r");
386 buf = (char *) calloc(LISTMAX, 1);
387 if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
388 printf("\r\n");
389 argv[0] = strsave(buf);
390 argv[1] = strsave("user");
391 argv[2] = strsave(uname);
392 if (status = sms_query("delete_member_from_list", 3, argv,
393 scream, (char *) NULL)) {
394 printf("\r\n");
395 com_err(whoami, status, " found.\n");
396 }
397 else {
398 sprintf(buf, "User %s deleted from list\r", uname);
399 show_text(DISPROW+3, STARTCOL, buf);
400 }
401 currow=DISPROW+4;
402 show_text(DISPROW+4, STARTCOL, "Press any Key to continue...");
403 c = getchar();
404 }
405 clrwin(DISPROW);
406}
407/****************************************************/
408list_by_member(argc, argv)
409
410{
411char *argv[3];
412char *buf;
413char c;
414
415 argv[1] = strsave("user");
416 argv[2] = strsave(uname);
417 buf = (char *) calloc(BUFSIZ, 1);
418 sprintf(buf, "%s is on the following lists:\r", uname);
419 show_text(DISPROW, STARTCOL, buf);
420 mvcur(0,0,currow, STARTCOL);
421 refresh();
422 if (status = sms_query("get_lists_of_member", 2, argv+1,
423 print_1, (char *) NULL)) {
424 printf("\r\n");
425 com_err(whoami, status, " in get_lists_of_member");
426 }
427 show_text(currow, STARTCOL, "Press any Key to continue...");
428 c = getchar();
429 clrwin(DISPROW);
430 return;
431}
432/****************************************************/
433show_all()
434{
435char c;
436
437 show_text(DISPROW, STARTCOL, "This function may take a while...proceed[y]?");
438 c = getchar();
439 if (c == 'n' || c == 'N') {
440 erase_line(DISPROW, STARTCOL);
441 return;
442 }
443 move(DISPROW+1, STARTCOL);
444 addstr("Processing query...please hold");
445 refresh();
446 list_all_groups();
447}
448
449/****************************************************/
450static int
451print_1(argc, argv, callback)
452 int argc;
453 char *argv[], *callback;
454{
455 char buf[BUFSIZ];
456
457 /* no newline 'cause Put_message adds one */
458 (void) sprintf(buf, "%s\r", argv[0]);
459 start_display(buf);
460
461 return (0);
462}
463/****************************************************/
464static int
465print_all(argc, argv, callback)
466 int argc;
467 char *argv[], *callback;
468{
469 char buf[BUFSIZ];
470 if (moreflg)
471 return;
472 if (first_time) {
473 erase_line(DISPROW+1, STARTCOL);
474 show_text(DISPROW+1, STARTCOL, "All mailing lists:");
475 first_time = 0;
476 }
477 (void) sprintf(buf, "%s\r", argv[0]);
478 start_display(buf);
479
480 return (0);
481}
482
483/****************************************************/
484list_all_groups()
485{
486
487 first_time = 1;
488 if (status = sms_query("get_all_visible_maillists", 0, (char **) NULL,
489 print_all, (char *) NULL)) {
490 printf("\r\n");
491 com_err(whoami, status, " in list_all_groups\n");
492 }
493 end_display();
494
495 return (DM_NORMAL); /* HA! */
496}
497/****************************************************/
498list_members()
499{
500 char *argv[1];
501 char *buf;
502 char buffer[80];
503
504 found_some = 0;
505 move(DISPROW, STARTCOL);
506 mvcur(0,0,DISPROW,STARTCOL);
507 refresh();
508 buf = (char *) calloc(LISTMAX, 1);
509 if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
510 sprintf(buffer, "The members of list '%s' are:", buf);
511 show_text(DISPROW+1, STARTCOL, buffer);
512 argv[0] = buf;
513 if (status = sms_query("get_members_of_list", 1, argv,
514 print_2, (char *) NULL)) {
515 printf("\r\n");
516 com_err(whoami, status, " found.\n");
517 currow++;
518 }
519 if (!found_some) {
520 show_text(currow, STARTCOL,"List is empty (no members).");
521 currow++;
522 }
523 end_display();
524 return;
525 }
526 clrwin(DISPROW);
527 return (DM_NORMAL); /* HA! */
528}
529
530/****************************************************/
531static int
532print_2(argc, argv, callback)
533 int argc;
534 char *argv[], *callback;
535{
536 char buf[BUFSIZ];
537
538 found_some = 1;
539 (void) sprintf(buf, "%s %s", argv[0], argv[1]);
540 start_display(buf);
541
542 return (0);
543}
544/****************************************************/
545start_display(buff)
546char *buff;
547{
548char c;
549char *buffer;
550
551 num_members++;
552 if (moreflg)
553 return;
554 buffer = (char *) calloc(50, 1);
555 if (currow >= LINES-2) {
556 page++;
557 currow++;
558 mvcur(0,0,currow,STARTCOL);
559 refresh();
560 if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1) == 0) {
561 printf("Flushing query...");
562 moreflg = 1;
563 return(0);
564 }
565 clrwin(DISPROW+2);
566 currow = DISPROW+2;
567 sprintf(buffer, "Continued (Page %d)", page);
568 show_text(currow, STARTCOL, buffer);
569 currow++;
570 toggle = 0;
571 }
572 if (!toggle)
573 show_text(currow, STARTCOL, buff);
574 else {
575 show_text(currow, SECONDCOL, buff);
576 currow++;
577 }
578 toggle = !toggle;
579}
580/****************************************************/
581end_display()
582{
583char *buffer, c;
584
585 if (moreflg) {
586 clrwin(DISPROW);
587 return;
588 }
589
590 buffer = (char *) calloc(50, 1);
591 currow++;
592 sprintf(buffer, "End of List. %d Total Members\r", num_members);
593 show_text(currow, STARTCOL, buffer);
594 currow++;
595 show_text(currow, STARTCOL, "Press any key to continue...");
596 c = getchar();
597 clrwin(DISPROW);
598
599}
600/****************************************************/
601display_menu(menu)
602MENU *menu;
603{
604 int i;
605
606 cls();
607 title(menu->title);
608 mvcur(0,0,STARTROW, STARTCOL);
609 refresh();
610 for(i=0; i<=menu->num_items-1; i++) {
611 move(STARTROW+i, STARTCOL);
612 standend();
613 addstr(menu->items[i]);
614 refresh();
615 }
616 center_text(STARTROW+menu->num_items+2,
617 "Enter a number, <up arrow>, or <down arrow>.");
618 if (!level)
619 center_text(STARTROW+menu->num_items+3,
620 "Press 'q' to exit, <return> to confirm choice.");
621 else
622 center_text(STARTROW+menu->num_items+3,
623 "Press 'q' to exit, 'r' for main menu, <return> to confirm choice.");
624
625 if (!level)
626 highlight(main_menu);
627}
628
629/****************************************************/
630pack_main_menu()
631{
632char *buf;
633
634main_menu = (MENU *) malloc((unsigned) sizeof(MENU));
635main_menu->num_items = 7;
636main_menu->items = (char **) malloc((unsigned) sizeof(char *) * main_menu->num_items);
637
638buf = (char *) calloc(50, 1);
639sprintf(buf, "Mail List Program for %s", uname);
640main_menu->title = strsave(buf);
641main_menu->items[0] = strsave("1. Show all mailing lists.");
642main_menu->items[1] = strsave("2. Get all members of a mailing list.");
643main_menu->items[2] = strsave("3. Display lists of which you are a member.");
644main_menu->items[3] = strsave("4. Show description of list.");
645main_menu->items[4] = strsave("5. Add yourself to a mailing list.");
646main_menu->items[5] = strsave("6. Delete yourself from a mailing list.");
647main_menu->items[6] = strsave("q. Quit.");
648}
649
650/****************************************************/
651pack_help_menu()
652{
653help_menu = (MENU *) malloc((unsigned) sizeof(MENU));
654help_menu->num_items = 5;
655help_menu->items = (char **) malloc((unsigned) sizeof(char *) * help_menu->num_items);
656
657help_menu->title = strsave("madm is designed as a basic mail list administration program.");
658help_menu->items[0] = strsave("if you need to perform more advanced list manipulation like");
659help_menu->items[1] = strsave("adding lists, or changing list characteristics, refer to the");
660help_menu->items[2] = strsave("program listmaint.");
661help_menu->items[3] = strsave(" ");
662help_menu->items[4] = strsave("Press any key to continue.");
663}
664/****************************************************/
665func_help_menu()
666{
667int i;
668char c;
669
670show_text(currow, STARTCOL, help_menu->title);
671for(i=0;i<=help_menu->num_items-1;i++) {
672 currow++;
673 show_text(currow, STARTCOL, help_menu->items[i]);
674}
675c=getchar();
676clrwin(DISPROW);
677}
678/****************************************************/
679highlight(menu)
680MENU *menu;
681{
682
683
684 if (oldpos[level] != position[level]) {
685 move(STARTROW+oldpos[level]-1, STARTCOL);
686 standend();
687 addstr(menu->items[oldpos[level]-1]);
688 refresh();
689 }
690
691 move(STARTROW+position[level]-1, STARTCOL);
692 standout();
693 addstr(menu->items[position[level]-1]);
694 refresh();
695 standend();
696 refresh();
697}
698
699/****************************************************/
700title(buff)
701char *buff;
702{
703 move(0, MAX(0, (COLS - strlen(buff))>>1));
704 standout();
705 addstr(buff);
706 refresh();
707 standend();
708}
709/****************************************************/
710rvid(row, buff)
711int row;
712char *buff;
713{
714 move(row, STARTCOL);
715 mvcur(0,0,row,STARTCOL);
716 addstr(buff);
717 standout();
718 refresh();
719 move(row, STARTCOL);
720 mvcur(0,0,row,STARTCOL);
721 refresh();
722 printf("%s", buff);
723 standend();
724 refresh();
725}
726
727
728/****************************************************/
729center_text(row, buff)
730int row;
731char *buff;
732{
733 move(row, MAX(0, (COLS - strlen(buff))>>1));
734 addstr(buff);
735 refresh();
736}
737
738/****************************************************/
739show_text(row, col, buff)
740int row, col;
741char *buff;
742{
743 mvcur(0,0,row,col);
744 refresh();
745 printf("%s", buff);
746}
747
748/****************************************************/
749erase_line(row, col)
750int row, col;
751{
752char *buff;
753int i;
754
755 buff = (char *) calloc(COLS, 1);
756 for(i=0; i<=COLS-2; i++)
757 buff[i] = ' ';
758 buff[i] = 0; /* just to be sure ! */
759 move(row, col);
760 mvcur(0,0,row,col);
761 printf("%s", buff);
762 refresh();
763}
764
765/****************************************************/
766cls()
767{
768 clear();
769 refresh();
770}
771
772/****************************************************/
773clrwin(erase_row)
774int erase_row;
775{
776int i;
777char *buff;
778int maxcol;
779
780 maxcol = COLS;
781 if (maxcol > 80)
782 maxcol = 80; /* limit width */
783
784 buff = (char *) calloc(maxcol+1, 1);
785 for(i=0; i<=maxcol-1; i++)
786 buff[i] = ' ';
787 buff[i] = 0; /* just to be sure ! */
788 mvcur(0,0,erase_row, STARTCOL);
789 refresh();
790 for(i=erase_row; i<=currow-1; i++) {
791 printf("%s\n\r", buff);
792 }
793 printf("%s", buff);
794 mvcur(erase_row,STARTCOL,STARTROW+oldpos[level]-1, STARTCOL);
795 refresh();
796}
797
798/****************************************************/
799char *strsave(s)
800 char *s;
801{
802 char *p;
803
804 if ((p = (char *) calloc(1, strlen(s)+1)) != NULL) {
805 strcpy(p, s);
806 }
807 else
808 printf("error in alloc\n\r");
809 return(p);
810}
811/****************************************************/
812/* jean's routine ??? */
813static void scream()
814{
815 com_err(whoami, status, "\nAn SMS update returned a value -- programmer \
816botch\n");
817 sms_disconnect();
818 exit(1);
819}
820/****************************************************/
821static int fetch_list_info(list, li)
822char *list;
823List_info *li;
824{
825 char *argv[1];
826
827 argv[0] = list;
828 if ((status = sms_query("get_list_info", 1, argv,
829 get_list_info, (char *) NULL)) == 0) {
830 return status;
831 }
832 else {
833 com_err(whoami, status, " found.\n");
834 return status;
835 }
836}
837
838/* ARGSUSED */
839static int get_list_info(argc, argv)
840int argc;
841char **argv;
842{
843
844 if (current_li->acl)
845 free(current_li->acl);
846 current_li->acl = strsave(argv[2]);
847 if (current_li->desc)
848 free(current_li->desc);
849 current_li->desc = strsave(argv[3]);
850 if (current_li->expdate)
851 free(current_li->expdate);
852 current_li->expdate = strsave(argv[4]);
853 return (0);
854}
855
856
857
858
859/****************************************************/
860/* Prompt the user for input */
861int Prompt(prompt, buf, buflen)
862 char *prompt;
863 char *buf;
864 int buflen;
865{
866 int c;
867 char *p;
868 int y, x, oldx;
869
870 printf("%s", prompt);
871 refresh();
872 for (p = buf; abs(strlen(p)-strlen(buf)) <= buflen;) {
873 refresh();
874 c = getchar();
875 switch (c) {
876 case CTL('C'):
877 return 0;
878 case CTL('Z'):
879 return 0;
880 case CTL('L'):
881 cls();
882 display_menu(main_menu);
883 return 0;
884 case '\n':
885 case '\r':
886 printf("\r");
887 *p = '\0';
888 if (strlen(buf) < 1) /* only /n or /r in buff */
889 return -1;
890 else
891 return 1;
892 case '\b':
893 case '\177':
894 if (p > buf) {
895 p--;
896 x--;
897 printf("\b");
898 printf(" ");
899 printf("\b");
900 }
901 break;
902 case CTL('U'):
903 case CTL('G'):
904 case CTL('['):
905 x = oldx;
906 p = buf;
907 break;
908 default:
909 if (abs(strlen(p)-strlen(buf)) >= buflen) {
910 printf("%c", 7);
911 break;
912 }
913 if (isprint(c)) {
914 (void) addch(c);
915 *p++ = c;
916 x++;
917 } else
918 putchar(CTL('G'));
919 break;
920 }
921 }
922}
923
924/*
925 * duplicate string
926 */
927char *ds(str)
928 char *str;
929{
930 register char *newstr = malloc((unsigned) strlen(str) + 1);
931
932 if (newstr == (char *) NULL)
933 return ((char *) NULL);
934 else
935 return (strcpy(newstr, str));
936}
937
938int bool_query(name, argc, argv)
939char *name;
940int argc;
941char *argv[];
942{
943 int result = 0;
944 sms_query(name, argc, argv, bool_answer, (caddr_t) &result);
945 return result;
946}
947
948static int bool_answer(argc, argv, arg)
949int argc;
950char *argv[];
951caddr_t arg;
952{
953 int *result = (int *) arg;
954 if (strcmp(argv[0], "true") == 0)
955 *result = 1;
956 else if (strcmp(argv[0], "false") == 0)
957 *result = 0;
958 return;
959}
960
961/*
962 * Local Variables:
963 * mode: c
964 * c-indent-level: 4
965 * c-continued-statement-offset: 4
966 * c-brace-offset: -4
967 * c-argdecl-indent: 4
968 * c-label-offset: -4
969 * End:
970 */
This page took 0.170898 seconds and 5 git commands to generate.