123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- --- a/libopkg/parse_util.c
- +++ b/libopkg/parse_util.c
- @@ -22,6 +22,7 @@
- #include "libbb/libbb.h"
-
- #include "parse_util.h"
- +#include "pkg_parse.h"
-
- int
- is_field(const char *type, const char *line)
- @@ -86,3 +87,84 @@ parse_list(const char *raw, unsigned int
- *count = line_count;
- return depends;
- }
- +
- +int
- +parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
- + char **buf0, size_t buf0len)
- +{
- + int ret, lineno;
- + char *buf, *nl;
- + size_t buflen;
- +
- + lineno = 1;
- + ret = 0;
- +
- + buflen = buf0len;
- + buf = *buf0;
- + buf[0] = '\0';
- +
- + while (1) {
- + if (fgets(buf, (int)buflen, fp) == NULL) {
- + if (ferror(fp)) {
- + opkg_perror(ERROR, "fgets");
- + ret = -1;
- + } else if (strlen(*buf0) == buf0len-1) {
- + opkg_msg(ERROR, "Missing new line character"
- + " at end of file!\n");
- + parse_line(item, *buf0, mask);
- + }
- + break;
- + }
- +
- + nl = strchr(buf, '\n');
- + if (nl == NULL) {
- + if (strlen(buf) < buflen-1) {
- + /*
- + * Line could be exactly buflen-1 long and
- + * missing a newline, but we won't know until
- + * fgets fails to read more data.
- + */
- + opkg_msg(ERROR, "Missing new line character"
- + " at end of file!\n");
- + parse_line(item, *buf0, mask);
- + break;
- + }
- + if (buf0len >= EXCESSIVE_LINE_LEN) {
- + opkg_msg(ERROR, "Excessively long line at "
- + "%d. Corrupt file?\n",
- + lineno);
- + ret = -1;
- + break;
- + }
- +
- + /*
- + * Realloc and point buf past the data already read,
- + * at the NULL terminator inserted by fgets.
- + * |<--------------- buf0len ----------------->|
- + * | |<------- buflen ---->|
- + * |---------------------|---------------------|
- + * buf0 buf
- + */
- + buflen = buf0len +1;
- + buf0len *= 2;
- + *buf0 = xrealloc(*buf0, buf0len);
- + buf = *buf0 + buflen -2;
- +
- + continue;
- + }
- +
- + *nl = '\0';
- +
- + lineno++;
- +
- + if (parse_line(item, *buf0, mask))
- + break;
- +
- + buf = *buf0;
- + buflen = buf0len;
- + buf[0] = '\0';
- + }
- +
- + return ret;
- +}
- +
- --- a/libopkg/parse_util.h
- +++ b/libopkg/parse_util.h
- @@ -22,4 +22,8 @@ int is_field(const char *type, const cha
- char *parse_simple(const char *type, const char *line);
- char **parse_list(const char *raw, unsigned int *count, const char sep, int skip_field);
-
- +typedef int (*parse_line_t)(void *, const char *, uint);
- +int parse_from_stream_nomalloc(parse_line_t parse_line, void *item, FILE *fp, uint mask,
- + char **buf0, size_t buf0len);
- +
- #endif
- --- a/libopkg/pkg_hash.c
- +++ b/libopkg/pkg_hash.c
- @@ -23,6 +23,7 @@
- #include "opkg_message.h"
- #include "pkg_vec.h"
- #include "pkg_hash.h"
- +#include "parse_util.h"
- #include "pkg_parse.h"
- #include "opkg_utils.h"
- #include "sprintf_alloc.h"
- @@ -119,8 +120,14 @@ pkg_hash_add_from_file(const char *file_
- pkg->src = src;
- pkg->dest = dest;
-
- - ret = pkg_parse_from_stream_nomalloc(pkg, fp, 0,
- + ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, 0,
- &buf, len);
- +
- + if (pkg->name == NULL) {
- + /* probably just a blank line */
- + ret = 1;
- + }
- +
- if (ret) {
- pkg_deinit (pkg);
- free(pkg);
- --- a/libopkg/pkg_parse.c
- +++ b/libopkg/pkg_parse.c
- @@ -104,9 +104,11 @@ get_arch_priority(const char *arch)
- return 0;
- }
-
- -static int
- -pkg_parse_line(pkg_t *pkg, const char *line, uint mask)
- +int
- +pkg_parse_line(void *ptr, const char *line, uint mask)
- {
- + pkg_t *pkg = (pkg_t *) ptr;
- +
- /* these flags are a bit hackish... */
- static int reading_conffiles = 0, reading_description = 0;
- int ret = 0;
- @@ -266,91 +268,6 @@ dont_reset_flags:
- }
-
- int
- -pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
- - char **buf0, size_t buf0len)
- -{
- - int ret, lineno;
- - char *buf, *nl;
- - size_t buflen;
- -
- - lineno = 1;
- - ret = 0;
- -
- - buflen = buf0len;
- - buf = *buf0;
- - buf[0] = '\0';
- -
- - while (1) {
- - if (fgets(buf, (int)buflen, fp) == NULL) {
- - if (ferror(fp)) {
- - opkg_perror(ERROR, "fgets");
- - ret = -1;
- - } else if (strlen(*buf0) == buf0len-1) {
- - opkg_msg(ERROR, "Missing new line character"
- - " at end of file!\n");
- - pkg_parse_line(pkg, *buf0, mask);
- - }
- - break;
- - }
- -
- - nl = strchr(buf, '\n');
- - if (nl == NULL) {
- - if (strlen(buf) < buflen-1) {
- - /*
- - * Line could be exactly buflen-1 long and
- - * missing a newline, but we won't know until
- - * fgets fails to read more data.
- - */
- - opkg_msg(ERROR, "Missing new line character"
- - " at end of file!\n");
- - pkg_parse_line(pkg, *buf0, mask);
- - break;
- - }
- - if (buf0len >= EXCESSIVE_LINE_LEN) {
- - opkg_msg(ERROR, "Excessively long line at "
- - "%d. Corrupt file?\n",
- - lineno);
- - ret = -1;
- - break;
- - }
- -
- - /*
- - * Realloc and point buf past the data already read,
- - * at the NULL terminator inserted by fgets.
- - * |<--------------- buf0len ----------------->|
- - * | |<------- buflen ---->|
- - * |---------------------|---------------------|
- - * buf0 buf
- - */
- - buflen = buf0len +1;
- - buf0len *= 2;
- - *buf0 = xrealloc(*buf0, buf0len);
- - buf = *buf0 + buflen -2;
- -
- - continue;
- - }
- -
- - *nl = '\0';
- -
- - lineno++;
- -
- - if (pkg_parse_line(pkg, *buf0, mask))
- - break;
- -
- - buf = *buf0;
- - buflen = buf0len;
- - buf[0] = '\0';
- - }
- -
- - if (pkg->name == NULL) {
- - /* probably just a blank line */
- - ret = 1;
- - }
- -
- - return ret;
- -}
- -
- -int
- pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask)
- {
- int ret;
- @@ -358,8 +275,13 @@ pkg_parse_from_stream(pkg_t *pkg, FILE *
- const size_t len = 4096;
-
- buf = xmalloc(len);
- - ret = pkg_parse_from_stream_nomalloc(pkg, fp, mask, &buf, len);
- + ret = parse_from_stream_nomalloc(pkg_parse_line, pkg, fp, mask, &buf, len);
- free(buf);
-
- + if (pkg->name == NULL) {
- + /* probably just a blank line */
- + ret = 1;
- + }
- +
- return ret;
- }
- --- a/libopkg/pkg_parse.h
- +++ b/libopkg/pkg_parse.h
- @@ -18,10 +18,11 @@
- #ifndef PKG_PARSE_H
- #define PKG_PARSE_H
-
- +#include "pkg.h"
- +
- int parse_version(pkg_t *pkg, const char *raw);
- int pkg_parse_from_stream(pkg_t *pkg, FILE *fp, uint mask);
- -int pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
- - char **buf0, size_t buf0len);
- +int pkg_parse_line(void *ptr, const char *line, uint mask);
-
- #define EXCESSIVE_LINE_LEN (4096 << 8)
-
- --- a/libopkg/release_parse.c
- +++ b/libopkg/release_parse.c
- @@ -23,8 +23,10 @@
- #include "parse_util.h"
-
- static int
- -release_parse_line(release_t *release, const char *line)
- +release_parse_line(void *ptr, const char *line, uint mask)
- {
- + release_t *release = (release_t *) ptr;
- +
- int ret = 0;
- unsigned int count = 0;
- char **list = 0;
- @@ -111,25 +113,14 @@ dont_reset_flags:
- int
- release_parse_from_stream(release_t *release, FILE *fp)
- {
- - int ret = 0;
- - char *buf = NULL;
- - size_t buflen, nread;
- -
- - nread = getline(&buf, &buflen, fp);
- - while ( nread != -1 ) {
- - if (buf[nread-1] == '\n') buf[nread-1] = '\0';
- - if (release_parse_line(release, buf))
- - opkg_msg(DEBUG, "Failed to parse release line for %s:\n\t%s\n",
- - release->name, buf);
- - nread = getline(&buf, &buflen, fp);
- - }
- -
- - if (!feof(fp)) {
- - opkg_perror(ERROR, "Problems reading Release file for %sd\n", release->name);
- - ret = -1;
- - }
- + int ret;
- + char *buf;
- + const size_t len = 4096;
-
- + buf = xmalloc(len);
- + ret = parse_from_stream_nomalloc(release_parse_line, release, fp, 0, &buf, len);
- free(buf);
- +
- return ret;
- }
-
|