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