#include "xpm.h" /* CPMIO header file for i/o operations.*/ #include "megen.h" /* general defines */ #include "meglob.h" /* global variable definitions */ #include "mefiles.h" /* file names */ #include "ctype.h" /* Add a new user to users file */ add_user(up) usr *up; { int tval,rec,lastrec,user_rec; if ( (tval=find_user(up->name))>=0 ) return ERROR; /* user exists already */ rec=getrec(users); /* save current place */ if (tval==HASHEMPTY) /* easiest case .. update hash file, write to last */ { toeof(users); /* end of file to write new */ user_rec=getrec(users); /* this is record to return */ movmem(up,bufloc(users),128); if (write(users,0)!=128) return ERROR; write_hash(hash_fn(up->name)%HFSIZE,getrec(users)); } else { /* we are at dead user, or end of list */ usr *ufp; read(users,0); ufp=bufloc(users); if ( (ufp->file_info)&DEADUSER ) /* if record is from dead user.. */ { up->file_info=(ufp->file_info)^DEADUSER; /* make live user */ up->number=ufp->number; /* set to write to current loc */ user_rec=getrec(users); } else { /* record from end of hash list */ char tbuf[129]; movmem(ufp,tbuf,128); /* save user being updated */ toeof(users); user_rec=lastrec=getrec(users); /* save eof record number */ movmem(up,bufloc(users),128); /* read for write to eof */ if (write(users,0)!=128) return ERROR; setarec(users,rec); movmem(tbuf,ufp,128); /* restore user (no read op) */ ufp->file_info|=MOREHASH; /* signal not end of list */ ufp->number=lastrec; /* point to end */ } write(users,0); /* write record */ } /* hash not empty else */ close(users); users=open(USERFILE,0); /* flush buffer so toeof works later */ setarec(users,user_rec); return user_rec; /* all ok, return user record (user number-1) */ } /* add_user */ write_hash(h_val,rec) unsigned h_val; int rec; { FILE *hashfile; int *ip; hashfile=open_hash(); ip=bufloc(hashfile); setarec(hashfile,(h_val/64)); /* seek to record to update */ read(hashfile,0); /* read old stuff */ ip[h_val%64]=rec; /* change old to new */ write(hashfile,0); /* write */ close(hashfile); } /* delete user @ name from users file.. (set DEADUSER flag) */ del_user(name) char *name; { usr *up; if (find_user(name)<0) return ERROR; /* user not found */ up=bufloc(users); /* point to read in record */ up->file_info|=DEADUSER; /* set dead user flag */ write(users,0); /* update */ return getrec(users); /* return record loc if ok */ }