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