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