此函数将头h写入文件fd中并且转换主机系统字节序为网络字节序。如果magicp定义为HEADER_MAGIC_YES,此函数在写入的头信息中加入适当的幻数。如果magicp定义为HEADER_MAGIC_NO,此函数写入的信息不包含幻数。
Header headerCopy(Header h);
此函数返回头h的副本。
unsigned int headerSizeof(Header h, int magicp);
此函数返回头h占用的字节数。
Header headerNew(void);
此函数返回一个新的头。
void headerFree(Header h);
此函数释放h所指定的头信息。
void headerDump(Header h, FILE *f, int flags);
此函数打印头h结构到文件f中。若flags标志为HEADER_DUMP_INLINE,头数据也被打印。
4.9 包头信息处理
此节的这些函数提供处理头入口的基本操作,包含下列头入口类型:
RPM_NULL_TYPE - 不使用此类型
RPM_CHAR_TYPE - 此入口包含单一字符。
RPM_INT8_TYPE - 此入口包含八位字符。
RPM_INT16_TYPE - 此入口包含16位字符。
RPM_INT32_TYPE - 此入口包含32位字符。
RPM_INT64_TYPE - 此入口包含64位字符。
RPM_STRING_TYPE - 此入口包含字符串类型。
RPM_BIN_TYPE - 此入口包含rpmlib无法处理的二进制数据。
RPM_STRING_ARRAY_TYPE - 此入口包含字符数组。
int headerGetEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
此过程从h中取出与tag标志匹配的入口。入口类型由type返回,数据指针由p返回,数据大小由c返回。
int headerAddEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
此函数向头h中加入新的入口, tag参数指定入口的标志,type指定入口的类型。P指定入口数据,c是此数据的大小。
4.10 头重复器支持
rpmdbMatchIterator rpmdbInitIterator(rpmdb rpmdb, int rpmtag, const void * key, size_t keylen);
此函数返回新创建的重复器。
Header rpmdbNextIterator(rpmdbMatchIterator iter);
此函数获得下一个头信息。
void rpmdbFreeIterator(rpmdbMatchIterator iter);
此函数释放重复器iter占用的资源。
5 RPM包管理过程实现
在安装程序中与包管理有关的函数基本上都保存在文件pkgs.pm中。这个模块中包含的主要函数如下:
getDeps
读入文件depslist.ordered,通过它形成所有包所依赖rpm包的描述结构。
getProvides
读入所有rpm文件的头信息描述结构,通过provides字段形成包的Provides结构。
init_db,rebuild_db_open_for_traversal,clean_old_rpm_db
初始化(重建、清除)包的rpm配置数据库。
install
安装指定的rpm包。
packageByXXX
通过对读入的包头信息的解释,生成相应的包内部信息。比如读出包的大小,版本号,描述,名字等。
psUsingHdlists
读入hdlists,由它每一行保存的信息,读入对应的hdlist文件。
psUsingHdlist
由psUsingHdlists函数调用,读入所有的rpm包的文件头描述信息。
remove
删除指定的rpm包。
read_rpmsrate
读入rpmsrate,形成最基本的包类描述。
readCompssUsers
读入高层的包类描述信息,返回compssUsers结构。每选中一个compssUsers类,对应多个rpmsrate文件描述的子类。
selectPackage
选中指定的包。
unselectPackage
取消指定包的选中状态。
包的处理过程的一般流程:

#-" 下面的程序是RPM包安装过程代码,它是整个包安装过程中作关键的部分。它使用了安装回调的机
#- 制,使得包安装过程中,系统可以随时显示安装进度并更换安装插图。