2 const char *__progname;
11 #define _RPMTS_INTERNAL /* ts->goal, ts->dbmode, ts->suggests */
15 #include "misc.h" /* rpmGlob */
18 static int noDeps = 1;
20 static rpmVSFlags vsflags = 0;
22 static inline const char * identifyDepend(int_32 f)
24 if (isLegacyPreReq(f))
27 if (f & RPMSENSE_SCRIPT_PRE)
28 return "Requires(pre):";
29 if (f & RPMSENSE_SCRIPT_POST)
30 return "Requires(post):";
31 if (f & RPMSENSE_SCRIPT_PREUN)
32 return "Requires(preun):";
33 if (f & RPMSENSE_SCRIPT_POSTUN)
34 return "Requires(postun):";
35 if (f & RPMSENSE_SCRIPT_VERIFY)
36 return "Requires(verify):";
37 if (f & RPMSENSE_FIND_REQUIRES)
38 return "Requires(auto):";
43 rpmGraph(rpmts ts, struct rpmInstallArguments_s * ia, const char ** fileArgv)
46 const char ** pkgURL = NULL;
47 char * pkgState = NULL;
49 const char * fileURL = NULL;
54 const char ** argv = NULL;
56 const char ** av = NULL;
67 if (ia->qva_flags & VERIFY_DIGEST)
68 vsflags |= _RPMVSF_NODIGESTS;
69 if (ia->qva_flags & VERIFY_SIGNATURE)
70 vsflags |= _RPMVSF_NOSIGNATURES;
71 ovsflags = rpmtsSetVSFlags(ts, vsflags);
73 /* Build fully globbed list of arguments in argv[argc]. */
74 for (fnp = fileArgv; *fnp; fnp++) {
77 rc = rpmGlob(*fnp, &ac, &av);
78 if (rc || ac == 0) continue;
80 argv = xrealloc(argv, (argc+2) * sizeof(*argv));
81 memcpy(argv+argc, av, ac * sizeof(*av));
85 av = _free(av); ac = 0;
88 /* Allocate sufficient storage for next set of args. */
89 if (pkgx >= numPkgs) {
90 numPkgs = pkgx + argc;
91 pkgURL = xrealloc(pkgURL, (numPkgs + 1) * sizeof(*pkgURL));
92 memset(pkgURL + pkgx, 0, ((argc + 1) * sizeof(*pkgURL)));
93 pkgState = xrealloc(pkgState, (numPkgs + 1) * sizeof(*pkgState));
94 memset(pkgState + pkgx, 0, ((argc + 1) * sizeof(*pkgState)));
97 /* Copy next set of args. */
98 for (i = 0; i < argc; i++) {
99 fileURL = _free(fileURL);
103 pkgURL[pkgx] = fileURL;
107 fileURL = _free(fileURL);
109 /* Continue processing file arguments, building transaction set. */
110 for (fnp = pkgURL+prevx; *fnp != NULL; fnp++, prevx++) {
111 const char * fileName;
114 (void) urlPath(*fnp, &fileName);
116 /* Try to read the header from a package file. */
117 fd = Fopen(*fnp, "r.ufdio");
118 if (fd == NULL || Ferror(fd)) {
119 rpmlog(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
125 numFailed++; *fnp = NULL;
129 /* Read the header, verifying signatures (if present). */
130 ovsflags = rpmtsSetVSFlags(ts, vsflags);
131 rpmrc = rpmReadPackageFile(ts, fd, *fnp, &h);
132 ovsflags = rpmtsSetVSFlags(ts, ovsflags);
139 rpmlog(RPMLOG_ERR, _("%s cannot be installed\n"), *fnp);
140 numFailed++; *fnp = NULL;
143 rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName, 0, NULL);
153 /* Try to read a package manifest. */
154 fd = Fopen(*fnp, "r.fpio");
155 if (fd == NULL || Ferror(fd)) {
156 rpmlog(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
162 numFailed++; *fnp = NULL;
166 /* Read list of packages from manifest. */
167 rc = rpmReadPackageManifest(fd, &argc, &argv);
169 rpmlog(RPMERR_MANIFEST, _("%s: read manifest failed: %s\n"),
170 fileURL, Fstrerror(fd));
174 /* If successful, restart the query loop. */
180 numFailed++; *fnp = NULL;
184 if (numFailed > 0) goto exit;
189 numFailed += numPkgs;
192 ps = rpmtsProblems(ts);
193 if (rpmpsNumProblems(ps) > 0) {
194 rpmlog(RPMLOG_ERR, _("Failed dependencies:\n"));
195 rpmpsPrint(NULL, ps);
196 numFailed += numPkgs;
198 if (ts->suggests != NULL && ts->nsuggests > 0) {
199 rpmlog(RPMMESS_NORMAL, _(" Suggested resolutions:\n"));
200 for (i = 0; i < ts->nsuggests; i++) {
201 const char * str = ts->suggests[i];
206 rpmlog(RPMMESS_NORMAL, "\t%s\n", str);
207 ts->suggests[i] = NULL;
210 ts->suggests = _free(ts->suggests);
223 unsigned char * selected =
224 alloca(sizeof(*selected) * (rpmtsNElements(ts) + 1));
225 int oType = TR_ADDED;
227 fprintf(stdout, "digraph XXX {\n");
229 fprintf(stdout, " rankdir=LR\n");
231 fprintf(stdout, "//===== Packages:\n");
233 while ((p = rpmtsiNext(pi, oType)) != NULL) {
234 fprintf(stdout, "//%5d%5d %s\n", rpmteTree(p), rpmteDepth(p), rpmteN(p));
237 fprintf(stdout, " \"%s\" -> \"%s\"\n", rpmteN(p), rpmteN(q));
239 fprintf(stdout, " \"%s\"\n", rpmteN(p));
240 fprintf(stdout, " { rank=max ; \"%s\" }\n", rpmteN(p));
245 fprintf(stdout, "}\n");
251 for (i = 0; i < numPkgs; i++)
252 pkgURL[i] = _free(pkgURL[i]);
253 pkgState = _free(pkgState);
254 pkgURL = _free(pkgURL);
260 static struct poptOption optionsTable[] = {
261 { "check", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &noDeps, 0,
262 N_("don't verify package dependencies"), NULL },
263 { "nolegacy", '\0', POPT_BIT_SET, &vsflags, RPMVSF_NEEDPAYLOAD,
264 N_("don't verify header+payload signature"), NULL },
265 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
266 N_("Common options for all rpm modes and executables:"),
275 main(int argc, char *argv[])
278 struct rpmInstallArguments_s * ia = &rpmIArgs;
282 optCon = rpmcliInit(argc, argv, optionsTable);
287 if (rpmcliQueryFlags & VERIFY_DIGEST)
288 vsflags |= _RPMVSF_NODIGESTS;
289 if (rpmcliQueryFlags & VERIFY_SIGNATURE)
290 vsflags |= _RPMVSF_NOSIGNATURES;
291 if (rpmcliQueryFlags & VERIFY_HDRCHK)
292 vsflags |= RPMVSF_NOHDRCHK;
293 (void) rpmtsSetVSFlags(ts, vsflags);
295 ec = rpmGraph(ts, ia, poptGetArgs(optCon));
299 optCon = rpmcliFini(optCon);