- 論壇徽章:
- 0
|
本帖最后由 duanjigang 于 2012-11-16 16:56 編輯
test.zip
(1.06 KB, 下載次數(shù): 249)
2012-11-16 16:53 上傳
點(diǎn)擊文件名下載附件
RPM解析示例代碼
附件的 test.c 是基于 rpm-devel 這個(gè)庫(kù)開(kāi)發(fā)的一個(gè) 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]
- 執(zhí)行編譯命令:
- [code]
- gcc test.c -I/usr/include/rpm -lrpm -lrpmdb -lrpmio -lpopt -o test_rpm
復(fù)制代碼 然后可以測(cè)試其功能:
- ./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>
復(fù)制代碼 本人沒(méi)有讀 rpm 的源碼,不過(guò)其實(shí)現(xiàn)應(yīng)該也類(lèi)似,參考 RPM 的協(xié)議文檔,逐個(gè)做解析吧。
到此為止, RPM 文件的介紹和格式剖析基本上結(jié)束。關(guān)于 RPM 的操作工具,可以參考 man 手冊(cè)。
或者有空時(shí),我再來(lái)補(bǔ)充,等對(duì) spec 文件做整理后,我會(huì)把 Spec 的部分總結(jié)出來(lái)。
:wink: over |
|