Remove redundant header includes
[openafs.git] / src / dir / test / dtest.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #define PAGESIZE 2048
11 #include <afsconfig.h>
12 #include <afs/param.h>
13
14 #include <roken.h>
15
16 #include <afs/dir.h>
17
18 long fidCounter = 0;
19
20 typedef struct DirHandle {
21     int fd;
22     int uniq;
23 } dirhandle;
24 int Uniq;
25
26 static void OpenDir(char *name, dirhandle *dir);
27 static void CreateDir(char *name, dirhandle *dir);
28
29 static void
30 Usage(void)
31 {
32     printf("Usage: dtest <command [args]>, where command is one of:\n");
33     printf("-l file - lists directory in file\n");
34     printf("-c file - checks directory in file\n");
35     printf("-s ifile ofile - salvages directory in ifile, places in ofile\n");
36     printf
37         ("-f file name count - creates count names based on \"name\" in directory in file\n");
38     printf("-d file name - delete name from directory in file\n");
39     printf("-r file name - lookup name in directory\n");
40     printf("-a file name - add name to directory in file\n");
41     exit(1);
42 }
43
44 static void
45 LookupDir(char *dname, char *ename)
46 {
47     dirhandle dir;
48     long fid[3];
49     int code;
50
51     OpenDir(dname, &dir);
52     code = afs_dir_Lookup(&dir, ename, fid);
53     if (code)
54         printf("lookup code %d\n", code);
55     else {
56         printf("Found fid %ld.%ld for file '%s'\n", fid[1], fid[2], ename);
57     }
58     DFlush();
59 }
60
61 static void
62 AddEntry(char *dname, char *ename)
63 {
64     dirhandle dir;
65     long fid[3];
66     int code;
67
68     fid[1] = fidCounter++;
69     fid[2] = 3;
70     OpenDir(dname, &dir);
71     code = afs_dir_Create(&dir, ename, fid);
72     if (code)
73         printf("create code %d\n", code);
74     DFlush();
75 }
76
77 static int
78 ListEntry(void * handle, char *name, afs_int32 vnode, afs_int32 unique)
79 {
80     printf("%s\t%ld\t%ld\n", name, afs_printable_int32_ld(vnode),
81            afs_printable_int32_ld(unique));
82
83     return 0;
84 }
85
86 static void
87 ListDir(char *name)
88 {
89     dirhandle dir;
90     OpenDir(name, &dir);
91     afs_dir_EnumerateDir(&dir, ListEntry, 0);
92 }
93
94 static void
95 CheckDir(char *name)
96 {
97     dirhandle dir;
98     OpenDir(name, &dir);
99     if (DirOK(&dir))
100         printf("Directory ok.\n");
101     else
102         printf("Directory bad\n");
103 }
104
105 static void
106 SalvageDir(char *iname, char *oname)
107 {
108     dirhandle in, out;
109     afs_int32 myFid[3], parentFid[3];
110
111     OpenDir(iname, &in);
112     if (afs_dir_Lookup(&in, ".", myFid) || 
113         afs_dir_Lookup(&in, "..", parentFid)) {
114         printf("Lookup of \".\" and/or \"..\" failed: ");
115         printf("%d %d %d %d\n", myFid[1], myFid[2], parentFid[1],
116                parentFid[2]);
117         printf("Directory cannnot be salvaged\n");
118     }
119     CreateDir(oname, &out);
120     DirSalvage(&in, &out, myFid[1], myFid[2], parentFid[1], parentFid[2]);
121     DFlush();
122 }
123
124 static void
125 DelTest(char *dname, char *ename)
126 {
127     dirhandle dir;
128     int code;
129
130     OpenDir(dname, &dir);
131     code = afs_dir_Delete(&dir, ename);
132     if (code)
133         printf("delete code is %d\n", code);
134     DFlush();
135 }
136
137 static void
138 CRTest(char *dname, char *ename, int count)
139 {
140     char tbuffer[200];
141     int i;
142     afs_int32 fid[3];
143     dirhandle dir;
144     int code;
145
146     CreateDir(dname, &dir);
147     memset(fid, 0, sizeof(fid));
148     afs_dir_MakeDir(&dir, fid, fid);
149     for (i = 0; i < count; i++) {
150         sprintf(tbuffer, "%s%d", ename, i);
151         fid[1] = fidCounter++;
152         fid[2] = count;
153         code = afs_dir_Create(&dir, tbuffer, &fid);
154         if (i % 100 == 0) {
155             printf("#");
156             fflush(stdout);
157         }
158         if (code) {
159             printf("code for '%s' is %d\n", tbuffer, code);
160             return;
161         }
162     }
163     DFlush();
164 }
165
166 static void
167 OpenDir(char *name, dirhandle *dir)
168 {
169     dir->fd = open(name, O_RDWR, 0666);
170     if (dir->fd == -1) {
171         printf("Couldn't open %s\n", name);
172         exit(1);
173     }
174     dir->uniq = ++Uniq;
175 }
176
177 static void
178 CreateDir(char *name, dirhandle *dir)
179 {
180     dir->fd = open(name, O_CREAT | O_RDWR | O_TRUNC, 0666);
181     dir->uniq = ++Uniq;
182     if (dir->fd == -1) {
183         printf("Couldn't create %s\n", name);
184         exit(1);
185     }
186 }
187
188 int
189 ReallyRead(dirhandle *dir, int block, char *data)
190 {
191     int code;
192     if (lseek(dir->fd, block * PAGESIZE, 0) == -1)
193         return errno;
194     code = read(dir->fd, data, PAGESIZE);
195     if (code < 0)
196         return errno;
197     if (code != PAGESIZE)
198         return EIO;
199     return 0;
200 }
201
202 int
203 ReallyWrite(dirhandle *dir, int block, char *data)
204 {
205     int code;
206     if (lseek(dir->fd, block * PAGESIZE, 0) == -1)
207         return errno;
208     code = write(dir->fd, data, PAGESIZE);
209     if (code < 0)
210         return errno;
211     if (code != PAGESIZE)
212         return EIO;
213     return 0;
214 }
215
216 void
217 FidZap(dirhandle *dir)
218 {
219     dir->fd = -1;
220 }
221
222 void
223 FidZero(long *afid)
224 {
225     *afid = 0;
226 }
227
228 int
229 FidEq(dirhandle *dir1, dirhandle *dir2)
230 {
231     return (dir1->uniq == dir2->uniq);
232 }
233
234 int
235 FidVolEq(long *afid, long *bfid)
236 {
237     return 1;
238 }
239
240 void
241 FidCpy(dirhandle *todir, dirhandle *fromdir)
242 {
243     *todir = *fromdir;
244 }
245
246 void
247 Die(char *msg)
248 {
249     printf("Something died with this message:  %s\n", msg);
250 }
251
252 void
253 Log(const char *fmt, ...)
254 {
255     va_list ap;
256
257     va_start(ap, fmt);
258     vprintf(fmt, ap);
259     va_end(ap);
260 }
261
262 int
263 main(int argc, char **argv)
264 {
265     DInit(600);
266     argc--;
267     argv++;
268
269     if (argc == 0)
270         Usage();
271
272     switch ((*argv++)[1]) {
273     case 'l':
274         ListDir(*argv);
275         break;
276     case 'c':
277         CheckDir(*argv);
278         break;
279     case 's':
280         SalvageDir(*argv, argv[1]);
281         break;
282     case 'f':
283         CRTest(*argv, argv[1], atoi(argv[2]));
284         break;
285     case 'd':
286         DelTest(*argv, argv[1]);
287         break;
288     case 'r':
289         LookupDir(*argv, argv[1]);
290         break;
291     case 'a':
292         AddEntry(*argv, argv[1]);
293         break;
294     default:
295         Usage();
296     }
297     exit(0);
298 }