1 /* This converts an old style (rpm 1.x) database to the new style */
5 #include <rpmio_internal.h>
11 #include "oldheader.h"
17 struct oldrpmdb olddb;
19 struct oldrpmdbLabel * packageLabels, * label;
20 struct oldrpmdbPackageInfo package;
27 char ** fileLinktoList;
28 int_32 * fileSizeList;
31 int_32 * fileMtimesList;
32 int_32 * fileFlagsList;
33 int_16 * fileModesList;
34 int_16 * fileRDevsList;
35 char * fileStatesList;
36 char * preun, * postun;
39 if (rpmfileexists("/var/lib/rpm/packages.rpm")) {
40 rpmError(RPMERR_NOCREATEDB, _("RPM database already exists"));
44 if (oldrpmdbOpen(&olddb)) {
45 rpmError(RPMERR_OLDDBMISSING, _("Old db is missing"));
49 /* if any of the indexes exist, get rid of them */
50 unlink("/var/lib/rpm/nameindex.rpm");
51 unlink("/var/lib/rpm/groupindex.rpm");
52 unlink("/var/lib/rpm/packageindex.rpm");
53 unlink("/var/lib/rpm/fileindex.rpm");
55 if (rpmdbOpen("", &db, O_RDWR | O_CREAT, 0644)) {
56 rpmError(RPMERR_DBOPEN, _("failed to create RPM database /var/lib/rpm"));
60 packageLabels = oldrpmdbGetAllLabels(&olddb);
62 rpmError(RPMERR_OLDDBCORRUPT, _("Old db is corrupt"));
64 unlink("/var/lib/rpm/packages.rpm");
65 oldrpmdbClose(&olddb);
69 for (label = packageLabels; label; label = label->next) {
70 if (oldrpmdbGetPackageInfo(&olddb, *label, &package)) {
71 fprintf(stderr, _("oldrpmdbGetPackageInfo failed &olddb = %p olddb.packages = %p\n"), &olddb, olddb.packages);
75 group = oldrpmdbGetPackageGroup(&olddb, *label);
76 preun = oldrpmdbGetPackagePreun(&olddb, *label);
77 postun = oldrpmdbGetPackagePostun(&olddb, *label);
79 dbentry = headerNew();
80 headerAddEntry(dbentry, RPMTAG_NAME, RPM_STRING_TYPE, package.name, 1);
81 headerAddEntry(dbentry, RPMTAG_VERSION, RPM_STRING_TYPE, package.version, 1);
82 headerAddEntry(dbentry, RPMTAG_RELEASE, RPM_STRING_TYPE, package.release, 1);
83 headerAddEntry(dbentry, RPMTAG_DESCRIPTION, RPM_STRING_TYPE,
84 package.description, 1);
85 headerAddEntry(dbentry, RPMTAG_BUILDTIME, RPM_INT32_TYPE, &package.buildTime, 1);
86 headerAddEntry(dbentry, RPMTAG_BUILDHOST, RPM_STRING_TYPE, package.buildHost, 1);
87 headerAddEntry(dbentry, RPMTAG_INSTALLTIME, RPM_INT32_TYPE,
88 &package.installTime, 1);
89 headerAddEntry(dbentry, RPMTAG_DISTRIBUTION, RPM_STRING_TYPE,
90 package.distribution, 1);
91 headerAddEntry(dbentry, RPMTAG_VENDOR, RPM_STRING_TYPE, package.vendor, 1);
92 headerAddEntry(dbentry, RPMTAG_SIZE, RPM_INT32_TYPE, &package.size, 1);
93 headerAddEntry(dbentry, RPMTAG_LICENSE, RPM_STRING_TYPE, package.copyright, 1);
94 headerAddEntry(dbentry, RPMTAG_GROUP, RPM_STRING_TYPE, group, 1);
97 headerAddEntry(dbentry, RPMTAG_PREUN, RPM_STRING_TYPE, preun, 1);
101 headerAddEntry(dbentry, RPMTAG_POSTUN, RPM_STRING_TYPE, postun, 1);
105 gif = oldrpmdbGetPackageGif(&olddb, *label, &gifSize);
107 headerAddEntry(dbentry, RPMTAG_GIF, RPM_BIN_TYPE, gif, gifSize);
111 if (package.fileCount) {
112 /* some packages have no file lists */
114 fileList = xmalloc(sizeof(char *) * package.fileCount);
115 fileLinktoList = xmalloc(sizeof(char *) * package.fileCount);
116 fileMD5List = xmalloc(sizeof(char *) * package.fileCount);
117 fileSizeList = xmalloc(sizeof(int_32) * package.fileCount);
118 fileUIDList = xmalloc(sizeof(int_32) * package.fileCount);
119 fileGIDList = xmalloc(sizeof(int_32) * package.fileCount);
120 fileMtimesList = xmalloc(sizeof(int_32) * package.fileCount);
121 fileFlagsList = xmalloc(sizeof(int_32) * package.fileCount);
122 fileModesList = xmalloc(sizeof(int_16) * package.fileCount);
123 fileRDevsList = xmalloc(sizeof(int_16) * package.fileCount);
124 fileStatesList = xmalloc(sizeof(char) * package.fileCount);
126 /* reverse the file list while we're at it */
127 j = package.fileCount - 1;
128 for (i = 0; i < package.fileCount; i++, j--) {
129 fileList[j] = package.files[i].path;
130 fileMD5List[j] = package.files[i].md5;
131 fileSizeList[j] = package.files[i].size;
132 fileUIDList[j] = package.files[i].uid;
133 fileGIDList[j] = package.files[i].gid;
134 fileMtimesList[j] = package.files[i].mtime;
135 fileModesList[j] = package.files[i].mode;
136 fileRDevsList[j] = package.files[i].rdev;
137 fileStatesList[j] = package.files[i].state;
139 if (package.files[i].linkto)
140 fileLinktoList[j] = package.files[i].linkto;
142 fileLinktoList[j] = "";
144 fileFlagsList[j] = 0;
145 if (package.files[i].isdoc)
146 fileFlagsList[j] |= RPMFILE_DOC;
147 if (package.files[i].isconf)
148 fileFlagsList[j] |= RPMFILE_CONFIG;
151 headerAddEntry(dbentry, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, fileList,
153 headerAddEntry(dbentry, RPMTAG_FILELINKTOS, RPM_STRING_ARRAY_TYPE,
154 fileLinktoList, package.fileCount);
155 headerAddEntry(dbentry, RPMTAG_FILEMD5S, RPM_STRING_ARRAY_TYPE, fileMD5List,
157 headerAddEntry(dbentry, RPMTAG_FILESIZES, RPM_INT32_TYPE, fileSizeList,
159 headerAddEntry(dbentry, RPMTAG_FILEUIDS, RPM_INT32_TYPE, fileUIDList,
161 headerAddEntry(dbentry, RPMTAG_FILEGIDS, RPM_INT32_TYPE, fileGIDList,
163 headerAddEntry(dbentry, RPMTAG_FILEMTIMES, RPM_INT32_TYPE, fileMtimesList,
165 headerAddEntry(dbentry, RPMTAG_FILEFLAGS, RPM_INT32_TYPE, fileFlagsList,
167 headerAddEntry(dbentry, RPMTAG_FILEMODES, RPM_INT16_TYPE, fileModesList,
169 headerAddEntry(dbentry, RPMTAG_FILERDEVS, RPM_INT16_TYPE, fileRDevsList,
171 headerAddEntry(dbentry, RPMTAG_FILESTATES, RPM_INT8_TYPE, fileStatesList,
175 free(fileLinktoList);
180 free(fileMtimesList);
184 free(fileStatesList);
187 rpmdbAdd(db, dbentry);
192 oldrpmdbFreePackageInfo(package);
195 oldrpmdbClose(&olddb);
201 int main(int argc, char ** argv)
203 setprogname(argv[0]);
205 fprintf(stderr, _("rpmconvert: no arguments expected"));
209 rpmReadConfigFiles(NULL, NULL);
211 printf(_("rpmconvert 1.0 - converting database in /var/lib/rpm\n"));