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