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