home *** CD-ROM | disk | FTP | other *** search
- /* user.c
- * User management functions
- * Users source code
- * (c) Chris Rutter 1997
- */
-
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #include "user.h"
-
- #ifdef __riscos
- char user_file[] = "<Users$Database>";
- #else
- char user_file[] = "/etc/users.db";
- #endif /* __riscos */
-
- user *user_enumerate ()
- {
- static FILE *fp;
- static user u;
- int b;
-
- if (!fp) fp=fopen(user_file, "r");
- if (!fp)
- {
- fprintf (stderr, "user_enumerate: Couldn't open %s.\n", user_file);
- return NULL;
- }
-
- b=user_read_line(fp,&u);
- if (!b) fclose (fp);
- else return &u;
- return 0;
- }
-
- user *user_get_info (char *username)
- {
- FILE *fp=fopen(user_file,"r");
- static user u;
-
- if (!fp)
- {
- fprintf (stderr, "user_get_info: Couldn't open %s.\n", user_file);
- return NULL;
- }
-
- while (user_read_line (fp, &u))
- {
- if (!strcmp (u.username, username)) return &u;
- }
-
- fclose (fp);
- return 0;
- }
-
- int user_read_line (FILE *fp, user *u)
- {
- static char buf[4096];
- fgets (buf, 4096, fp);
- if (feof(fp)||ferror(fp)) return 0;
- sscanf (buf, "%31[^: ]:%31[^:]:%127[^:]:%d:%d:%255[^\n]\n", u->username, u->password, u->realName, &u->uid, &u->gid, u->homeDir);
- return 1;
- }
-
- int user_write_line (user *u)
- {
- FILE *fp=fopen (user_file,"a+");
- int e;
-
- if (!fp)
- {
- fprintf (stderr, "user_write_line: Couldn't open %s.\n", user_file);
- return 0;
- }
-
- fprintf (fp, "%s:%s:%s:%d:%d:%s\n", u->username, u->password, u->realName, u->uid, u->gid, u->homeDir);
- e=!ferror(fp);
- fclose (fp);
- return e;
- }
-
- user *user_verify (char *nm, char *pw)
- {
- user *u=user_get_info (nm);
- if (!u) return 0;
- if (!strcmp (user_crypt (pw), u->password)) return u;
- return 0;
- }
-
- char *user_crypt (char *c)
- {
- static char buf[256];
- int n,l=strlen(c);
-
- if (strlen (c)>255)
- {
- fprintf (stderr, "user_crypt: String too long.\n");
- buf[0]=0;
- return (char *) buf;
- }
-
- for (n=0; n<l; n++)
- {
- /* lossy one-way crypt algorithm */
- buf[n]=c[n]^c[n+1];
- if (buf[n]==':') buf[n]='.';
- else while (buf[n]<32 || buf[n]>126)
- {
- if (buf[n]<32) buf[n]=126-buf[n];
- if (buf[n]>126) buf[n]=buf[n]/2;
- }
- }
-
- return (char *) buf;
- }
-
- /* substitute GNU readline, or something */
- #ifdef __riscos
- int user__echoFlag=1;
- void user__cOff(void) {user__echoFlag=0;}
- void user__cOn(void) {user__echoFlag=1;}
- __swi (0x004) int user__os_readc(void);
- __swi (0x108) void user__bs(void);
- int user__getc(FILE *fp)
- {
- int a=user__os_readc();
- if (user__echoFlag)
- {
- if (a!=8) putc(a,stdout);
- if (a==13) putc(10,stdout);
- }
- return a;
- }
- #else
- /* these probably need changing for other platforms */
- void user__cOff() {};
- void user__cOn() {};
- void user__bs() {putc(8,stdout);}
- int user__getc(FILE *fp) {return getc(fp)};
- #endif /* __riscos */
-
- void user_scanf (char *buf, size_t max, int echo)
- {
- /* replace all this with a proper line-editor call */
-
- int c,n=0;
-
- if (!echo) user__cOff();
-
- loop:
- c=user__getc(stdin);
- if (c==8)
- {
- n--;
- if (echo) user__bs();
- goto loop;
- }
- if (c==0||c==10||c==13||c>255) goto end;
- buf[n++]=c;
- if (n>=max)
- {
- /* buffer overflow */
- fprintf (stderr, "user_scanf: Buffer overflow.\n");
- n--;
- }
- else goto loop;
-
- end:
- buf[n]=0;
- if (!echo)
- {
- user__cOn();
- putc ('\n', stdout);
- }
- }
-
- void user_log (char *f, char *s)
- {
- FILE *fp=fopen(f,"a+");
- time_t t;
- struct tm *tm;
- char tb[256];
-
- if (!fp)
- {
- fprintf (stderr, "user_log: Failed to open %s.\n", f);
- return;
- }
-
- t=time(&t);
- tm=localtime(&t);
- strftime (tb, 256, "%d %b %H:%M:%S", tm);
-
- fprintf (fp, "%s %s\n", tb, s);
- fclose (fp);
- }
-