From e0887fcdc4dcfe7b78f218d3efbe289d142bfb7b Mon Sep 17 00:00:00 2001 From: Yevhen Kyriukha Date: Tue, 3 Feb 2015 21:01:12 +0200 Subject: [PATCH] Store Conffiles field value from DEBIAN status file in solvable. Implemented methods and new types to store info about configuration files of package. --- ext/repo_deb.c | 18 ++++++++++++++++++ src/knownid.h | 2 ++ src/libsolv.ver | 2 ++ src/repodata.c | 39 +++++++++++++++++++++++++++++++++++++++ src/repodata.h | 4 ++++ src/repopack.h | 14 ++++++++++++++ 6 files changed, 79 insertions(+) diff --git a/ext/repo_deb.c b/ext/repo_deb.c index c1ad9f5f0..807f38d23 100644 --- a/ext/repo_deb.c +++ b/ext/repo_deb.c @@ -229,6 +229,24 @@ control2solvable(Solvable *s, Repodata *data, char *control) case 'C' << 8 | 'O': if (!strcasecmp(tag, "conflicts")) s->conflicts = makedeps(repo, q, s->conflicts, 0); + else if (!strcasecmp(tag, "conffiles")) { + char *line, *curLine, *filename, *md5; + line = curLine = solv_strdup(q); + while (curLine && strlen(curLine)) { + char *nextLine = strchr(curLine, '\n'); + if (nextLine) + *nextLine++ = '\0'; + md5 = strchr(curLine, ' '); + if (md5) { + *md5++ = '\0'; + filename = curLine; + repodata_add_file_checksum(data, s - pool->solvables, SOLVABLE_DEB_CONFFILES, + filename, md5); + } + curLine = nextLine; + } + solv_free(line); + } break; case 'D' << 8 | 'E': if (!strcasecmp(tag, "depends")) diff --git a/src/knownid.h b/src/knownid.h index c094bf5b6..cd6579fd5 100644 --- a/src/knownid.h +++ b/src/knownid.h @@ -259,6 +259,8 @@ KNOWNID(SIGNATURE_DATA, "signature:data"), KNOWNID(PRODUCT_REGISTER_FLAVOR, "product:regflavor"), /* installed and available product */ KNOWNID(SOLVABLE_INSTALLSTATUS, "solvable:installstatus"), /* debian install status */ +KNOWNID(SOLVABLE_DEB_CONFFILES, "solvable:deb:conffiles"), +KNOWNID(REPOKEY_TYPE_CONFFILES_ARRAY, "repokey:type:conffiles_array"), KNOWNID(ID_NUM_INTERNAL, 0) diff --git a/src/libsolv.ver b/src/libsolv.ver index 91337ea40..793460c3d 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -179,6 +179,8 @@ SOLV_1.0 { repo_write_stdkeyfilter; repodata_add_dirnumnum; repodata_add_dirstr; + repodata_add_file_bin_checksum; + repodata_add_file_checksum; repodata_add_fixarray; repodata_add_flexarray; repodata_add_idarray; diff --git a/src/repodata.c b/src/repodata.c index 4ba1345b4..3e8a5479a 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -2425,6 +2425,38 @@ repodata_set_checksum(Repodata *data, Id solvid, Id keyname, Id type, repodata_set_bin_checksum(data, solvid, keyname, type, buf); } +void +repodata_add_file_bin_checksum(Repodata *data, Id solvid, Id keyname, const char* filename, + const unsigned char *chksum) +{ + int l; + Id filename_p, chksum_p; + + filename_p = pool_str2id(data->repo->pool, filename, 1); + + l = solv_chksum_len(REPOKEY_TYPE_MD5); + data->attrdata = solv_extend(data->attrdata, data->attrdatalen, l, 1, REPODATA_ATTRDATA_BLOCK); + memcpy(data->attrdata + data->attrdatalen, chksum, l); + chksum_p = data->attrdatalen; + data->attrdatalen += l; + + repodata_add_array(data, solvid, keyname, REPOKEY_TYPE_CONFFILES_ARRAY, 2); + data->attriddata[data->attriddatalen++] = filename_p; + data->attriddata[data->attriddatalen++] = chksum_p; + data->attriddata[data->attriddatalen++] = 0; +} + +void +repodata_add_file_checksum(Repodata *data, Id solvid, Id keyname, const char* filename, + const char *chksum) +{ + unsigned char buf[64]; + int l; + l = solv_chksum_len(REPOKEY_TYPE_MD5); + solv_hex2bin(&chksum, buf, l); + repodata_add_file_bin_checksum(data, solvid, keyname, filename, buf); +} + const char * repodata_chk2str(Repodata *data, Id type, const unsigned char *buf) { @@ -3083,6 +3115,13 @@ repodata_serialize_key(Repodata *data, struct extdata *newincore, data_addblob(xd, data->attrdata + ida[1], strlen((char *)(data->attrdata + ida[1])) + 1); } break; + case REPOKEY_TYPE_CONFFILES_ARRAY: + for (ida = data->attriddata + val; *ida; ida += 2) + { + data_addideof(xd, ida[0], ida[2] ? 0 : 1); + data_addblob(xd, data->attrdata + ida[1], SIZEOF_MD5); + } + break; case REPOKEY_TYPE_FIXARRAY: { int num = 0; diff --git a/src/repodata.h b/src/repodata.h index ad05525c6..f0122333a 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -256,6 +256,10 @@ void repodata_set_bin_checksum(Repodata *data, Id solvid, Id keyname, Id type, const unsigned char *buf); void repodata_set_checksum(Repodata *data, Id solvid, Id keyname, Id type, const char *str); +void repodata_add_file_bin_checksum(Repodata *data, Id solvid, Id keyname, const char* filename, + const unsigned char *chksum); +void repodata_add_file_checksum(Repodata *data, Id solvid, Id keyname, const char* filename, + const char *chksum); void repodata_set_idarray(Repodata *data, Id solvid, Id keyname, Queue *q); diff --git a/src/repopack.h b/src/repopack.h index f7828ab4a..596f49645 100644 --- a/src/repopack.h +++ b/src/repopack.h @@ -198,6 +198,10 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) kv->num = 0; /* not stringified yet */ kv->str = (const char *)dp; return dp + strlen(kv->str) + 1; + case REPOKEY_TYPE_CONFFILES_ARRAY: + dp = data_read_ideof(dp, &kv->id, &kv->eof); + kv->str = (const char *)dp; + return dp + SIZEOF_MD5; case REPOKEY_TYPE_DIRNUMNUMARRAY: dp = data_read_id(dp, &kv->id); dp = data_read_id(dp, (Id *)&kv->num); @@ -264,6 +268,16 @@ data_skip(unsigned char *dp, int type) if (!(x & 0x40)) return dp; } + case REPOKEY_TYPE_CONFFILES_ARRAY: + for (;;) + { + while ((*dp & 0x80) != 0) + dp++; + x = *dp++; + dp += SIZEOF_MD5 + 1; + if (!(x & 0x40)) + return dp; + } case REPOKEY_TYPE_DIRNUMNUMARRAY: for (;;) {