|
@@ -709,13 +709,13 @@ parsedb_close(struct parsedb_state *ps)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Parse an RFC-822 style file.
|
|
|
|
|
|
|
+ * Parse deb822 style package data from a buffer.
|
|
|
*
|
|
*
|
|
|
* donep may be NULL.
|
|
* donep may be NULL.
|
|
|
* If donep is not NULL only one package's information is expected.
|
|
* If donep is not NULL only one package's information is expected.
|
|
|
*/
|
|
*/
|
|
|
-int parsedb(const char *filename, enum parsedbflags flags,
|
|
|
|
|
- struct pkginfo **donep)
|
|
|
|
|
|
|
+int
|
|
|
|
|
+parsedb_parse(struct parsedb_state *ps, struct pkginfo **donep)
|
|
|
{
|
|
{
|
|
|
struct pkgset tmp_set;
|
|
struct pkgset tmp_set;
|
|
|
struct pkginfo *new_pkg, *db_pkg;
|
|
struct pkginfo *new_pkg, *db_pkg;
|
|
@@ -723,16 +723,13 @@ int parsedb(const char *filename, enum parsedbflags flags,
|
|
|
struct pkg_parse_object pkg_obj;
|
|
struct pkg_parse_object pkg_obj;
|
|
|
int fieldencountered[array_count(fieldinfos)];
|
|
int fieldencountered[array_count(fieldinfos)];
|
|
|
int pdone;
|
|
int pdone;
|
|
|
- struct parsedb_state *ps;
|
|
|
|
|
struct field_state fs;
|
|
struct field_state fs;
|
|
|
|
|
|
|
|
memset(&fs, 0, sizeof(fs));
|
|
memset(&fs, 0, sizeof(fs));
|
|
|
fs.fieldencountered = fieldencountered;
|
|
fs.fieldencountered = fieldencountered;
|
|
|
|
|
|
|
|
- ps = parsedb_open(filename, flags);
|
|
|
|
|
-
|
|
|
|
|
new_pkg = &tmp_set.pkg;
|
|
new_pkg = &tmp_set.pkg;
|
|
|
- if (flags & pdb_recordavailable)
|
|
|
|
|
|
|
+ if (ps->flags & pdb_recordavailable)
|
|
|
new_pkgbin = &new_pkg->available;
|
|
new_pkgbin = &new_pkg->available;
|
|
|
else
|
|
else
|
|
|
new_pkgbin = &new_pkg->installed;
|
|
new_pkgbin = &new_pkg->installed;
|
|
@@ -760,12 +757,12 @@ int parsedb(const char *filename, enum parsedbflags flags,
|
|
|
pkg_parse_verify(ps, new_pkg, new_pkgbin);
|
|
pkg_parse_verify(ps, new_pkg, new_pkgbin);
|
|
|
|
|
|
|
|
db_pkg = parse_find_pkg_slot(ps, new_pkg, new_pkgbin);
|
|
db_pkg = parse_find_pkg_slot(ps, new_pkg, new_pkgbin);
|
|
|
- if (flags & pdb_recordavailable)
|
|
|
|
|
|
|
+ if (ps->flags & pdb_recordavailable)
|
|
|
db_pkgbin = &db_pkg->available;
|
|
db_pkgbin = &db_pkg->available;
|
|
|
else
|
|
else
|
|
|
db_pkgbin = &db_pkg->installed;
|
|
db_pkgbin = &db_pkg->installed;
|
|
|
|
|
|
|
|
- if (((flags & pdb_ignoreolder) || ps->type == pdb_file_available) &&
|
|
|
|
|
|
|
+ if (((ps->flags & pdb_ignoreolder) || ps->type == pdb_file_available) &&
|
|
|
dpkg_version_is_informative(&db_pkgbin->version) &&
|
|
dpkg_version_is_informative(&db_pkgbin->version) &&
|
|
|
dpkg_version_compare(&new_pkgbin->version, &db_pkgbin->version) < 0)
|
|
dpkg_version_compare(&new_pkgbin->version, &db_pkgbin->version) < 0)
|
|
|
continue;
|
|
continue;
|
|
@@ -779,14 +776,32 @@ int parsedb(const char *filename, enum parsedbflags flags,
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- parsedb_close(ps);
|
|
|
|
|
-
|
|
|
|
|
varbuf_destroy(&fs.value);
|
|
varbuf_destroy(&fs.value);
|
|
|
- if (donep && !pdone) ohshit(_("no package information in `%.255s'"),filename);
|
|
|
|
|
|
|
+ if (donep && !pdone)
|
|
|
|
|
+ ohshit(_("no package information in `%.255s'"), ps->filename);
|
|
|
|
|
|
|
|
return pdone;
|
|
return pdone;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Parse a deb822 style file.
|
|
|
|
|
+ *
|
|
|
|
|
+ * donep may be NULL.
|
|
|
|
|
+ * If donep is not NULL only one package's information is expected.
|
|
|
|
|
+ */
|
|
|
|
|
+int
|
|
|
|
|
+parsedb(const char *filename, enum parsedbflags flags, struct pkginfo **pkgp)
|
|
|
|
|
+{
|
|
|
|
|
+ struct parsedb_state *ps;
|
|
|
|
|
+ int count;
|
|
|
|
|
+
|
|
|
|
|
+ ps = parsedb_open(filename, flags);
|
|
|
|
|
+ count = parsedb_parse(ps, pkgp);
|
|
|
|
|
+ parsedb_close(ps);
|
|
|
|
|
+
|
|
|
|
|
+ return count;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Copy dependency links structures.
|
|
* Copy dependency links structures.
|
|
|
*
|
|
*
|