home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff294.lzh / DNet / amiga / server / spasswd.c < prev    next >
C/C++ Source or Header  |  1989-12-11  |  3KB  |  180 lines

  1.  
  2. /*
  3.  *  SPASSWD.C
  4.  *
  5.  *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  6.  *
  7.  *  PASSWORD SERVER
  8.  *
  9.  *  user-password entry.  USER entries in s:dnet.config are scanned for
  10.  *  a match and the various dnet enviroment variables are set accordingly.
  11.  */
  12.  
  13. #include "defs.h"
  14.  
  15. int do_password ARGS((void *));
  16. void DPuts ARGS((void *, char *));
  17. int DGetLine ARGS((void *, char *, short));
  18.  
  19. int
  20. brk()
  21. {
  22.     return(0);
  23. }
  24.  
  25. void
  26. #ifdef LATTICE
  27. _main(str)
  28. #else
  29. _main(len,str)
  30. #endif
  31. char *str;
  32. {
  33.     struct MsgPort *port;
  34.     PROC    *myproc = (PROC *)FindTask(NULL);
  35.     void    *chan;
  36.     long    mask, rmask;
  37.     short   res;
  38.  
  39.     onbreak(brk);
  40.  
  41.     if (strncmp(str, "__dnet", 6) != 0) {
  42.     Version("SPasswd", VERSION, SPASSWD_VERSION);
  43.     _exit(0);
  44.     }
  45.  
  46.     port = DListen(PORT_PASSWD);
  47.     WaitPort(&myproc->pr_MsgPort);
  48.     ReplyMsg(GetMsg(&myproc->pr_MsgPort));
  49.  
  50.     mask = SIGBREAKF_CTRL_C|(1 << port->mp_SigBit);
  51.     for (;;) {
  52.     rmask = Wait(mask);
  53.     if (rmask & SIGBREAKF_CTRL_C)
  54.         break;
  55.     while (chan = DAccept(port)) {
  56.         res = do_password(chan);
  57.         Delay(10L);     /*  prevent name scan   */
  58.         if (res)
  59.         DPuts(chan, "user-password accepted\n");
  60.         else
  61.         DPuts(chan, "user-password failed\n");
  62.         Delay(50L);     /*  prevent name scan   */
  63.         DClose(chan);
  64.     }
  65.     }
  66.     DUnListen(port);
  67. }
  68.  
  69. int
  70. do_password(chan)
  71. void *chan;
  72. {
  73.     static char user[64];
  74.     static char pass[64];
  75.     static char buf[128];
  76.     static char suser[64];
  77.     static char spass[64];
  78.     short res;
  79.     long fh;
  80.     short i, n;
  81.     int s_level, s_read, s_write;
  82.  
  83.     DPuts(chan, "User Name: ");
  84.     res = DGetLine(chan, user, 64);
  85.     if (res < 0)
  86.     return(0);
  87.     DIoctl(chan, CIO_MODE, 0, 0);
  88.     DPuts(chan, "Password : ");
  89.     res = DGetLine(chan, pass, 64);
  90.     DIoctl(chan, CIO_MODE, 7, 0);
  91.     if (res < 0)
  92.     return(0);
  93.  
  94.     /*
  95.      *    search for USER entry in s:dnet.config
  96.      */
  97.  
  98.     fh = Open("s:dnet.config", 1005);
  99.     if (fh == NULL) {
  100.     DPuts(chan, "s:dnet.config does not exist\n");
  101.     return(0);
  102.     }
  103.     while ((n = Read(fh, buf, 256)) > 0) {
  104.     for (i = 0; i < n - 1; ++i) {
  105.         if (buf[i] == '\n')
  106.         break;
  107.     }
  108.     buf[i] = 0;
  109.     Seek(fh, (i + 1) - n, 0);
  110.     if (strncmp(buf, "USER", 4) == 0) {
  111.         suser[0] = spass[0] = 0;
  112.         s_level = s_read = s_write = 0;
  113.         sscanf(buf + 4, "%s %s %d %d %d", suser, spass, &s_level, &s_read, &s_write);
  114.         if (strcmp(user, suser) == 0 && strcmp(pass, spass) == 0) {
  115.         Close(fh);
  116.         sprintf(buf, "%d", s_level);
  117.         SetDEnv(DNET_LEVEL, buf);
  118.         sprintf(buf, "%d", s_read);
  119.         SetDEnv(DNET_READ, buf);
  120.         sprintf(buf, "%d", s_write);
  121.         SetDEnv(DNET_WRITE, buf);
  122.         return(1);
  123.         }
  124.     }
  125.     }
  126.     Close(fh);
  127.     return(0);
  128. }
  129.  
  130. void
  131. DPuts(chan, str)
  132. void *chan;
  133. char *str;
  134. {
  135.     DWrite(chan, str, strlen(str));
  136. }
  137.  
  138. int
  139. DGetLine(chan, buf, max)
  140. void *chan;
  141. char *buf;
  142. short max;
  143. {
  144.     short i = 0;
  145.     short n;
  146.     short notdone = 1;
  147.     char c;
  148.  
  149.     while (notdone) {
  150.     n = DRead(chan, &c, 1);
  151.     if (n == 0) {   /*  ioctl, ignore   */
  152.         short pv;
  153.         char pa;
  154.         DGetIoctl(chan, &pv, &pa);
  155.         continue;
  156.     }
  157.     if (n < 0) {
  158.         buf[i] = 0;
  159.         return(-1);
  160.     }
  161.     switch(c) {
  162.     case 8:     /*    BS  */
  163.         if (i)
  164.         --i;
  165.         break;
  166.     case 10:    /*    eol */
  167.     case 13:
  168.         notdone = 0;
  169.         break;
  170.     default:
  171.         if (i < max - 1)
  172.         buf[i++] = c;
  173.         break;
  174.     }
  175.     }
  176.     buf[i] = 0;
  177.     return(1);
  178. }
  179.  
  180.