81bf78b39d3b82f8ffd123f796ae5e6f5228af4c
Stefan Schuermans add cmdline to proc_begin

Stefan Schuermans authored 4 years ago

liblwpttr/src/stringlist.c   1) #include "stringlist.h"
liblwpttr/src/stringlist.c   2) #include "cleaner.h"
liblwpttr/src/stringlist.c   3) 
liblwpttr/src/stringlist.c   4) #include <fcntl.h>
liblwpttr/src/stringlist.c   5) #include <stdlib.h>
liblwpttr/src/stringlist.c   6) #include <string.h>
liblwpttr/src/stringlist.c   7) #include <sys/types.h>
liblwpttr/src/stringlist.c   8) #include <sys/stat.h>
liblwpttr/src/stringlist.c   9) #include <unistd.h>
liblwpttr/src/stringlist.c  10) 
liblwpttr/src/stringlist.c  11) /**
liblwpttr/src/stringlist.c  12)  * @brief read file contents
liblwpttr/src/stringlist.c  13)  * @param[in] pathname path to file containing zero-terminated string list
liblwpttr/src/stringlist.c  14)  * @param[out] *size size of file contents
liblwpttr/src/stringlist.c  15)  * @return pointer to malloc-ed file contents or NULL
liblwpttr/src/stringlist.c  16)  */
liblwpttr/src/stringlist.c  17) static char * stringlist_read_file(char const *pathname, size_t *size) {
liblwpttr/src/stringlist.c  18)   /* it is not possible to get file size before, because this yields zero for
liblwpttr/src/stringlist.c  19)      files like /proc/self/cmdline */
liblwpttr/src/stringlist.c  20)   *size = 0;
liblwpttr/src/stringlist.c  21)   /* open file */
liblwpttr/src/stringlist.c  22)   int fd = open(pathname, O_RDONLY);
liblwpttr/src/stringlist.c  23)   if (fd == -1) {
liblwpttr/src/stringlist.c  24)     return NULL;
liblwpttr/src/stringlist.c  25)   }
liblwpttr/src/stringlist.c  26)   /* get initial buffer */
liblwpttr/src/stringlist.c  27)   size_t sz = 4096;
liblwpttr/src/stringlist.c  28)   char *data = malloc(sz);
liblwpttr/src/stringlist.c  29)   if (! data) {
liblwpttr/src/stringlist.c  30)     close(fd);
liblwpttr/src/stringlist.c  31)     return NULL;
liblwpttr/src/stringlist.c  32)   }
liblwpttr/src/stringlist.c  33)   /* read file contents - potentially iteratively */
liblwpttr/src/stringlist.c  34)   size_t pos = 0;
liblwpttr/src/stringlist.c  35)   while (1) {
liblwpttr/src/stringlist.c  36)     /* read file contents */
liblwpttr/src/stringlist.c  37)     ssize_t len = read(fd, data + pos, sz - pos);
liblwpttr/src/stringlist.c  38)     /* error -> cleanup and return failure */
liblwpttr/src/stringlist.c  39)     if (len < 0) {
liblwpttr/src/stringlist.c  40)       free(data);
liblwpttr/src/stringlist.c  41)       close(fd);
liblwpttr/src/stringlist.c  42)       return NULL;
liblwpttr/src/stringlist.c  43)     }
liblwpttr/src/stringlist.c  44)     if (len == 0 ) {
liblwpttr/src/stringlist.c  45)       /* end of file -> return data */
liblwpttr/src/stringlist.c  46)       *size = pos;
liblwpttr/src/stringlist.c  47)       return data;
liblwpttr/src/stringlist.c  48)     }
liblwpttr/src/stringlist.c  49)     /* data read -> add to buffer */
liblwpttr/src/stringlist.c  50)     pos += len;
liblwpttr/src/stringlist.c  51)     /* buffer full ? -> enlarge */
liblwpttr/src/stringlist.c  52)     if (pos >= sz) {
liblwpttr/src/stringlist.c  53)       sz *= 2;
liblwpttr/src/stringlist.c  54)       char *data2 = realloc(data, sz);
liblwpttr/src/stringlist.c  55)       /* out of memory ? -> cleanup and return failure */
liblwpttr/src/stringlist.c  56)       if (! data2) {
liblwpttr/src/stringlist.c  57)         free(data);
liblwpttr/src/stringlist.c  58)         close(fd);
liblwpttr/src/stringlist.c  59)         return NULL;
liblwpttr/src/stringlist.c  60)       }
liblwpttr/src/stringlist.c  61)       /* use new buffer */
liblwpttr/src/stringlist.c  62)       data = data2;
liblwpttr/src/stringlist.c  63)     }
liblwpttr/src/stringlist.c  64)   }
liblwpttr/src/stringlist.c  65) }
liblwpttr/src/stringlist.c  66) 
liblwpttr/src/stringlist.c  67) /**
liblwpttr/src/stringlist.c  68)  * @brief make array with pointers to strings
liblwpttr/src/stringlist.c  69)  * @param[in] data pointer to string list
liblwpttr/src/stringlist.c  70)  * @param[in] sz size of string list
liblwpttr/src/stringlist.c  71)  * @param[out] *cnt number of entries in array
liblwpttr/src/stringlist.c  72)  * @return pointer to malloc-ed array of NULL
liblwpttr/src/stringlist.c  73)  */
liblwpttr/src/stringlist.c  74) static char ** stringlist_make_ptrs(char *data, size_t sz, size_t *cnt) {
liblwpttr/src/stringlist.c  75)   /* count strings */
liblwpttr/src/stringlist.c  76)   size_t pos = 0;
liblwpttr/src/stringlist.c  77)   *cnt = 0;
liblwpttr/src/stringlist.c  78)   while (pos < sz) {
liblwpttr/src/stringlist.c  79)     pos += strlen(data + pos) + 1;
liblwpttr/src/stringlist.c  80)     ++*cnt;
liblwpttr/src/stringlist.c  81)   }
liblwpttr/src/stringlist.c  82)   /* allocate array for pointers */
liblwpttr/src/stringlist.c  83)   char **ptrs = malloc(*cnt * sizeof(char *));
liblwpttr/src/stringlist.c  84)   if (! ptrs) {
liblwpttr/src/stringlist.c  85)     *cnt = 0;
liblwpttr/src/stringlist.c  86)     return NULL;
liblwpttr/src/stringlist.c  87)   }
liblwpttr/src/stringlist.c  88)   /* fill pointers into array */
liblwpttr/src/stringlist.c  89)   pos = 0;
liblwpttr/src/stringlist.c  90)   for (size_t i = 0; i < *cnt; ++i) {
liblwpttr/src/stringlist.c  91)     ptrs[i] = data + pos;
liblwpttr/src/stringlist.c  92)     pos += strlen(data + pos) + 1;
liblwpttr/src/stringlist.c  93)   }
liblwpttr/src/stringlist.c  94)   return ptrs;
liblwpttr/src/stringlist.c  95) }
liblwpttr/src/stringlist.c  96) 
liblwpttr/src/stringlist.c  97) int stringlist_read(char const *pathname, size_t *n, char ***strs,
Stefan Schuermans lwpttr -> lwptev

Stefan Schuermans authored 4 years ago

liblwptev/src/stringlist.c  98)                     lwptev_cleaner_t *cleaner) {
Stefan Schuermans add cmdline to proc_begin

Stefan Schuermans authored 4 years ago

liblwpttr/src/stringlist.c  99)   *n = 0;
liblwpttr/src/stringlist.c 100)   *strs = NULL;
liblwpttr/src/stringlist.c 101)   /* read file contents */
liblwpttr/src/stringlist.c 102)   size_t sz;
liblwpttr/src/stringlist.c 103)   char *data = stringlist_read_file(pathname, &sz);
liblwpttr/src/stringlist.c 104)   if (! data) {
Stefan Schuermans lwpttr -> lwptev

Stefan Schuermans authored 4 years ago

liblwptev/src/stringlist.c 105)     lwptev_cleaner_cleanup(cleaner);
Stefan Schuermans add cmdline to proc_begin

