Add %_i18ndomains configuration.
[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 "build/rpmbuild.h"
6
7 #include "falloc.h"
8 #include "oldrpmdb.h"
9 #include "oldheader.h"
10 #include "lib/rpmdb.h"
11
12 int convertDB(void);
13
14 int convertDB(void)
15 {
16     struct oldrpmdb olddb;
17     rpmdb db;
18     struct oldrpmdbLabel * packageLabels, * label;
19     struct oldrpmdbPackageInfo package;
20     Header dbentry;
21     char * group;
22     char * gif;
23     int gifSize;
24     char ** fileList;
25     char ** fileMD5List;
26     char ** fileLinktoList;
27     int_32 * fileSizeList;
28     int_32 * fileUIDList;
29     int_32 * fileGIDList;
30     int_32 * fileMtimesList;
31     int_32 * fileFlagsList;
32     int_16 * fileModesList;
33     int_16 * fileRDevsList;
34     char * fileStatesList;
35     char * preun, * postun;
36     int i, j;
37     
38     if (rpmfileexists("/var/lib/rpm/packages.rpm")) {
39         rpmError(RPMERR_NOCREATEDB, _("RPM database already exists"));
40         return 0;
41     }
42
43     if (oldrpmdbOpen(&olddb)) {
44         rpmError(RPMERR_OLDDBMISSING, _("Old db is missing"));
45         return 0;
46     }
47
48     /* if any of the indexes exist, get rid of them */
49     unlink("/var/lib/rpm/nameindex.rpm");
50     unlink("/var/lib/rpm/groupindex.rpm");
51     unlink("/var/lib/rpm/packageindex.rpm");
52     unlink("/var/lib/rpm/fileindex.rpm");
53
54     if (rpmdbOpen("", &db, O_RDWR | O_CREAT, 0644)) {
55         rpmError(RPMERR_DBOPEN, _("failed to create RPM database /var/lib/rpm"));
56         return 0;
57     }
58
59     packageLabels = oldrpmdbGetAllLabels(&olddb);
60     if (!packageLabels) {
61         rpmError(RPMERR_OLDDBCORRUPT, _("Old db is corrupt"));
62         rpmdbClose(db);
63         unlink("/var/lib/rpm/packages.rpm");
64         oldrpmdbClose(&olddb);
65         return 0;
66     }
67
68     for (label = packageLabels; label; label = label->next) {
69         if (oldrpmdbGetPackageInfo(&olddb, *label, &package)) {
70             fprintf(stderr, _("oldrpmdbGetPackageInfo failed &olddb = %p olddb.packages = %p\n"), &olddb, olddb.packages);
71             exit(EXIT_FAILURE);
72         }
73
74         group = oldrpmdbGetPackageGroup(&olddb, *label);
75         preun = oldrpmdbGetPackagePreun(&olddb, *label);
76         postun = oldrpmdbGetPackagePostun(&olddb, *label);
77
78         dbentry = headerNew();
79         headerAddEntry(dbentry, RPMTAG_NAME, RPM_STRING_TYPE, package.name, 1);
80         headerAddEntry(dbentry, RPMTAG_VERSION, RPM_STRING_TYPE, package.version, 1);
81         headerAddEntry(dbentry, RPMTAG_RELEASE, RPM_STRING_TYPE, package.release, 1);
82         headerAddEntry(dbentry, RPMTAG_DESCRIPTION, RPM_STRING_TYPE, 
83                  package.description, 1);
84         headerAddEntry(dbentry, RPMTAG_BUILDTIME, RPM_INT32_TYPE, &package.buildTime, 1);
85         headerAddEntry(dbentry, RPMTAG_BUILDHOST, RPM_STRING_TYPE, package.buildHost, 1);
86         headerAddEntry(dbentry, RPMTAG_INSTALLTIME, RPM_INT32_TYPE, 
87                  &package.installTime, 1);
88         headerAddEntry(dbentry, RPMTAG_DISTRIBUTION, RPM_STRING_TYPE, 
89                  package.distribution, 1);
90         headerAddEntry(dbentry, RPMTAG_VENDOR, RPM_STRING_TYPE, package.vendor, 1);
91         headerAddEntry(dbentry, RPMTAG_SIZE, RPM_INT32_TYPE, &package.size, 1);
92         headerAddEntry(dbentry, RPMTAG_LICENSE, RPM_STRING_TYPE, package.copyright, 1);
93         headerAddEntry(dbentry, RPMTAG_GROUP, RPM_STRING_TYPE, group, 1);
94
95         if (preun) {
96             headerAddEntry(dbentry, RPMTAG_PREUN, RPM_STRING_TYPE, preun, 1);
97             free(preun);
98         }
99         if (postun) {
100             headerAddEntry(dbentry, RPMTAG_POSTUN, RPM_STRING_TYPE, postun, 1);
101             free(postun);
102         }
103
104         gif = oldrpmdbGetPackageGif(&olddb, *label, &gifSize);
105         if (gif) {
106             headerAddEntry(dbentry, RPMTAG_GIF, RPM_BIN_TYPE, gif, gifSize);
107             free(gif);
108         }
109
110         if (package.fileCount) {
111             /* some packages have no file lists */
112
113             fileList = xmalloc(sizeof(char *) * package.fileCount);
114             fileLinktoList = xmalloc(sizeof(char *) * package.fileCount);
115             fileMD5List = xmalloc(sizeof(char *) * package.fileCount);
116             fileSizeList = xmalloc(sizeof(int_32) * package.fileCount);
117             fileUIDList = xmalloc(sizeof(int_32) * package.fileCount);
118             fileGIDList = xmalloc(sizeof(int_32) * package.fileCount);
119             fileMtimesList = xmalloc(sizeof(int_32) * package.fileCount);
120             fileFlagsList = xmalloc(sizeof(int_32) * package.fileCount);
121             fileModesList = xmalloc(sizeof(int_16) * package.fileCount);
122             fileRDevsList = xmalloc(sizeof(int_16) * package.fileCount);
123             fileStatesList = xmalloc(sizeof(char) * package.fileCount);
124
125             /* reverse the file list while we're at it */
126             j = package.fileCount - 1;
127             for (i = 0; i < package.fileCount; i++, j--) {
128                 fileList[j] = package.files[i].path;
129                 fileMD5List[j] = package.files[i].md5;
130                 fileSizeList[j] = package.files[i].size;
131                 fileUIDList[j] = package.files[i].uid;
132                 fileGIDList[j] = package.files[i].gid;
133                 fileMtimesList[j] = package.files[i].mtime;
134                 fileModesList[j] = package.files[i].mode;
135                 fileRDevsList[j] = package.files[i].rdev;
136                 fileStatesList[j] = package.files[i].state;
137
138                 if (package.files[i].linkto)
139                     fileLinktoList[j] = package.files[i].linkto;
140                 else
141                     fileLinktoList[j] = "";
142                 
143                 fileFlagsList[j] = 0;
144                 if (package.files[i].isdoc) 
145                     fileFlagsList[j] |= RPMFILE_DOC;
146                 if (package.files[i].isconf)
147                     fileFlagsList[j] |= RPMFILE_CONFIG;
148             }
149
150             headerAddEntry(dbentry, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, fileList, 
151                      package.fileCount);
152             headerAddEntry(dbentry, RPMTAG_FILELINKTOS, RPM_STRING_ARRAY_TYPE, 
153                      fileLinktoList, package.fileCount);
154             headerAddEntry(dbentry, RPMTAG_FILEMD5S, RPM_STRING_ARRAY_TYPE, fileMD5List, 
155                      package.fileCount);
156             headerAddEntry(dbentry, RPMTAG_FILESIZES, RPM_INT32_TYPE, fileSizeList, 
157                      package.fileCount);
158             headerAddEntry(dbentry, RPMTAG_FILEUIDS, RPM_INT32_TYPE, fileUIDList, 
159                      package.fileCount);
160             headerAddEntry(dbentry, RPMTAG_FILEGIDS, RPM_INT32_TYPE, fileGIDList, 
161                      package.fileCount);
162             headerAddEntry(dbentry, RPMTAG_FILEMTIMES, RPM_INT32_TYPE, fileMtimesList, 
163                      package.fileCount);
164             headerAddEntry(dbentry, RPMTAG_FILEFLAGS, RPM_INT32_TYPE, fileFlagsList, 
165                      package.fileCount);
166             headerAddEntry(dbentry, RPMTAG_FILEMODES, RPM_INT16_TYPE, fileModesList, 
167                      package.fileCount);
168             headerAddEntry(dbentry, RPMTAG_FILERDEVS, RPM_INT16_TYPE, fileRDevsList, 
169                      package.fileCount);
170             headerAddEntry(dbentry, RPMTAG_FILESTATES, RPM_INT8_TYPE, fileStatesList, 
171                      package.fileCount);
172
173             free(fileList);
174             free(fileLinktoList);
175             free(fileMD5List);
176             free(fileSizeList);
177             free(fileUIDList);
178             free(fileGIDList);
179             free(fileMtimesList);
180             free(fileFlagsList);
181             free(fileModesList);
182             free(fileRDevsList);
183             free(fileStatesList);
184         }
185
186         rpmdbAdd(db, dbentry);
187
188         free(group);
189         headerFree(dbentry);
190
191         oldrpmdbFreePackageInfo(package);
192     }
193
194     oldrpmdbClose(&olddb);
195     rpmdbClose(db);
196
197     return 1;
198 }
199
200 int main(int argc, char ** argv)
201 {
202     setprogname(argv[0]);
203     if (argc != 1) {
204         fprintf(stderr, _("rpmconvert: no arguments expected"));
205         exit(EXIT_FAILURE);
206     }
207
208     rpmReadConfigFiles(NULL, NULL);
209
210     printf(_("rpmconvert 1.0 - converting database in /var/lib/rpm\n"));
211     convertDB();
212
213     exit(EXIT_SUCCESS);
214 }