home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / comms_networking / users / Users / c / user
Encoding:
Text File  |  1998-01-01  |  3.5 KB  |  198 lines

  1. /* user.c
  2.  * User management functions
  3.  * Users source code
  4.  * (c) Chris Rutter 1997
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include "user.h"
  11.  
  12. #ifdef __riscos
  13. char user_file[] = "<Users$Database>";
  14. #else
  15. char user_file[] = "/etc/users.db";
  16. #endif /* __riscos */
  17.  
  18. user *user_enumerate ()
  19. {
  20.     static FILE *fp;
  21.     static user u;
  22.     int b;
  23.  
  24.     if (!fp) fp=fopen(user_file, "r");
  25.     if (!fp)
  26.     {
  27.         fprintf (stderr, "user_enumerate: Couldn't open %s.\n", user_file);
  28.         return NULL;
  29.     }
  30.  
  31.     b=user_read_line(fp,&u);
  32.     if (!b) fclose (fp);
  33.     else return &u;
  34.     return 0;
  35. }
  36.  
  37. user *user_get_info (char *username)
  38. {
  39.     FILE *fp=fopen(user_file,"r");
  40.     static user u;
  41.  
  42.     if (!fp)
  43.     {
  44.         fprintf (stderr, "user_get_info: Couldn't open %s.\n", user_file);
  45.         return NULL;
  46.     }        
  47.  
  48.     while (user_read_line (fp, &u))
  49.     {
  50.         if (!strcmp (u.username, username)) return &u;
  51.     }
  52.  
  53.     fclose (fp);
  54.     return 0;
  55. }
  56.  
  57. int user_read_line (FILE *fp, user *u)
  58. {
  59.     static char buf[4096];
  60.     fgets (buf, 4096, fp);
  61.     if (feof(fp)||ferror(fp)) return 0;
  62.     sscanf (buf, "%31[^: ]:%31[^:]:%127[^:]:%d:%d:%255[^\n]\n", u->username, u->password, u->realName, &u->uid, &u->gid, u->homeDir);
  63.     return 1;
  64. }
  65.  
  66. int user_write_line (user *u)
  67. {
  68.     FILE *fp=fopen (user_file,"a+");
  69.     int e;
  70.  
  71.     if (!fp)
  72.     {
  73.         fprintf (stderr, "user_write_line: Couldn't open %s.\n", user_file);
  74.         return 0;
  75.     }
  76.  
  77.     fprintf (fp, "%s:%s:%s:%d:%d:%s\n", u->username, u->password, u->realName, u->uid, u->gid, u->homeDir);
  78.     e=!ferror(fp);
  79.     fclose (fp);
  80.     return e;
  81. }
  82.  
  83. user *user_verify (char *nm, char *pw)
  84. {
  85.     user *u=user_get_info (nm);
  86.     if (!u) return 0;
  87.     if (!strcmp (user_crypt (pw), u->password)) return u;
  88.     return 0;
  89. }
  90.  
  91. char *user_crypt (char *c)
  92. {
  93.     static char buf[256];
  94.     int n,l=strlen(c);
  95.  
  96.     if (strlen (c)>255)
  97.     {
  98.         fprintf (stderr, "user_crypt: String too long.\n");
  99.         buf[0]=0;
  100.         return (char *) buf;
  101.     }
  102.  
  103.     for (n=0; n<l; n++)
  104.     {
  105.         /* lossy one-way crypt algorithm */
  106.         buf[n]=c[n]^c[n+1];
  107.         if (buf[n]==':') buf[n]='.';
  108.         else while (buf[n]<32 || buf[n]>126)
  109.         {
  110.             if (buf[n]<32) buf[n]=126-buf[n];
  111.             if (buf[n]>126) buf[n]=buf[n]/2;
  112.         }
  113.     }
  114.  
  115.     return (char *) buf;
  116. }
  117.  
  118. /* substitute GNU readline, or something */
  119. #ifdef __riscos
  120. int user__echoFlag=1;
  121. void user__cOff(void) {user__echoFlag=0;}
  122. void user__cOn(void) {user__echoFlag=1;}
  123. __swi (0x004) int user__os_readc(void);
  124. __swi (0x108) void user__bs(void);
  125. int user__getc(FILE *fp)
  126. {
  127.     int a=user__os_readc();
  128.     if (user__echoFlag)
  129.     {
  130.         if (a!=8) putc(a,stdout);
  131.         if (a==13) putc(10,stdout);
  132.     }
  133.     return a;
  134. }
  135. #else
  136. /* these probably need changing for other platforms */
  137. void user__cOff() {};
  138. void user__cOn() {};
  139. void user__bs() {putc(8,stdout);}
  140. int user__getc(FILE *fp) {return getc(fp)};
  141. #endif /* __riscos */
  142.  
  143. void user_scanf (char *buf, size_t max, int echo)
  144. {
  145.     /* replace all this with a proper line-editor call */
  146.  
  147.     int c,n=0;
  148.  
  149.     if (!echo) user__cOff();
  150.  
  151.     loop:
  152.         c=user__getc(stdin);
  153.         if (c==8)
  154.         {
  155.             n--;
  156.             if (echo) user__bs();
  157.             goto loop;
  158.         }
  159.         if (c==0||c==10||c==13||c>255) goto end;
  160.         buf[n++]=c;
  161.         if (n>=max)
  162.         {
  163.             /* buffer overflow */
  164.             fprintf (stderr, "user_scanf: Buffer overflow.\n");
  165.             n--;
  166.         }
  167.         else goto loop;
  168.  
  169.     end:
  170.         buf[n]=0;
  171.         if (!echo)
  172.         {
  173.             user__cOn();
  174.             putc ('\n', stdout);
  175.         }
  176. }
  177.  
  178. void user_log (char *f, char *s)
  179. {
  180.     FILE *fp=fopen(f,"a+");
  181.     time_t t;
  182.     struct tm *tm;
  183.     char tb[256];
  184.  
  185.     if (!fp)
  186.     {
  187.         fprintf (stderr, "user_log: Failed to open %s.\n", f);
  188.         return;
  189.     }
  190.  
  191.     t=time(&t);
  192.     tm=localtime(&t);
  193.     strftime (tb, 256, "%d %b %H:%M:%S", tm);
  194.  
  195.     fprintf (fp, "%s %s\n", tb, s);
  196.     fclose (fp);
  197. }
  198.