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: }

Defined functions

Defined variables

rcsid defined in line 7; never used
Last modified: 1985-01-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 325
Valid CSS Valid XHTML 1.0 Strict