assorted-warning-cleanup-20071126
[openafs.git] / src / venus / test / fulltest.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 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID
14     ("$Header$");
15
16 #include <sys/types.h>
17 #include <sys/time.h>
18 #include <sys/stat.h>
19 #include <fcntl.h>
20 #include <stdio.h>
21 #include <unistd.h>
22
23 main(argc, argv)
24      int argc;
25      char **argv;
26 {
27     char *dirName;
28     char tempName[1024];
29     struct stat tstat;
30     struct timeval tvp[2];
31     int fd1;
32     int code;
33 #ifndef HAVE_GETCWD
34     extern char *getwd();
35 #define getcwd(x,y) getwd(x)
36 #endif
37
38     /* venus system tester */
39     if (argc != 2)
40         return printf("usage: fulltest <dir-to-screw-up>\n");
41     dirName = argv[1];
42     mkdir(dirName, 0777);
43     if (chdir(dirName) < 0)
44         {perror("chdir");return;}
45     if (getcwd(tempName, 1024) == 0) {
46         return printf("Could not get working dir.\n");
47     }
48     /* now create some files */
49     fd1 = open("hi", O_CREAT | O_TRUNC | O_RDWR, 0666);
50     if (fd1 < 0)
51         {perror("open1");return;}
52     if (close(fd1) < 0)
53         {perror("close1");return;}
54     if (access("hi", 2) < 0)
55         return printf("New file can not be written (access)\n");
56     if (chmod("hi", 0741) < 0)
57         {perror("chmod1");return;}
58     if (stat("hi", &tstat) < 0)
59         {perror("stat1");return;}
60     if ((tstat.st_mode & 0777) != 0741)
61         return printf("chmod failed to set mode properly\n");
62
63     fd1 = open("hi", O_RDWR);
64     if (fd1 < 0)
65         {perror("open2");return;}
66     if (fchmod(fd1, 0654) < 0)
67         {perror("fchmod");return;}
68     if (fstat(fd1, &tstat) < 0)
69         {perror("fstat1");return;}
70     if ((tstat.st_mode & 0777) != 0654)
71         return printf("fchmod failed to set mode properly\n");
72 #if 0
73     /* These appear to be defunct routines;
74      * I don't know what, if anything, replaced them */
75     if (osi_ExclusiveLockNoBlock(fd1) < 0)
76         {perror("flock1");return;}
77     if (osi_UnLock(fd1) < 0)
78         {perror("flock/unlock");return;}
79 #endif
80
81 /* How about shared lock portability? */
82     {
83         struct flock fl;
84
85         fl.l_type = F_RDLCK;
86         fl.l_whence = SEEK_SET;
87         fl.l_start = 0;
88         fl.l_len = 0;
89
90         if (fcntl(fd1, F_SETLK, &fl) == -1)
91             {perror("fcntl1: RDLCK");return;}
92
93         fl.l_type = F_UNLCK;
94         fl.l_whence = SEEK_SET;
95         fl.l_start = 0;
96         fl.l_len = 0;
97
98         if (fcntl(fd1, F_SETLK, &fl) == -1)
99             {perror("fcntl2: UNLCK");return;}
100
101         fl.l_type = F_WRLCK;
102         fl.l_whence = SEEK_SET;
103         fl.l_start = 0;
104         fl.l_len = 0;
105
106         if (fcntl(fd1, F_SETLK, &fl) == -1)
107             {perror("fcntl3: WRLCK");return;}
108
109         fl.l_type = F_UNLCK;
110         fl.l_whence = SEEK_SET;
111         fl.l_start = 0;
112         fl.l_len = 0;
113
114         if (fcntl(fd1, F_SETLK, &fl) == -1)
115             {perror("fcntl4: UNLCK");return;}
116     }
117
118     if (fsync(fd1) < 0)
119         {perror("fsync");return;}
120     if (write(fd1, "hi\n", 3) != 3)
121         {perror("write");return;}
122     if (ftruncate(fd1, 2) < 0)
123         {perror("ftruncate");return;}
124     if (close(fd1) < 0)
125         {perror("close2");return;}
126
127     fd1 = open("hi", O_RDONLY);
128     if (fd1 < 0)
129         {perror("open3");return;}
130     if (read(fd1, tempName, 100) != 2)
131         {perror("read2");return;}
132     if (close(fd1) < 0)
133         {perror("close3");return;}
134
135     if (link("hi", "bye") < 0)
136         {perror("link");return;}
137     if (stat("bye", &tstat) < 0)
138         {perror("link/stat");return;}
139
140     if (unlink("bye") < 0)
141         {perror("unlink");return;}
142
143     if (symlink("hi", "bye") < 0)
144         {perror("symlink");return;}
145     if (readlink("bye", tempName, 100) != 2)
146         {perror("readlink");return;}
147     if (strncmp(tempName, "hi", 2) != 0)
148         return printf("readlink contents");
149     if (mkdir("tdir", 0777) < 0)
150         {perror("mkdir");return;}
151     fd1 = open("tdir/fdsa", O_CREAT | O_TRUNC, 0777);
152     close(fd1);
153     if (rmdir("tdir") == 0)
154         return printf("removed non-empty dir\n");
155     if (unlink("tdir/fdsa") < 0)
156         {perror("unlink tdir contents");return;}
157     if (rmdir("tdir") < 0)
158         {perror("rmdir");return;}
159
160     fd1 = open(".", O_RDONLY);
161     if (fd1 < 0)
162         {perror("open dot");return;}
163     if (read(fd1, tempName, 20) < 20)
164         perror("read dir");
165     close(fd1);
166
167     fd1 = open("rotest", O_RDWR | O_CREAT, 0444);
168     if (fd1 < 0)
169         {perror("open ronly");return;}
170     fchown(fd1, 1, -1);         /* don't check error code, may fail on Ultrix */
171     code = write(fd1, "test", 4);
172     if (code != 4) {
173         printf("rotest short read (%d)\n", code);
174         exit(1);
175     }
176     code = close(fd1);
177     if (code)
178         {perror("close ronly");return;}
179     code = stat("rotest", &tstat);
180     if (code < 0)
181         {perror("stat ronly");return;}
182     if (tstat.st_size != 4) {
183         printf("rotest short close\n");
184         exit(1);
185     }
186     if (unlink("rotest") < 0)
187         {perror("rotest unlink");return;}
188
189     if (rename("hi", "bye") < 0)
190         {perror("rename1");return;}
191     if (stat("bye", &tstat) < 0)
192         {perror("rename target invisible\n");return;}
193     if (stat("hi", &tstat) == 0)
194         return printf("rename source still there\n");
195
196 #ifndef AFS_AIX_ENV
197 /* No truncate(2) on aix so the following are excluded */
198     if (truncate("bye", 1) < 0)
199         {perror("truncate");return;}
200     if (stat("bye", &tstat) < 0)
201         {perror("truncate zapped");return;}
202     if (tstat.st_size != 1)
203         return printf("truncate failed\n");
204 #endif
205     if (utimes("bye", tvp) < 0)
206         {perror("utimes");return;}
207     if (unlink("bye") < 0)
208         {perror("unlink bye");return;}
209
210     /* now finish up */
211     chdir("..");
212     rmdir(dirName);
213     printf("Test completed successfully.\n");
214     return 0;
215 }