此过程搜索db指定的RPM数据库,查找包的conflicts信息和指定的conflicts信息一致的包,返回值保存在matches中。
4.6 包处理
int rpmInstallSourcePackage(char * root, int fd, char ** specFile, rpmNotifyFunction notify, char * labelFormat);
此函数安装fd指定的源码包。如果指定了root字段则将包安装到此目录下。notify指定安装过程中调用的进程跟踪过程。labelformat指定包标签的打印格式。
int rpmInstallPackage(char * rootdir,rpmdb db, int fd, char * prefix, int flags, rpmNotifyFunction notify, char * labelFormat, char * netsharedPath);
此过程安装db指定的二进制包,如果指定了rootdir,包安装到此目录下。flags参数控制包的安装行为。
RPMINSTALL_REPLACEPKG------------即使包已经安装,仍继续安装。
RPMINSTALL_REPLACEFILES----------即使会替换另外一个包的文件也安装此包。
RPMINSTALL_TEST------------------只进行安装时检测,不安装包。
RPMINSTALL_UPGRADE---------------安装包并除去包的老版本。
RPMINSTALL_UPGRADETOOLD----------即使此包是老版本,仍进行安装。
RPMINSTALL_NODOCS----------------不安装包的文档文件。
RPMINSTALL_NOSCRIPTS-------------不执行包的安装和删除脚本。
RPMINSTALL_NOARCH----------------不完成结构兼容性测试。
RPMINSTALL_NOOS------------------不进行操作系统兼容性测试。
Notify参数指定安装过程中系统调用的进度跟踪过程。回调过程的函数指针定义:
typedef void (*rpmNotifyFunction)(const unsigned long amount, const unsigned long total);
amount指定已经安装的字节数,total指定安装的总字节数。此过程可用于在安装过程中动态更新进程条等信息。
LabelFormat指定包标签的格式。NetsharedPath参数指定和其它系统共享的本地文件系统部分。如果共享多个目录,路径要用冒号隔开。
int rpmRemovePackage(char * root, rpmdb db, unsigned int offset, int flags);
此过程除去在rpm数据库中offset位置处的包。root指定包所在的根目录,flags的值定义在rpmlib.h中,定义了如下标志:
RPMUNINSTALL_TEST 进行删除检测,但是不除去任何包
RPMUNINSTALL_NOSCRIPTS 不执行包删除脚本。
4.7 与包依赖性相关的操作
依赖性操作是完全和正常的基于包的操作隔离的。包的安装和除去过程自身并不完成依赖性处理。因此依赖性处理函数和其他rpmlib函数不同。依赖性处理的中心是rpmDependencies数据结构。这些函数只是随着操作的不同管理此数据结构,它们并不对包进行操作。在依赖性检测过程发现存在包依赖性冲突问题时,rpmDependencyConflict结构返回依赖性冲突。
rpmDependencies rpmdepDependencies(rpmdb db);
此过程返回初始化了的rpmDependencies结构。此时基于db参数指定的rpm数据库进行依赖性检测。
void rpmdepAddPackage(rpmDependencies rpmdep, Header h);
此过程加入头为h的包到rpmDependencies数据结构rpmdep中。
void rpmdepUpgradePackage(rpmDependencies rpmdep, Header h);
此过程加入头为h的包到rpmDependencies数据结构rpmdep中,同时此过程除去包依赖的老版本。
void rpmdepRemovePackage(rpmDependencies rpmdep, int dboffset);
此过程在rpmdep依赖结构中除去rpm数据库中偏移为dboffset的包。
void rpmdepAvailablePackage(rpmDependencies rpmdep, Header h, void * key);
此过程加入头为h的包到rpmDependencies数据结构rpmdep中。Key用于标识加入的包,这个参数会作为rpmdepCheck()函数返回的rpmDependencyConflict结构的一部分。
int rpmdepCheck(rpmDependencies rpmdep, struct rpmDependencyConflict ** conflicts, int * numConflicts);
此函数在rpmDependencies类型的结构变量rpmdep上进行依赖性检测。它返回一个numConflicts大小的数组,数组保存在conflicts指针中。
void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts, int numConflicts);
此函数释放conflicts指针指向的依赖性冲突结构。
void rpmdepDone(rpmDependencies rpmdep);
此函数释放rpmDependencies类型的结构变量rpmdep。
4.8 头信息处理
rpm头信息是为最小化的rpm数据库服务的,在这个数据库中可以进行特定信息的检索。
Header headerRead(int fd, int magicp);
此函数从文件fd中读入header并且转换网络字节序为主机系统字节序。如果magicp定义为HEADER_MAGIC_YES,此函数期望接收头幻数。如果magicp定义为HEADER_MAGIC_NO,此函数不包含头幻数。
void headerWrite(int fd, Header h, int magicp);