| /* Test that /proc/{self,$PID}/auxv can be opened and read simultaneously |
| using two different file descriptors. */ |
| |
| #include <assert.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <sys/auxv.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| |
| /* Reads one auxv_t entry from the input file. */ |
| int read_entry(int fi, auxv_t *out) |
| { |
| size_t toread = sizeof(*out); |
| char *ptr = (char*)out; |
| |
| while (toread) { |
| ssize_t r; |
| |
| r = read(fi, ptr, toread); |
| if (r == 0) { |
| fprintf(stderr, "unexpected EOF\n"); |
| return 1; |
| } |
| if (r == -1) { |
| perror("read"); |
| return 1; |
| } |
| |
| ptr += r; |
| toread -= r; |
| |
| assert(toread >= 0); |
| } |
| |
| return 0; |
| } |
| |
| int main(void) |
| { |
| auxv_t vector[2][4]; |
| int fi[2] = {-1, -1}; |
| size_t i; |
| int res = 1; |
| |
| /* Open the first input file. */ |
| if ((fi[0] = open("/proc/self/auxv", O_RDONLY)) == -1) { |
| perror("open"); |
| goto out; |
| } |
| |
| /* Read the first two entries from the first file. */ |
| for (i = 0; i < 2; i++) |
| if (read_entry(fi[0], &vector[0][i])) |
| goto out; |
| |
| /* Open the second input file. */ |
| if ((fi[1] = open("/proc/self/auxv", O_RDONLY)) == -1) { |
| perror("open"); |
| goto out; |
| } |
| |
| /* Read the first two entries from the first file. */ |
| for (i = 2; i < 4; i++) |
| if (read_entry(fi[0], &vector[0][i])) |
| goto out; |
| |
| /* Read the first four entries from the second file. */ |
| for (i = 0; i < 4; i++) |
| if (read_entry(fi[1], &vector[1][i])) |
| goto out; |
| |
| /* Compare read vectors. */ |
| if (memcmp(vector[0], vector[1], 4 * sizeof(vector[0][0]))) { |
| fprintf(stderr, "vectors differ\n"); |
| goto out; |
| } |
| |
| res = 0; |
| |
| out: |
| for (i = 0; i < 2; i++) |
| if (fi[i] >= 0) |
| close(fi[i]); |
| |
| return res; |
| } |
| |