Import Upstream version 1.8.5
[hcoop/debian/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 }