"Fossies" - the Fresh Open Source Software Archive 
Member "unipkg-0.6.5/unipkg-trans.c" (16 Dec 2005, 12584 Bytes) of package /linux/privat/old/unipkg-0.6.5.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 /******************************************************************************\
2 * *
3 * UNIPKG (c) iSteve <isteve@bofh.cz>, 2005 *
4 * *
5 * Universal PacKaGer. *
6 * Licensed under GNU/GPL - if you don't like the software, fix it! *
7 * *
8 \******************************************************************************/
9
10 #undef DEBUG
11 #define _GNU_SOURCE
12
13 #include <time.h>
14
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <stdarg.h>
18 #include <string.h>
19 #include <unistd.h>
20
21 #include <ctype.h>
22
23 #include <sys/stat.h>
24 #include <sys/types.h>
25 #include <sys/wait.h>
26
27 #include <signal.h>
28
29 #include <fnmatch.h>
30 #include <dlfcn.h>
31
32 #include <getopt.h>
33
34 #include "common.h"
35 #include "manmachine.h"
36
37 typedef struct {
38 char *fdb, *tdb, *ifp, *ofp;
39 } params;
40
41 void clearparams(params *prm) {
42 prm->fdb = NULL;
43 prm->tdb = NULL;
44 prm->ifp = NULL;
45 prm->ofp = NULL;
46 }
47
48 void freeparams(params *prm) {
49 free(prm->fdb);
50 free(prm->tdb);
51 free(prm->ifp);
52 free(prm->ofp);
53 }
54
55 int getaction(char *needle, actions *longopts) {
56 unsigned int i=0;
57
58 while (longopts[i].text != NULL) {
59 if (strcmp(needle, longopts[i].text) == 0) { return longopts[i].reval; }
60 i++;
61 }
62 return 0;
63 }
64
65 int loaddbcalls(databasecalls *dbcalls) {
66 dbcalls->opendb = (void* (*)(char*))dlsym(dbcalls->libhandle, "opendb");
67 dbcalls->closedb = (void (*)(void*))dlsym(dbcalls->libhandle, "closedb");
68 dbcalls->rewinddb = (void (*)(void*))dlsym(dbcalls->libhandle, "rewinddb");
69 dbcalls->writepkg = (int (*)(void*, pkginfo*))dlsym(dbcalls->libhandle, "writepkg");
70 dbcalls->readpkg = (int (*)(void*, pkginfo*))dlsym(dbcalls->libhandle, "readpkg");
71 dbcalls->delpkg = (int (*)(void*, char*))dlsym(dbcalls->libhandle, "delpkg");
72 dbcalls->findpkg = (int (*)(void*, pkginfo, pkginfo*, int))dlsym(dbcalls->libhandle, "findpkg");
73 dbcalls->iswriteable = (int (*)(void*))dlsym(dbcalls->libhandle, "iswriteable");
74
75 if (dlerror() != NULL) { return 1; }
76 return 0;
77 }
78
79 int main(int argc, char *argv[]) {
80 int c;
81 actions configopts[] = { {"list", 1}, {"info", 2}, {"writetest", 3}, {"copydb", 4}, {"addtodb", 5}, {"sizerecalc", 6}, {NULL, 0} };
82 params parameters;
83 pkginfo pinfo, needle;
84
85 void *dbhandle;
86 void *writedbhandle;
87 databasecalls dbcalls;
88 databasecalls writedbcalls;
89 struct stat statbuf;
90 unsigned long i;
91
92 clearparams(¶meters);
93
94 while ((c = getopt(argc, argv, ":f:t:i:o:")) != -1) {
95 switch(c) {
96 case 'f':
97 parameters.fdb = strdup(optarg);
98 break;
99 case 't':
100 parameters.tdb = strdup(optarg);
101 break;
102 case 'i':
103 parameters.ifp = strdup(optarg);
104 break;
105 case 'o':
106 parameters.ofp = strdup(optarg);
107 break;
108 }
109 }
110
111 if (optind>= argc){
112 freeparams(¶meters);
113
114 fprintf(stderr, "unipkg-trans -f <input library> -i <input dbpath> \\\n");
115 fprintf(stderr, " [-t <output library> -o <output dbpath>] \\\n");
116 fprintf(stderr, " {list|info|writetest|copydb|addtodb} [<param>]\n\n");
117 fprintf(stderr, " list -- list input db\n");
118 fprintf(stderr, " info <pkgname> -- pkg info about pkgname from input db\n");
119 fprintf(stderr, " writetest <name> -- write a test pkg of name <name> to input db\n");
120 fprintf(stderr, " copydb -- read all pkgs from input and write to output\n");
121 fprintf(stderr, " addtodb -- add all pkgs from input to output that output misses\n");
122
123 return 1;
124 }
125
126 switch (getaction(argv[optind], configopts)) {
127 case 1:
128 if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
129 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
130 freeparams(¶meters);
131 return 1;
132 }
133 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
134 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
135 loaddbcalls(&dbcalls);
136
137 dbhandle = NULL;
138 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
139 fprintf(stderr, "Failed: couldn't open database.\n");
140 } else {
141 printseparator('-', '.', 2, 25, 50);
142 printcolumns('|', M_NOBORDERS, M_CENTER, 0, M_CUT, 2, 25, "Name", 50, "Version", "Description");
143 printseparator('-', '+', 2, 25, 50);
144 clearpinfo(&pinfo);
145 while (!dbcalls.readpkg(dbhandle, &pinfo)) {
146 printcolumns('|', M_NOBORDERS, M_LEFT, 1, M_CUT, 2, 25, pinfo.name, 50, pinfo.version, pinfo.description);
147 freepinfo(&pinfo);
148 clearpinfo(&pinfo);
149 }
150 printseparator('-', '\'', 2, 25, 50);
151 dbcalls.closedb(dbhandle);
152 }
153 dlclose(dbcalls.libhandle);
154 break;
155 case 2:
156 optind++;
157 if (optind >= argc) {
158 fprintf(stderr, "Add the name of pkg you want info about.\n");
159 freeparams(¶meters);
160 return 1;
161 }
162 if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
163 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
164 freeparams(¶meters);
165 return 1;
166 }
167 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
168 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
169 loaddbcalls(&dbcalls);
170 dbhandle = NULL;
171 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
172 fprintf(stderr, "Failed: couldn't open database.\n");
173 } else {
174 clearpinfo(&pinfo);
175 clearpinfo(&needle);
176 needle.name = argv[optind];
177 fprintf(stderr, "needle: %s\n", needle.name);
178 if (dbcalls.findpkg(dbhandle, needle, &pinfo, MATCH_NAME)) {
179 printpinfo(pinfo);
180 freepinfo(&pinfo);
181 clearpinfo(&pinfo);
182 }
183 else {
184 printf("No such package.\n");
185 }
186 dbcalls.closedb(dbhandle);
187 }
188 dlclose(dbcalls.libhandle);
189 break;
190
191 case 3:
192 optind++;
193 if (optind >= argc) {
194 fprintf(stderr, "Add the name of pkg you want to write in.\n");
195 freeparams(¶meters);
196 return 1;
197 }
198 if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
199 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
200 freeparams(¶meters);
201 return 1;
202 }
203 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
204 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
205 loaddbcalls(&dbcalls);
206 dbhandle = NULL;
207 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
208 fprintf(stderr, "Failed: couldn't open database.\n");
209 } else {
210 if (dbcalls.iswriteable(dbhandle)) {
211 clearpinfo(&pinfo);
212 pinfo.name = argv[optind];
213 pinfo.version = strdup("testver");
214 pinfo.description = strdup("Testing package");
215 pinfo.filecount = 1;
216 pinfo.files = malloc(sizeof(char *) * pinfo.filecount);
217 pinfo.files[0].name = malloc(strlen(pinfo.name) + strlen("/test/file/") + 1);
218 strcpy(pinfo.files[0].name, "/test/file/");
219 strcat(pinfo.files[0].name, pinfo.name);
220 fprintf(stderr, "Writing: %s\nFile: %s\n", pinfo.name, pinfo.files[0].name);
221 if (!dbcalls.writepkg(dbhandle, &pinfo)) {
222 printf("Write fine.\n");
223 }
224 else {
225 printf("Write err.\n");
226 }
227 }
228 dbcalls.closedb(dbhandle);
229 }
230 dlclose(dbcalls.libhandle);
231 break;
232
233 case 4:
234 if ((parameters.fdb == NULL) || (parameters.ifp == NULL) || (parameters.tdb == NULL) || (parameters.ofp == NULL)) {
235 fprintf(stderr, "Use -f to specify input library, -i to specify input filedb path, -t to specify target library and -o to specify output db path\n");
236 freeparams(¶meters);
237 return 1;
238 }
239
240 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
241 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
242 loaddbcalls(&dbcalls);
243 dbhandle = NULL;
244 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
245 fprintf(stderr, "Failed: couldn't open input database.\n");
246 } else {
247 writedbcalls.libhandle = dlopen(parameters.tdb, RTLD_LAZY);
248 if (!writedbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
249 loaddbcalls(&writedbcalls);
250 writedbhandle = NULL;
251 if ((writedbhandle = writedbcalls.opendb(parameters.ofp)) == NULL) {
252 fprintf(stderr, "Failed: couldn't open input database.\n");
253 } else {
254 if (writedbcalls.iswriteable(writedbhandle)) {
255 clearpinfo(&pinfo);
256 while (!dbcalls.readpkg(dbhandle, &pinfo)) {
257 fprintf(stderr, "Attempting to write: %s\n", pinfo.name);
258 if (writedbcalls.writepkg(writedbhandle, &pinfo)) {
259 fprintf(stderr, "Couldn't write\n");
260 break;
261 }
262 freepinfo(&pinfo);
263 clearpinfo(&pinfo);
264 }
265 }
266 writedbcalls.closedb(writedbhandle);
267 }
268 dbcalls.closedb(dbhandle);
269 }
270 dlclose(dbcalls.libhandle);
271 dlclose(writedbcalls.libhandle);
272 break;
273 case 5:
274 if ((parameters.fdb == NULL) || (parameters.ifp == NULL) || (parameters.tdb == NULL) || (parameters.ofp == NULL)) {
275 fprintf(stderr, "Use -f to specify input library, -i to specify input filedb path, -t to specify target library and -o to specify output db path\n");
276 freeparams(¶meters);
277 return 1;
278 }
279
280 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
281 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
282 loaddbcalls(&dbcalls);
283 dbhandle = NULL;
284 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
285 fprintf(stderr, "Failed: couldn't open input database.\n");
286 } else {
287 writedbcalls.libhandle = dlopen(parameters.tdb, RTLD_LAZY);
288 if (!writedbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
289 loaddbcalls(&writedbcalls);
290 writedbhandle = NULL;
291 if ((writedbhandle = writedbcalls.opendb(parameters.ofp)) == NULL) {
292 fprintf(stderr, "Failed: couldn't open input database.\n");
293 } else {
294 if (writedbcalls.iswriteable(writedbhandle)) {
295 clearpinfo(&pinfo);
296 while (!dbcalls.readpkg(dbhandle, &pinfo)) {
297 if (!writedbcalls.findpkg(writedbhandle, pinfo, NULL, MATCH_NAME)) {
298 fprintf(stderr, "Attempting to write: %s\n", pinfo.name);
299 if (writedbcalls.writepkg(writedbhandle, &pinfo)) {
300 fprintf(stderr, "Couldn't write\n");
301 break;
302 }
303 }
304 else {
305 fprintf(stderr, "Skipping write: %s\n", pinfo.name);
306 }
307 freepinfo(&pinfo);
308 clearpinfo(&pinfo);
309 }
310 }
311 writedbcalls.closedb(writedbhandle);
312 }
313 dbcalls.closedb(dbhandle);
314 }
315 dlclose(dbcalls.libhandle);
316 dlclose(writedbcalls.libhandle);
317 break;
318
319 case 6:
320 optind++;
321 if (optind >= argc) {
322 fprintf(stderr, "Add the name of pkg you want to recalculate.\n");
323 freeparams(¶meters);
324 return 1;
325 }
326 if ((parameters.fdb == NULL) || (parameters.ifp == NULL)) {
327 fprintf(stderr, "Use -f to specify input library and -i to specify input filedb path\n");
328 freeparams(¶meters);
329 return 1;
330 }
331 dbcalls.libhandle = dlopen(parameters.fdb, RTLD_LAZY);
332 if (!dbcalls.libhandle) { freeparams(¶meters); fprintf (stderr, "Error: %s\n", dlerror()); exit(1); }
333 loaddbcalls(&dbcalls);
334
335 dbhandle = NULL;
336 if ((dbhandle = dbcalls.opendb(parameters.ifp)) == NULL) {
337 fprintf(stderr, "Failed: couldn't open database.\n");
338 } else {
339 clearpinfo(&pinfo);
340 needle.name = argv[optind];
341 if (dbcalls.findpkg(dbhandle, needle, &pinfo, MATCH_NAME)) {
342 pinfo.pkgsize = 0;
343 for (i = 0; i < pinfo.filecount; i++) {
344 if (!stat(pinfo.files[i].name, &statbuf)) {
345 pinfo.pkgsize += statbuf.st_size;
346 }
347 }
348
349 if (dbcalls.iswriteable(dbhandle)) {
350 // ugly, ugly.
351 dbcalls.rewinddb(dbhandle);
352
353 if (!dbcalls.delpkg(dbhandle, needle.name)) {
354 if (!dbcalls.writepkg(dbhandle, &pinfo)) {
355 fprintf(stderr, "Updated %s\n", pinfo.name);
356 }
357 }
358 } else {
359 fprintf(stderr, "Can't write, %s has size: %ld\n", pinfo.name, pinfo.pkgsize);
360 }
361 freepinfo(&pinfo);
362 clearpinfo(&pinfo);
363 } else {
364 fprintf(stderr, "Couldn't find %s.\n", needle.name);
365 }
366 dbcalls.closedb(dbhandle);
367 }
368 dlclose(dbcalls.libhandle);
369 break;
370 case 0:
371 fprintf(stderr, "foo\n");
372 break;
373 }
374
375 freeparams(¶meters);
376 return 0;
377 }