]>
Commit | Line | Data |
---|---|---|
a9b171ef | 1 | /* Tests for pread and pwrite. |
f7a9f785 | 2 | Copyright (C) 1998-2016 Free Software Foundation, Inc. |
41bdb6e2 | 3 | This file is part of the GNU C Library. |
a9b171ef UD |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
a9b171ef UD |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
a9b171ef | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
a9b171ef UD |
19 | |
20 | #include <errno.h> | |
21 | #include <error.h> | |
22 | #include <string.h> | |
23 | #include <unistd.h> | |
24 | ||
25 | ||
09bbe3bf UD |
26 | /* Allow testing of the 64-bit versions as well. */ |
27 | #ifndef PREAD | |
28 | # define PREAD pread | |
29 | # define PWRITE pwrite | |
30 | #endif | |
31 | ||
32 | #define STRINGIFY(s) STRINGIFY2 (s) | |
33 | #define STRINGIFY2(s) #s | |
34 | ||
a9b171ef UD |
35 | /* Prototype for our test function. */ |
36 | extern void do_prepare (int argc, char *argv[]); | |
37 | extern int do_test (int argc, char *argv[]); | |
38 | ||
39 | /* We have a preparation function. */ | |
40 | #define PREPARE do_prepare | |
41 | ||
42 | /* We might need a bit longer timeout. */ | |
43 | #define TIMEOUT 20 /* sec */ | |
44 | ||
45 | /* This defines the `main' function and some more. */ | |
46 | #include <test-skeleton.c> | |
47 | ||
48 | /* These are for the temporary file we generate. */ | |
49 | char *name; | |
50 | int fd; | |
51 | ||
52 | void | |
53 | do_prepare (int argc, char *argv[]) | |
54 | { | |
30aa5785 | 55 | size_t name_len; |
a9b171ef | 56 | |
0a550321 UD |
57 | #define FNAME FNAME2(TRUNCATE) |
58 | #define FNAME2(s) "/" STRINGIFY(s) "XXXXXX" | |
59 | ||
60 | name_len = strlen (test_dir); | |
61 | name = malloc (name_len + sizeof (FNAME)); | |
08c7f6b0 UD |
62 | if (name == NULL) |
63 | error (EXIT_FAILURE, errno, "cannot allocate file name"); | |
0a550321 UD |
64 | mempcpy (mempcpy (name, test_dir, name_len), FNAME, sizeof (FNAME)); |
65 | add_temp_file (name); | |
66 | ||
67 | /* Open our test file. */ | |
68 | fd = mkstemp (name); | |
69 | if (fd == -1) | |
70 | error (EXIT_FAILURE, errno, "cannot open test file `%s'", name); | |
a9b171ef UD |
71 | } |
72 | ||
73 | ||
74 | int | |
75 | do_test (int argc, char *argv[]) | |
76 | { | |
77 | char buf[1000]; | |
78 | char res[1000]; | |
79 | int i; | |
80 | ||
81 | memset (buf, '\0', sizeof (buf)); | |
82 | memset (res, '\xff', sizeof (res)); | |
83 | ||
84 | if (write (fd, buf, sizeof (buf)) != sizeof (buf)) | |
85 | error (EXIT_FAILURE, errno, "during write"); | |
86 | ||
87 | for (i = 100; i < 200; ++i) | |
88 | buf[i] = i; | |
09bbe3bf UD |
89 | if (PWRITE (fd, buf + 100, 100, 100) != 100) |
90 | error (EXIT_FAILURE, errno, "during %s", STRINGIFY (PWRITE)); | |
a9b171ef UD |
91 | |
92 | for (i = 450; i < 600; ++i) | |
93 | buf[i] = i; | |
09bbe3bf UD |
94 | if (PWRITE (fd, buf + 450, 150, 450) != 150) |
95 | error (EXIT_FAILURE, errno, "during %s", STRINGIFY (PWRITE)); | |
a9b171ef | 96 | |
09bbe3bf UD |
97 | if (PREAD (fd, res, sizeof (buf) - 50, 50) != sizeof (buf) - 50) |
98 | error (EXIT_FAILURE, errno, "during %s", STRINGIFY (PREAD)); | |
a9b171ef UD |
99 | |
100 | close (fd); | |
101 | unlink (name); | |
102 | ||
103 | return memcmp (buf + 50, res, sizeof (buf) - 50); | |
104 | } |