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