- API: uncouple fadio from rest of rpmio.
[tools/librpm-tizen.git] / convertdb.c
1 /* This converts an old style (rpm 1.x) database to the new style */
2
3 #include "system.h"
4
5 #include <rpmio_internal.h>
6 #include <rpmbuild.h>
7 #include <rpmdb.h>
8
9 #include "falloc.h"
10 #include "oldrpmdb.h"
11 #include "oldheader.h"
12
13 int convertDB(void);
14
15 int convertDB(void)
16 {
17     struct oldrpmdb olddb;
18     rpmdb db;
19     struct oldrpmdbLabel * packageLabels, * label;
20     struct oldrpmdbPackageInfo package;
21     Header dbentry;
22     char * group;
23     char * gif;
24     int gifSize;
25     char ** fileList;
26     char ** fileMD5List;
27     char ** fileLinktoList;
28     int_32 * fileSizeList;
29     int_32 * fileUIDList;
30     int_32 * fileGIDList;
31     int_32 * fileMtimesList;
32     int_32 * fileFlagsList;
33     int_16 * fileModesList;
34     int_16 * fileRDevsList;
35     char * fileStatesList;
36     char * preun, * postun;
37     int i, j;
38     
39     if (rpmfileexists("/var/lib/rpm/packages.rpm")) {
40         rpmError(RPMERR_NOCREATEDB, _("RPM database already exists"));
41         return 0;
42     }
43
44     if (oldrpmdbOpen(&olddb)) {
45         rpmError(RPMERR_OLDDBMISSING, _("Old db is missing"));
46         return 0;
47     }
48
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");
54
55     if (rpmdbOpen("", &db, O_RDWR | O_CREAT, 0644)) {
56         rpmError(RPMERR_DBOPEN, _("failed to create RPM database /var/lib/rpm"));
57         return 0;
58     }
59
60     packageLabels = oldrpmdbGetAllLabels(&olddb);
61     if (!packageLabels) {
62         rpmError(RPMERR_OLDDBCORRUPT, _("Old db is corrupt"));
63         rpmdbClose(db);
64         unlink("/var/lib/rpm/packages.rpm");
65         oldrpmdbClose(&olddb);
66         return 0;
67     }
68
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);
72             exit(EXIT_FAILURE);
73         }
74
75         group = oldrpmdbGetPackageGroup(&olddb, *label);
76         preun = oldrpmdbGetPackagePreun(&olddb, *label);
77         postun = oldrpmdbGetPackagePostun(&olddb, *label);
78
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);
95
96         if (preun) {
97             headerAddEntry(dbentry, RPMTAG_PREUN, RPM_STRING_TYPE, preun, 1);
98             free(preun);
99         }
100         if (postun) {
101             headerAddEntry(dbentry, RPMTAG_POSTUN, RPM_STRING_TYPE, postun, 1);
102             free(postun);
103         }
104
105         gif = oldrpmdbGetPackageGif(&olddb, *label, &gifSize);
106         if (gif) {
107             headerAddEntry(dbentry, RPMTAG_GIF, RPM_BIN_TYPE, gif, gifSize);
108             free(gif);
109         }
110
111         if (package.fileCount) {
112             /* some packages have no file lists */
113
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);
125
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;
138
139                 if (package.files[i].linkto)
140                     fileLinktoList[j] = package.files[i].linkto;
141                 else
142                     fileLinktoList[j] = "";
143                 
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;
149             }
150
151             headerAddEntry(dbentry, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, fileList, 
152                      package.fileCount);
153             headerAddEntry(dbentry, RPMTAG_FILELINKTOS, RPM_STRING_ARRAY_TYPE, 
154                      fileLinktoList, package.fileCount);
155             headerAddEntry(dbentry, RPMTAG_FILEMD5S, RPM_STRING_ARRAY_TYPE, fileMD5List, 
156                      package.fileCount);
157             headerAddEntry(dbentry, RPMTAG_FILESIZES, RPM_INT32_TYPE, fileSizeList, 
158                      package.fileCount);
159             headerAddEntry(dbentry, RPMTAG_FILEUIDS, RPM_INT32_TYPE, fileUIDList, 
160                      package.fileCount);
161             headerAddEntry(dbentry, RPMTAG_FILEGIDS, RPM_INT32_TYPE, fileGIDList, 
162                      package.fileCount);
163             headerAddEntry(dbentry, RPMTAG_FILEMTIMES, RPM_INT32_TYPE, fileMtimesList, 
164                      package.fileCount);
165             headerAddEntry(dbentry, RPMTAG_FILEFLAGS, RPM_INT32_TYPE, fileFlagsList, 
166                      package.fileCount);
167             headerAddEntry(dbentry, RPMTAG_FILEMODES, RPM_INT16_TYPE, fileModesList, 
168                      package.fileCount);
169             headerAddEntry(dbentry, RPMTAG_FILERDEVS, RPM_INT16_TYPE, fileRDevsList, 
170                      package.fileCount);
171             headerAddEntry(dbentry, RPMTAG_FILESTATES, RPM_INT8_TYPE, fileStatesList, 
172                      package.fileCount);
173
174             free(fileList);
175             free(fileLinktoList);
176             free(fileMD5List);
177             free(fileSizeList);
178             free(fileUIDList);
179             free(fileGIDList);
180             free(fileMtimesList);
181             free(fileFlagsList);
182             free(fileModesList);
183             free(fileRDevsList);
184             free(fileStatesList);
185         }
186
187         rpmdbAdd(db, dbentry);
188
189         free(group);
190         headerFree(dbentry);
191
192         oldrpmdbFreePackageInfo(package);
193     }
194
195     oldrpmdbClose(&olddb);
196     rpmdbClose(db);
197
198     return 1;
199 }
200
201 int main(int argc, char ** argv)
202 {
203     setprogname(argv[0]);
204     if (argc != 1) {
205         fprintf(stderr, _("rpmconvert: no arguments expected"));
206         exit(EXIT_FAILURE);
207     }
208
209     rpmReadConfigFiles(NULL, NULL);
210
211     printf(_("rpmconvert 1.0 - converting database in /var/lib/rpm\n"));
212     convertDB();
213
214     exit(EXIT_SUCCESS);
215 }