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