Home | History | Annotate | Download | only in solaris
      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