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