使用rpmlib向标头添加标签

时间:2015-08-06 09:28:08

标签: c rpm

我正在尝试使用Header API函数创建一个新标头并使用RPM 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工具检查生成的文件内容时,我可以看到标题只包含字符串类型标记。

为什么我不能插入其他两个?

1 个答案:

答案 0 :(得分:0)

好吧,经过一些gdb调试并查看the RPM source files后,我发现了问题所在。

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

幸运的是,API还包含headerPut功能。这实际上是在完整性检查(包括类型检查)之后由类型特定的函数调用的,headerPut本身不会尝试任何标记类型匹配,它只是继续并尝试添加/追加它,因此是这些情况的一个很好的解决方案。

相关问题