|
|
1.1 root 1: static char *sccsid = "@(#)dumpitime.c 1.12 (Berkeley) 9/13/83";
2:
3: #include "dump.h"
4: #include <sys/file.h>
5:
6: char *prdate(d)
7: time_t d;
8: {
9: char *p;
10:
11: if(d == 0)
12: return("the epoch");
13: p = ctime(&d);
14: p[24] = 0;
15: return(p);
16: }
17:
18: struct idates **idatev = 0;
19: int nidates = 0;
20: int idates_in = 0;
21: struct itime *ithead = 0;
22:
23: inititimes()
24: {
25: FILE *df;
26: register int i;
27: register struct itime *itwalk;
28: int fd;
29:
30: if (idates_in)
31: return;
32: fd = open(increm, O_RDONLY);
33: if (fd < 0) {
34: perror(increm);
35: return;
36: }
37: (void) flock(fd, LOCK_SH);
38: if ((df = fdopen(fd, "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: lastincno = '0';
76:
77: inititimes();
78: /*
79: * Go find the entry with the same name for a lower increment
80: * and older date
81: */
82: ITITERATE(i, ip){
83: if(strncmp(fname, ip->id_name,
84: sizeof (ip->id_name)) != 0)
85: continue;
86: if (ip->id_incno >= incno)
87: continue;
88: if (ip->id_ddate <= spcl.c_ddate)
89: continue;
90: spcl.c_ddate = ip->id_ddate;
91: lastincno = ip->id_incno;
92: }
93: }
94:
95: putitime()
96: {
97: FILE *df;
98: register struct idates *itwalk;
99: register int i;
100: int fd;
101: char *fname;
102:
103: if(uflag == 0)
104: return;
105: fd = open(temp, O_RDWR|O_CREAT, 0600);
106: if (fd < 0) {
107: perror(temp);
108: dumpabort();
109: }
110: (void) flock(fd, LOCK_EX);
111: if ((df = fdopen(fd, "w")) == NULL) {
112: perror(temp);
113: dumpabort();
114: }
115: fname = disk;
116: free(idatev);
117: idatev = 0;
118: nidates = 0;
119: ithead = 0;
120: idates_in = 0;
121: inititimes();
122:
123: spcl.c_ddate = 0;
124: ITITERATE(i, itwalk){
125: if (strncmp(fname, itwalk->id_name,
126: sizeof (itwalk->id_name)) != 0)
127: continue;
128: if (itwalk->id_incno != incno)
129: continue;
130: goto found;
131: }
132: /*
133: * construct the new upper bound;
134: * Enough room has been allocated.
135: */
136: itwalk = idatev[nidates] =
137: (struct idates *)calloc(1, sizeof(struct idates));
138: nidates += 1;
139: found:
140: strncpy(itwalk->id_name, fname, sizeof (itwalk->id_name));
141: itwalk->id_incno = incno;
142: itwalk->id_ddate = spcl.c_date;
143:
144: ITITERATE(i, itwalk){
145: recout(df, itwalk);
146: }
147: if (rename(temp, increm) < 0) {
148: perror("rename");
149: (void) unlink(temp);
150: dumpabort();
151: }
152: (void) chmod(increm, 0644);
153: (void) fclose(df);
154: msg("level %c dump on %s\n", incno, prdate(spcl.c_date));
155: }
156:
157: recout(file, what)
158: FILE *file;
159: struct idates *what;
160: {
161: fprintf(file, DUMPOUTFMT,
162: what->id_name,
163: what->id_incno,
164: ctime(&(what->id_ddate))
165: );
166: }
167:
168: int recno;
169: int getrecord(df, idatep)
170: FILE *df;
171: struct idates *idatep;
172: {
173: char buf[BUFSIZ];
174:
175: recno = 0;
176: if ( (fgets(buf, BUFSIZ, df)) != buf)
177: return(-1);
178: recno++;
179: if (makeidate(idatep, buf) < 0)
180: msg("Unknown intermediate format in %s, line %d\n",
181: increm, recno);
182:
183: #ifdef FDEBUG
184: msg("getrecord: %s %c %s\n",
185: idatep->id_name, idatep->id_incno, prdate(idatep->id_ddate));
186: #endif
187: return(0);
188: }
189:
190: time_t unctime();
191:
192: int makeidate(ip, buf)
193: struct idates *ip;
194: char *buf;
195: {
196: char un_buf[128];
197:
198: sscanf(buf, DUMPINFMT, ip->id_name, &ip->id_incno, un_buf);
199: ip->id_ddate = unctime(un_buf);
200: if (ip->id_ddate < 0)
201: return(-1);
202: return(0);
203: }
204:
205: /*
206: * This is an estimation of the number of TP_BSIZE blocks in the file.
207: * It assumes that there are no unallocated blocks; hence
208: * the estimate may be high
209: */
210: est(ip)
211: struct dinode *ip;
212: {
213: long s;
214:
215: esize++;
216: /* calc number of TP_BSIZE blocks */
217: s = howmany(ip->di_size, TP_BSIZE);
218: if (ip->di_size > sblock->fs_bsize * NDADDR) {
219: /* calc number of indirect blocks on the dump tape */
220: s += howmany(s - NDADDR * sblock->fs_bsize / TP_BSIZE,
221: TP_NINDIR);
222: }
223: esize += s;
224: }
225:
226: bmapest(map)
227: char *map;
228: {
229: register i, n;
230:
231: n = -1;
232: for (i = 0; i < msiz; i++)
233: if(map[i])
234: n = i;
235: if(n < 0)
236: return;
237: n++;
238: esize++;
239: esize += howmany(n * sizeof map[0], TP_BSIZE);
240: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.