]> git.wh0rd.org Git - dump.git/blob - common/legacy_indexer.c
Regenerate configure.
[dump.git] / common / legacy_indexer.c
1 #include <config.h>
2 #include <compatlfs.h>
3 #include <ctype.h>
4 #include <compaterr.h>
5 #include <fcntl.h>
6 #include <fstab.h>
7 #include <signal.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <errno.h>
13
14 #include <sys/param.h>
15 #include <sys/time.h>
16 #include <time.h>
17 #ifdef __linux__
18 #include <linux/types.h>
19 #include <sys/stat.h>
20 #include <sys/mtio.h>
21 #include <bsdcompat.h>
22 #include <linux/fs.h>   /* for definition of BLKFLSBUF */
23 #elif defined sunos
24 #include <sys/vnode.h>
25
26 #include <ufs/inode.h>
27 #include <ufs/fs.h>
28 #else
29 #include <ufs/ufs/dinode.h>
30 #include <ufs/ffs/fs.h>
31 #endif
32
33 #include <protocols/dumprestore.h>
34
35 //#include "dump.h"
36 #include "indexer.h"
37 #include "slave.h"
38
39 extern dump_ino_t volinfo[];  // TP_NINOS
40 extern int tapeno;
41
42 static int Afile = -1;  /* archive file descriptor */
43 static int AfileActive = 1;/* Afile flag */
44
45 //extern char *Apath;
46 char *Apath;
47
48 #ifdef USE_QFA
49 static int GetTapePos __P((long long *));
50 static int MkTapeString __P((struct s_spcl *, long long));
51 #define FILESQFAPOS     20
52
53 int tapepos;
54 int ntrec;              /* blocking factor on tape */
55 int magtapeout;  /* is output a magnetic tape? */
56 //extern int tapepos;
57 //extern int ntrec;             /* blocking factor on tape */
58 //extern int magtapeout;  /* is output a magnetic tape? */
59
60 static int gtperr = 0;
61 static int gTapeposfd;
62 static char *gTapeposfile;
63 static char gTps[255];
64 static int32_t gThisDumpDate;
65 #endif /* USE_QFA */
66
67 void    msg __P((const char *fmt, ...));
68 void    quit __P((const char *fmt, ...));
69
70 extern char *host;
71 extern int tapefd;
72
73 /*
74  * Open the indexer file.
75  */
76 static int
77 legacy_open(const char *filename, int mode)
78 {
79         if (filename == NULL) {
80                 return 0;
81         }
82
83         if (mode == 0) {
84                 if ((Afile = OPEN(filename, O_RDONLY)) < 0) {
85                         msg("Cannot open %s for reading: %s\n",
86                                         filename, strerror(errno));
87                         msg("The ENTIRE dump is aborted.\n");
88                         return -1;
89                 }
90         } else if (mode == 1) {
91                 if ((Afile = OPEN(filename, O_WRONLY|O_CREAT|O_TRUNC,
92                                    S_IRUSR | S_IWUSR | S_IRGRP |
93                                    S_IWGRP | S_IROTH | S_IWOTH)) < 0) {
94                         msg("Cannot open %s for writing: %s\n",
95                                         filename, strerror(errno));
96                         msg("The ENTIRE dump is aborted.\n");
97                         return -1;
98                 }
99         }
100
101         return 0;
102 }
103
104 /*
105  * Close the indexer file.
106  */
107 static int
108 legacy_close()
109 {
110         if (Afile >= 0)
111                 msg("Archiving dump to %s\n", Apath);
112         return 0;
113 }
114
115 /*
116  * Write a record to the indexer file.
117  */
118 static int
119 legacy_writerec(const void *dp, int isspcl)
120 {
121         if (! AfileActive && isspcl && (spcl.c_type == TS_END))
122                 AfileActive = 1;
123         if (AfileActive && Afile >= 0 && !(spcl.c_flags & DR_EXTATTRIBUTES)) {
124                 /* When we dump an inode which is not a directory,
125                  * it means we ended the archive contents */
126                 if (isspcl && (spcl.c_type == TS_INODE) &&
127                     ((spcl.c_dinode.di_mode & S_IFMT) != IFDIR))
128                         AfileActive = 0;
129                 else {
130                         union u_spcl tmp;
131                         tmp = *(union u_spcl *)dp;
132                         /* Write the record, _uncompressed_ */
133                         if (isspcl) {
134                                 tmp.s_spcl.c_flags &= ~DR_COMPRESSED;
135                                 mkchecksum(&tmp);
136                         }
137                         if (write(Afile, &tmp, TP_BSIZE) != TP_BSIZE)
138                                 msg("error writing archive file: %s\n",
139                                 strerror(errno));
140                 }
141         }
142         return 0;
143 }
144
145 /*
146  * I'm not sure what this is used for...
147  */
148 static int
149 legacy_foo()
150 {
151         if (Afile >= 0) {
152                 volinfo[1] = ROOTINO;
153                 memcpy(spcl.c_inos, volinfo, TP_NINOS * sizeof(dump_ino_t));
154                 spcl.c_flags |= DR_INODEINFO;
155         }
156         return 0;
157 }
158
159 /*
160  * Dump inode
161  */
162 static int
163 legacy_addInode(struct dinode *dp, dump_ino_t ino, int metaonly)
164 {
165         return 0;
166 }
167
168 /*
169  * Dump directory (dirent) entry
170  */
171 static int
172 legacy_addDirEntry(struct direct *dp, dump_ino_t parent_ino)
173 {
174          return 0;
175 }
176
177
178 #define LSEEK_GET_TAPEPOS       10
179 #define LSEEK_GO2_TAPEPOS       11
180
181 /*
182  *
183  */
184 static int
185 legacy_openQfa()
186 {
187 #ifdef USE_QFA
188         gThisDumpDate = spcl.c_date;
189         if (tapepos) {
190                 msg("writing QFA positions to %s\n", gTapeposfile);
191                 if ((gTapeposfd = open(gTapeposfile,
192                                        O_WRONLY|O_CREAT|O_TRUNC,
193                                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
194                                        | S_IROTH | S_IWOTH)) < 0)
195                         quit("can't open tapeposfile\n");
196                 /* print QFA-file header */
197                 snprintf(gTps, sizeof(gTps), "%s\n%s\n%ld\n\n", QFA_MAGIC, QFA_VERSION, (unsigned long)spcl.c_date);
198                 gTps[sizeof(gTps) - 1] = '\0';
199                 if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps))
200                         quit("can't write tapeposfile\n");
201                 sprintf(gTps, "ino\ttapeno\ttapepos\n");
202                 if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps))
203                         quit("can't write tapeposfile\n");
204         }
205 #endif /* USE_QFA */
206         return 0;
207 }
208
209 /*
210  *
211  */
212 static int
213 legacy_closeQfa()
214 {
215         return 0;
216 }
217
218 /*
219  *
220  */
221 static int
222 legacy_openQfaState(QFA_State *s)
223 {
224         s->curtapepos = 0;
225         s->maxntrecs = 50000;   /* every 50MB */
226         s->cntntrecs = s->maxntrecs;
227         return 0;
228 }
229
230 /*
231  *
232  */
233 static int
234 legacy_updateQfaState(QFA_State *s)
235 {
236         if (gTapeposfd >= 0) {
237                 s->cntntrecs += ntrec;
238         }
239
240         return 0;
241 }
242
243
244 /*
245  *
246  */
247 static int
248 legacy_updateQfa(QFA_State *s)
249 {
250 #ifdef USE_QFA
251         union u_spcl *uspclptr;
252         struct s_spcl *spclptr;
253
254         if (gTapeposfd >= 0) {
255                 int i;
256                 int foundone = 0;
257
258                 for (i = 0; (i < ntrec) && !foundone; ++i) {
259                         uspclptr = (union u_spcl *)&slp->tblock[i];
260                         spclptr = &uspclptr->s_spcl;
261                         if ((spclptr->c_magic == NFS_MAGIC) && 
262                                                 (spclptr->c_type == TS_INODE) &&
263                                                 (spclptr->c_date == gThisDumpDate) &&
264                                                 !(spclptr->c_dinode.di_mode & S_IFDIR) &&
265                                                 !(spclptr->c_flags & DR_EXTATTRIBUTES)
266                                         ) {
267                                 foundone = 1;
268                                 /* if (s->cntntrecs >= s->maxntrecs) {   only write every maxntrecs amount of data */
269                                         s->cntntrecs = 0;
270                                         if (gtperr == 0) 
271                                                 gtperr = GetTapePos(&s->curtapepos);
272                                         /* if an error occured previously don't
273                                          * try again */
274                                         if (gtperr == 0) {
275 #ifdef DEBUG_QFA
276                                                 msg("inode %ld at tapepos %ld\n", spclptr->c_inumber, s->curtapepos);
277 #endif
278                                                 gtperr = MkTapeString(spclptr, s->curtapepos);
279                                         }
280                                 /* } */
281                         }
282                 }
283         }
284 #endif /* USE_QFA */
285         return 0;
286 }
287
288 #ifdef USE_QFA
289 /*
290  * read the current tape position
291  */
292 static int
293 GetTapePos(long long *pos)
294 {
295         int err = 0;
296
297 #ifdef RDUMP
298         if (host) {
299                 *pos = (long long) rmtseek((OFF_T)0, (int)LSEEK_GET_TAPEPOS);
300                 err = *pos < 0;
301         }
302         else 
303 #endif
304         {
305         if (magtapeout) {
306                 long mtpos;
307                 *pos = 0;
308                 err = (ioctl(tapefd, MTIOCPOS, &mtpos) < 0);
309                 *pos = (long long)mtpos;
310         }
311         else {
312                 *pos = LSEEK(tapefd, 0, SEEK_CUR);
313                 err = (*pos < 0);
314         }
315         }
316         if (err) {
317                 err = errno;
318                 msg("[%ld] error: %d (getting tapepos: %lld)\n", getpid(), 
319                         err, *pos);
320                 return err;
321         }
322         return err;
323 }
324
325 static int 
326 MkTapeString(struct s_spcl *spclptr, long long curtapepos)
327 {
328         int     err = 0;
329
330 #ifdef DEBUG_QFA
331         msg("inode %ld at tapepos %lld\n", spclptr->c_inumber, curtapepos);
332 #endif
333
334         snprintf(gTps, sizeof(gTps), "%ld\t%d\t%lld\n", 
335                  (unsigned long)spclptr->c_inumber, 
336                  tapeno, 
337                  curtapepos);
338         gTps[sizeof(gTps) - 1] = '\0';
339         if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps)) {
340                 err = errno;
341         warn("error writing tapepos file. (error %d)\n", errno);
342         }
343         return err;
344 }
345 #endif /* USE_QFA */
346
347 Indexer indexer_legacy = {
348         NULL,
349         &legacy_open,
350         &legacy_close,
351         &legacy_foo,
352         &legacy_writerec,
353         &legacy_addInode,
354         &legacy_addDirEntry,
355         &legacy_openQfa,
356         &legacy_closeQfa,
357         &legacy_updateQfa,
358         &legacy_updateQfaState
359 };