include-afsconfig-before-param-h-20010712
[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 RCSID("$Header$");
15
16 #ifdef AFS_NT40_ENV
17 #include <fcntl.h>
18 #include <windows.h>
19 #else
20 #include <sys/file.h>
21 #endif
22 #include <stdio.h>
23 #include <errno.h>
24
25 long fidCounter = 0;
26
27 typedef struct dirhandle {
28     int fd;
29     int uniq;
30 } dirhandle;
31 int Uniq;
32
33 void Usage(void)
34 {
35     printf("Usage: dtest <command [args]>, where command is one of:\n");
36     printf("-l file - lists directory in file\n");
37     printf("-c file - checks directory in file\n");
38     printf("-s ifile ofile - salvages directory in ifile, places in ofile\n");
39     printf("-f file name count - creates count names based on \"name\" in directory in file\n");
40     printf("-d file name - delete name from directory in file\n");
41     printf("-r file name - lookup name in directory\n");
42     printf("-a file name - add name to directory in file\n");
43     exit(1);
44 }
45
46 main(argc,argv) 
47     char **argv;
48 {
49     DInit(600);
50     argc--; argv++;
51
52     if (argc == 0)
53         Usage();
54
55     switch ((*argv++)[1]) {
56         case 'l': ListDir(*argv); break;
57         case 'c': CheckDir(*argv); break;
58         case 's': SalvageDir(*argv, argv[1]); break;
59         case 'f': CRTest(*argv, argv[1], atoi(argv[2])); break;
60         case 'd': DelTest(*argv, argv[1]); break;
61         case 'r': LookupDir(*argv, argv[1]); break;
62         case 'a': AddEntry(*argv, argv[1]); break;
63         default: 
64             Usage();
65     }
66     exit(0);
67 }
68
69 LookupDir(dname, ename)
70 register char *dname, *ename; {
71     dirhandle dir;
72     long fid[3], code;
73
74     OpenDir(dname, &dir);
75     code = Lookup(&dir, ename, fid);
76     if (code) printf("lookup code %d\n", code);
77     else {
78         printf("Found fid %d.%d for file '%s'\n", fid[1], fid[2], ename);
79     }
80     DFlush();
81 }
82
83 AddEntry(dname, ename)
84 register char *dname, *ename; {
85     dirhandle dir;
86     long fid[3], code;
87
88     fid[1] = fidCounter++;
89     fid[2] = 3;
90     OpenDir(dname, &dir);
91     code = Create(&dir, ename, fid);
92     if (code) printf("create code %d\n", code);
93     DFlush();
94 }
95
96 ListDir(name) 
97     char *name;
98 {
99     extern ListEntry();
100     dirhandle dir;
101     OpenDir(name, &dir);
102     EnumerateDir(&dir, ListEntry, 0);
103 }
104
105 ListEntry(handle, name, vnode, unique)
106     long handle, vnode, unique;
107     char *name;
108 {
109     printf("%s\t%d\t%d\n", name, vnode, unique);
110 }
111
112 CheckDir(name)
113     char *name;
114 {
115     dirhandle dir;
116     OpenDir(name, &dir);
117     if (DirOK(&dir)) printf("Directory ok.\n");
118     else printf ("Directory bad\n");
119 }
120
121 SalvageDir(iname, oname)
122     char *iname, *oname;
123 {
124     dirhandle in,out;
125     long myFid[3], parentFid[3];
126     OpenDir(iname, &in);
127     if ( Lookup(in, ".", myFid) || Lookup(in, "..", parentFid) )
128     {
129         printf("Lookup of \".\" and/or \"..\" failed: ");
130         printf("%d %d %d %d\n",myFid[1],myFid[2],parentFid[1],parentFid[2]);
131         printf("Directory cannnot be salvaged\n");
132     }
133     CreateDir(oname, &out);
134     DirSalvage(&in, &out, myFid[1],myFid[2],parentFid[1],parentFid[2]);
135     DFlush();
136 }
137
138 DelTest(dname, ename)
139 char *dname;
140 char *ename; {
141     dirhandle dir;
142     register long code;
143
144     OpenDir(dname, &dir);
145     code = Delete(&dir, ename);
146     if (code) printf("delete code is %d\n", code);
147     DFlush();
148 }
149
150 CRTest(dname, ename, count)
151 char *dname;
152 char *ename;
153 int count; {
154     char tbuffer[200];
155     register long i, code;
156     long fid[3];
157     dirhandle dir;
158
159     CreateDir(dname, &dir);
160     bzero(fid, sizeof(fid));
161     MakeDir(&dir, fid, fid);
162     for(i=0;i<count;i++) {
163         sprintf(tbuffer, "%s%d", ename, i);
164         fid[1] = fidCounter++;
165         fid[2] = count;
166         code = Create(&dir, tbuffer, &fid);
167         if (i % 100 == 0) {
168             printf("#");
169             fflush(stdout);
170         }
171         if (code) {
172             printf("code for '%s' is %d\n", tbuffer, code);
173             return;
174         }
175     }
176     DFlush();
177 }
178
179 OpenDir(name, dir)
180     char *name;
181     dirhandle *dir;
182 {
183     dir->fd = open(name, O_RDWR, 0666);
184     if (dir->fd == -1) {
185         printf("Couldn't open %s\n", name);
186         exit(1);
187     }
188     dir->uniq = ++Uniq;
189 }
190
191 CreateDir(name, dir)
192     char *name;
193     dirhandle *dir;
194 {
195     dir->fd = open(name, O_CREAT|O_RDWR|O_TRUNC, 0666);
196     dir->uniq = ++Uniq;
197     if (dir->fd == -1) {
198         printf("Couldn't create %s\n", name);
199         exit(1);
200     }
201  }
202
203 ReallyRead(dir, block, data)
204     dirhandle *dir;
205     int block;
206     char *data;
207 {
208     int code;
209     if (lseek(dir->fd, block*PAGESIZE, 0) == -1)
210         return errno;
211     code = read(dir->fd, data, PAGESIZE);
212     if (code < 0)
213         return errno;
214     if (code != PAGESIZE)
215         return EIO;
216     return 0;
217 }
218
219 ReallyWrite(dir, block, data)
220     dirhandle *dir;
221     int block;
222     char *data;
223 {
224     int code;
225     if (lseek(dir->fd, block*PAGESIZE, 0) == -1)
226         return errno;
227     code = write(dir->fd, data, PAGESIZE);
228     if (code < 0)
229         return errno;
230     if (code != PAGESIZE)
231         return EIO;
232     return 0;
233 }
234
235 FidZap(dir)
236     dirhandle *dir;
237 {
238     dir->fd = -1;
239 }
240
241 FidEq(dir1, dir2)
242     dirhandle *dir1, *dir2;
243 {
244     return (dir1->uniq == dir2->uniq);
245 }
246
247 FidCpy(todir, fromdir)
248     dirhandle *todir, *fromdir;
249 {
250     *todir = *fromdir;
251 }
252
253 Die(msg)
254     char *msg;
255 {
256     printf("Something died with this message:  %s\n", msg);
257 }
258
259 Log(a,b,c,d,e,f,g,h,i,j,k,l,m,n) {
260         printf(a,b,c,d,e,f,g,h,i,j,k,l,m,n);
261 }