[pacman-dev] be_files.c work
From 84a7a5db2dc58a1ae800075d3acd604d18c86747 Mon Sep 17 00:00:00 2001 From: K. Piche <kevin@archlinux.org> Date: Sun, 13 Apr 2008 22:54:37 -0400 Subject: [PATCH] Add helper functions to read standard types from
Added functions to read standard types from db files. This is the first patch in a larger work to follow eventually. package database files. Signed-off-by: K. Piche <kevin@archlinux.org> --- lib/libalpm/be_files.c | 305 +++++++++++++++++++++++++++++++----------------- 1 files changed, 197 insertions(+), 108 deletions(-) diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 7cc01c2..7d78296 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -244,6 +244,134 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target) return(pkg); } + + +/********** db file type parsing **********/ + + + +/** + * @brief Read a string from a package's db file. + * @param fp File to read from. + * @param pstr pointer to char pointer to store the string. + * @return 0 for success or -1 for failure. + */ +int _alpm_db_read_string(FILE *fp, char **pstr) +{ + char line[512]; + + ALPM_LOG_FUNC; + + if(fgets(line, 512, fp) == NULL) { + return(-1); + } + + STRDUP(*pstr, _alpm_strtrim(line), return(-1)); + + return(0); +} + + +/** + * @brief Read a long from a package's db file. + * @param fp File to read from. + * @param plong pointer to long to store the input. + * @return 0 for success or -1 for failure. + */ +int _alpm_db_read_long(FILE *fp, unsigned long *plong) +{ + char line[512]; + + ALPM_LOG_FUNC; + + if(fgets(line, 512, fp) == NULL) { + return(-1); + } + + *plong = atol(_alpm_strtrim(line)); + + return(0); +} + + +/** + * @brief Read a list of strings from a package's db file. + * @param fp File to read from. + * @param plist pointer to alpm_list_t pointer to store the list. + * @return 0 for success or -1 for failure. + */ +int _alpm_db_read_list(FILE *fp, alpm_list_t **plist) +{ + char line[512]; + + ALPM_LOG_FUNC; + + /* FIXME no error return */ + while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { + char *linedup; + STRDUP(linedup, _alpm_strtrim(line), return(-1)); + *plist = alpm_list_add(*plist, linedup); + } + + return(0); +} + + +/** + * @brief Read a pmdepend_t list from a package's db file. + * @param fp File to read from. + * @param pdlist pointer to alpm_list_t pointer to store the dependencies. + * @return 0 for success or -1 for failure. + */ +int _alpm_db_read_deplist(FILE *fp, alpm_list_t **pdlist) +{ + char line[512]; + + ALPM_LOG_FUNC; + + /* FIXME no error return */ + while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { + pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line)); + *pdlist = alpm_list_add(*pdlist, dep); + } + + return(0); +} + + +/** + * @brief Read a date from a package's db file. + * @param fp File to read from. + * @param pdate pointer to a long to store the date. + * @return 0 for success or -1 for failure. + */ +int _alpm_db_read_date(FILE *fp, long *pdate) +{ + char line[512]; + + ALPM_LOG_FUNC; + + if(fgets(line, 512, fp) == NULL) { + return(-1); + } + _alpm_strtrim(line); + + char first = tolower(line[0]); + if(first > 'a' && first < 'z') { + struct tm tmp_tm = {0}; /* Initialize to null incase of failure. */ + setlocale(LC_TIME, "C"); + strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm); + *pdate = mktime(&tmp_tm); + setlocale(LC_TIME, ""); + } else { + *pdate = atol(line); + } + + return(0); +} + + + int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) { FILE *fp = NULL; @@ -297,123 +425,89 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); goto error; } + while(!feof(fp)) { if(fgets(line, 256, fp) == NULL) { break; } _alpm_strtrim(line); if(strcmp(line, "%FILENAME%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->filename, _alpm_strtrim(line), goto error); + + if (_alpm_db_read_string(fp, &info->filename)) goto error; + } else if(strcmp(line, "%DESC%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->desc, _alpm_strtrim(line), goto error); + + if (_alpm_db_read_string(fp, &info->desc)) goto error; + } else if(strcmp(line, "%GROUPS%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->groups = alpm_list_add(info->groups, linedup); - } + + if (_alpm_db_read_list(fp, &info->groups)) goto error; + } else if(strcmp(line, "%URL%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->url, _alpm_strtrim(line), goto error); + + if (_alpm_db_read_string(fp, &info->url)) goto error; + } else if(strcmp(line, "%LICENSE%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->licenses = alpm_list_add(info->licenses, linedup); - } + + if (_alpm_db_read_list(fp, &info->licenses)) goto error; + } else if(strcmp(line, "%ARCH%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->arch, _alpm_strtrim(line), goto error); + + if (_alpm_db_read_string(fp, &info->arch)) goto error; + } else if(strcmp(line, "%BUILDDATE%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - _alpm_strtrim(line); - char first = tolower(line[0]); - if(first > 'a' && first < 'z') { - struct tm tmp_tm = {0}; //initialize to null incase of failure - setlocale(LC_TIME, "C"); - strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm); - info->builddate = mktime(&tmp_tm); - setlocale(LC_TIME, ""); - } else { - info->builddate = atol(line); - } + if (_alpm_db_read_date(fp, &info->builddate)) goto error; + } else if(strcmp(line, "%INSTALLDATE%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - _alpm_strtrim(line); - char first = tolower(line[0]); - if(first > 'a' && first < 'z') { - struct tm tmp_tm = {0}; //initialize to null incase of failure - setlocale(LC_TIME, "C"); - strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm); - info->installdate = mktime(&tmp_tm); - setlocale(LC_TIME, ""); - } else { - info->installdate = atol(line); - } + if (_alpm_db_read_date(fp, &info->installdate)) goto error; + } else if(strcmp(line, "%PACKAGER%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->packager, _alpm_strtrim(line), goto error); + + if (_alpm_db_read_string(fp, &info->packager)) goto error; + } else if(strcmp(line, "%REASON%") == 0) { - if(fgets(line, 512, fp) == NULL) { - goto error; - } - info->reason = atol(_alpm_strtrim(line)); + + unsigned long tempreason; + if (_alpm_db_read_long(fp, &tempreason)) goto error; + info->reason = tempreason; + } else if(strcmp(line, "%SIZE%") == 0 || 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. */ - if(fgets(line, 512, fp) == NULL) { - goto error; - } - info->size = atol(_alpm_strtrim(line)); + if (_alpm_db_read_long(fp, &info->size)) goto error; + /* also store this value to isize if isize is unset */ if(info->isize == 0) { info->isize = info->size; } + } else if(strcmp(line, "%ISIZE%") == 0) { + /* ISIZE (installed size) tag only appears in sync repositories, * not the local one. */ - if(fgets(line, 512, fp) == NULL) { - goto error; - } - info->isize = atol(_alpm_strtrim(line)); + if (_alpm_db_read_long(fp, &info->isize)) goto error; + } else if(strcmp(line, "%MD5SUM%") == 0) { + /* MD5SUM tag only appears in sync repositories, * not the local one. */ - if(fgets(line, 512, fp) == NULL) { - goto error; - } - STRDUP(info->md5sum, _alpm_strtrim(line), goto error); + if (_alpm_db_read_string(fp, &info->md5sum)) goto error; + } else if(strcmp(line, "%REPLACES%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->replaces = alpm_list_add(info->replaces, linedup); - } + + if (_alpm_db_read_list(fp, &info->replaces)) goto error; + } else if(strcmp(line, "%FORCE%") == 0) { info->force = 1; } } + fclose(fp); fp = NULL; } @@ -425,22 +519,20 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); goto error; } + while(fgets(line, 256, fp)) { _alpm_strtrim(line); if(strcmp(line, "%FILES%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->files = alpm_list_add(info->files, linedup); - } + + if (_alpm_db_read_list(fp, &info->files)) goto error; + } else if(strcmp(line, "%BACKUP%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->backup = alpm_list_add(info->backup, linedup); - } + + if (_alpm_db_read_list(fp, &info->backup)) goto error; + } } + fclose(fp); fp = NULL; } @@ -452,34 +544,29 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); goto error; } + while(!feof(fp)) { fgets(line, 255, fp); _alpm_strtrim(line); if(strcmp(line, "%DEPENDS%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line)); - info->depends = alpm_list_add(info->depends, dep); - } + + if (_alpm_db_read_deplist(fp, &info->depends)) goto error; + } else if(strcmp(line, "%OPTDEPENDS%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->optdepends = alpm_list_add(info->optdepends, linedup); - } + + if (_alpm_db_read_list(fp, &info->optdepends)) goto error; + } else if(strcmp(line, "%CONFLICTS%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->conflicts = alpm_list_add(info->conflicts, linedup); - } + + if (_alpm_db_read_list(fp, &info->conflicts)) goto error; + } else if(strcmp(line, "%PROVIDES%") == 0) { - while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - info->provides = alpm_list_add(info->provides, linedup); - } + + if (_alpm_db_read_list(fp, &info->provides)) goto error; + } } + fclose(fp); fp = NULL; } @@ -489,6 +576,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path, info->name, info->version); if((fp = fopen(path, "r"))) { + while(!feof(fp)) { fgets(line, 255, fp); _alpm_strtrim(line); @@ -498,6 +586,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) } } } + fclose(fp); fp = NULL; } -- 1.5.5 -- K. Piche <kpiche@rogers.com>
participants (1)
-
K. Piche