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