1*b725ae77Skettenis #include <stdio.h>
2*b725ae77Skettenis #include <stdlib.h>
3*b725ae77Skettenis #include <string.h>
4*b725ae77Skettenis #include <sys/errno.h>
5*b725ae77Skettenis #include <sys/types.h>
6*b725ae77Skettenis #include <sys/fcntl.h>
7*b725ae77Skettenis #include <sys/stat.h>
8*b725ae77Skettenis #include <sys/time.h>
9*b725ae77Skettenis #include <errno.h>
10*b725ae77Skettenis #include <sys/wait.h>
11*b725ae77Skettenis /* TESTS :
12*b725ae77Skettenis * - open(const char *pathname, int flags, mode_t mode);
13*b725ae77Skettenis 1) Attempt to create file that already exists - EEXIST
14*b725ae77Skettenis 2) Attempt to open a directory for writing - EISDIR
15*b725ae77Skettenis 3) Pathname does not exist - ENOENT
16*b725ae77Skettenis 4) Open for write but no write permission - EACCES
17*b725ae77Skettenis
18*b725ae77Skettenis read(int fd, void *buf, size_t count);
19*b725ae77Skettenis 1) Read using invalid file descriptor - EBADF
20*b725ae77Skettenis
21*b725ae77Skettenis write(int fd, const void *buf, size_t count);
22*b725ae77Skettenis 1) Write using invalid file descriptor - EBADF
23*b725ae77Skettenis 2) Attempt to write to read-only file - EBADF
24*b725ae77Skettenis
25*b725ae77Skettenis lseek(int fildes, off_t offset, int whence);
26*b725ae77Skettenis 1) Seeking on an invalid file descriptor - EBADF
27*b725ae77Skettenis 2) Invalid "whence" (3rd param) value - EINVAL
28*b725ae77Skettenis
29*b725ae77Skettenis close(int fd);
30*b725ae77Skettenis 1) Attempt to close an invalid file descriptor - EBADF
31*b725ae77Skettenis
32*b725ae77Skettenis stat(const char *file_name, struct stat *buf);
33*b725ae77Skettenis 1) Pathname is a null string - ENOENT
34*b725ae77Skettenis 2) Pathname does not exist - ENOENT
35*b725ae77Skettenis
36*b725ae77Skettenis fstat(int filedes, struct stat *buf);
37*b725ae77Skettenis 1) Attempt to stat using an invalid file descriptor - EBADF
38*b725ae77Skettenis
39*b725ae77Skettenis isatty (int desc);
40*b725ae77Skettenis Not applicable. We will test that it returns 1 when expected and a case
41*b725ae77Skettenis where it should return 0.
42*b725ae77Skettenis
43*b725ae77Skettenis rename(const char *oldpath, const char *newpath);
44*b725ae77Skettenis 1) newpath is an existing directory, but oldpath is not a directory. - EISDIR
45*b725ae77Skettenis 2) newpath is a non-empty directory. - ENOTEMPTY or EEXIST
46*b725ae77Skettenis 3) newpath is a subdirectory of old path. - EINVAL
47*b725ae77Skettenis 4) oldpath does not exist. - ENOENT
48*b725ae77Skettenis
49*b725ae77Skettenis unlink(const char *pathname);
50*b725ae77Skettenis 1) pathname does not have write access. - EACCES
51*b725ae77Skettenis 2) pathname does not exist. - ENOENT
52*b725ae77Skettenis
53*b725ae77Skettenis time(time_t *t);
54*b725ae77Skettenis Not applicable.
55*b725ae77Skettenis
56*b725ae77Skettenis system (const char * string);
57*b725ae77Skettenis 1) Invalid string/command. - returns 127. */
58*b725ae77Skettenis
59*b725ae77Skettenis static const char *strerrno (int err);
60*b725ae77Skettenis
61*b725ae77Skettenis #define FILENAME "foo.fileio.test"
62*b725ae77Skettenis #define RENAMED "bar.fileio.test"
63*b725ae77Skettenis #define NONEXISTANT "nofoo.fileio.test"
64*b725ae77Skettenis #define NOWRITE "nowrt.fileio.test"
65*b725ae77Skettenis #define TESTDIR1 "dir1.fileio.test"
66*b725ae77Skettenis #define TESTDIR2 "dir2.fileio.test"
67*b725ae77Skettenis #define TESTSUBDIR "dir1.fileio.test/subdir.fileio.test"
68*b725ae77Skettenis
69*b725ae77Skettenis #define STRING "Hello World"
70*b725ae77Skettenis
71*b725ae77Skettenis int
test_open()72*b725ae77Skettenis test_open ()
73*b725ae77Skettenis {
74*b725ae77Skettenis int ret;
75*b725ae77Skettenis
76*b725ae77Skettenis /* Test opening */
77*b725ae77Skettenis errno = 0;
78*b725ae77Skettenis ret = open (FILENAME, O_CREAT | O_TRUNC | O_RDWR, S_IWUSR | S_IRUSR);
79*b725ae77Skettenis printf ("open 1: ret = %d, errno = %d %s\n", ret, errno,
80*b725ae77Skettenis ret >= 0 ? "OK" : "");
81*b725ae77Skettenis if (ret >= 0)
82*b725ae77Skettenis close (ret);
83*b725ae77Skettenis /* Creating an already existing file (created by fileio.exp) */
84*b725ae77Skettenis errno = 0;
85*b725ae77Skettenis ret = open (FILENAME, O_CREAT | O_EXCL | O_WRONLY, S_IWUSR | S_IRUSR);
86*b725ae77Skettenis printf ("open 2: ret = %d, errno = %d %s\n", ret, errno,
87*b725ae77Skettenis strerrno (errno));
88*b725ae77Skettenis if (ret >= 0)
89*b725ae77Skettenis close (ret);
90*b725ae77Skettenis /* Open directory (for writing) */
91*b725ae77Skettenis errno = 0;
92*b725ae77Skettenis ret = open (".", O_WRONLY);
93*b725ae77Skettenis printf ("open 3: ret = %d, errno = %d %s\n", ret, errno,
94*b725ae77Skettenis strerrno (errno));
95*b725ae77Skettenis if (ret >= 0)
96*b725ae77Skettenis close (ret);
97*b725ae77Skettenis /* Opening nonexistant file */
98*b725ae77Skettenis errno = 0;
99*b725ae77Skettenis ret = open (NONEXISTANT, O_RDONLY);
100*b725ae77Skettenis printf ("open 4: ret = %d, errno = %d %s\n", ret, errno,
101*b725ae77Skettenis strerrno (errno));
102*b725ae77Skettenis if (ret >= 0)
103*b725ae77Skettenis close (ret);
104*b725ae77Skettenis /* Open for write but no write permission */
105*b725ae77Skettenis errno = 0;
106*b725ae77Skettenis ret = open (NOWRITE, O_CREAT | O_RDONLY, S_IRUSR);
107*b725ae77Skettenis if (ret >= 0)
108*b725ae77Skettenis {
109*b725ae77Skettenis close (ret);
110*b725ae77Skettenis errno = 0;
111*b725ae77Skettenis ret = open (NOWRITE, O_WRONLY);
112*b725ae77Skettenis printf ("open 5: ret = %d, errno = %d %s\n", ret, errno,
113*b725ae77Skettenis strerrno (errno));
114*b725ae77Skettenis if (ret >= 0)
115*b725ae77Skettenis close (ret);
116*b725ae77Skettenis }
117*b725ae77Skettenis else
118*b725ae77Skettenis printf ("open 5: ret = %d, errno = %d\n", ret, errno);
119*b725ae77Skettenis }
120*b725ae77Skettenis
121*b725ae77Skettenis int
test_write()122*b725ae77Skettenis test_write ()
123*b725ae77Skettenis {
124*b725ae77Skettenis int fd, ret;
125*b725ae77Skettenis
126*b725ae77Skettenis /* Test writing */
127*b725ae77Skettenis errno = 0;
128*b725ae77Skettenis fd = open (FILENAME, O_WRONLY);
129*b725ae77Skettenis if (fd >= 0)
130*b725ae77Skettenis {
131*b725ae77Skettenis errno = 0;
132*b725ae77Skettenis ret = write (fd, STRING, strlen (STRING));
133*b725ae77Skettenis printf ("write 1: ret = %d, errno = %d %s\n", ret, errno,
134*b725ae77Skettenis ret == strlen (STRING) ? "OK" : "");
135*b725ae77Skettenis close (fd);
136*b725ae77Skettenis }
137*b725ae77Skettenis else
138*b725ae77Skettenis printf ("write 1: ret = %d, errno = %d\n", ret, errno);
139*b725ae77Skettenis /* Write using invalid file descriptor */
140*b725ae77Skettenis errno = 0;
141*b725ae77Skettenis ret = write (999, STRING, strlen (STRING));
142*b725ae77Skettenis printf ("write 2: ret = %d, errno = %d, %s\n", ret, errno,
143*b725ae77Skettenis strerrno (errno));
144*b725ae77Skettenis /* Write to a read-only file */
145*b725ae77Skettenis errno = 0;
146*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
147*b725ae77Skettenis if (fd >= 0)
148*b725ae77Skettenis {
149*b725ae77Skettenis errno = 0;
150*b725ae77Skettenis ret = write (fd, STRING, strlen (STRING));
151*b725ae77Skettenis printf ("write 3: ret = %d, errno = %d %s\n", ret, errno,
152*b725ae77Skettenis strerrno (errno));
153*b725ae77Skettenis }
154*b725ae77Skettenis else
155*b725ae77Skettenis printf ("write 3: ret = %d, errno = %d\n", ret, errno);
156*b725ae77Skettenis }
157*b725ae77Skettenis
158*b725ae77Skettenis int
test_read()159*b725ae77Skettenis test_read ()
160*b725ae77Skettenis {
161*b725ae77Skettenis int fd, ret;
162*b725ae77Skettenis char buf[16];
163*b725ae77Skettenis
164*b725ae77Skettenis /* Test reading */
165*b725ae77Skettenis errno = 0;
166*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
167*b725ae77Skettenis if (fd >= 0)
168*b725ae77Skettenis {
169*b725ae77Skettenis memset (buf, 0, 16);
170*b725ae77Skettenis errno = 0;
171*b725ae77Skettenis ret = read (fd, buf, 16);
172*b725ae77Skettenis buf[15] = '\0'; /* Don't trust anybody... */
173*b725ae77Skettenis if (ret == strlen (STRING))
174*b725ae77Skettenis printf ("read 1: %s %s\n", buf, !strcmp (buf, STRING) ? "OK" : "");
175*b725ae77Skettenis else
176*b725ae77Skettenis printf ("read 1: ret = %d, errno = %d\n", ret, errno);
177*b725ae77Skettenis close (fd);
178*b725ae77Skettenis }
179*b725ae77Skettenis else
180*b725ae77Skettenis printf ("read 1: ret = %d, errno = %d\n", ret, errno);
181*b725ae77Skettenis /* Read using invalid file descriptor */
182*b725ae77Skettenis errno = 0;
183*b725ae77Skettenis ret = read (999, buf, 16);
184*b725ae77Skettenis printf ("read 2: ret = %d, errno = %d %s\n", ret, errno,
185*b725ae77Skettenis strerrno (errno));
186*b725ae77Skettenis }
187*b725ae77Skettenis
188*b725ae77Skettenis int
test_lseek()189*b725ae77Skettenis test_lseek ()
190*b725ae77Skettenis {
191*b725ae77Skettenis int fd;
192*b725ae77Skettenis off_t ret = 0;
193*b725ae77Skettenis
194*b725ae77Skettenis /* Test seeking */
195*b725ae77Skettenis errno = 0;
196*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
197*b725ae77Skettenis if (fd >= 0)
198*b725ae77Skettenis {
199*b725ae77Skettenis errno = 0;
200*b725ae77Skettenis ret = lseek (fd, 0, SEEK_CUR);
201*b725ae77Skettenis printf ("lseek 1: ret = %ld, errno = %d, %s\n", (long) ret, errno,
202*b725ae77Skettenis ret == 0 ? "OK" : "");
203*b725ae77Skettenis errno = 0;
204*b725ae77Skettenis ret = lseek (fd, 0, SEEK_END);
205*b725ae77Skettenis printf ("lseek 2: ret = %ld, errno = %d, %s\n", (long) ret, errno,
206*b725ae77Skettenis ret == 11 ? "OK" : "");
207*b725ae77Skettenis errno = 0;
208*b725ae77Skettenis ret = lseek (fd, 3, SEEK_SET);
209*b725ae77Skettenis printf ("lseek 3: ret = %ld, errno = %d, %s\n", (long) ret, errno,
210*b725ae77Skettenis ret == 3 ? "OK" : "");
211*b725ae77Skettenis close (fd);
212*b725ae77Skettenis }
213*b725ae77Skettenis else
214*b725ae77Skettenis {
215*b725ae77Skettenis printf ("lseek 1: ret = %d, errno = %d\n", ret, errno);
216*b725ae77Skettenis printf ("lseek 2: ret = %d, errno = %d\n", ret, errno);
217*b725ae77Skettenis printf ("lseek 3: ret = %d, errno = %d\n", ret, errno);
218*b725ae77Skettenis }
219*b725ae77Skettenis /* Seeking on an invalid file descriptor */
220*b725ae77Skettenis
221*b725ae77Skettenis }
222*b725ae77Skettenis
223*b725ae77Skettenis int
test_close()224*b725ae77Skettenis test_close ()
225*b725ae77Skettenis {
226*b725ae77Skettenis int fd, ret;
227*b725ae77Skettenis
228*b725ae77Skettenis /* Test close */
229*b725ae77Skettenis errno = 0;
230*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
231*b725ae77Skettenis if (fd >= 0)
232*b725ae77Skettenis {
233*b725ae77Skettenis errno = 0;
234*b725ae77Skettenis ret = close (fd);
235*b725ae77Skettenis printf ("close 1: ret = %d, errno = %d, %s\n", ret, errno,
236*b725ae77Skettenis ret == 0 ? "OK" : "");
237*b725ae77Skettenis }
238*b725ae77Skettenis else
239*b725ae77Skettenis printf ("close 1: ret = %d, errno = %d\n", ret, errno);
240*b725ae77Skettenis /* Close an invalid file descriptor */
241*b725ae77Skettenis errno = 0;
242*b725ae77Skettenis ret = close (999);
243*b725ae77Skettenis printf ("close 2: ret = %d, errno = %d, %s\n", ret, errno,
244*b725ae77Skettenis strerrno (errno));
245*b725ae77Skettenis }
246*b725ae77Skettenis
247*b725ae77Skettenis int
test_stat()248*b725ae77Skettenis test_stat ()
249*b725ae77Skettenis {
250*b725ae77Skettenis int ret;
251*b725ae77Skettenis struct stat st;
252*b725ae77Skettenis
253*b725ae77Skettenis /* Test stat */
254*b725ae77Skettenis errno = 0;
255*b725ae77Skettenis ret = stat (FILENAME, &st);
256*b725ae77Skettenis if (!ret)
257*b725ae77Skettenis printf ("stat 1: ret = %d, errno = %d %s\n", ret, errno,
258*b725ae77Skettenis st.st_size == 11 ? "OK" : "");
259*b725ae77Skettenis else
260*b725ae77Skettenis printf ("stat 1: ret = %d, errno = %d\n", ret, errno);
261*b725ae77Skettenis /* NULL pathname */
262*b725ae77Skettenis errno = 0;
263*b725ae77Skettenis ret = stat (NULL, &st);
264*b725ae77Skettenis printf ("stat 2: ret = %d, errno = %d %s\n", ret, errno,
265*b725ae77Skettenis strerrno (errno));
266*b725ae77Skettenis /* Empty pathname */
267*b725ae77Skettenis errno = 0;
268*b725ae77Skettenis ret = stat ("", &st);
269*b725ae77Skettenis printf ("stat 3: ret = %d, errno = %d %s\n", ret, errno,
270*b725ae77Skettenis strerrno (errno));
271*b725ae77Skettenis /* Nonexistant file */
272*b725ae77Skettenis errno = 0;
273*b725ae77Skettenis ret = stat (NONEXISTANT, &st);
274*b725ae77Skettenis printf ("stat 4: ret = %d, errno = %d %s\n", ret, errno,
275*b725ae77Skettenis strerrno (errno));
276*b725ae77Skettenis }
277*b725ae77Skettenis
278*b725ae77Skettenis int
test_fstat()279*b725ae77Skettenis test_fstat ()
280*b725ae77Skettenis {
281*b725ae77Skettenis int fd, ret;
282*b725ae77Skettenis struct stat st;
283*b725ae77Skettenis
284*b725ae77Skettenis /* Test fstat */
285*b725ae77Skettenis errno = 0;
286*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
287*b725ae77Skettenis if (fd >= 0)
288*b725ae77Skettenis {
289*b725ae77Skettenis errno = 0;
290*b725ae77Skettenis ret = fstat (fd, &st);
291*b725ae77Skettenis if (!ret)
292*b725ae77Skettenis printf ("fstat 1: ret = %d, errno = %d %s\n", ret, errno,
293*b725ae77Skettenis st.st_size == 11 ? "OK" : "");
294*b725ae77Skettenis else
295*b725ae77Skettenis printf ("fstat 1: ret = %d, errno = %d\n", ret, errno);
296*b725ae77Skettenis close (fd);
297*b725ae77Skettenis }
298*b725ae77Skettenis else
299*b725ae77Skettenis printf ("fstat 1: ret = %d, errno = %d\n", ret, errno);
300*b725ae77Skettenis /* Fstat using invalid file descriptor */
301*b725ae77Skettenis errno = 0;
302*b725ae77Skettenis ret = fstat (999, &st);
303*b725ae77Skettenis printf ("fstat 2: ret = %d, errno = %d %s\n", ret, errno,
304*b725ae77Skettenis strerrno (errno));
305*b725ae77Skettenis }
306*b725ae77Skettenis
307*b725ae77Skettenis int
test_isatty()308*b725ae77Skettenis test_isatty ()
309*b725ae77Skettenis {
310*b725ae77Skettenis int fd;
311*b725ae77Skettenis
312*b725ae77Skettenis /* Check std I/O */
313*b725ae77Skettenis printf ("isatty 1: stdin %s\n", isatty (0) ? "yes OK" : "no");
314*b725ae77Skettenis printf ("isatty 2: stdout %s\n", isatty (1) ? "yes OK" : "no");
315*b725ae77Skettenis printf ("isatty 3: stderr %s\n", isatty (2) ? "yes OK" : "no");
316*b725ae77Skettenis /* Check invalid fd */
317*b725ae77Skettenis printf ("isatty 4: invalid %s\n", isatty (999) ? "yes" : "no OK");
318*b725ae77Skettenis /* Check open file */
319*b725ae77Skettenis fd = open (FILENAME, O_RDONLY);
320*b725ae77Skettenis if (fd >= 0)
321*b725ae77Skettenis {
322*b725ae77Skettenis printf ("isatty 5: file %s\n", isatty (fd) ? "yes" : "no OK");
323*b725ae77Skettenis close (fd);
324*b725ae77Skettenis }
325*b725ae77Skettenis else
326*b725ae77Skettenis printf ("isatty 5: file couldn't open\n");
327*b725ae77Skettenis }
328*b725ae77Skettenis
329*b725ae77Skettenis
330*b725ae77Skettenis int
test_system()331*b725ae77Skettenis test_system ()
332*b725ae77Skettenis {
333*b725ae77Skettenis /*
334*b725ae77Skettenis * Requires test framework to switch on "set remote system-call-allowed 1"
335*b725ae77Skettenis */
336*b725ae77Skettenis int ret;
337*b725ae77Skettenis char sys[512];
338*b725ae77Skettenis
339*b725ae77Skettenis /* This test prepares the directory for test_rename() */
340*b725ae77Skettenis sprintf (sys, "mkdir -p %s %s", TESTSUBDIR, TESTDIR2);
341*b725ae77Skettenis ret = system (sys);
342*b725ae77Skettenis if (ret == 127)
343*b725ae77Skettenis printf ("system 1: ret = %d /bin/sh unavailable???\n", ret);
344*b725ae77Skettenis else
345*b725ae77Skettenis printf ("system 1: ret = %d %s\n", ret, ret == 0 ? "OK" : "");
346*b725ae77Skettenis /* Invalid command (just guessing ;-) ) */
347*b725ae77Skettenis ret = system ("wrtzlpfrmpft");
348*b725ae77Skettenis printf ("system 2: ret = %d %s\n", ret, WEXITSTATUS (ret) == 127 ? "OK" : "");
349*b725ae77Skettenis }
350*b725ae77Skettenis
351*b725ae77Skettenis int
test_rename()352*b725ae77Skettenis test_rename ()
353*b725ae77Skettenis {
354*b725ae77Skettenis int ret;
355*b725ae77Skettenis struct stat st;
356*b725ae77Skettenis
357*b725ae77Skettenis /* Test rename */
358*b725ae77Skettenis errno = 0;
359*b725ae77Skettenis ret = rename (FILENAME, RENAMED);
360*b725ae77Skettenis if (!ret)
361*b725ae77Skettenis {
362*b725ae77Skettenis errno = 0;
363*b725ae77Skettenis ret = stat (FILENAME, &st);
364*b725ae77Skettenis if (ret && errno == ENOENT)
365*b725ae77Skettenis {
366*b725ae77Skettenis errno = 0;
367*b725ae77Skettenis ret = stat (RENAMED, &st);
368*b725ae77Skettenis printf ("rename 1: ret = %d, errno = %d %s\n", ret, errno,
369*b725ae77Skettenis strerrno (errno));
370*b725ae77Skettenis errno = 0;
371*b725ae77Skettenis }
372*b725ae77Skettenis else
373*b725ae77Skettenis printf ("rename 1: ret = %d, errno = %d\n", ret, errno);
374*b725ae77Skettenis }
375*b725ae77Skettenis else
376*b725ae77Skettenis printf ("rename 1: ret = %d, errno = %d\n", ret, errno);
377*b725ae77Skettenis /* newpath is existing directory, oldpath is not a directory */
378*b725ae77Skettenis errno = 0;
379*b725ae77Skettenis ret = rename (RENAMED, TESTDIR2);
380*b725ae77Skettenis printf ("rename 2: ret = %d, errno = %d %s\n", ret, errno,
381*b725ae77Skettenis strerrno (errno));
382*b725ae77Skettenis /* newpath is a non-empty directory */
383*b725ae77Skettenis errno = 0;
384*b725ae77Skettenis ret = rename (TESTDIR2, TESTDIR1);
385*b725ae77Skettenis printf ("rename 3: ret = %d, errno = %d %s\n", ret, errno,
386*b725ae77Skettenis strerrno (errno));
387*b725ae77Skettenis /* newpath is a subdirectory of old path */
388*b725ae77Skettenis errno = 0;
389*b725ae77Skettenis ret = rename (TESTDIR1, TESTSUBDIR);
390*b725ae77Skettenis printf ("rename 4: ret = %d, errno = %d %s\n", ret, errno,
391*b725ae77Skettenis strerrno (errno));
392*b725ae77Skettenis /* oldpath does not exist */
393*b725ae77Skettenis errno = 0;
394*b725ae77Skettenis ret = rename (NONEXISTANT, FILENAME);
395*b725ae77Skettenis printf ("rename 5: ret = %d, errno = %d %s\n", ret, errno,
396*b725ae77Skettenis strerrno (errno));
397*b725ae77Skettenis }
398*b725ae77Skettenis
399*b725ae77Skettenis int
test_unlink()400*b725ae77Skettenis test_unlink ()
401*b725ae77Skettenis {
402*b725ae77Skettenis int ret;
403*b725ae77Skettenis char name[256];
404*b725ae77Skettenis char sys[512];
405*b725ae77Skettenis
406*b725ae77Skettenis /* Test unlink */
407*b725ae77Skettenis errno = 0;
408*b725ae77Skettenis ret = unlink (RENAMED);
409*b725ae77Skettenis printf ("unlink 1: ret = %d, errno = %d %s\n", ret, errno,
410*b725ae77Skettenis strerrno (errno));
411*b725ae77Skettenis /* No write access */
412*b725ae77Skettenis sprintf (name, "%s/%s", TESTDIR2, FILENAME);
413*b725ae77Skettenis errno = 0;
414*b725ae77Skettenis ret = open (name, O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR);
415*b725ae77Skettenis if (ret >= 0)
416*b725ae77Skettenis {
417*b725ae77Skettenis sprintf (sys, "chmod -w %s", TESTDIR2);
418*b725ae77Skettenis ret = system (sys);
419*b725ae77Skettenis if (!ret)
420*b725ae77Skettenis {
421*b725ae77Skettenis errno = 0;
422*b725ae77Skettenis ret = unlink (name);
423*b725ae77Skettenis printf ("unlink 2: ret = %d, errno = %d %s\n", ret, errno,
424*b725ae77Skettenis strerrno (errno));
425*b725ae77Skettenis }
426*b725ae77Skettenis else
427*b725ae77Skettenis printf ("unlink 2: ret = %d chmod failed\n", ret, errno);
428*b725ae77Skettenis }
429*b725ae77Skettenis else
430*b725ae77Skettenis printf ("unlink 2: ret = %d, errno = %d\n", ret, errno);
431*b725ae77Skettenis /* pathname doesn't exist */
432*b725ae77Skettenis errno = 0;
433*b725ae77Skettenis ret = unlink (NONEXISTANT);
434*b725ae77Skettenis printf ("unlink 3: ret = %d, errno = %d %s\n", ret, errno,
435*b725ae77Skettenis strerrno (errno));
436*b725ae77Skettenis }
437*b725ae77Skettenis
438*b725ae77Skettenis int
test_time()439*b725ae77Skettenis test_time ()
440*b725ae77Skettenis {
441*b725ae77Skettenis time_t ret, t;
442*b725ae77Skettenis
443*b725ae77Skettenis errno = 0;
444*b725ae77Skettenis ret = time (&t);
445*b725ae77Skettenis printf ("time 1: ret = %ld, errno = %d, t = %ld %s\n", (long) ret, errno, (long) t, ret == t ? "OK" : "");
446*b725ae77Skettenis errno = 0;
447*b725ae77Skettenis ret = time (NULL);
448*b725ae77Skettenis printf ("time 2: ret = %ld, errno = %d, t = %ld %s\n",
449*b725ae77Skettenis (long) ret, errno, (long) t, ret >= t && ret < t + 10 ? "OK" : "");
450*b725ae77Skettenis }
451*b725ae77Skettenis
452*b725ae77Skettenis static const char *
strerrno(int err)453*b725ae77Skettenis strerrno (int err)
454*b725ae77Skettenis {
455*b725ae77Skettenis switch (err)
456*b725ae77Skettenis {
457*b725ae77Skettenis case 0: return "OK";
458*b725ae77Skettenis #ifdef EACCES
459*b725ae77Skettenis case EACCES: return "EACCES";
460*b725ae77Skettenis #endif
461*b725ae77Skettenis #ifdef EBADF
462*b725ae77Skettenis case EBADF: return "EBADF";
463*b725ae77Skettenis #endif
464*b725ae77Skettenis #ifdef EEXIST
465*b725ae77Skettenis case EEXIST: return "EEXIST";
466*b725ae77Skettenis #endif
467*b725ae77Skettenis #ifdef EFAULT
468*b725ae77Skettenis case EFAULT: return "EFAULT";
469*b725ae77Skettenis #endif
470*b725ae77Skettenis #ifdef EINVAL
471*b725ae77Skettenis case EINVAL: return "EINVAL";
472*b725ae77Skettenis #endif
473*b725ae77Skettenis #ifdef EISDIR
474*b725ae77Skettenis case EISDIR: return "EISDIR";
475*b725ae77Skettenis #endif
476*b725ae77Skettenis #ifdef ENOENT
477*b725ae77Skettenis case ENOENT: return "ENOENT";
478*b725ae77Skettenis #endif
479*b725ae77Skettenis #ifdef ENOTEMPTY
480*b725ae77Skettenis case ENOTEMPTY: return "ENOTEMPTY";
481*b725ae77Skettenis #endif
482*b725ae77Skettenis #ifdef EBUSY
483*b725ae77Skettenis case EBUSY: return "EBUSY";
484*b725ae77Skettenis #endif
485*b725ae77Skettenis default: return "E??";
486*b725ae77Skettenis }
487*b725ae77Skettenis }
488*b725ae77Skettenis
489*b725ae77Skettenis int
main()490*b725ae77Skettenis main ()
491*b725ae77Skettenis {
492*b725ae77Skettenis /* Don't change the order of the calls. They partly depend on each other */
493*b725ae77Skettenis test_open ();
494*b725ae77Skettenis test_write ();
495*b725ae77Skettenis test_read ();
496*b725ae77Skettenis test_lseek ();
497*b725ae77Skettenis test_close ();
498*b725ae77Skettenis test_stat ();
499*b725ae77Skettenis test_fstat ();
500*b725ae77Skettenis test_isatty ();
501*b725ae77Skettenis test_system ();
502*b725ae77Skettenis test_rename ();
503*b725ae77Skettenis test_unlink ();
504*b725ae77Skettenis test_time ();
505*b725ae77Skettenis return 0;
506*b725ae77Skettenis }
507