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,
|
lwpttr -> lwptev
Stefan Schuermans authored 4 years ago
|
liblwptev/src/stringlist.c 98) lwptev_cleaner_t *cleaner) {
|
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) {
|
lwpttr -> lwptev
Stefan Schuermans authored 4 years ago
|
liblwptev/src/stringlist.c 105) lwptev_cleaner_cleanup(cleaner);
|
add cmdline to proc_begin
Stefan Schuermans authored 4 years ago
|
liblwpttr/src/stringlist.c 106) return -1;
liblwpttr/src/stringlist.c 107) }
|
lwpttr -> lwptev
Stefan Schuermans authored 4 years ago
|
liblwptev/src/stringlist.c 108) lwptev_cleaner_add_ptr(cleaner, data);
|
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) {
|
lwpttr -> lwptev
Stefan Schuermans authored 4 years ago
|
liblwptev/src/stringlist.c 113) lwptev_cleaner_cleanup(cleaner);
|
add cmdline to proc_begin
Stefan Schuermans authored 4 years ago
|
liblwpttr/src/stringlist.c 114) return -1;
liblwpttr/src/stringlist.c 115) }
|
lwpttr -> lwptev
Stefan Schuermans authored 4 years ago
|
liblwptev/src/stringlist.c 116) lwptev_cleaner_add_ptr(cleaner, ptrs);
|