Fix PR 20345 - call_function_by_hand_dummy: Assertion `tp->thread_fsm == &sm->thread_...
[deliverable/binutils-gdb.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 () {}
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 }
This page took 0.042109 seconds and 4 git commands to generate.