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