使用 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 并且是 STRING
,RPMTAG_SUMMARY
是 1004 并且是 I18NSTRING
。 RPM 源文件无法区分两者,并假定它们是 header 标签,而不是签名标签。
幸运的是,API 还包含 headerPut
功能。这实际上是 type-specific 函数在完整性检查(包括类型检查)之后调用的内容,headerPut
本身不尝试任何 tag-type 匹配,它只是继续并尝试 add/append 它,因此是解决这些情况的好方法。
我正在尝试创建一个新的 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 并且是 STRING
,RPMTAG_SUMMARY
是 1004 并且是 I18NSTRING
。 RPM 源文件无法区分两者,并假定它们是 header 标签,而不是签名标签。
幸运的是,API 还包含 headerPut
功能。这实际上是 type-specific 函数在完整性检查(包括类型检查)之后调用的内容,headerPut
本身不尝试任何 tag-type 匹配,它只是继续并尝试 add/append 它,因此是解决这些情况的好方法。