- 论坛徽章:
- 0
|
本帖最后由 duanjigang 于 2012-11-16 16:56 编辑
test.zip
(1.06 KB, 下载次数: 248)
附件的 test.c 是基于 rpm-devel 这个库开发的一个 rpm 信息读取功能的 C程序,读取RPM基本信息并且打印,如果你了解了RPM的格式,看这段代码就比较容易了。
核心代码片段如下:
- char * readHeaderString (Header header, int_32 tag_id)
- {
- int_32 type;
- void *pointer;
- int_32 data_size;
- int header_status = headerGetEntry (header, tag_id, &type, &pointer, &data_size);
- if (header_status)
- {
- if (type == RPM_STRING_TYPE)
- {
- return pointer;
- }
- }
- return NULL;
- }
- int samplerpm (const char *szrpm)
- {
- char g_szname[1024] = {0};
- FD_t fd = Fopen (szrpm, "r");
- memset (g_szname, 0, 1024);
- sprintf (g_szname, "%s", szrpm);
- fflush (stdin);
- fflush (stdout);
- if (!fd)
- {
- printf ("open file '%s' failed\n", szrpm);
- return 0;
- }
- //else
- // printf ("open '%s' success\n", szrpm);
-
- struct rpmlead plead;
- int lead = readLead (fd, &plead);
- if (lead)
- {
- printf ("readLead of '%s' failed\n", szrpm);
- Fclose (fd);
- return 0;
- }
- else
- {
- //printf ("name=%s,may=%d,min=%d\n",plead.name,plead.major,plead.minor);
- }
- //sigType sig_type = plead.signature_type;
- Header header;
- rpmRC ret = rpmReadSignature (fd, &header, plead.signature_type);
- if (ret != RPMRC_OK)
- {
- printf ("rpmReadSignature of '%s' failed\n", szrpm);
- Fclose (fd);
- return 0;
- }
- //else
- //printf ("rpmReadSignature success:%s\n", szrpm);
- //read header
- Header newheader =
- headerRead (fd, (plead.major >= 3) ? HEADER_MAGIC_YES : HEADER_MAGIC_NO);
- if (!newheader)
- {
- printf ("headerRead of '%s' failed\n", szrpm);
- Fclose (fd);
- return 0;
- }
- const char *name = readHeaderString (newheader, RPMTAG_NAME);
- const char *version = readHeaderString (newheader, RPMTAG_VERSION);
- const char *release = readHeaderString (newheader, RPMTAG_RELEASE);
- const char *group = readHeaderString (newheader, RPMTAG_GROUP);
- const char *packager = readHeaderString (newheader, RPMTAG_PACKAGER);
- if (!group) group = "NONE_GROUP";
- if (!packager) packager = "NONE_PACKAGER";
- printf ("name:%s\nversion:%s\nrelease:%s\ngroup:%s\npackager:%s\n\n",
- name, version, release, group, packager);
- Fclose (fd);
- return 1;
- }
- [code]
- 执行编译命令:
- [code]
- gcc test.c -I/usr/include/rpm -lrpm -lrpmdb -lrpmio -lpopt -o test_rpm
复制代码 然后可以测试其功能:
- ./test_rpm ./mysql-server-5.0.77-4.el5_6.6.x86_64.rpm
- name:mysql-server
- version:5.0.77
- release:4.el5_6.6
- group:Applications/Databases
- packager:Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
复制代码 本人没有读 rpm 的源码,不过其实现应该也类似,参考 RPM 的协议文档,逐个做解析吧。
到此为止, RPM 文件的介绍和格式剖析基本上结束。关于 RPM 的操作工具,可以参考 man 手册。
或者有空时,我再来补充,等对 spec 文件做整理后,我会把 Spec 的部分总结出来。
:wink: over |
|