]> andersk Git - moira.git/blame_incremental - clients/mailmaint/mailmaint.c
don't print prompt message over data line
[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 currow++;
448 show_text(currow, STARTCOL, "Press any Key to continue...");
449 (void) getchar();
450 clrwin(DISPROW);
451 return;
452}
453
454/****************************************************/
455show_all()
456{
457 char c;
458
459 show_text(DISPROW, STARTCOL, "This function may take a \
460while... proceed? [y] ");
461 c = getchar();
462 if (c == 'y' || c == 'Y' || c == '\n') {
463 move(DISPROW + 1, STARTCOL);
464 addstr("Processing query...please hold");
465 refresh();
466 (void) list_all_groups();
467 }
468 else
469 erase_line(DISPROW, STARTCOL);
470 return;
471
472}
473
474/****************************************************/
475/*ARGSUSED*/
476static int
477print_1(argc, argv, callback)
478 int argc;
479 char *argv[], *callback;
480{
481 char buf[BUFSIZ];
482
483 /* no newline 'cause Put_message adds one */
484 (void) sprintf(buf, "%s\r", argv[0]);
485 (void) start_display(buf);
486
487 return (0);
488}
489
490/****************************************************/
491/*ARGSUSED*/
492static int
493print_all(argc, argv, callback)
494 int argc;
495 char *argv[], *callback;
496{
497 char buf[BUFSIZ];
498
499 if (moreflg)
500 return (0);
501 if (first_time) {
502 erase_line(DISPROW + 1, STARTCOL);
503 show_text(DISPROW + 1, STARTCOL, "All mailing lists:");
504 first_time = 0;
505 }
506 (void) sprintf(buf, "%s\r", argv[0]);
507 (void) start_display(buf);
508
509 return (0);
510}
511
512/****************************************************/
513list_all_groups()
514{
515 char *argv[5];
516 argv[0] = argv[3] = "true";
517 argv[1] = argv[4] = "dontcare";
518 argv[2] = "false";
519 first_time = 1;
520 if (status = sms_query("qualified_get_lists", 5, argv,
521 print_all, (char *) NULL)) {
522 Put_message("\r\n");
523 com_err(whoami, status, " in list_all_groups\n");
524 }
525 end_display();
526
527 return (DM_NORMAL); /* HA! */
528}
529
530/****************************************************/
531list_members()
532{
533 char *argv[1];
534 char *buf;
535 char buffer[80];
536
537 found_some = 0;
538 move(DISPROW, STARTCOL);
539 mvcur(0, 0, DISPROW, STARTCOL);
540 refresh();
541 buf = calloc(LISTMAX, 1);
542 if (Prompt("Enter List Name: ", buf, LISTSIZE, 1) == 1) {
543 (void) sprintf(buffer, "The members of list '%s' are:", buf);
544 show_text(DISPROW + 1, STARTCOL, buffer);
545 argv[0] = buf;
546 if (status = sms_query("get_members_of_list", 1, argv,
547 print_2, (char *) NULL)) {
548 Put_message("\r\n");
549 com_err(whoami, status, " found.\n");
550 currow++;
551 }
552 if (!found_some) {
553 show_text(currow, STARTCOL, "List is empty (no members).");
554 currow++;
555 show_text(currow, STARTCOL, "Press any key to continue...");
556 getchar();
557 clrwin(DISPROW);
558 return;
559 }
560 end_display();
561 return(0);
562 }
563 clrwin(DISPROW);
564 return (DM_NORMAL); /* HA! */
565}
566
567/****************************************************/
568/*ARGSUSED*/
569static int
570print_2(argc, argv, callback)
571 int argc;
572 char *argv[], *callback;
573{
574 char buf[BUFSIZ];
575
576 found_some = 1;
577 (void) sprintf(buf, "%s %s", argv[0], argv[1]);
578 (void) start_display(buf);
579
580 return (0);
581}
582
583/****************************************************/
584start_display(buff)
585 char *buff;
586{
587 char *buffer;
588
589 num_members++;
590 if (moreflg)
591 return(0);
592 buffer = calloc(50, 1);
593 if (currow >= LINES - 2) {
594 page++;
595 currow++;
596 mvcur(0, 0, currow, STARTCOL);
597 refresh();
598 if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1, 0) == 0) {
599 Put_message("Flushing query...");
600 moreflg = 1;
601 return (0);
602 }
603 clrwin(DISPROW + 2);
604 currow = DISPROW + 2;
605 (void) sprintf(buffer, "Continued (Page %d)", page);
606 show_text(currow, STARTCOL, buffer);
607 currow++;
608 toggle = 0;
609 }
610 if (!toggle)
611 show_text(currow, STARTCOL, buff);
612 else {
613 show_text(currow, SECONDCOL, buff);
614 currow++;
615 }
616 toggle = !toggle;
617 return(0);
618}
619
620/****************************************************/
621end_display()
622{
623 char *buffer, c;
624
625 if (moreflg) {
626 clrwin(DISPROW);
627 return;
628 }
629
630 buffer = calloc(50, 1);
631 currow++;
632 (void) sprintf(buffer, "End of List. %d Total Members\r", num_members);
633 show_text(currow, STARTCOL, buffer);
634 currow++;
635 show_text(currow, STARTCOL, "Press any key to continue...");
636 (void) getchar();
637 clrwin(DISPROW);
638
639}
640
641/****************************************************/
642display_menu(menu)
643 MENU *menu;
644{
645 int i;
646
647 cls();
648 title(menu->title);
649 mvcur(0, 0, STARTROW, STARTCOL);
650 refresh();
651 for (i = 0; i <= menu->num_items - 1; i++) {
652 move(STARTROW + i, STARTCOL);
653 standend();
654 addstr(menu->items[i]);
655 refresh();
656 }
657 center_text(STARTROW + menu->num_items + 2,
658 "Enter a number, <up arrow>, or <down arrow>.");
659 if (!level)
660 center_text(STARTROW + menu->num_items + 3,
661 "Press 'q' to exit, <return> to confirm choice.");
662 else
663 center_text(STARTROW + menu->num_items + 3,
664 "Press 'q' to exit, 'r' for main menu, <return> to confirm choice.");
665
666 if (!level)
667 highlight(main_menu);
668}
669
670/****************************************************/
671pack_main_menu()
672{
673 char *buf;
674
675 main_menu = (MENU *) malloc((unsigned) sizeof(MENU));
676 main_menu->num_items = 7;
677 main_menu->items = (char **) malloc((unsigned) sizeof(char *) * main_menu->num_items);
678
679 buf = calloc(50, 1);
680 (void) sprintf(buf, "Mail List Program for %s", uname);
681 main_menu->title = strsave(buf);
682 main_menu->items[0] = strsave("1. Show all mailing lists.");
683 main_menu->items[1] = strsave("2. Get all members of a mailing list.");
684 main_menu->items[2] = strsave("3. Display lists of which you are a member.");
685 main_menu->items[3] = strsave("4. Show description of list.");
686 main_menu->items[4] = strsave("5. Add yourself to a mailing list.");
687 main_menu->items[5] = strsave("6. Delete yourself from a mailing list.");
688 main_menu->items[6] = strsave("q. Quit.");
689}
690
691/****************************************************/
692pack_help_menu()
693{
694 help_menu = (MENU *) malloc((unsigned) sizeof(MENU));
695 help_menu->num_items = 5;
696 help_menu->items = (char **) malloc((unsigned) sizeof(char *) * help_menu->num_items);
697
698 help_menu->title = strsave("mailmaint is designed as a basic mail list administration program.");
699 help_menu->items[0] = strsave("if you need to perform more advanced list manipulation like");
700 help_menu->items[1] = strsave("adding lists, or changing list characteristics, refer to the");
701 help_menu->items[2] = strsave("program listmaint.");
702 help_menu->items[3] = strsave(" ");
703 help_menu->items[4] = strsave("Press any key to continue.");
704}
705
706/****************************************************/
707highlight(menu)
708 MENU *menu;
709{
710
711
712 if (oldpos[level] != position[level]) {
713 move(STARTROW + oldpos[level] - 1, STARTCOL);
714 standend();
715 addstr(menu->items[oldpos[level] - 1]);
716 refresh();
717 }
718
719 move(STARTROW + position[level] - 1, STARTCOL);
720 standout();
721 addstr(menu->items[position[level] - 1]);
722 refresh();
723 standend();
724 refresh();
725}
726
727/****************************************************/
728title(buff)
729 char *buff;
730{
731 move(0, MAX(0, (COLS - strlen(buff)) >> 1));
732 standout();
733 addstr(buff);
734 refresh();
735 standend();
736}
737
738/****************************************************/
739center_text(row, buff)
740 int row;
741 char *buff;
742{
743 move(row, MAX(0, (COLS - strlen(buff)) >> 1));
744 addstr(buff);
745 refresh();
746}
747
748/****************************************************/
749show_text(row, col, buff)
750 int row, col;
751 char *buff;
752{
753 mvcur(0, 0, row, col);
754 refresh();
755 printf("%s", buff);
756}
757
758/****************************************************/
759erase_line(row, col)
760 int row, col;
761{
762 char *buff;
763 int i;
764
765 buff = calloc((unsigned)COLS, 1);
766 for (i = 0; i <= COLS - 2; i++)
767 buff[i] = ' ';
768 buff[i] = 0; /* just to be sure ! */
769 move(row, col);
770 mvcur(0, 0, row, col);
771 printf("%s", buff);
772 refresh();
773}
774
775/****************************************************/
776cls()
777{
778 clear();
779 refresh();
780}
781
782/****************************************************/
783clrwin(erase_row)
784 int erase_row;
785{
786 int i;
787 char *buff;
788 int maxcol;
789
790 maxcol = COLS;
791 if (maxcol > 80)
792 maxcol = 80; /* limit width */
793
794 buff = calloc((unsigned)maxcol + 1, 1);
795 for (i = 0; i <= maxcol - 1; i++)
796 buff[i] = ' ';
797 buff[i] = 0; /* just to be sure ! */
798 mvcur(0, 0, erase_row, STARTCOL);
799 refresh();
800 for (i = erase_row; i <= currow - 1; i++) {
801 printf("%s\n\r", buff);
802 }
803 printf("%s", buff);
804 mvcur(erase_row, STARTCOL, STARTROW + oldpos[level] - 1, STARTCOL);
805 refresh();
806}
807
808/****************************************************/
809
810static void
811scream()
812{
813 com_err(whoami, status, "\nAn SMS update returned a value -- programmer \
814botch\n");
815 sms_disconnect();
816 exit(1);
817}
818
819/****************************************************/
820/*ARGSUSED*/
821static int
822fetch_list_info(list, li)
823 char *list;
824 List_info *li;
825{
826 char *argv[1];
827
828 argv[0] = list;
829 return sms_query("get_list_info", 1, argv, get_list_info, (char *) NULL);
830}
831
832/* ARGSUSED */
833static int
834get_list_info(argc, argv)
835 int argc;
836 char **argv;
837{
838
839 if (current_li->acl_type)
840 free(current_li->acl_type);
841 current_li->acl_type = strsave(argv[7]);
842 if (current_li->acl_name)
843 free(current_li->acl_name);
844 current_li->acl_name = strsave(argv[8]);
845 if (current_li->desc)
846 free(current_li->desc);
847 current_li->desc = strsave(argv[9]);
848 if (current_li->modtime)
849 free(current_li->modtime);
850 current_li->modtime = strsave(argv[10]);
851 if (current_li->modby)
852 free(current_li->modby);
853 current_li->modby = strsave(argv[11]);
854 if (current_li->modwith)
855 free(current_li->modwith);
856 current_li->modwith = strsave(argv[12]);
857 return (0);
858}
859
860
861
862
863/****************************************************/
864/* Prompt the user for input */
865int
866Prompt(prompt, buf, buflen, crok)
867 char *prompt;
868 char *buf;
869 int buflen;
870 int crok;
871{
872 int c;
873 char *p;
874 int x, oldx;
875
876 printf("%s", prompt);
877 refresh();
878 for (p = buf; abs(strlen(p) - strlen(buf)) <= buflen;) {
879 refresh();
880 c = getchar();
881 switch (c) {
882 case CTL('C'):
883 return 0;
884 case CTL('Z'):
885 return 0;
886 case CTL('L'):
887 cls();
888 display_menu(main_menu);
889 return (0);
890 case '\n':
891 case '\r':
892 if (crok)
893 Put_message("\r");
894 *p = '\0';
895 if (strlen(buf) < 1)/* only \n or \r in buff */
896 return (-1);
897 else
898 return (1);
899 case '\b':
900 case '\177':
901 if (p > buf) {
902 p--;
903 x--;
904 printf("\b \b");
905 }
906 break;
907 case CTL('U'):
908 case CTL('G'):
909 case CTL('['):
910 x = oldx;
911 while (p-- > buf)
912 printf("\b \b");
913 p = buf;
914 break;
915 default:
916 if (abs(strlen(p) - strlen(buf)) >= buflen) {
917 printf("%c", 7);
918 break;
919 }
920 if (isprint(c)) {
921 (void) addch(c);
922 *p++ = c;
923 x++;
924 }
925 else
926 (void) putchar(CTL('G'));
927 break;
928 }
929 }
930 return(0);
931}
932
933
934/*
935 * Hook function to cause error messages to be printed through
936 * curses instead of around it.
937 */
938
939int
940menu_err_hook(who, code, fmt, args)
941 char *who;
942 int code;
943 char *fmt;
944 va_list args;
945{
946 char buf[BUFSIZ], *cp;
947
948 FILE _strbuf;
949
950 (void) strcpy(buf, who);
951 for (cp = buf; *cp; cp++);
952 *cp++ = ':';
953 *cp++ = ' ';
954 if (code) {
955 (void) strcpy(cp, error_message(code));
956 while (*cp)
957 cp++;
958 }
959 _strbuf._flag = _IOWRT + _IOSTRG;
960 _strbuf._ptr = cp;
961 _strbuf._cnt = BUFSIZ - (cp - buf);
962 _doprnt(fmt, args, &_strbuf);
963 (void) putc('\0', &_strbuf);
964 Put_message(buf);
965}
This page took 0.044458 seconds and 5 git commands to generate.