# 2.11BSD#431 - /usr/src/new/notes/src/times.c

##### Functions

    fixlast           X
    getlast           X

       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

fixlast defined in line 136; used 7 times

- in /usr/src/new/notes/src/control.c line 146, 172
- in /usr/src/new/notes/src/newsout.c line 98, 177
- in /usr/src/new/notes/src/nfsend.c line 126, 208
- in /usr/src/new/notes/src/nftimestamp.c line 117

getlast defined in line 25; used 12 times

- in /usr/src/new/notes/src/checknotes.c line 57-62(2), 85
- in /usr/src/new/notes/src/control.c line 52-57(2), 128
- in /usr/src/new/notes/src/newsout.c line 56-61(2), 87
- in /usr/src/new/notes/src/nfsend.c line 71-76(2), 117

#### 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: 821 |