我正在尝试使用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
工具检查生成的文件内容时,我可以看到标题只包含字符串类型标记。
为什么我不能插入其他两个?
答案 0 :(得分:0)
好吧,经过一些gdb
调试并查看the RPM source files后,我发现了问题所在。
在签名中,RPMSIGTAG_SIZE
(1000)的类型为INT32
,RPMSIGTAG_MD5
(1004)的类型为BIN
。问题是这些符号值也对应于RPM标头标签,其中类型不同:RPMTAG_NAME
是1000,STRING
,RPMTAG_SUMMARY
是1004,是I18NSTRING
。 RPM源文件无法区分这两者并假设它们是标题标记,而不是签名标记。
幸运的是,API还包含headerPut
功能。这实际上是在完整性检查(包括类型检查)之后由类型特定的函数调用的,headerPut
本身不会尝试任何标记类型匹配,它只是继续并尝试添加/追加它,因此是这些情况的一个很好的解决方案。