1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)dumpitime.c	5.1 (Berkeley) 6/5/85";
   9: #endif not lint
  10: 
  11: #include "dump.h"
  12: 
  13: char *prdate(d)
  14:     time_t d;
  15: {
  16:     char *p;
  17: 
  18:     if(d == 0)
  19:         return("the epoch");
  20:     p = ctime(&d);
  21:     p[24] = 0;
  22:     return(p);
  23: }
  24: 
  25: struct  idates  **idatev = 0;
  26: int nidates = 0;
  27: int idates_in = 0;
  28: struct  itime   *ithead = 0;
  29: 
  30: inititimes()
  31: {
  32:             FILE    *df;
  33:     register    int i;
  34:     register    struct  itime   *itwalk;
  35: 
  36:     if (idates_in)
  37:         return;
  38:     if ( (df = fopen(increm, "r")) == NULL){
  39:         nidates = 0;
  40:         ithead = 0;
  41:     } else {
  42:         do{
  43:             itwalk=(struct itime *)calloc(1,sizeof (struct itime));
  44:             if (getrecord(df, &(itwalk->it_value)) < 0)
  45:                 break;
  46:             nidates++;
  47:             itwalk->it_next = ithead;
  48:             ithead = itwalk;
  49:         } while (1);
  50:         fclose(df);
  51:     }
  52: 
  53:     idates_in = 1;
  54:     /*
  55: 	 *	arrayify the list, leaving enough room for the additional
  56: 	 *	record that we may have to add to the idate structure
  57: 	 */
  58:     idatev = (struct idates **)calloc(nidates + 1,sizeof (struct idates *));
  59:     for (i = nidates-1, itwalk = ithead; i >= 0; i--, itwalk = itwalk->it_next)
  60:         idatev[i] = &itwalk->it_value;
  61: }
  62: 
  63: getitime()
  64: {
  65:     register    struct  idates  *ip;
  66:     register    int i;
  67:             char    *fname;
  68: 
  69:     fname = disk;
  70: #ifdef FDEBUG
  71:     msg("Looking for name %s in increm = %s for delta = %c\n",
  72:         fname, increm, incno);
  73: #endif
  74:     spcl.c_ddate = 0;
  75: 
  76:     inititimes();
  77:     /*
  78: 	 *	Go find the entry with the same name for a lower increment
  79: 	 *	and older date
  80: 	 */
  81:     ITITERATE(i, ip){
  82:         if(strncmp(fname, ip->id_name,
  83:                 sizeof (ip->id_name)) != 0)
  84:             continue;
  85:         if (ip->id_incno >= incno)
  86:             continue;
  87:         if (ip->id_ddate <= spcl.c_ddate)
  88:             continue;
  89:         spcl.c_ddate = ip->id_ddate;
  90:     }
  91: }
  92: 
  93: putitime()
  94: {
  95:     FILE        *df;
  96:     register    struct  idates  *itwalk;
  97:     register    int i;
  98:     char        *fname;
  99: 
 100:     if(uflag == 0)
 101:         return;
 102:     fname = disk;
 103: 
 104:     spcl.c_ddate = 0;
 105:     ITITERATE(i, itwalk){
 106:         if (strncmp(fname, itwalk->id_name,
 107:                 sizeof (itwalk->id_name)) != 0)
 108:             continue;
 109:         if (itwalk->id_incno != incno)
 110:             continue;
 111:         goto found;
 112:     }
 113:     /*
 114: 	 *	construct the new upper bound;
 115: 	 *	Enough room has been allocated.
 116: 	 */
 117:     itwalk = idatev[nidates] =
 118:         (struct idates *)calloc(1, sizeof(struct idates));
 119:     nidates += 1;
 120:   found:
 121:     strncpy(itwalk->id_name, fname, sizeof (itwalk->id_name));
 122:     itwalk->id_incno = incno;
 123:     itwalk->id_ddate = spcl.c_date;
 124: 
 125:     if ( (df = fopen(increm, "w")) == NULL){
 126:         msg("Cannot open %s\n", increm);
 127:         dumpabort();
 128:     }
 129:     ITITERATE(i, itwalk){
 130:         recout(df, itwalk);
 131:     }
 132:     fclose(df);
 133:     msg("level %c dump on %s\n", incno, prdate(spcl.c_date));
 134: }
 135: 
 136: recout(file, what)
 137:     FILE    *file;
 138:     struct  idates  *what;
 139: {
 140:     fprintf(file, DUMPOUTFMT,
 141:         what->id_name,
 142:         what->id_incno,
 143:         ctime(&(what->id_ddate))
 144:     );
 145: }
 146: 
 147: int recno;
 148: int getrecord(df, idatep)
 149:     FILE    *df;
 150:     struct  idates  *idatep;
 151: {
 152:     char        buf[BUFSIZ];
 153: 
 154:     recno = 0;
 155:     if ( (fgets(buf, BUFSIZ, df)) != buf)
 156:         return(-1);
 157:     recno++;
 158:     if (makeidate(idatep, buf) < 0)
 159:         msg("Unknown intermediate format in %s, line %d\n",
 160:             NINCREM, recno);
 161: 
 162: #ifdef FDEBUG
 163:     msg("getrecord: %s %c %s\n",
 164:         idatep->id_name, idatep->id_incno, prdate(idatep->id_ddate));
 165: #endif
 166:     return(0);
 167: }
 168: 
 169: /*
 170:  *	Convert from old format to new format
 171:  *	Convert from /etc/ddate to /etc/dumpdates format
 172:  */
 173: o_nconvert()
 174: {
 175:     FILE    *oldfile;
 176:     FILE    *newfile;
 177:     struct  idates  idate;
 178:     struct  idates  idatecopy;
 179: 
 180:     if( (newfile = fopen(NINCREM, "w")) == NULL){
 181:         msg("%s: Can not open %s to update.\n", processname, NINCREM);
 182:         Exit(X_ABORT);
 183:     }
 184:     if ( (oldfile = fopen(OINCREM, "r")) != NULL){
 185:         while(!feof(oldfile)){
 186:             if (fread(&idate, sizeof(idate), 1, oldfile) != 1)
 187:                 break;
 188:             /*
 189: 			 *	The old format ddate did not have
 190: 			 *	the full special path name on it;
 191: 			 *	we add the prefix /dev/ to the
 192: 			 *	special name, although this may not be
 193: 			 *	always the right thing to do.
 194: 			 */
 195:             idatecopy = idate;
 196:             strcpy(idatecopy.id_name, "/dev/");
 197:             strncat(idatecopy.id_name, idate.id_name,
 198:                 sizeof(idate.id_name) - sizeof ("/dev/"));
 199:             recout(newfile, &idatecopy);
 200:         }
 201:     }
 202:     fclose(oldfile);
 203:     fclose(newfile);
 204: }
 205: 
 206: time_t  unctime();
 207: 
 208: int makeidate(ip, buf)
 209:     struct  idates  *ip;
 210:     char    *buf;
 211: {
 212:     char    un_buf[128];
 213: 
 214:     sscanf(buf, DUMPINFMT, ip->id_name, &ip->id_incno, un_buf);
 215:     ip->id_ddate = unctime(un_buf);
 216:     if (ip->id_ddate < 0)
 217:         return(-1);
 218:     return(0);
 219: }
 220: 
 221: est(ip)
 222:     struct dinode *ip;
 223: {
 224:     long s;
 225: 
 226:     esize++;
 227:     s = (ip->di_size + BSIZE-1) / BSIZE;
 228:     esize += s;
 229:     if(s > NADDR-3) {
 230:         /*
 231: 		 *	This code is only appproximate.
 232: 		 *	it totally estimates low on doubly and triply indirect
 233: 		 *	files.
 234: 		 */
 235:         s -= NADDR-3;
 236:         s = (s + (BSIZE/sizeof(daddr_t))-1) / (BSIZE/sizeof(daddr_t));
 237:         esize += s;
 238:     }
 239: }
 240: 
 241: bmapest(map)
 242: short *map;
 243: {
 244:     register i, n;
 245: 
 246:     n = -1;
 247:     for(i=0; i<MSIZ; i++)
 248:         if(map[i])
 249:             n = i;
 250:     if(n < 0)
 251:         return;
 252:     esize++;
 253:     esize += (n + (BSIZE/sizeof(short))-1) / (BSIZE/sizeof(short));
 254: }

Defined functions

bmapest defined in line 241; used 2 times
est defined in line 221; used 2 times
getitime defined in line 63; used 1 times
getrecord defined in line 148; used 1 times
  • in line 44
inititimes defined in line 30; used 2 times
makeidate defined in line 208; used 1 times
o_nconvert defined in line 173; used 1 times
prdate defined in line 13; used 5 times
putitime defined in line 93; used 1 times
recout defined in line 136; used 2 times

Defined variables

idates_in defined in line 27; used 2 times
idatev defined in line 25; used 3 times
ithead defined in line 28; used 4 times
nidates defined in line 26; used 6 times
recno defined in line 147; used 3 times
sccsid defined in line 8; never used
Last modified: 1985-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1714
Valid CSS Valid XHTML 1.0 Strict