}
void
-runrpm(const char *arg, const char *name)
+runrpm(const char *arg, const char *name, int dupfd3, FILE **newpkgsfps, int newpkgs)
{
pid_t pid;
int status;
}
if (pid == 0)
{
+ int i;
+ for (i = 0; i < newpkgs; i++)
+ {
+ if (!newpkgsfps[i])
+ continue;
+ if (dupfd3 != -1 && fileno(newpkgsfps[i]) == dupfd3)
+ continue;
+ close(fileno(newpkgsfps[i]));
+ }
+ if (dupfd3 != -1 && dupfd3 != 3)
+ {
+ dup2(dupfd3, 3);
+ close(dupfd3);
+ }
if (strcmp(arg, "-e") == 0)
execlp("rpm", "rpm", arg, "--nodeps", "--nodigest", "--nosignature", name, (char *)0);
else
Id *newpkgsps = 0;
struct fcstate fcstate;
- pool = pool_create();
- // pool_setdebuglevel(pool, 2);
- setarch(pool);
- repoinfos = read_repoinfos(pool, "/etc/zypp/repos.d", &nrepoinfos);
- read_repos(pool, repoinfos, nrepoinfos);
- // FOR_REPOS(i, repo)
- // printf("%s: %d solvables\n", repo->name, repo->nsolvables);
- pool_addfileprovides(pool);
- pool_createwhatprovides(pool);
if (!strcmp(argv[1], "install") || !strcmp(argv[1], "in"))
mode = SOLVER_INSTALL;
else if (!strcmp(argv[1], "erase") || !strcmp(argv[1], "rm"))
fprintf(stderr, "Usage: solv install|erase|update|show <select>\n");
exit(1);
}
+
+ pool = pool_create();
+ // pool_setdebuglevel(pool, 2);
+ setarch(pool);
+ repoinfos = read_repoinfos(pool, "/etc/zypp/repos.d", &nrepoinfos);
+ read_repos(pool, repoinfos, nrepoinfos);
+ // FOR_REPOS(i, repo)
+ // printf("%s: %d solvables\n", repo->name, repo->nsolvables);
+ pool_addfileprovides(pool);
+ pool_createwhatprovides(pool);
+
queue_init(&job);
for (i = 2; i < argc; i++)
mkselect(pool, argv[i], 0, &job);
for (i = 0; i < job.count; i += 2)
{
FOR_JOB_SELECT(p, pp, job.elements[i], job.elements[i + 1])
- printf(" - %s\n", solvid2str(pool, p));
+ {
+ Solvable *s = pool_id2solvable(pool, p);
+ printf(" - %s [%s]\n", solvable2str(pool, s), s->repo->name);
+ }
}
exit(0);
}
}
transaction_order(trans, 0);
- printf("Committing transaction:\n");
+ printf("Committing transaction:\n\n");
for (i = 0; i < trans->steps.count; i++)
{
char rpmname[256];
if (evrp > evr && evrp[0] == ':' && evrp[1])
evr = evrp + 1;
sprintf(rpmname, "%s-%s.%s", id2str(pool, s->name), evr, id2str(pool, s->arch));
- runrpm("-e", rpmname);
+ runrpm("-e", rpmname, -1, newpkgsfps, newpkgs);
break;
case SOLVER_TRANSACTION_INSTALL:
case SOLVER_TRANSACTION_MULTIINSTALL:
fp = j < newpkgs ? newpkgsfps[j] : 0;
rewind(fp);
lseek(fileno(fp), 0, SEEK_SET);
- sprintf(rpmname, "/dev/fd/%d", fileno(fp));
- runrpm(type == SOLVER_TRANSACTION_MULTIINSTALL ? "-i" : "-U", rpmname);
+ runrpm(type == SOLVER_TRANSACTION_MULTIINSTALL ? "-i" : "-U", "/dev/fd/3", fileno(fp), newpkgsfps, newpkgs);
+ fclose(fp);
+ newpkgsfps[j] = 0;
break;
default:
break;
}
}
for (i = 0; i < newpkgs; i++)
- fclose(newpkgsfps[i]);
+ if (newpkgsfps[i])
+ fclose(newpkgsfps[i]);
sat_free(newpkgsfps);
sat_free(newpkgsps);
solver_free(solv);