12 #define _RPMEVR_INTERNAL 20 #define _RPMTS_INTERNAL 24 #define _RPMGI_INTERNAL 30 #define _RPMROLLBACK_INTERNAL 31 #include <rpmrollback.h> 42 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 44 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 45 #define VSF_SET(_vsflags, _FLAG) \ 46 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG)) 47 #define VSF_CLR(_vsflags, _FLAG) \ 48 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG)) 50 GENfree(
const void **)
54 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 56 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 57 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG) 58 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG) 87 rpmcliHashesTotal = (isatty (STDOUT_FILENO) ? 44 : 50);
89 if (rpmcliHashesCurrent != rpmcliHashesTotal) {
90 float pct = (float) (total ? (((
float) amount) / total) : 1);
91 hashesNeeded = (int)((rpmcliHashesTotal * pct) + 0.5);
92 while (hashesNeeded > rpmcliHashesCurrent) {
93 if (isatty (STDOUT_FILENO)) {
99 fprintf(stdout,
"(%3d%%)", (
int)((100 * pct) + 0.5));
100 for (i = 0; i < (rpmcliHashesTotal + 6); i++)
101 (
void) putchar (
'\b');
103 fprintf(stdout,
"#");
105 rpmcliHashesCurrent++;
107 (void) fflush(stdout);
109 if (rpmcliHashesCurrent == rpmcliHashesTotal) {
111 rpmcliProgressCurrent++;
112 if (isatty(STDOUT_FILENO)) {
114 (
void) putchar (
'#');
115 pct = (float) (rpmcliProgressTotal
116 ? (((
float) rpmcliProgressCurrent) / rpmcliProgressTotal)
118 fprintf(stdout,
" [%3d%%]", (
int)((100 * pct) + 0.5));
120 fprintf(stdout,
"\n");
122 (void) fflush(stdout);
141 int flags = (int) ((
long)data);
144 const char * filename = (
const char *)key;
146 static FD_t fd = NULL;
151 if (filename == NULL || filename[0] ==
'\0')
153 fd =
Fopen(filename,
"r%{?_rpmgio}");
157 int ut =
urlPath(filename, NULL);
160 fd =
Fopen(filename,
"r%{?_rpmgio}");
164 if (fd == NULL ||
Ferror(fd)) {
172 fd =
fdLink(fd,
"persist (showProgress)");
174 #if defined(POSIX_FADV_WILLNEED) 175 (void)
Fadvise(fd, 0, 0, POSIX_FADV_WILLNEED);
185 fd =
fdFree(fd,
"persist (showProgress)");
194 rpmcliHashesCurrent = 0;
201 if (isatty (STDOUT_FILENO))
202 fprintf(stdout,
"%4d:%-23.23s", (
int)rpmcliProgressCurrent + 1, s);
204 fprintf(stdout,
"%-28.28s", s);
205 (void) fflush(stdout);
208 char * t =
rpmExpand(
"%{?___NVRA}%{!?___NVRA:%%{NAME}-%%{VERSION}-%%{RELEASE}}", NULL);
210 fprintf(stdout,
"%s\n", s);
211 (void) fflush(stdout);
221 fprintf(stdout,
"%%%% %f\n", (
double) (total
222 ? ((((
float) amount) / total) * 100)
224 else if (flags & INSTALL_HASH)
227 (void) fflush(stdout);
231 rpmcliHashesCurrent = 0;
232 rpmcliProgressTotal = 1;
233 rpmcliProgressCurrent = 0;
234 if (!(flags & INSTALL_LABEL))
236 if (flags & INSTALL_HASH)
237 fprintf(stdout,
"%-28s",
_(
"Preparing..."));
239 fprintf(stdout,
"%s\n",
_(
"Preparing packages for installation..."));
240 (void) fflush(stdout);
244 if (flags & INSTALL_HASH)
247 rpmcliProgressCurrent = 0;
251 rpmcliHashesCurrent = 0;
252 rpmcliProgressTotal = total;
253 rpmcliProgressCurrent = 0;
254 if (!(flags & INSTALL_LABEL))
256 if (flags & INSTALL_HASH)
257 fprintf(stdout,
"%-28s\n",
_(
"Repackaging..."));
259 fprintf(stdout,
"%s\n",
_(
"Repackaging erased files..."));
260 (void) fflush(stdout);
264 if (amount && (flags & INSTALL_HASH))
269 rpmcliProgressTotal = total;
270 rpmcliProgressCurrent = total;
271 if (flags & INSTALL_HASH)
274 rpmcliProgressCurrent = 0;
275 if (!(flags & INSTALL_LABEL))
277 if (flags & INSTALL_HASH)
278 fprintf(stdout,
"%-28s\n",
_(
"Upgrading..."));
280 fprintf(stdout,
"%s\n",
_(
"Upgrading packages..."));
281 (void) fflush(stdout);
325 if (ts->suggests != NULL && ts->nsuggests > 0) {
330 for (i = 0; i < ts->nsuggests && (s = (
char *)ts->suggests[i]) != NULL;
331 s =
_free(s), ts->suggests[i++] = NULL)
335 ts->suggests =
_free(ts->suggests);
400 const char * fn = NULL;
404 if (av != NULL && av[0] != NULL)
405 ftsp =
Fts_open((
char *
const *)av, _ftsOpts, NULL);
407 while((fts =
Fts_read(ftsp)) != NULL) {
413 if (fts_level > 0 && fts->
fts_level >= fts_level)
456 "%{?_rpmgi_pattern_glob}" 457 "%{!?_rpmgi_pattern_glob:.}",
462 "%{?_rpmgi_pattern_regex:%{_rpmgi_pattern_regex ", arg,
"}}" 463 "%{!?_rpmgi_pattern_regex:", arg,
"-[^-]+-[^-]+\\.[^.]+\\.rpm$}",
476 if (xx || dav == NULL)
480 for (i = 0; i < dac; i++) {
489 for (i = 0; i < nac; i++) {
490 const char * t = nav[i];
491 size_t nt = strlen(t);
494 if (!(nt > 0 && t[nt-1] ==
'/'))
498 nav[i] =
_free(nav[i]);
503 if (nac > 0 && nav != NULL)
517 mirePattern =
_free(mirePattern);
545 if (argv == NULL)
goto exit;
548 rpmcliPackagesTotal = 0;
560 time_t ttid = (time_t)ia->
arbtid;
562 ctime(&ttid), ia->
arbtid);
572 #if defined(SUPPORT_NOSIGNATURES) 574 VSF_SET(vsflags, NOSHA1HEADER);
601 if (relocations->
newPath == NULL)
610 const char * fn = NULL;;
670 if (xx && he->
c == 1) {
678 _(
"package %s is not relocatable\n"), he->
p.
str);
694 assert(xx != 0 && he->
p.
str != NULL);
734 numFailed = (numRPMS ? numRPMS : 1);
735 if (numFailed)
goto exit;
746 numFailed = (numRPMS ? numRPMS : 1);
757 numFailed = (numRPMS ? numRPMS : 1);
761 if (numFailed)
goto exit;
784 if (argv == NULL)
return 0;
788 #if defined(SUPPORT_NOSIGNATURES) 790 VSF_SET(vsflags, NOSHA1HEADER);
818 time_t ttid = (time_t)ia->
arbtid;
820 ctime(&ttid), ia->
arbtid);
835 for (arg = argv; *arg; arg++) {
864 if (numFailed == 0 && numRPMS > 0) {
879 numFailed += (rc < 0 ? numRPMS : rc);
889 const char ** specFilePtr,
const char ** cookie)
894 if (fd == NULL ||
Ferror(fd)) {
900 fprintf(stdout,
_(
"Installing %s\n"), arg);
905 VSF_SET(nvsflags, NEEDPAYLOAD);
914 if (fd != NULL) (void)
Fclose(fd);
rpmRelocation relocations
#define QVA_ISSET(_qvaflags, _FLAG)
int rpmErase(rpmts ts, QVA_t ia, const char **argv)
Erase binary rpm package.
int rpmgiRc(rpmgi gi)
Return current iteration item(s) exit code.
miRE mireNew(rpmMireMode mode, int tag)
Create pattern container.
FTS * Fts_open(char *const *argv, int options, int(*compar)(const FTSENT **, const FTSENT **))
Create a handle for file hierarchy traversal.
uint32_t rpmmiInstance(rpmmi mi)
Return header instance for current position of rpmdb iterator.
Structures used for an "rpmte" transaction element.
char * xstrdup(const char *str)
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
rpmuint64_t rpmcliProgressTotal
int rpmtsAddInstallElement(rpmts ts, Header h, fnpyKey key, int upgrade, rpmRelocation relocs)
Add package to be installed to transaction set.
rpmgi rpmgiFree(rpmgi gi)
Destroy a generalized iterator.
rpmuint64_t rpmcliProgressCurrent
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
enum rpmprobFilterFlags_e rpmprobFilterFlags
struct headerToken_s * Header
void rpmpsPrint(FILE *fp, rpmps ps)
Print problems to file handle.
int mireRegcomp(miRE mire, const char *pattern)
Compile pattern match.
int argvAppend(ARGV_t *argvp, ARGV_t av)
Append one argv array to another.
int(* rpmtsOrder)(rpmts ts)
Determine package order in a transaction set according to dependencies.
FD_t fdLink(void *cookie, const char *msg)
static rpmVSFlags vsflags
int rpmtsSetNotifyCallback(rpmts ts, rpmCallbackFunction notify, rpmCallbackData notifyData)
Set transaction notify callback function and argument.
int rpmcliInstallRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
Install/erase package elements in a transaction set, reporting problems.
Header rpmgiHeader(rpmgi gi)
Return current iteration header.
enum rpmCallbackType_e rpmCallbackType
Bit(s) to identify progress callbacks.
void addMacro(MacroContext mc, const char *n, const char *o, const char *b, int level)
Add macro to context.
#define VSF_SET(_vsflags, _FLAG)
static const char * rpmcliWalkFirst(ARGV_t av, miRE mire)
int Fadvise(FD_t fd, off_t offset, off_t length, int advice)
posix_fadvise(2) clone.
int rpmcliInstallProblems(rpmts ts, const char *msg, int rc)
Report package problems (if any).
static void rpmlog(int code, const char *fmt,...)
struct rpmps_s * rpmps
Transaction problems found while processing a transaction set/.
int rpmcliInstallOrder(rpmts ts)
Order package elements in a transaction set, reporting problems.
int rpmcliInstallCheck(rpmts ts)
Check package element dependencies in a transaction set, reporting problems.
Command line option information.
char * headerSprintf(Header h, const char *fmt, headerTagTableEntry tags, headerSprintfExtension exts, errmsg_t *errmsg)
Return formatted output string from header tags.
int rpmpsNumProblems(rpmps ps)
Return number of problems in set.
rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags)
Set transaction flags, i.e.
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
void delMacro(MacroContext mc, const char *n)
Delete macro from context.
miRE mireFree(miRE mire)
Free pattern container.
static const char * rpmcliInstallElementPath(rpmts ts, const char *arg)
const char * Fstrerror(FD_t fd)
strerror(3) clone.
rpmgi rpmgiNew(rpmts ts, int tag, const void *keyp, size_t keylen)
Return a generalized iterator.
#define VSF_CLR(_vsflags, _FLAG)
FD_t fdFree(FD_t fd, const char *msg)
enum rpmgiFlags_e rpmgiFlags
int argvCount(const ARGV_t argv)
Return no.
rpmRC rpmInstallSourcePackage(rpmts ts, void *_fd, const char **specFilePtr, const char **cookie)
Install source package.
unsigned long long rpmuint64_t
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
int(* rpmtsCheck)(rpmts ts)
Perform dependency resolution on the transaction set.
int rpmtsNElements(rpmts ts)
Return number of (ordered) transaction set elements.
int rpmInstallSource(rpmts ts, const char *arg, const char **specFilePtr, const char **cookie)
Install source rpm package.
Routines to expand a manifest containing glob expressions into an argv list.
Structure(s) used for dependency tag sets.
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int ftsOpts, rpmgiFlags flags)
Load iterator args.
The FD_t File Handle data structure.
rpmmi rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)
Return transaction database iterator.
int argvAdd(ARGV_t *argvp, ARGstr_t val)
Add a string to an argv array.
int mireRegexec(miRE mire, const char *val, size_t vallen)
Execute pattern match.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
Header headerFree(Header h)
Dereference a header instance.
FTSENT * Fts_read(FTS *sp)
Return next node in the file hierarchy traversal.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
int(* rpmtsRun)(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
Process all package elements in a transaction set.
void rpmtsSetARBGoal(rpmts ts, rpmuint32_t goal)
Set autorollback goal.
int rpmcliInstall(rpmts ts, QVA_t ia, const char **argv)
Install/upgrade/freshen binary rpm package.
rpmInstallInterfaceFlags installInterfaceFlags
static void printHash(const rpmuint64_t amount, const rpmuint64_t total)
Print a CLI progress bar.
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
int Fclose(FD_t fd)
fclose(3) clone.
rpmprobFilterFlags probFilter
int Fts_set(FTS *sp, FTSENT *p, int instr)
Modify the traversal for a file set member.
rpmps rpmpsFree(rpmps ps)
Destroy a problem set.
Header headerLink(Header h)
Reference a header instance.
struct rpmgi_s * rpmgi
Generalized iterator.
enum rpmRC_e rpmRC
RPM return codes.
int Ferror(FD_t fd)
ferror(3) clone.
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
rpmdepFlags rpmtsSetDFlags(rpmts ts, rpmdepFlags depFlags)
Set dependency flags, i.e.
rpmps rpmtsProblems(rpmts ts)
Return current transaction set problems.
enum rpmtransFlags_e rpmtransFlags
Bit(s) to control rpmtsRun() operation.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
struct rpmts_s * rpmts
The RPM Transaction Set.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Structures and prototypes used for an "rpmts" transaction set.
Header rpmmiNext(rpmmi mi)
Return next package header from iteration.
rpmVSFlags rpmtsVSFlags(rpmts ts)
Get verify signatures flag(s).
static rpmRC rpmcliEraseElement(rpmts ts, const char *arg)
int rpmtsAddEraseElement(rpmts ts, Header h, uint32_t hdrNum)
Add package to be erased to transaction set.
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
int Fts_close(FTS *sp)
Destroy a file hierarchy traversal handle.
rpmRC rpmgiNext(rpmgi gi)
Perform next iteration step.
Header rpmgiReadHeader(rpmgi gi, const char *path)
Return header from package.
const char * rpmgiHdrPath(rpmgi gi)
Return current header path.
void * rpmShowProgress(const void *arg, const rpmCallbackType what, const rpmuint64_t amount, const rpmuint64_t total, fnpyKey key, void *data)
The rpm CLI generic transaction callback handler.
Access RPM indices using Berkeley DB interface(s).
int rpmcliInstallSuggests(rpmts ts)
Report packages(if any) that satisfy unresolved dependencies.
unsigned int rpmmiCount(rpmmi mi)
Return number of elements in rpm database iterator.
In Memoriam: Steve Taylor staylor@redhat.com was here, now he's not.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
void rpmtsEmpty(rpmts ts)
Re-create an empty transaction set.
int rpmVersionCompare(Header A, Header B)
tsmStage rpmtsSetGoal(rpmts ts, tsmStage goal)
Set goal of transaction set.
void rpmtsClean(rpmts ts)
Free memory needed only for dependency checks and ordering.