使用 rpmlib 添加标签到 header

Adding tags to header with rpmlib

我正在尝试创建一个新的 header 并使用 RPM Header API using the headerPut* 函数插入一些标签,但在这个简单的示例中,我尝试插入失败,但 headerPutString 和我不知道为什么:

Header s = NULL;
unsigned char md5[16] = {0};
uint32_t size = 42;

s = headerNew();

if (headerPutString(s, RPMSIGTAG_SHA1, "foo") != 1)
    fprintf(stderr, "headerPutString error\n");

if (headerPutUint32(s, RPMSIGTAG_SIZE, &size, 1) != 1)
    fprintf(stderr, "headerPutUint32 error\n");

if (headerPutBin(s, RPMSIGTAG_MD5, md5, 16) != 1)
    fprintf(stderr, "headerPutBin error\n");

运行 这输出:

headerPutUint32 error
headerPutBin error

然后当我调用 headerWrite 并使用 hexdump 工具检查生成的文件内容时,我可以看到 header 仅包含 string-type 标记。

为什么我不能插入另外两个?

嗯,经过一些 gdb 调试和查看 the RPM source files,我知道问题出在哪里了。

签名中,RPMSIGTAG_SIZE(1000)是INT32类型,RPMSIGTAG_MD5(1004)是BIN类型。问题是这些符号值也对应于 RPM header 标签,其中类型不同:RPMTAG_NAME 是 1000 并且是 STRINGRPMTAG_SUMMARY 是 1004 并且是 I18NSTRING。 RPM 源文件无法区分两者,并假定它们是 header 标签,而不是签名标签。

幸运的是,API 还包含 headerPut 功能。这实际上是 type-specific 函数在完整性检查(包括类型检查)之后调用的内容,headerPut 本身不尝试任何 tag-type 匹配,它只是继续并尝试 add/append 它,因此是解决这些情况的好方法。