10 #define _RPMTS_INTERNAL /* ts->goal, ts->dbmode, ts->suggests */
14 #include "misc.h" /* rpmGlob */
17 static int noDeps = 1;
18 static int noChainsaw = 0;
20 static rpmVSFlags vsflags = 0;
22 static inline /*@observer@*/ const char * const identifyDepend(int_32 f)
25 if (isLegacyPreReq(f))
28 if (f & RPMSENSE_SCRIPT_PRE)
29 return "Requires(pre):";
30 if (f & RPMSENSE_SCRIPT_POST)
31 return "Requires(post):";
32 if (f & RPMSENSE_SCRIPT_PREUN)
33 return "Requires(preun):";
34 if (f & RPMSENSE_SCRIPT_POSTUN)
35 return "Requires(postun):";
36 if (f & RPMSENSE_SCRIPT_VERIFY)
37 return "Requires(verify):";
38 if (f & RPMSENSE_FIND_REQUIRES)
39 return "Requires(auto):";
44 rpmGraph(rpmts ts, struct rpmInstallArguments_s * ia, const char ** fileArgv)
48 const char ** pkgURL = NULL;
49 char * pkgState = NULL;
51 const char * fileURL = NULL;
56 const char ** argv = NULL;
58 const char ** av = NULL;
70 tsflags = rpmtsFlags(ts);
72 tsflags |= RPMTRANS_FLAG_CHAINSAW;
73 (void) rpmtsSetFlags(ts, tsflags);
75 if (ia->qva_flags & VERIFY_DIGEST)
76 vsflags |= _RPMVSF_NODIGESTS;
77 if (ia->qva_flags & VERIFY_SIGNATURE)
78 vsflags |= _RPMVSF_NOSIGNATURES;
79 ovsflags = rpmtsSetVSFlags(ts, vsflags);
81 /* Build fully globbed list of arguments in argv[argc]. */
82 for (fnp = fileArgv; *fnp; fnp++) {
85 rc = rpmGlob(*fnp, &ac, &av);
86 if (rc || ac == 0) continue;
88 argv = xrealloc(argv, (argc+2) * sizeof(*argv));
89 memcpy(argv+argc, av, ac * sizeof(*av));
93 av = _free(av); ac = 0;
96 /* Allocate sufficient storage for next set of args. */
97 if (pkgx >= numPkgs) {
98 numPkgs = pkgx + argc;
99 pkgURL = xrealloc(pkgURL, (numPkgs + 1) * sizeof(*pkgURL));
100 memset(pkgURL + pkgx, 0, ((argc + 1) * sizeof(*pkgURL)));
101 pkgState = xrealloc(pkgState, (numPkgs + 1) * sizeof(*pkgState));
102 memset(pkgState + pkgx, 0, ((argc + 1) * sizeof(*pkgState)));
105 /* Copy next set of args. */
106 for (i = 0; i < argc; i++) {
107 fileURL = _free(fileURL);
111 pkgURL[pkgx] = fileURL;
115 fileURL = _free(fileURL);
117 /* Continue processing file arguments, building transaction set. */
118 for (fnp = pkgURL+prevx; *fnp != NULL; fnp++, prevx++) {
119 const char * fileName;
122 (void) urlPath(*fnp, &fileName);
124 /* Try to read the header from a package file. */
125 fd = Fopen(*fnp, "r.ufdio");
126 if (fd == NULL || Ferror(fd)) {
127 rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
133 numFailed++; *fnp = NULL;
137 /* Read the header, verifying signatures (if present). */
138 ovsflags = rpmtsSetVSFlags(ts, vsflags);
139 rpmrc = rpmReadPackageFile(ts, fd, *fnp, &h);
140 ovsflags = rpmtsSetVSFlags(ts, ovsflags);
144 if (rpmrc == RPMRC_FAIL || rpmrc == RPMRC_SHORTREAD) {
145 numFailed++; *fnp = NULL;
149 if (rpmrc == RPMRC_OK || rpmrc == RPMRC_BADSIZE) {
150 rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName, 0, NULL);
155 if (rpmrc != RPMRC_NOTFOUND) {
156 rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), *fnp);
157 numFailed++; *fnp = NULL;
161 /* Try to read a package manifest. */
162 fd = Fopen(*fnp, "r.fpio");
163 if (fd == NULL || Ferror(fd)) {
164 rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
170 numFailed++; *fnp = NULL;
174 /* Read list of packages from manifest. */
175 rc = rpmReadPackageManifest(fd, &argc, &argv);
177 rpmError(RPMERR_MANIFEST, _("%s: read manifest failed: %s\n"),
178 fileURL, Fstrerror(fd));
182 /* If successful, restart the query loop. */
188 numFailed++; *fnp = NULL;
192 if (numFailed > 0) goto exit;
197 numFailed += numPkgs;
200 ps = rpmtsProblems(ts);
201 if (rpmpsNumProblems(ps) > 0) {
202 rpmMessage(RPMMESS_ERROR, _("Failed dependencies:\n"));
203 rpmpsPrint(NULL, ps);
204 numFailed += numPkgs;
207 if (ts->suggests != NULL && ts->nsuggests > 0) {
208 rpmMessage(RPMMESS_NORMAL, _(" Suggested resolutions:\n"));
209 for (i = 0; i < ts->nsuggests; i++) {
210 const char * str = ts->suggests[i];
215 rpmMessage(RPMMESS_NORMAL, "\t%s\n", str);
216 ts->suggests[i] = NULL;
219 ts->suggests = _free(ts->suggests);
226 if (numFailed > 0) goto exit;
235 unsigned char * selected =
236 alloca(sizeof(*selected) * (rpmtsNElements(ts) + 1));
237 int oType = TR_ADDED;
239 fprintf(stdout, "digraph XXX {\n");
241 fprintf(stdout, " rankdir=LR\n");
243 fprintf(stdout, "//===== Packages:\n");
245 while ((p = rpmtsiNext(pi, oType)) != NULL) {
246 fprintf(stdout, "//%5d%5d %s\n", rpmteTree(p), rpmteDepth(p), rpmteN(p));
249 fprintf(stdout, " \"%s\" -> \"%s\"\n", rpmteN(p), rpmteN(q));
251 fprintf(stdout, " \"%s\"\n", rpmteN(p));
252 fprintf(stdout, " { rank=max ; \"%s\" }\n", rpmteN(p));
257 fprintf(stdout, "}\n");
263 for (i = 0; i < numPkgs; i++)
264 pkgURL[i] = _free(pkgURL[i]);
265 pkgState = _free(pkgState);
266 pkgURL = _free(pkgURL);
272 static struct poptOption optionsTable[] = {
273 { "check", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &noDeps, 0,
274 N_("don't verify package dependencies"), NULL },
275 { "nolegacy", '\0', POPT_BIT_SET, &vsflags, RPMVSF_NEEDPAYLOAD,
276 N_("don't verify header+payload signature"), NULL },
278 { "nochainsaw", '\0', POPT_ARGFLAG_DOC_HIDDEN, &noChainsaw, 0,
281 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
282 N_("Common options for all rpm modes and executables:"),
291 main(int argc, char *const argv[])
294 struct rpmInstallArguments_s * ia = &rpmIArgs;
298 optCon = rpmcliInit(argc, argv, optionsTable);
303 if (rpmcliQueryFlags & VERIFY_DIGEST)
304 vsflags |= _RPMVSF_NODIGESTS;
305 if (rpmcliQueryFlags & VERIFY_SIGNATURE)
306 vsflags |= _RPMVSF_NOSIGNATURES;
307 if (rpmcliQueryFlags & VERIFY_HDRCHK)
308 vsflags |= RPMVSF_NOHDRCHK;
309 (void) rpmtsSetVSFlags(ts, vsflags);
311 ec = rpmGraph(ts, ia, poptGetArgs(optCon));
315 optCon = rpmcliFini(optCon);