1: #include "parms.h" 2: #include "structs.h" 3: #include <sys/types.h> 4: #include <sys/stat.h> 5: 6: #ifdef RCSIDENT 7: static char rcsid[] = "$Header: times.c,v 1.7 85/01/18 15:39:48 notes Rel $"; 8: #endif RCSIDENT 9: 10: /* 11: * getlast(atime, nf, seqon, name) 12: * struct when_f *atime; char *nf, *name 13: * retrieve last time that user was in the notefile. 14: * fixlast(atime, nf, seqon, name) 15: * struct when_f *atime; char *nf, *name 16: * update users last access time. 17: * 18: * Restructure of Original effort (Nov 1981 by R. Essick) 19: * Coding: Ray Essick January 1982 20: */ 21: 22: long lseek (); /* make sure gets right type */ 23: char *malloc (); 24: 25: getlast (atime, nf, seqon, name) 26: struct when_f *atime; 27: char *nf, 28: *name; 29: { 30: FILE * seqfile; 31: FILE * fopen (); 32: struct seq_f entry; 33: register int retcode, 34: i; 35: char fn[WDLEN]; 36: int fid, 37: size; 38: struct stat statval; 39: char holdit[NNLEN + 1]; 40: 41: static int nentries = 0; /* number in file */ 42: static int havechecked = 0; /* for seq file */ 43: static char lastname[20]; /* last name loaded */ 44: static struct seq_f *entries = (struct seq_f *) NULL;/* the times */ 45: 46: *atime = Basetime; /* pick "old time" */ 47: 48: if (seqon < NOREADSEQ) /* don't read */ 49: return 0; /* sequencer off */ 50: 51: if (strcmp (name, lastname) != 0) /* new user */ 52: { /* may never happen */ 53: havechecked = 0; 54: strcpy (lastname, name); 55: if (entries) /* do we have some? */ 56: { 57: free (entries); /* return space */ 58: entries = (struct seq_f *) NULL; /* and mark so */ 59: } 60: } 61: 62: sprintf (fn, "%s/%s/%s", Mstdir, SEQUENCER, name); 63: if (!havechecked) /* try making incore */ 64: { 65: havechecked++; /* don't repeat */ 66: if (stat (fn, &statval) < 0) /* no file */ 67: size = 0; 68: else 69: size = statval.st_size; 70: if (size != 0) /* we have a file */ 71: { 72: nentries = 0; /* ready to fail */ 73: if ((entries = (struct seq_f *) malloc (size)) == NULL) 74: goto hardway; 75: if ((fid = open (fn, 0)) < 0) 76: { 77: free (entries); /* return our space */ 78: goto hardway; /* couldn't open */ 79: } 80: if (read (fid, entries, size) != size) /* get it all */ 81: { 82: free (entries); /* return space */ 83: close (fid); /* and the file */ 84: goto hardway; /* didn't read all */ 85: } 86: nentries = size / (sizeof entry); 87: close (fid); 88: } 89: } 90: 91: hardway: /* look it up */ 92: 93: /* 94: * Make sure the sequencer entry is short enough 95: * This turns out to be a constant which can be resolved at 96: * compile time! 97: */ 98: i = (FILENAMELEN > NNLEN) ? NNLEN : FILENAMELEN; /* shorter one */ 99: if (strlen (nf) >= i) /* 14 before 4.2 */ 100: { 101: strncpy (holdit, nf, i); /* copy them */ 102: holdit[i] = '\0'; /* and terminate */ 103: nf = holdit; /* move pointer */ 104: } 105: 106: if (nentries == 0) /* not pre-loaded */ 107: { 108: if ((seqfile = fopen (fn, "r")) == NULL) 109: return (-1); /* no file, return default */ 110: do 111: retcode = fread (&entry, sizeof entry, 1, seqfile); 112: while (retcode && strcmp (entry.nfname, nf) != 0); 113: 114: fclose (seqfile); /* close the file */ 115: 116: if (strcmp (entry.nfname, nf) == 0) 117: { 118: copydate (&entry.lastin, atime); /* give him time */ 119: return 0; 120: } 121: else 122: return (-1); 123: } 124: else /* search table */ 125: { 126: for (i = 0; i < nentries; i++) 127: if (strcmp (entries[i].nfname, nf) == 0) 128: { 129: copydate (&entries[i].lastin, atime); 130: return 0; 131: } 132: } 133: return 0; 134: } 135: 136: fixlast (atime, nf, seqon, name) 137: struct when_f *atime; 138: char *nf, 139: *name; 140: { 141: struct seq_f entry; 142: register int fid; /* file descriptor */ 143: register int atend, 144: i; 145: char fn[WDLEN]; 146: char holdit[NNLEN + 1]; /* hold a nf name */ 147: 148: if (seqon > NOWRITESEQ) /* if updating */ 149: { 150: sprintf (fn, "%s/%s/%s", Mstdir, SEQUENCER, name); 151: 152: if ((fid = open (fn, 2)) < 0) /* open up */ 153: { 154: x ((fid = creat (fn, 0666)) < 0, "fixlast: create"); 155: x (close (fid) < 0, "fixlast: close I"); 156: x ((fid = open (fn, 2)) < 0, "fixlast: open write"); 157: } 158: 159: /* 160: * Make sure the sequencer entry is short enough 161: */ 162: i = (FILENAMELEN > NNLEN) ? NNLEN : FILENAMELEN;/* shorter one */ 163: if (strlen (nf) >= i) /* 14 before 4.2 */ 164: { 165: strncpy (holdit, nf, i); /* copy them */ 166: holdit[i] = '\0'; /* and terminate */ 167: nf = holdit; /* move pointer */ 168: } 169: 170: while ((atend = read (fid, &entry, sizeof entry)) == sizeof entry) 171: if (strcmp (entry.nfname, nf) == 0) 172: break; /* found him */ 173: 174: x (atend < 0, "fixlast: read error"); 175: if (atend == sizeof entry) /* not at the end */ 176: x (lseek (fid, -((long) sizeof entry), 1) < 0, "fixlast: reseek"); 177: else 178: { 179: strmove (nf, entry.nfname); /* build the entry */ 180: x (lseek (fid, 0L, 2) < 0, "fixlast: EOF seek"); 181: /* make sure at end */ 182: } 183: copydate (atime, &entry.lastin); 184: x (write (fid, &entry, sizeof entry) != sizeof entry, "fixlast: write"); 185: x (close (fid) < 0, "fixlast: close II"); 186: } 187: }