]> andersk Git - moira.git/blame - clients/mailmaint/mailmaint.c
Programmer: Win Treese
[moira.git] / clients / mailmaint / mailmaint.c
CommitLineData
3b3cb07f 1/*
2 * $Source$
3 * $Header$
4 */
5
7189310c 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
3b3cb07f 10#ifndef lint
11static char rcsid_mailmaint_c[] = "$Header$";
3b3cb07f 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>
502797d8 25#include <sys/types.h>
32e1a4a9 26#include <varargs.h>
27#include <com_err.h>
3b3cb07f 28#include <ctype.h>
9a2d61b0 29#include <sms.h>
30#include <sms_app.h>
7189310c 31#include <mit-copyright.h>
3b3cb07f 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
c7c64ef0 42char *whoami; /* should not be static, for logging package */
3b3cb07f 43static int status;
44static void scream();
2c52591f 45extern char *strsave();
32e1a4a9 46int menu_err_hook();
3b3cb07f 47
48typedef struct list_info {
aa45021d 49 int active;
50 int public;
51 int hidden;
52 int maillist;
53 int group;
54 char *acl_type;
55 char *acl_name;
0faf7bee 56 char *desc;
aa45021d 57 char *modtime;
58 char *modby;
59 char *modwith;
0faf7bee 60} List_info;
61
62static char *ascbuff = {"0123456789"};
63static int
64print_2(), print_1();
3b3cb07f 65static List_info *current_li = (List_info *) NULL;
66static int get_list_info();
67static int fetch_list_info();
68
69char *malloc();
70char *rindex();
3b3cb07f 71char *getlogin();
d35f6756 72extern char *strsave();
3b3cb07f 73char *getenv();
0faf7bee 74char *calloc();
75
76uid_t getuid();
3b3cb07f 77
78typedef struct _menu {
79 int num_items;
80 char *title;
81 char **items;
0faf7bee 82} MENU;
3b3cb07f 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/****************************************************/
0faf7bee 93/*ARGSUSED*/
3b3cb07f 94main(argc, argv)
0faf7bee 95 int argc;
96 char *argv[];
97
98{
32e1a4a9 99 int (*old_hook)();
0faf7bee 100 int use_menu = 1;
101 char buf[BUFSIZ];
0faf7bee 102
103 init_sms_err_tbl();
104 init_krb_err_tbl();
911fc95e 105
0faf7bee 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 {
aa45021d 117 current_li->acl_type = (char *) NULL;
118 current_li->acl_name = (char *) NULL;
0faf7bee 119 current_li->desc = (char *) NULL;
aa45021d 120 current_li->modtime = (char *) NULL;
121 current_li->modby = (char *) NULL;
122 current_li->modwith = (char *) NULL;
0faf7bee 123 }
124 if ((uname = getlogin()) == NULL) {
125 struct passwd *getpwuid();
3b3cb07f 126
0faf7bee 127 uname = getpwuid((int) getuid())->pw_name;
128 }
2c52591f 129 uname = (uname && strlen(uname)) ? strsave(uname) : "";
3b3cb07f 130
0faf7bee 131 printf("Connecting to database for %s...please hold on.\n", uname);
3b3cb07f 132
9a2d61b0 133 status = sms_connect(SMS_SERVER);
0faf7bee 134 if (status) {
135 (void) sprintf(buf, "\nConnection to SMS server failed");
136 goto punt;
137 }
3b3cb07f 138
aa45021d 139 status = sms_auth("mailmaint");
0faf7bee 140 if (status) {
141 (void) sprintf(buf, "\nAuthorization failed.\n");
142 goto punt;
143 }
3b3cb07f 144
0faf7bee 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);
3b3cb07f 155 }
0faf7bee 156 raw();
157 noecho();
32e1a4a9 158 old_hook = set_com_err_hook(menu_err_hook);
0faf7bee 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();
32e1a4a9 167 set_com_err_hook(old_hook);
0faf7bee 168 }
0faf7bee 169 exit(0);
3b3cb07f 170
171punt:
0faf7bee 172 com_err(whoami, status, buf);
0faf7bee 173 exit(1);
3b3cb07f 174}
175
176/****************************************************/
177get_main_input()
178{
0faf7bee 179 int c;
180 int retflg;
181
182 while (1) {
3b3cb07f 183 oldpos[level] = position[level];
184 retflg = 0;
0faf7bee 185 currow = DISPROW + 2;
3b3cb07f 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 }
0faf7bee 196 switch (c) {
197 case 'L' & 037: /* clear screen */
3b3cb07f 198 display_menu(main_menu);
199 break;
0faf7bee 200 case 'q':
201 case 'Q': /* quit */
3b3cb07f 202 position[level] = 7;
203 highlight(main_menu);
204 if (retflg) {
205 cls();
206 return;
207 }
208 break;
0faf7bee 209 case '1': /* show all lists */
3b3cb07f 210 position[level] = 1;
211 if (retflg) {
212 show_all();
213 }
214 break;
0faf7bee 215 case '2': /* get all members of a list */
3b3cb07f 216 position[level] = 2;
217 if (retflg) {
0faf7bee 218 (void) list_members();
3b3cb07f 219 }
220 break;
0faf7bee 221 case '3': /* display list which user is a recipient */
3b3cb07f 222 position[level] = 3;
223 if (retflg) {
224 list_by_member();
225 }
226 break;
0faf7bee 227 case '4': /* show description */
3b3cb07f 228 position[level] = 4;
229 if (retflg) {
230 show_list_info();
231 }
232 break;
0faf7bee 233 case '5': /* add to list */
3b3cb07f 234 position[level] = 5;
235 if (retflg) {
236 add_member();
237 }
238 break;
0faf7bee 239 case '6': /* delete */
3b3cb07f 240 position[level] = 6;
241 if (retflg) {
242 delete_member();
243 }
244 break;
0faf7bee 245 case 27: /* up arrow */
3b3cb07f 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 }
0faf7bee 254 else {
3b3cb07f 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}
0faf7bee 270
3b3cb07f 271/****************************************************/
272show_list_info()
273{
0faf7bee 274 char *buf;
275 char c;
3b3cb07f 276
277 show_text(DISPROW, STARTCOL, "Show information about a list.\n\r");
0faf7bee 278 buf = calloc((unsigned)1024, 1);
35b57b47 279 if (Prompt("Enter List Name: ", buf, LISTSIZE, 1) == 1) {
0faf7bee 280 Put_message("\n\r");
3b3cb07f 281 if (fetch_list_info(buf, current_li) == 0) {
282 (void) sprintf(buf, "Description: %s\n\r", current_li->desc);
0faf7bee 283 if (strlen(buf) > 60)
284 (void) display_buff(buf);
3b3cb07f 285 else
286 show_text(currow, STARTCOL, buf);
287 currow++;
aa45021d 288 (void) sprintf(buf, "List Administrator: %s %s",
289 current_li->acl_type, current_li->acl_name);
3b3cb07f 290 show_text(currow, STARTCOL, buf);
291 currow++;
aa45021d 292 (void) sprintf(buf, "Modified on %s by user %s with %s",
293 current_li->modtime, current_li->modby,
294 current_li->modwith);
3b3cb07f 295 show_text(currow, STARTCOL, buf);
296 currow++;
297 }
298 else {
32e1a4a9 299 show_text(currow, STARTCOL, "mailmaint: No such list found.");
3b3cb07f 300 currow++;
301 }
302 show_text(currow, STARTCOL, "Press any Key to continue...");
911fc95e 303 (void) getchar();
3b3cb07f 304 }
305 clrwin(DISPROW);
306}
0faf7bee 307
3b3cb07f 308/****************************************************/
309display_buff(buf)
0faf7bee 310 char *buf;
3b3cb07f 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;
0faf7bee 321 printbuf = calloc((unsigned)maxcol, 1);
322 for (i = 0; i <= strlen(buf); i++) {
3b3cb07f 323 printbuf[cnt] = buf[i];
324 cnt++;
325 if (cnt >= maxcol) {
0faf7bee 326 (void) start_display_buff(printbuf);
3b3cb07f 327 cnt = 0;
328 free(printbuf);
0faf7bee 329 printbuf = calloc((unsigned)maxcol, 1);
3b3cb07f 330 }
331 }
0faf7bee 332 if (strlen(buf) % maxcol != 0) {
333 (void) start_display_buff(printbuf);
3b3cb07f 334 free(printbuf);
335 }
0faf7bee 336 return (0);
3b3cb07f 337}
0faf7bee 338
3b3cb07f 339/****************************************************/
340start_display_buff(buff)
0faf7bee 341 char *buff;
3b3cb07f 342{
0faf7bee 343 char buffer[5];
3b3cb07f 344
345 num_members++;
346 if (moreflg)
0faf7bee 347 return (0);
348 if (currow >= LINES - 2) {
3b3cb07f 349 page++;
350 currow++;
0faf7bee 351 mvcur(0, 0, currow, STARTCOL);
3b3cb07f 352 refresh();
35b57b47 353 if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1, 0) == 0) {
0faf7bee 354 Put_message("Flushing query...");
355 moreflg = 1;
356 return (0);
3b3cb07f 357 }
0faf7bee 358 clrwin(DISPROW + 2);
359 currow = DISPROW + 2;
3b3cb07f 360 show_text(currow, STARTCOL, "continued");
361 currow++;
362 }
363 show_text(currow, STARTCOL, buff);
364 currow++;
0faf7bee 365 return (0);
3b3cb07f 366}
0faf7bee 367
3b3cb07f 368/****************************************************/
369add_member()
370{
aa45021d 371 char *argv[3];
0faf7bee 372 char *buf;
373 char c;
3b3cb07f 374
375 show_text(DISPROW, STARTCOL, "Add yourself to a list\n\r");
0faf7bee 376 buf = calloc(LISTMAX, 1);
35b57b47 377 if (Prompt("Enter List Name: ", buf, LISTSIZE, 1) == 1) {
0faf7bee 378 Put_message("\r\n");
aa45021d 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)) {
0faf7bee 384 Put_message("\r\n");
3b3cb07f 385 com_err(whoami, status, " found.\n");
386 }
387 else {
0faf7bee 388 (void) sprintf(buf, "User %s added to list\r", uname);
389 show_text(DISPROW + 3, STARTCOL, buf);
3b3cb07f 390 }
0faf7bee 391 currow = DISPROW + 4;
392 show_text(DISPROW + 4, STARTCOL, "Press any Key to continue...");
911fc95e 393 (void) getchar();
3b3cb07f 394 }
395 clrwin(DISPROW);
396}
397
398/****************************************************/
399delete_member()
400{
aa45021d 401 char *argv[3];
0faf7bee 402 char *buf;
403 char c;
3b3cb07f 404
405 show_text(DISPROW, STARTCOL, "Remove yourself from a list\n\r");
0faf7bee 406 buf = calloc(LISTMAX, 1);
35b57b47 407 if (Prompt("Enter List Name: ", buf, LISTSIZE, 1) == 1) {
0faf7bee 408 Put_message("\r\n");
aa45021d 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)) {
0faf7bee 414 Put_message("\r\n");
3b3cb07f 415 com_err(whoami, status, " found.\n");
416 }
417 else {
0faf7bee 418 (void) sprintf(buf, "User %s deleted from list\r", uname);
419 show_text(DISPROW + 3, STARTCOL, buf);
3b3cb07f 420 }
0faf7bee 421 currow = DISPROW + 4;
422 show_text(DISPROW + 4, STARTCOL, "Press any Key to continue...");
911fc95e 423 (void) getchar();
3b3cb07f 424 }
425 clrwin(DISPROW);
426}
3b3cb07f 427
0faf7bee 428/****************************************************/
429list_by_member()
3b3cb07f 430{
0faf7bee 431 char *nargv[3];
432 char *buf;
433 char c;
3b3cb07f 434
aa45021d 435 nargv[1] = strsave("ruser");
0faf7bee 436 nargv[2] = strsave(uname);
437 buf = calloc(BUFSIZ, 1);
438 (void) sprintf(buf, "%s is on the following lists:\r", uname);
3b3cb07f 439 show_text(DISPROW, STARTCOL, buf);
0faf7bee 440 mvcur(0, 0, currow, STARTCOL);
3b3cb07f 441 refresh();
0faf7bee 442 if (status = sms_query("get_lists_of_member", 2, nargv + 1,
3b3cb07f 443 print_1, (char *) NULL)) {
0faf7bee 444 Put_message("\r\n");
445 com_err(whoami, status, " in get_lists_of_member");
3b3cb07f 446 }
447 show_text(currow, STARTCOL, "Press any Key to continue...");
911fc95e 448 (void) getchar();
3b3cb07f 449 clrwin(DISPROW);
450 return;
451}
0faf7bee 452
3b3cb07f 453/****************************************************/
454show_all()
455{
0faf7bee 456 char c;
3b3cb07f 457
2c52591f 458 show_text(DISPROW, STARTCOL, "This function may take a \
459while... proceed? [y] ");
3b3cb07f 460 c = getchar();
aa45021d 461 if (c == 'y' || c == 'Y' || c == '\n') {
2c52591f 462 move(DISPROW + 1, STARTCOL);
463 addstr("Processing query...please hold");
464 refresh();
465 (void) list_all_groups();
3b3cb07f 466 }
2c52591f 467 else
468 erase_line(DISPROW, STARTCOL);
469 return;
470
3b3cb07f 471}
472
473/****************************************************/
0faf7bee 474/*ARGSUSED*/
3b3cb07f 475static int
476print_1(argc, argv, callback)
0faf7bee 477 int argc;
478 char *argv[], *callback;
3b3cb07f 479{
0faf7bee 480 char buf[BUFSIZ];
3b3cb07f 481
0faf7bee 482 /* no newline 'cause Put_message adds one */
483 (void) sprintf(buf, "%s\r", argv[0]);
484 (void) start_display(buf);
3b3cb07f 485
0faf7bee 486 return (0);
3b3cb07f 487}
0faf7bee 488
3b3cb07f 489/****************************************************/
0faf7bee 490/*ARGSUSED*/
3b3cb07f 491static int
492print_all(argc, argv, callback)
0faf7bee 493 int argc;
494 char *argv[], *callback;
495{
496 char buf[BUFSIZ];
3b3cb07f 497
0faf7bee 498 if (moreflg)
3b3cb07f 499 return (0);
0faf7bee 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);
3b3cb07f 509}
510
511/****************************************************/
512list_all_groups()
513{
aa45021d 514 char *argv[5];
515 argv[0] = argv[3] = "true";
516 argv[1] = argv[4] = "dontcare";
517 argv[2] = "false";
3b3cb07f 518 first_time = 1;
aa45021d 519 if (status = sms_query("qualified_get_lists", 5, argv,
0faf7bee 520 print_all, (char *) NULL)) {
521 Put_message("\r\n");
3b3cb07f 522 com_err(whoami, status, " in list_all_groups\n");
523 }
524 end_display();
525
526 return (DM_NORMAL); /* HA! */
527}
0faf7bee 528
3b3cb07f 529/****************************************************/
530list_members()
531{
532 char *argv[1];
533 char *buf;
534 char buffer[80];
535
536 found_some = 0;
537 move(DISPROW, STARTCOL);
0faf7bee 538 mvcur(0, 0, DISPROW, STARTCOL);
3b3cb07f 539 refresh();
0faf7bee 540 buf = calloc(LISTMAX, 1);
35b57b47 541 if (Prompt("Enter List Name: ", buf, LISTSIZE, 1) == 1) {
0faf7bee 542 (void) sprintf(buffer, "The members of list '%s' are:", buf);
543 show_text(DISPROW + 1, STARTCOL, buffer);
3b3cb07f 544 argv[0] = buf;
545 if (status = sms_query("get_members_of_list", 1, argv,
546 print_2, (char *) NULL)) {
0faf7bee 547 Put_message("\r\n");
3b3cb07f 548 com_err(whoami, status, " found.\n");
549 currow++;
550 }
551 if (!found_some) {
0faf7bee 552 show_text(currow, STARTCOL, "List is empty (no members).");
3b3cb07f 553 currow++;
32e1a4a9 554 show_text(currow, STARTCOL, "Press any key to continue...");
555 getchar();
556 clrwin(DISPROW);
557 return;
3b3cb07f 558 }
559 end_display();
0faf7bee 560 return(0);
3b3cb07f 561 }
562 clrwin(DISPROW);
563 return (DM_NORMAL); /* HA! */
564}
565
566/****************************************************/
0faf7bee 567/*ARGSUSED*/
3b3cb07f 568static int
569print_2(argc, argv, callback)
0faf7bee 570 int argc;
571 char *argv[], *callback;
3b3cb07f 572{
0faf7bee 573 char buf[BUFSIZ];
3b3cb07f 574
0faf7bee 575 found_some = 1;
576 (void) sprintf(buf, "%s %s", argv[0], argv[1]);
577 (void) start_display(buf);
3b3cb07f 578
0faf7bee 579 return (0);
3b3cb07f 580}
0faf7bee 581
3b3cb07f 582/****************************************************/
583start_display(buff)
0faf7bee 584 char *buff;
3b3cb07f 585{
0faf7bee 586 char *buffer;
3b3cb07f 587
588 num_members++;
589 if (moreflg)
0faf7bee 590 return(0);
591 buffer = calloc(50, 1);
592 if (currow >= LINES - 2) {
3b3cb07f 593 page++;
594 currow++;
0faf7bee 595 mvcur(0, 0, currow, STARTCOL);
3b3cb07f 596 refresh();
35b57b47 597 if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1, 0) == 0) {
0faf7bee 598 Put_message("Flushing query...");
599 moreflg = 1;
600 return (0);
3b3cb07f 601 }
0faf7bee 602 clrwin(DISPROW + 2);
603 currow = DISPROW + 2;
604 (void) sprintf(buffer, "Continued (Page %d)", page);
3b3cb07f 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;
0faf7bee 616 return(0);
3b3cb07f 617}
0faf7bee 618
3b3cb07f 619/****************************************************/
620end_display()
621{
0faf7bee 622 char *buffer, c;
3b3cb07f 623
624 if (moreflg) {
625 clrwin(DISPROW);
626 return;
627 }
628
0faf7bee 629 buffer = calloc(50, 1);
3b3cb07f 630 currow++;
0faf7bee 631 (void) sprintf(buffer, "End of List. %d Total Members\r", num_members);
3b3cb07f 632 show_text(currow, STARTCOL, buffer);
633 currow++;
634 show_text(currow, STARTCOL, "Press any key to continue...");
911fc95e 635 (void) getchar();
3b3cb07f 636 clrwin(DISPROW);
637
638}
0faf7bee 639
3b3cb07f 640/****************************************************/
641display_menu(menu)
0faf7bee 642 MENU *menu;
3b3cb07f 643{
644 int i;
645
646 cls();
647 title(menu->title);
0faf7bee 648 mvcur(0, 0, STARTROW, STARTCOL);
3b3cb07f 649 refresh();
0faf7bee 650 for (i = 0; i <= menu->num_items - 1; i++) {
651 move(STARTROW + i, STARTCOL);
3b3cb07f 652 standend();
653 addstr(menu->items[i]);
654 refresh();
655 }
0faf7bee 656 center_text(STARTROW + menu->num_items + 2,
3b3cb07f 657 "Enter a number, <up arrow>, or <down arrow>.");
658 if (!level)
0faf7bee 659 center_text(STARTROW + menu->num_items + 3,
660 "Press 'q' to exit, <return> to confirm choice.");
3b3cb07f 661 else
0faf7bee 662 center_text(STARTROW + menu->num_items + 3,
663 "Press 'q' to exit, 'r' for main menu, <return> to confirm choice.");
3b3cb07f 664
665 if (!level)
666 highlight(main_menu);
0faf7bee 667}
3b3cb07f 668
669/****************************************************/
670pack_main_menu()
671{
0faf7bee 672 char *buf;
3b3cb07f 673
0faf7bee 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);
3b3cb07f 677
0faf7bee 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.");
3b3cb07f 688}
689
690/****************************************************/
691pack_help_menu()
692{
0faf7bee 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);
3b3cb07f 696
32e1a4a9 697 help_menu->title = strsave("mailmaint is designed as a basic mail list administration program.");
0faf7bee 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.");
3b3cb07f 703}
3b3cb07f 704
3b3cb07f 705/****************************************************/
706highlight(menu)
0faf7bee 707 MENU *menu;
3b3cb07f 708{
709
710
711 if (oldpos[level] != position[level]) {
0faf7bee 712 move(STARTROW + oldpos[level] - 1, STARTCOL);
3b3cb07f 713 standend();
0faf7bee 714 addstr(menu->items[oldpos[level] - 1]);
3b3cb07f 715 refresh();
716 }
717
0faf7bee 718 move(STARTROW + position[level] - 1, STARTCOL);
3b3cb07f 719 standout();
0faf7bee 720 addstr(menu->items[position[level] - 1]);
3b3cb07f 721 refresh();
722 standend();
723 refresh();
724}
725
726/****************************************************/
727title(buff)
0faf7bee 728 char *buff;
3b3cb07f 729{
0faf7bee 730 move(0, MAX(0, (COLS - strlen(buff)) >> 1));
3b3cb07f 731 standout();
0faf7bee 732 addstr(buff);
3b3cb07f 733 refresh();
3b3cb07f 734 standend();
3b3cb07f 735}
736
3b3cb07f 737/****************************************************/
738center_text(row, buff)
0faf7bee 739 int row;
740 char *buff;
3b3cb07f 741{
0faf7bee 742 move(row, MAX(0, (COLS - strlen(buff)) >> 1));
3b3cb07f 743 addstr(buff);
744 refresh();
745}
746
747/****************************************************/
748show_text(row, col, buff)
0faf7bee 749 int row, col;
750 char *buff;
3b3cb07f 751{
0faf7bee 752 mvcur(0, 0, row, col);
3b3cb07f 753 refresh();
754 printf("%s", buff);
755}
756
757/****************************************************/
758erase_line(row, col)
0faf7bee 759 int row, col;
3b3cb07f 760{
0faf7bee 761 char *buff;
762 int i;
3b3cb07f 763
0faf7bee 764 buff = calloc((unsigned)COLS, 1);
765 for (i = 0; i <= COLS - 2; i++)
3b3cb07f 766 buff[i] = ' ';
0faf7bee 767 buff[i] = 0; /* just to be sure ! */
3b3cb07f 768 move(row, col);
0faf7bee 769 mvcur(0, 0, row, col);
3b3cb07f 770 printf("%s", buff);
771 refresh();
772}
773
774/****************************************************/
775cls()
776{
777 clear();
778 refresh();
779}
780
781/****************************************************/
782clrwin(erase_row)
0faf7bee 783 int erase_row;
3b3cb07f 784{
0faf7bee 785 int i;
786 char *buff;
787 int maxcol;
3b3cb07f 788
789 maxcol = COLS;
790 if (maxcol > 80)
0faf7bee 791 maxcol = 80; /* limit width */
3b3cb07f 792
0faf7bee 793 buff = calloc((unsigned)maxcol + 1, 1);
794 for (i = 0; i <= maxcol - 1; i++)
3b3cb07f 795 buff[i] = ' ';
0faf7bee 796 buff[i] = 0; /* just to be sure ! */
797 mvcur(0, 0, erase_row, STARTCOL);
3b3cb07f 798 refresh();
0faf7bee 799 for (i = erase_row; i <= currow - 1; i++) {
3b3cb07f 800 printf("%s\n\r", buff);
801 }
0faf7bee 802 printf("%s", buff);
803 mvcur(erase_row, STARTCOL, STARTROW + oldpos[level] - 1, STARTCOL);
3b3cb07f 804 refresh();
805}
806
807/****************************************************/
0faf7bee 808
0faf7bee 809static void
810scream()
3b3cb07f 811{
0faf7bee 812 com_err(whoami, status, "\nAn SMS update returned a value -- programmer \
3b3cb07f 813botch\n");
0faf7bee 814 sms_disconnect();
815 exit(1);
3b3cb07f 816}
0faf7bee 817
3b3cb07f 818/****************************************************/
0faf7bee 819/*ARGSUSED*/
820static int
821fetch_list_info(list, li)
822 char *list;
823 List_info *li;
3b3cb07f 824{
825 char *argv[1];
826
827 argv[0] = list;
32e1a4a9 828 return sms_query("get_list_info", 1, argv, get_list_info, (char *) NULL);
3b3cb07f 829}
830
831/* ARGSUSED */
0faf7bee 832static int
833get_list_info(argc, argv)
834 int argc;
835 char **argv;
836{
837
aa45021d 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]);
0faf7bee 844 if (current_li->desc)
845 free(current_li->desc);
aa45021d 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]);
0faf7bee 856 return (0);
3b3cb07f 857}
858
859
860
861
862/****************************************************/
863/* Prompt the user for input */
0faf7bee 864int
35b57b47 865Prompt(prompt, buf, buflen, crok)
3b3cb07f 866 char *prompt;
867 char *buf;
868 int buflen;
35b57b47 869 int crok;
3b3cb07f 870{
871 int c;
872 char *p;
0faf7bee 873 int x, oldx;
3b3cb07f 874
875 printf("%s", prompt);
876 refresh();
0faf7bee 877 for (p = buf; abs(strlen(p) - strlen(buf)) <= buflen;) {
3b3cb07f 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);
0faf7bee 888 return (0);
3b3cb07f 889 case '\n':
890 case '\r':
35b57b47 891 if (crok)
892 Put_message("\r");
3b3cb07f 893 *p = '\0';
911fc95e 894 if (strlen(buf) < 1)/* only \n or \r in buff */
0faf7bee 895 return (-1);
3b3cb07f 896 else
0faf7bee 897 return (1);
3b3cb07f 898 case '\b':
899 case '\177':
900 if (p > buf) {
901 p--;
902 x--;
52b98fdc 903 printf("\b \b");
3b3cb07f 904 }
905 break;
906 case CTL('U'):
907 case CTL('G'):
908 case CTL('['):
909 x = oldx;
52b98fdc 910 while (p-- > buf)
911 printf("\b \b");
3b3cb07f 912 p = buf;
913 break;
914 default:
0faf7bee 915 if (abs(strlen(p) - strlen(buf)) >= buflen) {
3b3cb07f 916 printf("%c", 7);
917 break;
918 }
919 if (isprint(c)) {
920 (void) addch(c);
921 *p++ = c;
922 x++;
0faf7bee 923 }
924 else
925 (void) putchar(CTL('G'));
3b3cb07f 926 break;
927 }
928 }
0faf7bee 929 return(0);
3b3cb07f 930}
931
32e1a4a9 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.225497 seconds and 5 git commands to generate.