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) 06/05/85";
9 #endif not lint
10
11 #include "dump.h"
12
prdate(d)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
inititimes()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
getitime()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
putitime()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
recout(file,what)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;
getrecord(df,idatep)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 */
o_nconvert()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
makeidate(ip,buf)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
bmapest(map)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 }
255