/* logutil.c note: must link REL to newlib/s */ #include "printf.h" #define TITLE "Logon Version 1.2, by David C. Oshel\n\nUser Maintenance Utility" #define BDRIV 14 /* bdos select disk */ #define BUSER 32 /* bdos set user code */ #define MAXUSERS 64 #define TRUE 1 #define FALSE 0 #define USERFILE "LOGON.USR" #define UFD 0 #define UFU 15 /* selects A15: for userfile */ static int new; static struct users { char uname[20]; char passw[20]; char progr[20]; char parms[80]; int usdr, uusr; } *login[MAXUSERS], *log; main( argc, argv ) int argc; char *argv[]; { init_lib(); ONinterrupt(); getable(); sort(); clr_screen(); printf("%s\n\nEnter \"?\" for user list.\n\n",TITLE); while ( updatu() ) { sort(); putable(); } exit(); } /* end: main */ updatu() { struct users temp; char p[4]; zoo: printf("\nUser name (or CR to quit): "); getu(temp.uname,15); if (strlen(temp.uname) == 0) return (FALSE); if (index(temp.uname,"?") >= 0) { listit(); goto zoo; } if ( getwho(temp.uname) >= 0 ) { if (!new ) { printf("\nFOUND!\n"); show( log ); if (!ask("\nAny changes? ")) goto zoo; if (ask("\nDelete this user? ")) { if (ask("Delete user...are you sure? ")) { printf("Deleted!\n"); strcpy(log->uname,""); return (TRUE); }} else strcpy(temp.uname, log->uname); if (ask("Change password? ")) { printf("New password (*=hidden public): "); getu(temp.passw,15); printf("Change noted!\n"); } else strcpy(temp.passw, log->passw); } else { /* new user */ printf("\nNEW USER: %s\n",temp.uname); if (!ask("Add this user? ")) goto zoo; printf("New password (*=hidden public): "); getu(temp.passw,15); } printf("\nEnter Startup Info:\n\n"); printf("Startup program name, e.g., MBASIC (no .COM, please): "); getu(temp.progr,9); printf("Parameters ($=user will be prompted): "); getu(temp.parms,78); printf("Startup drive, A or B: "); getu(p,1); temp.usdr = strlen(p); if (temp.usdr) { if (toupper(p[0]) == 'B') temp.usdr = 1; else temp.usdr = 0; } printf("Startup user area, 0-15 : "); getu(p,2); temp.uusr = atoi(p); if (temp.uusr < 0 || temp.uusr > 15) temp.uusr = 0; if ( verify( &temp ) ) { strcpy(log->uname,temp.uname); strcpy(log->passw,temp.passw); strcpy(log->progr,temp.progr); strcpy(log->parms,temp.parms); log->usdr = temp.usdr; log->uusr = temp.uusr; return (TRUE); } else goto zoo; } else return( FALSE ); /* list full or nothing entered, quit */ } /* end: updatu */ verify( z ) struct users *z; { printf("\n\nYou have requested: \n\n"); show( z ); return (ask("\nIs everything ok? ")); } /* end: verify */ show( z ) struct users *z; { printf("User Name: %s\n",z->uname); printf("Password : %s\n",z->passw); printf("Startup Program: %s%d:",((z->usdr == 0) ? "A" : "B"),z->uusr); printf("%s %s\n",z->progr,z->parms); } /* end: show */ getwho(p) char *p; { int i; new = TRUE; for (i = 0; i < MAXUSERS; i++) { /* check for existing user */ log = login[i]; if ( strcmp(p,log->uname) == 0 ) { new = FALSE; break; } } if (new) { /* not there, is there room in the list to add it? */ for (i = 0; i < MAXUSERS; i++) { log = login[i]; if (strlen(log->uname) == 0) break; } } if (i == MAXUSERS) return (-1); else return (i); } /* end: getwho */ getable() { int i, j, k, file; char *glog; k = sizeof(struct users); bdos(BDRIV,UFD); bdos(BUSER,UFU); if ( rename(USERFILE,USERFILE) == -1 ) { /* create blank table, create user file */ file = fopen(USERFILE,"wb"); for (i = 0; i < MAXUSERS; i++) { for (j = 0; j < k; j++) putc(0,file); } fclose (file); } file = fopen(USERFILE,"rb"); for (i = 0; i < MAXUSERS; i++) { login[i] = alloc( k ); glog = (char *) login[i]; for (j = 0; j < k; j++) *glog++ = toupper( getc(file) ); } fclose( file ); } /* end: getable */ putable() { int i, j, k, file; char *plog; k = sizeof(struct users); bdos(BDRIV,UFD); bdos(BUSER,UFU); file = fopen(USERFILE,"ub"); for (i = 0; i < MAXUSERS; i++) { plog = (char *) login[i]; for (j = 0; j < k; j++ ) putc(*plog++,file); } fclose( file ); } /* end: putable */ listit() { int ch, i, lst, u; lst = ask("\n*** USER LIST: Do you want a printout? "); if (lst) ONscript(); u = 0; printf("\nNum User Name Password Startup Program\n\n"); for (i = 0; i < MAXUSERS; i++) { log = login[i]; if (strlen(log->uname) > 0) { printf("%3d. %15s%15s ",++u,log->uname,log->passw); printf("%s%d:",((log->usdr == 0) ? "A" : "B"),log->uusr); printf("%s %s\n",log->progr,log->parms); if (!lst && !(u % 20)) { printf("(more)"); while (!(ch = getc(0))) /* wait for direct console keystroke */ ; printf("\008\008\008\008\008\008"); if (ch == 3 || ch == 27) break; /* long list */ } } } OFFscript(); } /* end: listit */ getu( p,len ) char *p; int len; { gets(p,len); while (*p) *p = toupper(*p++); } /* end: getu */ sort() { static struct users *p,*q; static int i, j; for (i = 0; i < MAXUSERS-1; i++) for (j = i+1; j < MAXUSERS; j++) { p = login[i]; q = login[j]; if (strcmp(p->uname,q->uname) > 0) { login[i] = q; login[j] = p; } } } /* end: sort */