1 /* Test that /proc/{self,$PID}/auxv can be opened and read simultaneously 2 using two different file descriptors. */ 3 4 #include <assert.h> 5 #include <errno.h> 6 #include <fcntl.h> 7 #include <stdio.h> 8 #include <string.h> 9 #include <sys/auxv.h> 10 #include <sys/stat.h> 11 #include <sys/types.h> 12 #include <unistd.h> 13 14 /* Reads one auxv_t entry from the input file. */ 15 int read_entry(int fi, auxv_t *out) 16 { 17 size_t toread = sizeof(*out); 18 char *ptr = (char*)out; 19 20 while (toread) { 21 ssize_t r; 22 23 r = read(fi, ptr, toread); 24 if (r == 0) { 25 fprintf(stderr, "unexpected EOF\n"); 26 return 1; 27 } 28 if (r == -1) { 29 perror("read"); 30 return 1; 31 } 32 33 ptr += r; 34 toread -= r; 35 36 assert(toread >= 0); 37 } 38 39 return 0; 40 } 41 42 int main(void) 43 { 44 auxv_t vector[2][4]; 45 int fi[2] = {-1, -1}; 46 size_t i; 47 int res = 1; 48 49 /* Open the first input file. */ 50 if ((fi[0] = open("/proc/self/auxv", O_RDONLY)) == -1) { 51 perror("open"); 52 goto out; 53 } 54 55 /* Read the first two entries from the first file. */ 56 for (i = 0; i < 2; i++) 57 if (read_entry(fi[0], &vector[0][i])) 58 goto out; 59 60 /* Open the second input file. */ 61 if ((fi[1] = open("/proc/self/auxv", O_RDONLY)) == -1) { 62 perror("open"); 63 goto out; 64 } 65 66 /* Read the first two entries from the first file. */ 67 for (i = 2; i < 4; i++) 68 if (read_entry(fi[0], &vector[0][i])) 69 goto out; 70 71 /* Read the first four entries from the second file. */ 72 for (i = 0; i < 4; i++) 73 if (read_entry(fi[1], &vector[1][i])) 74 goto out; 75 76 /* Compare read vectors. */ 77 if (memcmp(vector[0], vector[1], 4 * sizeof(vector[0][0]))) { 78 fprintf(stderr, "vectors differ\n"); 79 goto out; 80 } 81 82 res = 0; 83 84 out: 85 for (i = 0; i < 2; i++) 86 if (fi[i] >= 0) 87 close(fi[i]); 88 89 return res; 90 } 91 92