diff options
-rw-r--r-- | lib/libalpm/be_sync.c | 151 |
1 files changed, 52 insertions, 99 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 72caa507..137fc1b2 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -218,6 +218,24 @@ static int sync_db_populate(pmdb_t *db) return(count); } +#define READ_NEXT(s) do { \ + if(_alpm_archive_fgets(s, sizeof(s), archive) == NULL) goto error; \ + _alpm_strtrim(s); \ +} while(0) + +#define READ_AND_STORE(f) do { \ + READ_NEXT(line); \ + STRDUP(f, line, goto error); \ +} while(0) + +#define READ_AND_STORE_ALL(f) do { \ + char *linedup; \ + READ_NEXT(line); \ + if(strlen(line) == 0) break; \ + STRDUP(linedup, line, goto error); \ + f = alpm_list_add(f, linedup); \ +} while(1) /* note the while(1) and not (0) */ + static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entry *entry) { char line[1024]; @@ -264,63 +282,35 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr while(_alpm_archive_fgets(line, sizeof(line), archive) != NULL) { _alpm_strtrim(line); if(strcmp(line, "%NAME%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - if(strcmp(_alpm_strtrim(line), pkg->name) != 0) { + READ_NEXT(line); + if(strcmp(line, pkg->name) != 0) { _alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: name " "mismatch on package %s\n"), db->treename, pkg->name); } } else if(strcmp(line, "%VERSION%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - if(strcmp(_alpm_strtrim(line), pkg->version) != 0) { + READ_NEXT(line); + if(strcmp(line, pkg->version) != 0) { _alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: version " "mismatch on package %s\n"), db->treename, pkg->name); } } else if(strcmp(line, "%FILENAME%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->filename, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->filename); } else if(strcmp(line, "%DESC%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->desc, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->desc); } else if(strcmp(line, "%GROUPS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->groups = alpm_list_add(pkg->groups, linedup); - } + READ_AND_STORE_ALL(pkg->groups); } else if(strcmp(line, "%URL%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->url, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->url); } else if(strcmp(line, "%LICENSE%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->licenses = alpm_list_add(pkg->licenses, linedup); - } + READ_AND_STORE_ALL(pkg->licenses); } else if(strcmp(line, "%ARCH%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->arch, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->arch); } else if(strcmp(line, "%BUILDDATE%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - _alpm_strtrim(line); - + READ_NEXT(line); char first = tolower((unsigned char)line[0]); if(first > 'a' && first < 'z') { - struct tm tmp_tm = {0}; /* initialize to null in case of failure */ + /* initialize to null in case of failure */ + struct tm tmp_tm = {0}; setlocale(LC_TIME, "C"); strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm); pkg->builddate = mktime(&tmp_tm); @@ -329,46 +319,28 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr pkg->builddate = atol(line); } } else if(strcmp(line, "%PACKAGER%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->packager, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->packager); } else if(strcmp(line, "%CSIZE%") == 0) { - /* NOTE: the CSIZE and SIZE fields both share the "size" field - * in the pkginfo_t struct. This can be done b/c CSIZE - * is currently only used in sync databases, and SIZE is - * only used in local databases. + /* Note: the CSIZE and SIZE fields both share the "size" field in the + * pkginfo_t struct. This can be done b/c CSIZE is currently only used + * in sync databases, and SIZE is only used in local databases. */ - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->size = atol(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->size = atol(line); /* also store this value to isize if isize is unset */ if(pkg->isize == 0) { pkg->isize = pkg->size; } } else if(strcmp(line, "%ISIZE%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->isize = atol(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->isize = atol(line); } else if(strcmp(line, "%MD5SUM%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->md5sum, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->md5sum); } else if(strcmp(line, "%REPLACES%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->replaces = alpm_list_add(pkg->replaces, linedup); - } + READ_AND_STORE_ALL(pkg->replaces); } else if(strcmp(line, "%EPOCH%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->epoch = atoi(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->epoch = atoi(line); } else if(strcmp(line, "%FORCE%") == 0) { /* For backward compatibility, treat force as a non-zero epoch * but only if we didn't already have a known epoch value. */ @@ -376,39 +348,20 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr pkg->epoch = 1; } } else if(strcmp(line, "%DEPENDS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line)); - pkg->depends = alpm_list_add(pkg->depends, dep); + /* Different than the rest because of the _alpm_splitdep call. */ + while(1) { + READ_NEXT(line); + if(strlen(line) == 0) break; + pkg->depends = alpm_list_add(pkg->depends, _alpm_splitdep(line)); } } else if(strcmp(line, "%OPTDEPENDS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->optdepends = alpm_list_add(pkg->optdepends, linedup); - } + READ_AND_STORE_ALL(pkg->optdepends); } else if(strcmp(line, "%CONFLICTS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->conflicts = alpm_list_add(pkg->conflicts, linedup); - } + READ_AND_STORE_ALL(pkg->conflicts); } else if(strcmp(line, "%PROVIDES%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->provides = alpm_list_add(pkg->provides, linedup); - } + READ_AND_STORE_ALL(pkg->provides); } else if(strcmp(line, "%DELTAS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && strlen(_alpm_strtrim(line))) { - pmdelta_t *delta = _alpm_delta_parse(line); - if(delta) { - pkg->deltas = alpm_list_add(pkg->deltas, delta); - } - } + READ_AND_STORE_ALL(pkg->deltas); } } } else { |