diff options
author | Mike Frysinger <vapier@gentoo.org> | 2015-11-27 15:14:07 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-11-27 15:14:07 -0500 |
commit | be66cbd9a8e495972f1e85398ce6bde98c210c7b (patch) | |
tree | 0d166c2c9a43bd04f45abc82fbe4a46c5b458e68 | |
parent | qcache: only warn once per missing cache file (diff) | |
download | portage-utils-be66cbd9.tar.gz portage-utils-be66cbd9.tar.bz2 portage-utils-be66cbd9.zip |
qcache: rewrite arch.list loading to use getline()
This applet carries its own file reading utils that are inefficient
(they read 1 byte off the disk at a time) and are used by only one
piece of code -- the arch.list reader. Punt the funcs so we can use
getline directly.
-rw-r--r-- | qcache.c | 146 |
1 files changed, 33 insertions, 113 deletions
@@ -204,105 +204,6 @@ int read_keywords(char *s, int *keywords) return 0; } -/********************************************************************/ -/* File reading helper functions */ -/********************************************************************/ - -/* - * inline unsigned int qcache_count_lines(char *filename); - * - * Count the number of new line characters '\n' in a file. - * - * IN: - * char *filename - name of the file to read. - * OUT: - * unsigned int count - number of new lines counted. - * ERR: - * -1 is returned if the file cannot be read. - */ -_q_static -unsigned int qcache_count_lines(char *filename) -{ - int count, fd; - char c; - - if ((fd = open(filename, O_RDONLY|O_CLOEXEC)) != -1) { - count = 0; - - while (read(fd, &c, 1) == 1) - if (c == '\n') - count++; - - close(fd); - return count; - } - - return -1; -} - -/* - * char **qcache_read_lines(char *filename); - * - * Reads in every line contained in a file - * - * IN: - * char *filename - name of the file to read. - * OUT: - * char **lines - number of new lines counted. - * ERR: - * NULL is returned if an error occurs. - */ -_q_static -char **qcache_read_lines(char *filename) -{ - int len, fd, count, i, num_lines; - char **lines, c; - - if (-1 == (num_lines = qcache_count_lines(filename))) - return NULL; - - len = sizeof(char*) * (num_lines + 1); - lines = xzalloc(len); - - if ((fd = open(filename, O_RDONLY|O_CLOEXEC)) != -1) { - for (i = 0; i < num_lines; i++) { - count = 0; - - /* determine the space needed for storing the line */ - while (read(fd, &c, 1) == 1 && c != '\n') - count++; - lseek(fd, (lseek(fd, 0, SEEK_CUR) - count - 1), SEEK_SET); - - lines[i] = xzalloc(sizeof(char) * (count+1)); - - /* copy the line into lines[i] */ - assert(read(fd, lines[i], count) == count); - assert(read(fd, &c, 1) == 1); /* skip '\n' */ - } - - close(fd); - return lines; - } - - return NULL; -} - -/* - * void qcache_free_lines(char **lines); - * - * free()'s memory allocated by qcache_read_lines - */ -_q_static -void qcache_free_lines(char **lines) -{ - int i; - - for (i = 0; lines[i]; i++) - free(lines[i]); - - free(lines); -} - /* * portage_cache *qcache_read_cache_file(const char *file); * @@ -884,25 +785,40 @@ void qcache_testing_only(qcache_data *data) * -1 is returned on error. */ _q_static -int qcache_init(void) +bool qcache_init(void) { - char *filename; - int len; + bool ret = false; + FILE *fp; + char *filename, *s; + size_t buflen, linelen; + char *buf; xasprintf(&filename, "%s/profiles/arch.list", portdir); + fp = fopen(filename, "re"); + if (!fp) + goto done; - if (NULL == (archlist = qcache_read_lines(filename))) { - free(filename); - return -1; - } + archlist_count = 0; + buf = NULL; + while ((linelen = getline(&buf, &buflen, fp)) != -1) { + rmspace_len(buf, linelen); - len = 0; - while (archlist[len]) - ++len; - archlist_count = len; + if ((s = strchr(buf, '#')) != NULL) + *s = '\0'; + if (buf[0] == '\0') + continue; + + ++archlist_count; + archlist = xrealloc_array(archlist, sizeof(*archlist), archlist_count); + archlist[archlist_count - 1] = xstrdup(buf); + } + free(buf); + ret = true; + fclose(fp); + done: free(filename); - return 0; + return ret; } /* @@ -913,7 +829,11 @@ int qcache_init(void) _q_static void qcache_free(void) { - qcache_free_lines(archlist); + size_t a; + + for (a = 0; a < archlist_count; ++a) + free(archlist[a]); + free(archlist); } /********************************************************************/ @@ -946,7 +866,7 @@ int qcache_main(int argc, char **argv) } } - if (-1 == qcache_init()) + if (!qcache_init()) err("Could not initialize arch list"); if (optind < argc) |