#if defined(ENABLE_DEBIAN) && defined(DEBIAN) #include #include #include #include #include #include #include #include "pool.h" #include "repo.h" #include "repo_deb.h" #include "transaction.h" #include "repoinfo.h" #include "repoinfo_cache.h" #include "repoinfo_system_debian.h" static void rundpkg(const char *arg, const char *name, int dupfd3, const char *rootdir) { pid_t pid; int status; if ((pid = fork()) == (pid_t)-1) { perror("fork"); exit(1); } if (pid == 0) { if (!rootdir) rootdir = "/"; if (dupfd3 != -1 && dupfd3 != 3) { dup2(dupfd3, 3); close(dupfd3); } if (dupfd3 != -1) fcntl(3, F_SETFD, 0); /* clear CLOEXEC */ if (strcmp(arg, "--install") == 0) execlp("dpkg", "dpkg", "--install", "--root", rootdir, "--force", "all", name, (char *)0); else execlp("dpkg", "dpkg", "--remove", "--root", rootdir, "--force", "all", name, (char *)0); perror("dpkg"); _exit(0); } while (waitpid(pid, &status, 0) != pid) ; if (status) { printf("dpkg failed\n"); exit(1); } } int read_installed_debian(struct repoinfo *cinfo) { struct stat stb; Repo *repo = cinfo->repo; Pool *pool = repo->pool; memset(&stb, 0, sizeof(stb)); printf("dpgk database:"); if (stat(pool_prepend_rootdir_tmp(pool, "/var/lib/dpkg/status"), &stb)) memset(&stb, 0, sizeof(stb)); calc_cookie_stat(&stb, REPOKEY_TYPE_SHA256, 0, cinfo->cookie); cinfo->cookieset = 1; if (usecachedrepo(cinfo, 0, 0)) { printf(" cached\n"); return 1; } if (repo_add_debdb(repo, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE | REPO_USE_ROOTDIR)) { fprintf(stderr, "installed db: %s\n", pool_errstr(pool)); return 0; } repo_internalize(repo); writecachedrepo(cinfo, 0, 0); return 1; } void commit_transactionelement_debian(Pool *pool, Id type, Id p, FILE *fp) { Solvable *s = pool_id2solvable(pool, p); const char *rootdir = pool_get_rootdir(pool); switch(type) { case SOLVER_TRANSACTION_ERASE: rundpkg("--remove", pool_id2str(pool, s->name), 0, rootdir); break; case SOLVER_TRANSACTION_INSTALL: case SOLVER_TRANSACTION_MULTIINSTALL: rewind(fp); lseek(fileno(fp), 0, SEEK_SET); rundpkg("--install", "/dev/fd/3", fileno(fp), rootdir); break; default: break; } } #endif