home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CCP / LOGON12.LBR / LOGUTIL.CQ / LOGUTIL.C
Text File  |  2000-06-30  |  6KB  |  267 lines

  1. /* logutil.c 
  2.  
  3.  
  4. note: must link REL to newlib/s
  5.  
  6. */
  7.  
  8. #include "printf.h"
  9.  
  10.  
  11.  
  12. #define TITLE "Logon Version 1.2, by David C. Oshel\n\nUser Maintenance Utility"
  13. #define BDRIV 14 /* bdos select disk   */
  14. #define BUSER 32 /* bdos set user code */
  15. #define MAXUSERS 64
  16. #define TRUE 1
  17. #define FALSE 0
  18. #define USERFILE "LOGON.USR"
  19. #define UFD 0
  20. #define UFU 15 /* selects A15: for userfile */
  21.  
  22. static int new;
  23.  
  24. static struct users {
  25.     char uname[20];
  26.     char passw[20];
  27.     char progr[20];
  28.     char parms[80];
  29.     int  usdr, uusr;
  30.     }
  31.     *login[MAXUSERS],
  32.     *log;
  33.  
  34.  
  35.  
  36. main( argc, argv ) int argc; char *argv[]; {
  37.  
  38.     init_lib();
  39.     ONinterrupt();
  40.  
  41.     getable(); sort();
  42.  
  43.     clr_screen(); 
  44.     printf("%s\n\nEnter \"?\" for user list.\n\n",TITLE);
  45.     while ( updatu() ) { sort(); putable(); }
  46.  
  47.     exit();
  48.  
  49. } /* end: main */
  50.  
  51.  
  52.  
  53.  
  54.  
  55. updatu() {
  56.  
  57. struct users temp; char p[4];
  58.  
  59. zoo:    printf("\nUser name (or CR to quit): ");
  60.     getu(temp.uname,15);
  61.     if (strlen(temp.uname) == 0) return (FALSE);
  62.     if (index(temp.uname,"?") >= 0) { listit(); goto zoo; }
  63.  
  64.     if ( getwho(temp.uname) >= 0 ) {
  65.         if (!new ) {
  66.             printf("\nFOUND!\n"); show( log );
  67.             if (!ask("\nAny changes? ")) goto zoo;
  68.             if (ask("\nDelete this user? ")) {
  69.             if (ask("Delete user...are you sure? ")) {
  70.                 printf("Deleted!\n");
  71.                 strcpy(log->uname,"");
  72.                 return (TRUE);
  73.             }}
  74.             else strcpy(temp.uname, log->uname);
  75.             if (ask("Change password? ")) {
  76.                 printf("New password (*=hidden public): ");
  77.                 getu(temp.passw,15);
  78.                 printf("Change noted!\n");
  79.             }
  80.             else strcpy(temp.passw, log->passw);
  81.         }
  82.         else { /* new user */
  83.             printf("\nNEW USER: %s\n",temp.uname);
  84.             if (!ask("Add this user? ")) goto zoo;
  85.             printf("New password (*=hidden public): "); 
  86.             getu(temp.passw,15);
  87.         }
  88.         printf("\nEnter Startup Info:\n\n");
  89.         printf("Startup program name, e.g., MBASIC (no .COM, please): ");
  90.         getu(temp.progr,9);
  91.         printf("Parameters ($=user will be prompted): ");
  92.         getu(temp.parms,78);
  93.         printf("Startup drive, A or B: ");
  94.         getu(p,1);
  95.         temp.usdr = strlen(p);
  96.         if (temp.usdr) {
  97.             if (toupper(p[0]) == 'B') temp.usdr = 1; 
  98.             else temp.usdr = 0;
  99.         }
  100.         printf("Startup user area, 0-15 : ");
  101.         getu(p,2);
  102.         temp.uusr = atoi(p);
  103.         if (temp.uusr < 0 || temp.uusr > 15) temp.uusr = 0;
  104.         
  105.         if ( verify( &temp ) ) {
  106.             strcpy(log->uname,temp.uname);
  107.             strcpy(log->passw,temp.passw);
  108.             strcpy(log->progr,temp.progr);
  109.             strcpy(log->parms,temp.parms);
  110.             log->usdr = temp.usdr;
  111.             log->uusr = temp.uusr;
  112.             return (TRUE); 
  113.         }
  114.         else goto zoo;
  115.     }
  116.     else return( FALSE ); /* list full or nothing entered, quit */
  117.  
  118. } /* end: updatu */
  119.  
  120.  
  121. verify( z ) struct users *z; {
  122.  
  123.     printf("\n\nYou have requested: \n\n"); 
  124.     show( z );
  125.     return (ask("\nIs everything ok? "));
  126.  
  127. } /* end: verify */
  128.  
  129.  
  130. show( z ) struct users *z; {
  131.  
  132.     printf("User Name: %s\n",z->uname);
  133.     printf("Password : %s\n",z->passw);
  134.     printf("Startup Program: %s%d:",((z->usdr == 0) ? "A" : "B"),z->uusr);
  135.     printf("%s %s\n",z->progr,z->parms);
  136.  
  137. } /* end: show */
  138.  
  139.  
  140. getwho(p) char *p; {
  141.  
  142. int i;
  143.  
  144.     new = TRUE;
  145.     for (i = 0; i < MAXUSERS; i++) {  /* check for existing user */
  146.         log = login[i];
  147.         if ( strcmp(p,log->uname) == 0  ) 
  148.             { new = FALSE; break; }
  149.     }
  150.     if (new) { /* not there, is there room in the list to add it? */
  151.         for (i = 0; i < MAXUSERS; i++) {
  152.             log = login[i];
  153.             if (strlen(log->uname) == 0) break;
  154.         }
  155.     }
  156.     if (i == MAXUSERS) return (-1); else return (i);
  157.  
  158. } /* end: getwho */
  159.  
  160.  
  161.  
  162.  
  163. getable() {
  164.  
  165. int i, j, k, file; char *glog;
  166.  
  167.     k = sizeof(struct users);
  168.     bdos(BDRIV,UFD);
  169.     bdos(BUSER,UFU); 
  170.     if ( rename(USERFILE,USERFILE) == -1 ) {
  171.         /* create blank table, create user file */
  172.         file = fopen(USERFILE,"wb");
  173.         for (i = 0; i < MAXUSERS; i++) {
  174.             for (j = 0; j < k; j++) putc(0,file);
  175.         }
  176.         fclose (file);
  177.     }
  178.  
  179.     file = fopen(USERFILE,"rb");
  180.  
  181.     for (i = 0; i < MAXUSERS; i++) {
  182.         login[i] = alloc( k );
  183.         glog = (char *) login[i];
  184.         for (j = 0; j < k; j++) *glog++ = toupper( getc(file) );
  185.     }
  186.     fclose( file );
  187.  
  188.  
  189. } /* end: getable */
  190.  
  191.  
  192. putable() {
  193.  
  194. int i, j, k, file; char *plog;
  195.  
  196.     k = sizeof(struct users);
  197.     bdos(BDRIV,UFD);
  198.     bdos(BUSER,UFU); 
  199.     file = fopen(USERFILE,"ub");
  200.     for (i = 0; i < MAXUSERS; i++) {
  201.         plog = (char *) login[i];
  202.         for (j = 0; j < k; j++ ) putc(*plog++,file);
  203.     }
  204.     fclose( file );
  205.  
  206. } /* end: putable */
  207.  
  208.  
  209. listit() {
  210.  
  211. int ch, i, lst, u;
  212.  
  213.  
  214.     lst = ask("\n*** USER LIST:  Do you want a printout? ");
  215.     if (lst) ONscript();
  216.     u = 0;
  217.     printf("\nNum        User Name       Password  Startup Program\n\n");
  218.     for (i = 0; i < MAXUSERS; i++) {
  219.         log = login[i];
  220.         if (strlen(log->uname) > 0) {
  221.             printf("%3d. %15s%15s  ",++u,log->uname,log->passw);    
  222.             printf("%s%d:",((log->usdr == 0) ? "A" : "B"),log->uusr);
  223.             printf("%s %s\n",log->progr,log->parms); 
  224.             if (!lst && !(u % 20)) { 
  225.                 printf("(more)"); 
  226.                 while (!(ch = getc(0))) 
  227.                 /* wait for direct console keystroke */
  228.                 ; 
  229.                 printf("\008\008\008\008\008\008");
  230.                 if (ch == 3 || ch == 27) break; /* long list */
  231.             }        
  232.         }
  233.     }
  234.     OFFscript();
  235.  
  236. } /* end: listit */
  237.  
  238.  
  239. getu( p,len ) char *p; int len; {
  240.  
  241.     gets(p,len);
  242.     while (*p) *p = toupper(*p++);
  243.  
  244. } /* end: getu */ 
  245.  
  246.  
  247.  
  248. sort() {
  249.  
  250. static struct users *p,*q; static int i, j;
  251.  
  252.     for (i = 0; i < MAXUSERS-1; i++) 
  253.  
  254.     for (j = i+1; j < MAXUSERS; j++) {
  255.  
  256.         p = login[i];
  257.         q = login[j];
  258.  
  259.         if (strcmp(p->uname,q->uname) > 0) { 
  260.             login[i] = q;
  261.             login[j] = p;
  262.         }
  263.     }
  264.  
  265. } /* end: sort */
  266.  
  267.