|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.