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