1 /* This converts an old style (rpm 1.x) database to the new style */
5 #include "build/rpmbuild.h"
14 struct oldrpmdb olddb;
16 struct oldrpmdbLabel * packageLabels, * label;
17 struct oldrpmdbPackageInfo package;
24 char ** fileLinktoList;
25 int_32 * fileSizeList;
28 int_32 * fileMtimesList;
29 int_32 * fileFlagsList;
30 int_16 * fileModesList;
31 int_16 * fileRDevsList;
32 char * fileStatesList;
33 char * preun, * postun;
36 if (exists("/var/lib/rpm/packages.rpm")) {
37 rpmError(RPMERR_NOCREATEDB, "RPM database already exists");
41 if (oldrpmdbOpen(&olddb)) {
42 rpmError(RPMERR_OLDDBMISSING, "");
46 /* if any of the indexes exist, get rid of them */
47 unlink("/var/lib/rpm/nameindex.rpm");
48 unlink("/var/lib/rpm/groupindex.rpm");
49 unlink("/var/lib/rpm/packageindex.rpm");
50 unlink("/var/lib/rpm/fileindex.rpm");
52 if (rpmdbOpen("", &db, O_RDWR | O_CREAT, 0644)) {
53 rpmError(RPMERR_DBOPEN, "failed to create RPM database /var/lib/rpm");
57 packageLabels = oldrpmdbGetAllLabels(&olddb);
59 rpmError(RPMERR_OLDDBCORRUPT, "");
61 unlink("/var/lib/rpm/packages.rpm");
62 oldrpmdbClose(&olddb);
66 for (label = packageLabels; label; label = label->next) {
67 if (oldrpmdbGetPackageInfo(&olddb, *label, &package)) {
68 fprintf(stderr, "oldrpmdbGetPackageInfo failed &olddb = %p olddb.packages = %p\n", &olddb, olddb.packages);
72 group = oldrpmdbGetPackageGroup(&olddb, *label);
73 preun = oldrpmdbGetPackagePreun(&olddb, *label);
74 postun = oldrpmdbGetPackagePostun(&olddb, *label);
76 dbentry = headerNew();
77 headerAddEntry(dbentry, RPMTAG_NAME, RPM_STRING_TYPE, package.name, 1);
78 headerAddEntry(dbentry, RPMTAG_VERSION, RPM_STRING_TYPE, package.version, 1);
79 headerAddEntry(dbentry, RPMTAG_RELEASE, RPM_STRING_TYPE, package.release, 1);
80 headerAddEntry(dbentry, RPMTAG_DESCRIPTION, RPM_STRING_TYPE,
81 package.description, 1);
82 headerAddEntry(dbentry, RPMTAG_BUILDTIME, RPM_INT32_TYPE, &package.buildTime, 1);
83 headerAddEntry(dbentry, RPMTAG_BUILDHOST, RPM_STRING_TYPE, package.buildHost, 1);
84 headerAddEntry(dbentry, RPMTAG_INSTALLTIME, RPM_INT32_TYPE,
85 &package.installTime, 1);
86 headerAddEntry(dbentry, RPMTAG_DISTRIBUTION, RPM_STRING_TYPE,
87 package.distribution, 1);
88 headerAddEntry(dbentry, RPMTAG_VENDOR, RPM_STRING_TYPE, package.vendor, 1);
89 headerAddEntry(dbentry, RPMTAG_SIZE, RPM_INT32_TYPE, &package.size, 1);
90 headerAddEntry(dbentry, RPMTAG_LICENSE, RPM_STRING_TYPE, package.copyright, 1);
91 headerAddEntry(dbentry, RPMTAG_GROUP, RPM_STRING_TYPE, group, 1);
94 headerAddEntry(dbentry, RPMTAG_PREUN, RPM_STRING_TYPE, preun, 1);
98 headerAddEntry(dbentry, RPMTAG_POSTUN, RPM_STRING_TYPE, postun, 1);
102 gif = oldrpmdbGetPackageGif(&olddb, *label, &gifSize);
104 headerAddEntry(dbentry, RPMTAG_GIF, RPM_BIN_TYPE, gif, gifSize);
108 if (package.fileCount) {
109 /* some packages have no file lists */
111 fileList = malloc(sizeof(char *) * package.fileCount);
112 fileLinktoList = malloc(sizeof(char *) * package.fileCount);
113 fileMD5List = malloc(sizeof(char *) * package.fileCount);
114 fileSizeList = malloc(sizeof(int_32) * package.fileCount);
115 fileUIDList = malloc(sizeof(int_32) * package.fileCount);
116 fileGIDList = malloc(sizeof(int_32) * package.fileCount);
117 fileMtimesList = malloc(sizeof(int_32) * package.fileCount);
118 fileFlagsList = malloc(sizeof(int_32) * package.fileCount);
119 fileModesList = malloc(sizeof(int_16) * package.fileCount);
120 fileRDevsList = malloc(sizeof(int_16) * package.fileCount);
121 fileStatesList = malloc(sizeof(char) * package.fileCount);
123 /* reverse the file list while we're at it */
124 j = package.fileCount - 1;
125 for (i = 0; i < package.fileCount; i++, j--) {
126 fileList[j] = package.files[i].path;
127 fileMD5List[j] = package.files[i].md5;
128 fileSizeList[j] = package.files[i].size;
129 fileUIDList[j] = package.files[i].uid;
130 fileGIDList[j] = package.files[i].gid;
131 fileMtimesList[j] = package.files[i].mtime;
132 fileModesList[j] = package.files[i].mode;
133 fileRDevsList[j] = package.files[i].rdev;
134 fileStatesList[j] = package.files[i].state;
136 if (package.files[i].linkto)
137 fileLinktoList[j] = package.files[i].linkto;
139 fileLinktoList[j] = "";
141 fileFlagsList[j] = 0;
142 if (package.files[i].isdoc)
143 fileFlagsList[j] |= RPMFILE_DOC;
144 if (package.files[i].isconf)
145 fileFlagsList[j] |= RPMFILE_CONFIG;
148 headerAddEntry(dbentry, RPMTAG_FILENAMES, RPM_STRING_ARRAY_TYPE, fileList,
150 headerAddEntry(dbentry, RPMTAG_FILELINKTOS, RPM_STRING_ARRAY_TYPE,
151 fileLinktoList, package.fileCount);
152 headerAddEntry(dbentry, RPMTAG_FILEMD5S, RPM_STRING_ARRAY_TYPE, fileMD5List,
154 headerAddEntry(dbentry, RPMTAG_FILESIZES, RPM_INT32_TYPE, fileSizeList,
156 headerAddEntry(dbentry, RPMTAG_FILEUIDS, RPM_INT32_TYPE, fileUIDList,
158 headerAddEntry(dbentry, RPMTAG_FILEGIDS, RPM_INT32_TYPE, fileGIDList,
160 headerAddEntry(dbentry, RPMTAG_FILEMTIMES, RPM_INT32_TYPE, fileMtimesList,
162 headerAddEntry(dbentry, RPMTAG_FILEFLAGS, RPM_INT32_TYPE, fileFlagsList,
164 headerAddEntry(dbentry, RPMTAG_FILEMODES, RPM_INT16_TYPE, fileModesList,
166 headerAddEntry(dbentry, RPMTAG_FILERDEVS, RPM_INT16_TYPE, fileRDevsList,
168 headerAddEntry(dbentry, RPMTAG_FILESTATES, RPM_INT8_TYPE, fileStatesList,
172 free(fileLinktoList);
177 free(fileMtimesList);
181 free(fileStatesList);
184 rpmdbAdd(db, dbentry);
189 oldrpmdbFreePackageInfo(package);
192 oldrpmdbClose(&olddb);
198 int main(int argc, char ** argv) {
200 fprintf(stderr, "rpmconvert: no arguments expected");
204 rpmReadConfigFiles(NULL, NULL, NULL, 0);
206 printf("rpmconvert 1.0 - converting database in /var/lib/rpm\n");