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