5 #include "rpm_malloc.h"
9 static int labelstrlistToLabelList(char * str, int length,
10 struct oldrpmdbLabel ** list);
11 static char * getScript(char * which, struct oldrpmdb *oldrpmdb,
12 struct oldrpmdbLabel label);
14 static char * prefix = "/var/lib/rpm";
16 char * oldrpmdbLabelToLabelstr(struct oldrpmdbLabel label, int withFileNum) {
20 if (withFileNum && label.fileNumber > -1)
21 c = xmalloc(strlen(label.name) + strlen(label.version) +
22 strlen(label.release) + 10);
24 c = xmalloc(strlen(label.name) + strlen(label.version) +
25 strlen(label.release) + 3);
27 strcpy(c, label.name);
29 strcat(c, label.version);
31 strcat(c, label.release);
33 if (withFileNum && label.fileNumber > -1) {
34 sprintf(buffer, "%d", label.fileNumber);
42 int oldrpmdbLabelstrToLabel(char * str, int length, struct oldrpmdbLabel * label) {
45 label->freeType = RPMDB_FREENAME;
47 label->name = malloc(length + 1);
51 memcpy(label->name, str, length);
52 label->name[length] = '\0';
55 while (*chptr != ':') chptr++;
57 label->version = ++chptr;
58 while (*chptr != ':') chptr++;
60 label->release = chptr + 1;
62 label->fileNumber = -1;
64 /* there might be a path number tagged on to the end of this */
65 while ((chptr - label->name) < length && *chptr != ':') chptr++;
66 if ((chptr - label->name) < length) {
68 label->fileNumber = atoi(chptr + 1);
74 static int labelstrlistToLabelList(char * str, int length,
75 struct oldrpmdbLabel ** list) {
76 char * start, * chptr;
77 struct oldrpmdbLabel * head = NULL;
78 struct oldrpmdbLabel * tail = NULL;
79 struct oldrpmdbLabel * label;
82 for (chptr = start; (chptr - str) < length; chptr++) {
83 /* spaces following a space get ignored */
84 if (*chptr == ' ' && start < chptr) {
85 label = malloc(sizeof(struct oldrpmdbLabel));
87 oldrpmdbFreeLabelList(head);
90 if (oldrpmdbLabelstrToLabel(start, chptr - start, label)) {
92 oldrpmdbFreeLabelList(head);
108 /* a space on the end would break things horribly w/o this test */
110 label = malloc(sizeof(struct oldrpmdbLabel));
112 oldrpmdbFreeLabelList(head);
115 if (oldrpmdbLabelstrToLabel(start, chptr - start, label)) {
117 oldrpmdbFreeLabelList(head);
136 /* returns 0 on success, -1 on failure */
137 int oldrpmdbOpen(struct oldrpmdb * oldrpmdb) {
138 unsigned int gdbmFlags;
142 oldrpmdb->rpmdbError = RPMDB_NONE;
144 gdbmFlags = GDBM_READER;
146 strcpy(path, prefix);
147 strcat(path, "/packages");
148 oldrpmdb->packages = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
149 if (!oldrpmdb->packages) {
150 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
154 strcpy(path, prefix);
155 strcat(path, "/nameidx");
156 oldrpmdb->nameIndex = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
157 if (!oldrpmdb->packages) {
158 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
162 strcpy(path, prefix);
163 strcat(path, "/pathidx");
164 oldrpmdb->pathIndex = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
165 if (!oldrpmdb->packages) {
166 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
170 strcpy(path, prefix);
171 strcat(path, "/iconidx");
172 oldrpmdb->iconIndex = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
173 if (!oldrpmdb->iconIndex) {
174 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
178 strcpy(path, prefix);
179 strcat(path, "/groupindex");
180 oldrpmdb->groupIndex = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
181 if (!oldrpmdb->packages) {
182 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
186 strcpy(path, prefix);
187 strcat(path, "/postidx");
188 oldrpmdb->postIndex = gdbm_open(path, 1024, gdbmFlags, 0644, NULL);
189 if (!oldrpmdb->postIndex) {
190 rpmError(RPMERR_GDBMOPEN, path, gdbm_strerror(gdbm_errno));
195 oldrpmdbClose(oldrpmdb);
202 void oldrpmdbClose(struct oldrpmdb * oldrpmdb) {
203 gdbm_close(oldrpmdb->packages);
204 gdbm_close(oldrpmdb->nameIndex);
205 gdbm_close(oldrpmdb->pathIndex);
206 gdbm_close(oldrpmdb->postIndex);
207 gdbm_close(oldrpmdb->groupIndex);
208 gdbm_close(oldrpmdb->iconIndex);
211 struct oldrpmdbLabel * oldrpmdbGetAllLabels(struct oldrpmdb * oldrpmdb) {
214 struct oldrpmdbLabel * head = NULL;
215 struct oldrpmdbLabel * tail = NULL;
216 struct oldrpmdbLabel * label;
218 oldrpmdb->rpmdbError = RPMDB_NONE;
220 rec = gdbm_firstkey(oldrpmdb->packages);
222 label = malloc(sizeof(struct oldrpmdbLabel));
224 oldrpmdbFreeLabelList(head);
225 oldrpmdb->rpmdbError = RPMDB_NO_MEMORY;
228 if (oldrpmdbLabelstrToLabel(rec.dptr, rec.dsize, label)) {
230 oldrpmdbFreeLabelList(head);
231 oldrpmdb->rpmdbError = RPMDB_NO_MEMORY;
243 rec = gdbm_nextkey(oldrpmdb->packages, rec);
249 struct oldrpmdbLabel * oldrpmdbFindPackagesByFile(struct oldrpmdb * oldrpmdb, char * path) {
252 struct oldrpmdbLabel * list;
254 oldrpmdb->rpmdbError = RPMDB_NONE;
257 key.dsize = strlen(path);
258 rec = gdbm_fetch(oldrpmdb->pathIndex, key);
262 if (labelstrlistToLabelList(rec.dptr, rec.dsize, &list)) {
264 oldrpmdb->rpmdbError = RPMDB_NO_MEMORY;
272 struct oldrpmdbLabel * oldrpmdbFindPackagesByLabel(struct oldrpmdb * oldrpmdb,
273 struct oldrpmdbLabel label)
275 /* the Name has to be here. The version/release fields optionally
276 restrict the search. Either will do. */
281 struct oldrpmdbLabel * list;
282 struct oldrpmdbLabel * prospect;
283 struct oldrpmdbLabel * parent;
286 oldrpmdb->rpmdbError = RPMDB_NONE;
288 key.dptr = label.name;
289 key.dsize = strlen(label.name);
290 rec = gdbm_fetch(oldrpmdb->nameIndex, key);
294 if (labelstrlistToLabelList(rec.dptr, rec.dsize, &list)) {
296 oldrpmdb->rpmdbError = RPMDB_NO_MEMORY;
305 if (label.version && strcmp(label.version, prospect->version))
307 else if (label.release && strcmp(label.release, prospect->release))
311 oldrpmdbFreeLabel(*prospect);
313 list = prospect->next;
317 parent->next = prospect->next;
319 prospect = parent->next;
322 prospect = prospect->next;
329 struct oldrpmdbLabel oldrpmdbMakeLabel(char * name, char * version, char * release,
330 int fileNumber, enum oldrpmdbFreeType freeType) {
331 struct oldrpmdbLabel label;
334 label.freeType = freeType;
336 label.version = version;
337 label.release = release;
338 label.fileNumber = fileNumber;
343 void oldrpmdbFreeLabelList(struct oldrpmdbLabel * list) {
344 struct oldrpmdbLabel * saved;
347 oldrpmdbFreeLabel(*list);
354 void oldrpmdbFreeLabel(struct oldrpmdbLabel label) {
355 if (label.freeType == RPMDB_NOFREE) return;
358 if (label.freeType == RPMDB_FREEALL) {
364 /* Returns NULL on error */
365 char * oldrpmdbGetPackageGroup(struct oldrpmdb * oldrpmdb, struct oldrpmdbLabel label) {
369 key.dptr = label.name;
370 key.dsize = strlen(label.name);
372 rec = gdbm_fetch(oldrpmdb->groupIndex, key);
374 return xstrdup("Unknown");
377 g = malloc(rec.dsize + 1);
378 strncpy(g, rec.dptr, rec.dsize);
385 static char * getScript(char * which, struct oldrpmdb *oldrpmdb,
386 struct oldrpmdbLabel label) {
388 char * labelstr, * l;
390 labelstr = oldrpmdbLabelToLabelstr(label, 0);
391 labelstr = xrealloc(labelstr, strlen(labelstr) + 10);
392 strcat(labelstr, ":");
393 strcat(labelstr, which);
396 key.dsize = strlen(labelstr);
398 rec = gdbm_fetch(oldrpmdb->postIndex, key);
401 if (!rec.dptr) return NULL;
403 l = malloc(rec.dsize + 1);
404 strncpy(l, rec.dptr, rec.dsize);
412 char *oldrpmdbGetPackagePostun (struct oldrpmdb *oldrpmdb,
413 struct oldrpmdbLabel label) {
414 return getScript("post", oldrpmdb, label);
417 char *oldrpmdbGetPackagePreun (struct oldrpmdb *oldrpmdb,
418 struct oldrpmdbLabel label) {
419 return getScript("pre", oldrpmdb, label);
422 /* Returns NULL on error or if no icon exists */
423 char * oldrpmdbGetPackageGif(struct oldrpmdb * oldrpmdb,
424 struct oldrpmdbLabel label, int * size) {
428 labelstr = oldrpmdbLabelToLabelstr(label, 0);
431 key.dsize = strlen(labelstr);
433 rec = gdbm_fetch(oldrpmdb->iconIndex, key);
444 /* return 0 on success, 1 on failure */
445 int oldrpmdbGetPackageInfo(struct oldrpmdb * oldrpmdb, struct oldrpmdbLabel label,
446 struct oldrpmdbPackageInfo * pinfo) {
448 char ** list, ** prelist;
453 labelstr = oldrpmdbLabelToLabelstr(label, 0);
455 rpmMessage(RPMMESS_DEBUG, _("pulling %s from database\n"), labelstr);
458 key.dsize = strlen(labelstr);
460 rec = gdbm_fetch(oldrpmdb->packages, key);
462 rpmError(RPMERR_OLDDBCORRUPT, _("package not found in database\n"));
468 list = splitString(rec.dptr, rec.dsize, '\1');
471 pinfo->version = xstrdup(list[1]);
472 pinfo->release = xstrdup(list[2]);
473 /* list[3] == "1" always */
474 pinfo->name = malloc(strlen(list[0]) + strlen(list[4]) + 2);
475 strcpy(pinfo->name, list[0]);
476 if (strlen(list[4])) {
477 strcat(pinfo->name, "-");
478 strcat(pinfo->name, list[4]);
480 pinfo->labelstr = malloc(strlen(pinfo->name) + strlen(pinfo->version) +
481 strlen(pinfo->release) + 3);
482 strcpy(pinfo->labelstr, pinfo->name);
483 strcat(pinfo->labelstr, ":");
484 strcat(pinfo->labelstr, pinfo->version);
485 strcat(pinfo->labelstr, ":");
486 strcat(pinfo->labelstr, pinfo->release);
488 pinfo->preamble = xstrdup(list[5]);
489 pinfo->installTime = atoi(list[6]);
490 pinfo->fileCount = atoi(list[7]);
492 prelist = splitString(pinfo->preamble, strlen(pinfo->preamble), '\n');
494 /* these are optional */
495 pinfo->distribution = NULL;
496 pinfo->vendor = NULL;
497 pinfo->description = NULL;
498 pinfo->copyright = NULL;
500 for (strptr = prelist; *strptr; strptr++) {
501 if (!strncasecmp("Description: ", *strptr, 13))
502 pinfo->description = xstrdup((*strptr) + 13);
503 else if (!strncasecmp("Copyright: ", *strptr, 11))
504 pinfo->copyright = xstrdup((*strptr) + 11);
505 else if (!strncasecmp("Distribution: ", *strptr, 14))
506 pinfo->distribution = xstrdup((*strptr) + 14);
507 else if (!strncasecmp("Vendor: ", *strptr, 8))
508 pinfo->vendor = xstrdup((*strptr) + 8);
509 else if (!strncasecmp("size: ", *strptr, 6))
510 pinfo->size = atoi((*strptr) + 6);
511 else if (!strncasecmp("BuildDate: ", *strptr, 11))
512 pinfo->buildTime =atoi((*strptr) + 11);
513 else if (!strncasecmp("BuildHost: ", *strptr, 11))
514 pinfo->buildHost = xstrdup((*strptr) + 11);
516 freeSplitString(prelist);
518 if (!pinfo->vendor) pinfo->vendor = xstrdup("");
519 if (!pinfo->description) pinfo->description = xstrdup("");
520 if (!pinfo->distribution) pinfo->distribution = xstrdup("");
521 if (!pinfo->copyright) {
522 pinfo->copyright = xstrdup("");
523 fprintf(stdout, _("no copyright!\n"));
526 pinfo->files = malloc(sizeof(struct oldrpmFileInfo) * pinfo->fileCount);
529 for (i = 0; i < pinfo->fileCount; i++) {
530 oldrpmfileFromInfoLine(list[j], list[j + 1], list[j + 2],
535 freeSplitString(list);
540 void oldrpmdbFreePackageInfo(struct oldrpmdbPackageInfo package) {
543 free(package.version);
544 free(package.release);
546 free(package.labelstr);
547 free(package.buildHost);
548 free(package.vendor);
549 free(package.description);
550 free(package.copyright);
551 free(package.distribution);
552 free(package.preamble);
554 for (i = 0; i < package.fileCount; i++) {
555 oldrpmfileFree(&package.files[i]);
561 int oldrpmdbLabelCmp(struct oldrpmdbLabel * one, struct oldrpmdbLabel * two) {
564 if ((i = strcmp(one->name, two->name)))
566 else if ((i = strcmp(one->version, two->version)))
569 return strcmp(one->release, two->release);
572 void oldrpmdbSetPrefix(char * new) {