Stefan Schuermans authored 4 years ago

liblwpttr/src/stringlist.c 106)     return -1;
liblwpttr/src/stringlist.c 107)   }
Stefan Schuermans lwpttr -> lwptev

Stefan Schuermans authored 4 years ago

liblwptev/src/stringlist.c 108)   lwptev_cleaner_add_ptr(cleaner, data);
Stefan Schuermans add cmdline to proc_begin

Stefan Schuermans authored 4 years ago

liblwpttr/src/stringlist.c 109)   /* create pointer array */
liblwpttr/src/stringlist.c 110)   size_t cnt;
liblwpttr/src/stringlist.c 111)   char **ptrs = stringlist_make_ptrs(data, sz, &cnt);
liblwpttr/src/stringlist.c 112)   if (! ptrs) {
Stefan Schuermans lwpttr -> lwptev

Stefan Schuermans authored 4 years ago

liblwptev/src/stringlist.c 113)     lwptev_cleaner_cleanup(cleaner);
Stefan Schuermans add cmdline to proc_begin

Stefan Schuermans authored 4 years ago

liblwpttr/src/stringlist.c 114)     return -1;
liblwpttr/src/stringlist.c 115)   }
Stefan Schuermans lwpttr -> lwptev

Stefan Schuermans authored 4 years ago

liblwptev/src/stringlist.c 116)   lwptev_cleaner_add_ptr(cleaner, ptrs);