/* 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; }