diff options
Diffstat (limited to 'lib')
| -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 { | 
