1 #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA))
13 #include "repo_rpmdb.h"
14 #if defined(ENABLE_SUSEREPO) && defined(SUSE)
15 #include "repo_products.h"
17 #if defined(ENABLE_APPDATA)
18 #include "repo_appdata.h"
20 #include "transaction.h"
23 #include "repoinfo_cache.h"
24 #include "repoinfo_system_rpm.h"
27 # define PRODUCTS_PATH "/etc/products.d"
30 # define APPDATA_PATH "/usr/share/metainfo"
31 # define APPDATA_LEGACY_PATH "/usr/share/appdata"
35 runrpm(const char *arg, const char *name, int dupfd3, const char *rootdir)
40 if ((pid = fork()) == (pid_t)-1)
49 if (dupfd3 != -1 && dupfd3 != 3)
55 fcntl(3, F_SETFD, 0); /* clear CLOEXEC */
56 if (strcmp(arg, "-e") == 0)
57 execlp("rpm", "rpm", arg, "--nodeps", "--nodigest", "--nosignature", "--root", rootdir, name, (char *)0);
59 execlp("rpm", "rpm", arg, "--force", "--nodeps", "--nodigest", "--nosignature", "--root", rootdir, name, (char *)0);
63 while (waitpid(pid, &status, 0) != pid)
67 printf("rpm failed\n");
73 read_installed_rpm(struct repoinfo *cinfo)
75 Repo *repo = cinfo->repo;
76 Pool *pool = repo->pool;
80 memset(&stb, 0, sizeof(stb));
81 printf("rpm database:");
82 if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/rpm/Packages"), &stb))
83 memset(&stb, 0, sizeof(stb));
84 calc_cookie_stat(&stb, REPOKEY_TYPE_SHA256, 0, cinfo->cookie);
86 if (usecachedrepo(cinfo, 0, 0))
92 #if defined(ENABLE_SUSEREPO) && defined(PRODUCTS_PATH)
93 if (repo_add_products(repo, PRODUCTS_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
95 fprintf(stderr, "product reading failed: %s\n", pool_errstr(pool));
99 #if defined(ENABLE_APPDATA) && defined(APPDATA_PATH)
100 if (repo_add_appdata_dir(repo, APPDATA_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
102 fprintf(stderr, "appdata reading failed: %s\n", pool_errstr(pool));
105 #elif defined(ENABLE_APPDATA) && defined(APPDATA_LEGACY_PATH)
106 if (repo_add_appdata_dir(repo, APPDATA_LEGACY_PATH, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
108 fprintf(stderr, "appdata reading from legacy dir failed: %s\n", pool_errstr(pool));
112 ofp = fopen(calc_cachepath(repo, 0, 0), "r");
113 if (repo_add_rpmdb_reffp(repo, ofp, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR))
115 fprintf(stderr, "installed db: %s\n", pool_errstr(pool));
120 repo_internalize(repo);
121 writecachedrepo(cinfo, 0, 0);
126 commit_transactionelement_rpm(Pool *pool, Id type, Id p, FILE *fp)
128 Solvable *s = pool_id2solvable(pool, p);
129 const char *rootdir = pool_get_rootdir(pool);
130 const char *evr, *evrp, *nvra;
134 case SOLVER_TRANSACTION_ERASE:
135 if (!s->repo->rpmdbid || !s->repo->rpmdbid[p - s->repo->start])
137 /* strip epoch from evr */
138 evr = evrp = pool_id2str(pool, s->evr);
139 while (*evrp >= '0' && *evrp <= '9')
141 if (evrp > evr && evrp[0] == ':' && evrp[1])
143 nvra = pool_tmpjoin(pool, pool_id2str(pool, s->name), "-", evr);
144 nvra = pool_tmpappend(pool, nvra, ".", pool_id2str(pool, s->arch));
145 runrpm("-e", nvra, -1, rootdir); /* too bad that --querybynumber doesn't work */
147 case SOLVER_TRANSACTION_INSTALL:
148 case SOLVER_TRANSACTION_MULTIINSTALL:
150 lseek(fileno(fp), 0, SEEK_SET);
151 runrpm(type == SOLVER_TRANSACTION_MULTIINSTALL ? "-i" : "-U", "/dev/fd/3", fileno(fp), rootdir);