]> andersk Git - moira.git/commitdiff
Initial revision
authorwesommer <wesommer>
Sat, 22 Aug 1987 22:30:25 +0000 (22:30 +0000)
committerwesommer <wesommer>
Sat, 22 Aug 1987 22:30:25 +0000 (22:30 +0000)
clients/mailmaint/Makefile [new file with mode: 0644]
clients/mailmaint/mailmaint.c [new file with mode: 0644]

diff --git a/clients/mailmaint/Makefile b/clients/mailmaint/Makefile
new file mode 100644 (file)
index 0000000..729e4e6
--- /dev/null
@@ -0,0 +1,39 @@
+#
+#      $Source$
+#      $Header$
+#
+
+# Makefile for SMS client mailmaint
+#
+#
+DESTDIR=
+CFLAGS = -I../../include -O
+CONFDIR = ${DESTDIR}/usr/athena
+BINDIR = ${DESTDIR}/bin
+
+SMSLIB =  ../../lib/libsms.a ../../lib/libgdb.a ../../lib/libcom_err.a
+
+SRCS = mailmaint.c
+
+OBJECTS = mailmaint.o
+
+all:   mailmaint
+
+mailmaint:     ${OBJECTS}
+       cc ${CFLAGS} -o mailmaint ${OBJECTS} ${SMSLIB} \
+       -lcurses -ltermcap -lkrb -ldes
+
+mailmaint.o:           mailmaint.c
+       cc -c ${CFLAGS} mailmaint.c
+
+lint:
+       lint -I../../include ${SRCS}
+
+clean: 
+       rm -f *.o *~ core \#*
+       rm -f mailmaint
+
+install:       ${PROGS}
+       install mailmaint ${DESTDIR}/usr/athena/mailmaint
+
+
diff --git a/clients/mailmaint/mailmaint.c b/clients/mailmaint/mailmaint.c
new file mode 100644 (file)
index 0000000..12982cd
--- /dev/null
@@ -0,0 +1,970 @@
+/*
+ *     $Source$
+ *     $Header$
+ */
+
+#ifndef lint
+static char *rcsid_mailmaint_c = "$Header$";
+#endif lint
+
+#ifndef lint
+static char rcsid_mailmaint_c[] = "$Header$";
+
+#endif lint
+
+/***********************************************************************/
+/*  mailmaint.c - pjlevine - 20 August 1987 
+    
+*/
+/***********************************************************************/
+#include <stdio.h>
+#include <pwd.h>
+#include <menu.h>
+#include <signal.h>
+#include <strings.h>
+#include <curses.h>
+#include </usr/include/sys/types.h>
+#include <ctype.h>
+#include "mit-copyright.h"
+
+#define STARTCOL 0
+#define STARTROW 3
+#define SECONDCOL 30
+#define DISPROW 15
+#define LISTMAX 50
+#define LISTSIZE 32
+#define CTL(ch)  ((ch) & 037)
+#define MAX(A,B) ((A) > (B) ? (A) : (B))
+
+static char *whoami;
+static int status;
+static void scream();
+char *ds();
+static int bool_answer();
+
+typedef struct list_info {
+       char *acl;
+       char *desc;
+       char *expdate;
+} List_info;
+
+static char *ascbuff={"0123456789"};
+static int print_2(), print_1();
+static List_info *current_li = (List_info *) NULL;
+static int get_list_info();
+static int fetch_list_info();
+
+char *malloc();
+char *rindex();
+char *strcpy();
+char *getlogin();
+char *strsave();
+char *getenv();
+
+typedef struct _menu {
+    int num_items;
+    char *title;
+    char **items;
+}MENU;
+
+MENU *main_menu, *help_menu;
+
+int position[2], oldpos[2];
+int level, found_some, currow, page, num_members;
+int moreflg, toggle, first_time;
+char *uname;
+
+
+/****************************************************/
+main(argc, argv)
+       int argc;
+       char *argv[];
+
+{
+
+       int use_menu = 1;
+       char buf[BUFSIZ];
+
+       init_sms_err_tbl();
+       init_krb_err_tbl();
+
+        if (getenv("TERM") == (char *) NULL) {
+           printf("Please set your TERM environment variable\n");
+           goto punt;
+       }
+        if (getenv("TERMCAP") == (char *) NULL) {
+           printf("Please set your TERMCAP environment variable\n");
+           goto punt;
+       }
+       if ((whoami = rindex(argv[0], '/')) == NULL)
+               whoami = argv[0];
+       else
+               whoami++;
+       uname = (char *) calloc(20, 1);
+       if ((current_li = (List_info *) malloc(sizeof(List_info)))
+           == (List_info *) NULL) {
+           (void) sprintf(buf, ": allocating list info");
+           goto punt;
+       } else {
+           current_li->acl = (char *) NULL;
+           current_li->desc = (char *) NULL;
+           current_li->expdate = (char *) NULL;
+       }
+       if ((uname = getlogin()) == NULL) {
+           struct passwd *getpwuid();
+           uname = getpwuid(getuid())->pw_name;
+       }
+       uname = (uname && strlen(uname))? ds(uname): "";
+
+       printf("Connecting to database for %s...please hold on.\n", uname);
+
+       status = sms_connect();
+       if (status) {
+               (void) sprintf(buf, "\nConnection to SMS server failed");
+               goto punt;
+       }
+
+       status = sms_auth();
+       if (status) {
+               (void) sprintf(buf, "\nAuthorization failed.\n");
+               goto punt;
+       }
+
+       if (use_menu) {
+           initscr();
+           if ((LINES < 24) || (COLS < 60)) {
+               printf("Display window too small.\n\n");
+
+               printf("Current window parameters are (%d lines, %d columns)\n", LINES, COLS);
+               printf("Please resize your window\n");
+               printf("to at least 24 lines and 60 columns.\n");
+               exit(0);
+           }
+           raw();
+           noecho();
+           position[0] = oldpos[0] = 1;
+           level = 0;
+           pack_main_menu();
+           pack_help_menu();
+           display_menu(main_menu);
+           get_main_input();
+           cls();
+           endwin();
+       }
+       sms_disconnect();
+       exit(0);
+
+punt:
+       com_err(whoami, status, buf);
+/*     sms_disconnect(); */
+       exit(1);
+}
+
+/****************************************************/
+get_main_input()
+{
+int c;
+int retflg;
+    
+    while(1) {
+       oldpos[level] = position[level];
+       retflg = 0;
+       currow = DISPROW+2;
+       page = 1;
+       toggle = num_members = moreflg = 0;
+       c = getchar();
+       if (c == 13) {
+           if (position[level] == 7)
+               c = 'q';
+           else
+               c = ascbuff[position[level]];
+           retflg = 1;
+       }
+       switch(c) {
+       case 'L' & 037:      /* clear screen */
+           display_menu(main_menu);
+           break;
+       case 'q': case 'Q':        /*quit*/
+           position[level] = 7;
+           highlight(main_menu);
+           if (retflg) {
+               cls();
+               return;
+           }
+           break;
+       case '1':            /* show all lists */
+           position[level] = 1;
+           if (retflg) {
+               show_all();
+           }
+           break;
+       case '2':           /* get all members of a list */
+           position[level] = 2;
+           if (retflg) {
+               list_members();
+           }
+           break;
+       case '3':          /* display list which user is a recipient */
+           position[level] = 3;
+           if (retflg) {
+               list_by_member();
+           }
+           break;
+       case '4':         /* show description */
+           position[level] = 4;
+           if (retflg) {
+               show_list_info();
+           }
+           break;
+       case '5':        /* add to list */
+           position[level] = 5;
+           if (retflg) {
+               add_member();
+           }
+           break;
+       case '6':       /* delete */
+           position[level] = 6;
+           if (retflg) {
+               delete_member();
+           }
+           break;
+        case 27:        /* up arrow */
+           c = getchar();
+           if (c == 91) {
+               c = getchar();
+               if (c == 65) {
+                   position[level]--;
+                   if (!position[level])
+                       position[level] = 7;
+               }
+               else  {
+                   if (c == 66) {
+                       position[level]++;
+                       if (position[level] > 7)
+                           position[level] = 1;
+                   }
+               }
+           }
+           break;
+       default:
+           printf("%c", 7);
+           break;
+       }
+       highlight(main_menu);
+    }
+}
+/****************************************************/
+show_list_info()
+{
+char *argv[2];
+char *buf;
+char c;
+
+    show_text(DISPROW, STARTCOL, "Show information about a list.\n\r");
+    buf = (char *) calloc(1024, 1);
+    if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
+       printf("\n\r");
+       if (fetch_list_info(buf, current_li) == 0) {
+           (void) sprintf(buf, "Description: %s\n\r", current_li->desc);
+           if (strlen(buf) > 60) 
+               display_buff(buf);
+           else
+               show_text(currow, STARTCOL, buf);
+           currow++;
+           (void) sprintf(buf, "List Administrator: %s", current_li->acl);
+           show_text(currow, STARTCOL, buf);
+           currow++;
+           (void) sprintf(buf, "Expiration date: %s", current_li->expdate);
+           show_text(currow, STARTCOL, buf);
+           currow++;
+       }
+       else {
+           show_text(currow, STARTCOL, "madm: No such list found.");
+           currow++;
+       }
+       show_text(currow, STARTCOL, "Press any Key to continue...");
+       c = getchar();
+    }
+    clrwin(DISPROW);
+}
+/****************************************************/
+display_buff(buf)
+char *buf;
+{
+    int i, cnt;
+    char *printbuf;
+    int maxcol;
+
+    maxcol = COLS;
+    if (maxcol >= 80)
+       maxcol = 80;
+
+    cnt = 0;
+    printbuf = (char *) calloc(maxcol, 1);
+    for(i=0; i<=strlen(buf); i++) {
+       printbuf[cnt] = buf[i];
+       cnt++;
+       if (cnt >= maxcol) {
+           start_display_buff(printbuf);
+           cnt = 0;
+           free(printbuf);
+           printbuf = (char *) calloc(maxcol, 1);
+       }
+    }
+    if (strlen(buf)%maxcol != 0) {
+       start_display_buff(printbuf);
+       free(printbuf);
+    }
+    return(0);
+}
+/****************************************************/
+start_display_buff(buff)
+char *buff;
+{
+char c;
+char buffer[5];
+
+    num_members++;
+    if (moreflg)
+       return;
+    if (currow >= LINES-2) {
+       page++;
+       currow++;
+       mvcur(0,0,currow,STARTCOL);
+       refresh();
+       if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1) == 0) {
+           printf("Flushing query...");
+            moreflg = 1;
+           return(0);
+       }
+       clrwin(DISPROW+2);
+       currow = DISPROW+2;
+       show_text(currow, STARTCOL, "continued");
+       currow++;
+    }
+    show_text(currow, STARTCOL, buff);
+    currow++;
+}
+/****************************************************/
+add_member()
+{
+char *argv[3];
+char *buf;
+char c;
+
+    show_text(DISPROW, STARTCOL, "Add yourself to a list\n\r");
+    buf = (char *) calloc(LISTMAX, 1);
+    if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
+       printf("\r\n");
+       argv[0] = strsave(buf);
+       argv[1] = strsave("user");
+       argv[2] = strsave(uname);
+       if (status = sms_query("add_member_to_list", 3, argv,
+                              scream, (char *) NULL)) {
+           printf("\r\n");
+           com_err(whoami, status, " found.\n");
+       }
+       else {
+           sprintf(buf, "User %s added to list\r", uname);
+           show_text(DISPROW+3, STARTCOL, buf);
+       }
+        currow = DISPROW+4;
+       show_text(DISPROW+4, STARTCOL, "Press any Key to continue...");
+       c = getchar();
+    }
+    clrwin(DISPROW);
+}
+
+/****************************************************/
+delete_member()
+{
+char *argv[3];
+char *buf;
+char c;
+
+    show_text(DISPROW, STARTCOL, "Remove yourself from a list\n\r");
+    buf = (char *) calloc(LISTMAX, 1);
+    if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
+       printf("\r\n");
+       argv[0] = strsave(buf);
+       argv[1] = strsave("user");
+       argv[2] = strsave(uname);
+       if (status = sms_query("delete_member_from_list", 3, argv,
+                              scream, (char *) NULL)) {
+           printf("\r\n");
+           com_err(whoami, status, " found.\n");
+       }
+       else {
+           sprintf(buf, "User %s deleted from list\r", uname);
+           show_text(DISPROW+3, STARTCOL, buf);
+       }
+       currow=DISPROW+4;
+       show_text(DISPROW+4, STARTCOL, "Press any Key to continue...");
+       c = getchar();
+    }
+    clrwin(DISPROW);
+}
+/****************************************************/
+list_by_member(argc, argv)
+
+{
+char *argv[3];
+char *buf;
+char c;
+
+    argv[1] = strsave("user");
+    argv[2] = strsave(uname);
+    buf = (char *) calloc(BUFSIZ, 1);
+    sprintf(buf, "%s is on the following lists:\r", uname);
+    show_text(DISPROW, STARTCOL, buf);
+    mvcur(0,0,currow, STARTCOL);
+    refresh();
+    if (status = sms_query("get_lists_of_member", 2, argv+1,
+                          print_1, (char *) NULL)) {
+           printf("\r\n");
+           com_err(whoami, status, " in get_lists_of_member");
+    }
+    show_text(currow, STARTCOL, "Press any Key to continue...");
+    c = getchar();
+    clrwin(DISPROW);
+    return;
+}
+/****************************************************/
+show_all()
+{
+char c;
+
+    show_text(DISPROW, STARTCOL, "This function may take a while...proceed[y]?");
+    c = getchar();
+    if (c == 'n' || c == 'N') {
+       erase_line(DISPROW, STARTCOL);
+       return;
+    }
+    move(DISPROW+1, STARTCOL);
+    addstr("Processing query...please hold");
+    refresh();
+    list_all_groups();
+}
+
+/****************************************************/
+static int
+print_1(argc, argv, callback)
+       int argc;
+       char *argv[], *callback;
+{
+       char buf[BUFSIZ];
+
+       /* no newline 'cause Put_message adds one */
+       (void) sprintf(buf, "%s\r", argv[0]);
+       start_display(buf);
+
+       return (0);
+}
+/****************************************************/
+static int
+print_all(argc, argv, callback)
+       int argc;
+       char *argv[], *callback;
+{
+       char buf[BUFSIZ];
+       if (moreflg)
+           return;
+       if (first_time) {
+           erase_line(DISPROW+1, STARTCOL);
+           show_text(DISPROW+1, STARTCOL, "All mailing lists:");
+           first_time = 0;
+       }
+       (void) sprintf(buf, "%s\r", argv[0]);
+       start_display(buf);
+
+       return (0);
+}
+
+/****************************************************/
+list_all_groups()
+{
+
+    first_time = 1;
+    if (status = sms_query("get_all_visible_maillists", 0, (char **) NULL,
+                                print_all, (char *) NULL)) {
+       printf("\r\n");
+       com_err(whoami, status, " in list_all_groups\n");
+    }
+    end_display();
+
+    return (DM_NORMAL);                /* HA! */
+}
+/****************************************************/
+list_members()
+{
+    char *argv[1];
+    char *buf;
+    char buffer[80];
+
+    found_some = 0;
+    move(DISPROW, STARTCOL);
+    mvcur(0,0,DISPROW,STARTCOL);
+    refresh();
+    buf = (char *) calloc(LISTMAX, 1);
+    if (Prompt("Enter List Name: ", buf, LISTSIZE)==1) {
+       sprintf(buffer, "The members of list '%s' are:", buf);
+       show_text(DISPROW+1, STARTCOL, buffer);
+       argv[0] = buf;
+       if (status = sms_query("get_members_of_list", 1, argv,
+                              print_2, (char *) NULL)) {
+           printf("\r\n");
+           com_err(whoami, status, " found.\n");
+           currow++;
+       }
+       if (!found_some) {
+           show_text(currow, STARTCOL,"List is empty (no members).");
+           currow++;
+       }
+       end_display();
+       return;
+    }
+    clrwin(DISPROW);
+    return (DM_NORMAL);                /* HA! */
+}
+
+/****************************************************/
+static int
+print_2(argc, argv, callback)
+       int argc;
+       char *argv[], *callback;
+{
+       char buf[BUFSIZ];
+
+       found_some = 1;
+       (void) sprintf(buf, "%s %s", argv[0], argv[1]);
+       start_display(buf);
+
+       return (0);
+}
+/****************************************************/
+start_display(buff)
+char *buff;
+{
+char c;
+char *buffer;
+
+    num_members++;
+    if (moreflg)
+       return;
+    buffer = (char *) calloc(50, 1);
+    if (currow >= LINES-2) {
+       page++;
+       currow++;
+       mvcur(0,0,currow,STARTCOL);
+       refresh();
+       if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1) == 0) {
+           printf("Flushing query...");
+            moreflg = 1;
+           return(0);
+       }
+       clrwin(DISPROW+2);
+       currow = DISPROW+2;
+       sprintf(buffer, "Continued (Page %d)", page);
+       show_text(currow, STARTCOL, buffer);
+       currow++;
+       toggle = 0;
+    }
+    if (!toggle)
+       show_text(currow, STARTCOL, buff);
+    else {
+       show_text(currow, SECONDCOL, buff);
+       currow++;
+    }
+    toggle = !toggle;
+}
+/****************************************************/
+end_display()
+{
+char *buffer, c;
+
+    if (moreflg) {
+       clrwin(DISPROW);
+       return;
+    }
+
+    buffer = (char *) calloc(50, 1);
+    currow++;
+    sprintf(buffer, "End of List. %d Total Members\r", num_members);
+    show_text(currow, STARTCOL, buffer);
+    currow++;
+    show_text(currow, STARTCOL, "Press any key to continue...");
+    c = getchar();
+    clrwin(DISPROW);
+
+}
+/****************************************************/
+display_menu(menu)
+MENU *menu;
+{
+    int i;
+
+    cls();
+    title(menu->title);
+    mvcur(0,0,STARTROW, STARTCOL);
+    refresh();
+    for(i=0; i<=menu->num_items-1; i++) {
+       move(STARTROW+i, STARTCOL);
+       standend();
+       addstr(menu->items[i]);
+       refresh();
+    }
+    center_text(STARTROW+menu->num_items+2, 
+               "Enter a number, <up arrow>, or <down arrow>.");
+    if (!level)
+       center_text(STARTROW+menu->num_items+3, 
+              "Press 'q' to exit, <return> to confirm choice.");
+    else
+       center_text(STARTROW+menu->num_items+3, 
+              "Press 'q' to exit, 'r' for main menu, <return> to confirm choice.");
+
+    if (!level)
+       highlight(main_menu);
+}      
+
+/****************************************************/
+pack_main_menu()
+{
+char *buf;
+
+main_menu = (MENU *) malloc((unsigned) sizeof(MENU));
+main_menu->num_items = 7;
+main_menu->items = (char **) malloc((unsigned) sizeof(char *) * main_menu->num_items);
+
+buf = (char *) calloc(50, 1);
+sprintf(buf, "Mail List Program for %s", uname);
+main_menu->title = strsave(buf);
+main_menu->items[0] = strsave("1.  Show all mailing lists.");
+main_menu->items[1] = strsave("2.  Get all members of a mailing list.");
+main_menu->items[2] = strsave("3.  Display lists of which you are a member.");
+main_menu->items[3] = strsave("4.  Show description of list.");
+main_menu->items[4] = strsave("5.  Add yourself to a mailing list.");
+main_menu->items[5] = strsave("6.  Delete yourself from a mailing list.");
+main_menu->items[6] = strsave("q.  Quit.");
+}
+
+/****************************************************/
+pack_help_menu()
+{
+help_menu = (MENU *) malloc((unsigned) sizeof(MENU));
+help_menu->num_items = 5;
+help_menu->items = (char **) malloc((unsigned) sizeof(char *) * help_menu->num_items);
+
+help_menu->title = strsave("madm is designed as a basic mail list administration program.");
+help_menu->items[0] = strsave("if you need to perform more advanced list manipulation like");
+help_menu->items[1] = strsave("adding lists, or changing list characteristics, refer to the");
+help_menu->items[2] = strsave("program listmaint.");
+help_menu->items[3] = strsave(" ");
+help_menu->items[4] = strsave("Press any key to continue.");
+}
+/****************************************************/
+func_help_menu()
+{
+int i;
+char c;
+
+show_text(currow, STARTCOL, help_menu->title);
+for(i=0;i<=help_menu->num_items-1;i++) {
+    currow++;
+    show_text(currow, STARTCOL, help_menu->items[i]);
+}
+c=getchar();
+clrwin(DISPROW);
+}
+/****************************************************/
+highlight(menu)
+MENU *menu;
+{
+
+
+    if (oldpos[level] != position[level]) {
+       move(STARTROW+oldpos[level]-1, STARTCOL);
+       standend();
+       addstr(menu->items[oldpos[level]-1]);
+       refresh();
+    }
+
+    move(STARTROW+position[level]-1, STARTCOL);
+    standout();
+    addstr(menu->items[position[level]-1]);
+    refresh();
+    standend();
+    refresh();
+}
+
+/****************************************************/
+title(buff)
+char *buff;
+{  
+    move(0, MAX(0, (COLS - strlen(buff))>>1));
+    standout();
+    addstr(buff);
+    refresh();
+    standend();
+}
+/****************************************************/
+rvid(row, buff)
+int row;
+char *buff;
+{
+    move(row, STARTCOL);
+    mvcur(0,0,row,STARTCOL);
+    addstr(buff);
+    standout();
+    refresh();
+    move(row, STARTCOL);
+    mvcur(0,0,row,STARTCOL);
+    refresh();
+    printf("%s", buff);
+    standend();
+    refresh();
+}
+
+
+/****************************************************/
+center_text(row, buff)
+int row;
+char *buff;
+{
+    move(row, MAX(0, (COLS - strlen(buff))>>1));
+    addstr(buff);
+    refresh();
+}
+
+/****************************************************/
+show_text(row, col, buff)
+int row, col;
+char *buff;
+{
+    mvcur(0,0,row,col);
+    refresh();
+    printf("%s", buff);
+}
+
+/****************************************************/
+erase_line(row, col)
+int row, col;
+{
+char *buff;
+int i;
+
+    buff = (char *) calloc(COLS, 1);
+    for(i=0; i<=COLS-2; i++)
+       buff[i] = ' ';
+    buff[i] = 0;     /* just to be sure ! */
+    move(row, col);
+    mvcur(0,0,row,col);
+    printf("%s", buff);
+    refresh();
+}
+
+/****************************************************/
+cls()
+{
+    clear();
+    refresh();
+}
+
+/****************************************************/
+clrwin(erase_row)
+int erase_row;
+{
+int i; 
+char *buff;
+int maxcol;
+
+    maxcol = COLS;
+    if (maxcol > 80)
+       maxcol = 80;    /* limit width */
+
+    buff = (char *) calloc(maxcol+1, 1);
+    for(i=0; i<=maxcol-1; i++)
+       buff[i] = ' ';
+    buff[i] = 0;     /* just to be sure ! */
+    mvcur(0,0,erase_row, STARTCOL);
+    refresh();
+    for(i=erase_row; i<=currow-1; i++) {
+       printf("%s\n\r", buff);
+    }
+    printf("%s", buff); 
+    mvcur(erase_row,STARTCOL,STARTROW+oldpos[level]-1, STARTCOL);
+    refresh();
+}
+
+/****************************************************/
+char *strsave(s)
+     char *s;
+{
+    char *p;
+    
+    if ((p = (char *) calloc(1, strlen(s)+1)) != NULL) {
+        strcpy(p, s);
+    }
+    else
+        printf("error in alloc\n\r");
+    return(p);
+}
+/****************************************************/
+/* jean's routine ??? */
+static void scream()
+{
+       com_err(whoami, status, "\nAn SMS update returned a value -- programmer \
+botch\n");
+       sms_disconnect();
+       exit(1);
+}
+/****************************************************/
+static int fetch_list_info(list, li)
+char *list;
+List_info *li;
+{
+    char *argv[1];
+
+    argv[0] = list;
+    if ((status = sms_query("get_list_info", 1, argv,
+                           get_list_info, (char *) NULL)) == 0) {
+       return status;
+    }
+    else {
+       com_err(whoami, status, " found.\n");
+       return status;
+    }
+}
+
+/* ARGSUSED */
+static int get_list_info(argc, argv)
+int argc;
+char **argv;
+{
+
+       if (current_li->acl)
+         free(current_li->acl);
+       current_li->acl = strsave(argv[2]);
+       if (current_li->desc)
+         free(current_li->desc);
+       current_li->desc = strsave(argv[3]);
+       if (current_li->expdate)
+         free(current_li->expdate);
+       current_li->expdate = strsave(argv[4]);
+       return (0);
+}
+
+
+
+
+/****************************************************/
+/* Prompt the user for input */
+int Prompt(prompt, buf, buflen)
+    char *prompt;
+    char *buf;
+    int buflen;
+{
+    int c;
+    char *p;
+    int y, x, oldx;
+
+    printf("%s", prompt);
+    refresh();
+    for (p = buf; abs(strlen(p)-strlen(buf)) <= buflen;) {
+       refresh();
+       c = getchar();
+       switch (c) {
+       case CTL('C'):
+           return 0;
+       case CTL('Z'):
+           return 0;
+       case CTL('L'):
+           cls();
+           display_menu(main_menu);
+           return 0;
+       case '\n':
+       case '\r':
+            printf("\r");
+           *p = '\0';
+           if (strlen(buf) < 1)    /* only /n or /r in buff */ 
+               return -1;
+           else
+               return 1;
+       case '\b':
+       case '\177':
+           if (p > buf) {
+               p--;
+               x--;
+               printf("\b");
+               printf(" ");
+               printf("\b");
+           }
+           break;
+       case CTL('U'):
+       case CTL('G'):
+       case CTL('['):
+           x = oldx;
+           p = buf;
+           break;
+       default:
+           if (abs(strlen(p)-strlen(buf)) >= buflen) {
+               printf("%c", 7);
+               break;
+           }
+           if (isprint(c)) {
+               (void) addch(c);
+               *p++ = c;
+               x++;
+           } else
+               putchar(CTL('G'));
+           break;
+       }
+    }
+}
+
+/*
+ * duplicate string 
+ */
+char *ds(str)
+       char *str;
+{
+       register char *newstr = malloc((unsigned) strlen(str) + 1);
+
+       if (newstr == (char *) NULL)
+               return ((char *) NULL);
+       else
+               return (strcpy(newstr, str));
+}
+
+int bool_query(name, argc, argv)
+char *name;
+int argc;
+char *argv[];
+{
+    int result = 0;
+    sms_query(name, argc, argv, bool_answer, (caddr_t) &result);
+    return result;
+}
+
+static int bool_answer(argc, argv, arg)
+int argc;
+char *argv[];
+caddr_t arg;
+{
+    int *result = (int *) arg;
+    if (strcmp(argv[0], "true") == 0)
+      *result = 1;
+    else if (strcmp(argv[0], "false") == 0) 
+      *result = 0;
+    return;
+}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-indent-level: 4
+ * c-continued-statement-offset: 4
+ * c-brace-offset: -4
+ * c-argdecl-indent: 4
+ * c-label-offset: -4
+ * End: 
+ */
This page took 0.087272 seconds and 5 git commands to generate.