gpt4 book ai didi

c - 使用 rpmlib 将标签添加到 header

转载 作者:行者123 更新时间:2023-11-30 17:12:01 26 4
gpt4 key购买 nike

我正在尝试创建一个新 header 并使用 RPM Header API 插入一些标签使用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 仅包含字符串类型标记。

为什么我无法插入另外两个?

最佳答案

好吧,经过一些 gdb 调试和查看 the RPM source files ,我明白问题出在哪里了。

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

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

关于c - 使用 rpmlib 将标签添加到 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com