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