8 #if defined(IAM_RPM) || defined(__LCLINT__) 16 #if defined(RPM_VENDOR_OPENPKG) 17 #define _RPMIOB_INTERNAL 29 #if defined(IAM_RPMBT) || defined(IAM_RPMK) 33 #if defined(RPM_VENDOR_OPENPKG) 35 #define _RPMLUA_INTERNAL 37 #include "rpmluaext.h" 50 #define GETOPT_REBUILD 1003 51 #define GETOPT_RECOMPILE 1004 55 #include <rpmrollback.h> 62 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 63 #define QVA_SET(_qvaflags, _FLAG) \ 64 (*((unsigned *)&(_qvaflags)) |= (VERIFY_##_FLAG)) 65 #define QVA_CLR(_qvaflags, _FLAG) \ 66 (*((unsigned *)&(_qvaflags)) &= ~(VERIFY_##_FLAG)) 68 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 69 #define VSF_SET(_vsflags, _FLAG) \ 70 (*((unsigned *)&(_vsflags)) |= (RPMVSF_##_FLAG)) 71 #define VSF_CLR(_vsflags, _FLAG) \ 72 (*((unsigned *)&(_vsflags)) &= ~(RPMVSF_##_FLAG)) 76 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG)) 77 #define QVA_SET(_qvaflags, _FLAG) (_qvaflags) |= (VERIFY_##_FLAG) 78 #define QVA_CLR(_qvaflags, _FLAG) (_qvaflags) &= ~(VERIFY_##_FLAG) 80 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG)) 81 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG) 82 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG) 91 #define MODES_QV (MODE_QUERY | MODE_VERIFY) 95 #define MODES_IE (MODE_INSTALL | MODE_ERASE) 101 #define MODES_BT (MODE_BUILD | MODE_TARBUILD | MODE_REBUILD | MODE_RECOMPILE) 105 #define MODES_K (MODE_CHECKSIG | MODE_RESIGN) 111 #define MODES_FOR_DBPATH (MODES_BT | MODES_IE | MODES_QV | MODES_DB) 112 #define MODES_FOR_NODEPS (MODES_BT | MODES_IE | MODE_VERIFY) 113 #define MODES_FOR_TEST (MODES_BT | MODES_IE) 114 #define MODES_FOR_ROOT (MODES_BT | MODES_IE | MODES_QV | MODES_DB | MODES_K) 122 N_(
"Query options (with -q or --query):"),
125 N_(
"Verify options (with -V or --verify):"),
128 { NULL,
'\0', POPT_ARG_INCLUDE_TABLE, rpmcliQVSourcePoptTable, 0,
129 N_(
"Source options (with --query or --verify):"),
134 #if defined(IAM_RPMQV) || defined(IAM_RPMEIU) 136 N_(
"Dependency check/order options:"),
142 N_(
"File tree walk options (with --ftswalk):"),
148 N_(
"Signature options:"),
154 N_(
"Database options:"),
160 N_(
"Build options with [ <specfile> | <tarball> | <source package> ]:"),
166 N_(
"Install/Upgrade/Erase options:"),
171 N_(
"Common options:"),
181 long _stksize = 64 * 1024
L;
199 fprintf(fp,
"rpmlib 0x%08x,0x%08x,0x%08x\n",
203 static void printUsage(poptContext con, FILE * fp,
int flags)
211 poptPrintHelp(con, fp, flags);
213 poptPrintUsage(con, fp, flags);
217 #if defined(RPM_VENDOR_OPENPKG) 219 #if !defined(RPM_INTEGRITY_FP) 220 #error required RPM_INTEGRITY_FP (fingerprint of public key of integrity authority) not defined! 225 INTEGRITY_WARNING = 1,
229 static void integrity_check_message(
const char *fmt, ...)
234 fprintf(stderr,
"rpm: ATTENTION: INTEGRITY CHECKING DETECTED AN ENVIRONMENT ANOMALY!\nrpm: ");
235 vfprintf(stderr, fmt, ap);
240 static void integrity_check(
const char *
progname,
enum modes progmode_num)
244 char *spec_fn = NULL;
245 char *proc_fn = NULL;
246 char *pkey_fn = NULL;
251 const char *result = NULL;
252 const char *error = NULL;
254 const char *progmode;
255 int rc = INTEGRITY_ERROR;
258 spec_fn =
rpmExpand(
"%{?_integrity_spec_cfg}%{!?_integrity_spec_cfg:scripts/integrity.cfg}", NULL);
259 if (spec_fn == NULL || spec_fn[0] ==
'\0') {
260 integrity_check_message(
"ERROR: Integrity Configuration Specification file not configured.\n" 261 "rpm: HINT: macro %%{_integrity_spec_cfg} not configured correctly.\n");
264 proc_fn =
rpmExpand(
"%{?_integrity_proc_lua}%{!?_integrity_proc_lua:scripts/integrity.lua}", NULL);
265 if (proc_fn == NULL || proc_fn[0] ==
'\0') {
266 integrity_check_message(
"ERROR: Integrity Validation Processor file not configured.\n" 267 "rpm: HINT: macro %%{_integrity_proc_lua} not configured correctly.\n");
270 pkey_fn =
rpmExpand(
"%{?_integrity_pkey_pgp}%{!?_integrity_pkey_pgp:scripts/integrity.pgp}", NULL);
271 if (pkey_fn == NULL || pkey_fn[0] ==
'\0') {
272 integrity_check_message(
"ERROR: Integrity Authority Public-Key file not configured.\n" 273 "rpm: HINT: macro %%{_integrity_pkey_pgp} not configured correctly.\n");
283 integrity_check_message(
"ERROR: Integrity Configuration Specification file contains invalid signature.\n" 284 "rpm: HINT: Check file \"%s\".\n", spec_fn);
290 integrity_check_message(
"ERROR: Integrity Validation Processor file contains invalid signature.\n" 291 "rpm: HINT: Check file \"%s\".\n", proc_fn);
297 if (!(xx == 0 && spec_iob != NULL)) {
298 integrity_check_message(
"ERROR: Unable to load Integrity Configuration Specification file.\n" 299 "rpm: HINT: Check file \"%s\".\n", spec_fn);
306 if (!(xx == 0 && proc_iob != NULL)) {
307 integrity_check_message(
"ERROR: Unable to load Integrity Validation Processor file.\n" 308 "rpm: HINT: Check file \"%s\".\n", proc_fn);
314 if (progname == NULL || progname[0] ==
'\0')
316 switch (progmode_num) {
329 default: progmode =
"unknown";
break;
335 rpmluaextActivate(lua);
336 lua_getfield(lua->L, LUA_GLOBALSINDEX,
"integrity");
337 lua_getfield(lua->L, -1,
"processor");
338 lua_remove(lua->L, -2);
339 lua_pushstring(lua->L, progname);
340 lua_pushstring(lua->L, progmode);
341 lua_pushstring(lua->L, spec_fn);
342 lua_pushstring(lua->L, spec);
343 lua_pushstring(lua->L, proc_fn);
344 lua_pushstring(lua->L, proc);
345 #ifdef RPM_INTEGRITY_MV 346 lua_pushstring(lua->L, RPM_INTEGRITY_MV);
348 lua_pushstring(lua->L,
"0");
350 if (lua_pcall(lua->L, 7, 1, 0) != 0) {
351 error = lua_isstring(lua->L, -1) ? lua_tostring(lua->L, -1) :
"unknown error";
353 integrity_check_message(
"ERROR: Failed to execute Integrity Validation Processor.\n" 354 "rpm: ERROR: Lua: %s.\n" 355 "rpm: HINT: Check file \"%s\".\n", error, proc_fn);
360 if (!lua_isstring(lua->L, -1)) {
361 integrity_check_message(
"ERROR: Failed to fetch Integrity Validation Processor results.\n" 362 "rpm: HINT: Check file \"%s\".\n", proc_fn);
365 result = lua_tostring(lua->L, -1);
366 if (strcmp(result,
"OK") == 0)
368 else if (strncmp(result,
"WARNING:", 8) == 0) {
369 rc = INTEGRITY_WARNING;
370 integrity_check_message(
"%s\n", result);
373 rc = INTEGRITY_ERROR;
374 integrity_check_message(
"%s\n", result);
384 if (spec_iob != NULL)
386 if (proc_iob != NULL)
390 if (rc != INTEGRITY_OK) {
391 if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO))
393 if (rc == INTEGRITY_ERROR)
402 #if !defined(__GLIBC__) && !defined(__LCLINT__) 403 int main(
int argc,
const char ** argv,
char ** envp)
405 int main(
int argc,
const char ** argv)
412 poptContext optCon =
rpmcliInit(argc, (
char *
const *)argv, optionsTable);
417 #if defined(IAM_RPMQV) 429 #if defined(IAM_RPMDB) 433 #if defined(IAM_RPMK) 437 #if defined(IAM_RPMBT) || defined(IAM_RPMK) 438 char * passPhrase = (
char *)
"";
449 #if !defined(__GLIBC__) && !defined(__LCLINT__) 453 #if !defined(HAVE_SETPROCTITLE) && defined(__linux__) 454 (void) initproctitle(argc, (
char **)argv,
environ);
481 #if defined(IAM_RPMQV) 522 argerror(
_(
"only one major mode may be specified"));
538 argerror(
_(
"one type of query/verify may be performed at a " 541 if (qva->
qva_flags && (bigMode & ~MODES_QV))
559 argerror(
_(
"only one major mode may be specified"));
588 #if defined(IAM_RPMEIU) 591 argerror(
_(
"only installation, upgrading, rmsource and rmspec may be forced"));
593 argerror(
_(
"files may only be relocated during package installation"));
596 argerror(
_(
"cannot use --prefix with --relocate or --excludepath"));
599 argerror(
_(
"--relocate and --excludepath may only be used when installing new packages"));
602 argerror(
_(
"--prefix may only be used when installing new packages"));
605 argerror(
_(
"arguments to --prefix must begin with a /"));
608 argerror(
_(
"--hash (-h) may only be specified during package " 612 argerror(
_(
"--percent may only be specified during package " 616 argerror(
_(
"--replacepkgs may only be specified during package " 620 argerror(
_(
"--excludedocs may only be specified during package " 624 argerror(
_(
"--includedocs may only be specified during package " 628 argerror(
_(
"only one of --excludedocs and --includedocs may be " 632 argerror(
_(
"--ignorearch may only be specified during package " 636 argerror(
_(
"--ignoreos may only be specified during package " 640 argerror(
_(
"--allmatches may only be specified during package " 644 argerror(
_(
"--allfiles may only be specified during package " 649 argerror(
_(
"--justdb may only be specified during package " 650 "installation and erasure"));
654 argerror(
_(
"script disabling options may only be specified during " 655 "package installation and erasure"));
659 argerror(
_(
"trigger disabling options may only be specified during " 660 "package installation and erasure"));
663 argerror(
_(
"--nodeps may only be specified during package " 664 "building, rebuilding, recompilation, installation, " 665 "erasure, and verification"));
668 argerror(
_(
"--test may only be specified during package installation, " 669 "erasure, and building"));
673 argerror(
_(
"--root (-r) may only be specified during " 674 "installation, erasure, querying, and " 675 "database rebuilds"));
685 argerror(
_(
"arguments to --root (-r) must begin with a /"));
690 #if defined(RPM_VENDOR_OPENPKG) 694 #if defined(IAM_RPMBT) || defined(IAM_RPMK) 696 #
if defined(IAM_RPMBT)
699 #
if defined(IAM_RPMK)
712 if ((av = poptGetArgs(optCon)) == NULL) {
713 fprintf(stderr,
_(
"no files to sign\n"));
717 if (
Stat(*av, &sb)) {
718 fprintf(stderr,
_(
"cannot access file %s\n"), *av);
730 if (poptPeekArg(optCon)
731 #
if defined(IAM_RPMBT)
734 #
if defined(IAM_RPMK)
739 passPhrase =
Getpass(
_(
"Enter pass phrase: "));
741 fprintf(stderr,
_(
"Pass phrase check failed\n"));
745 fprintf(stderr,
_(
"Pass phrase is good.\n"));
747 passPhrase =
xstrdup(passPhrase);
756 fprintf(stderr,
_(
"creating a pipe for --pipe failed: %m\n"));
760 if (!(pipeChild = fork())) {
762 (void) dup2(p[0], STDIN_FILENO);
765 fprintf(stderr,
_(
"exec failed\n"));
769 (void) dup2(p[1], STDOUT_FILENO);
783 #if defined(SUPPORT_NOSIGNATURES) 785 VSF_SET(vsflags, NOSHA1HEADER);
817 if (!poptPeekArg(optCon))
818 argerror(
_(
"no packages files given for rebuild"));
830 while ((pkg = poptGetArg(optCon))) {
842 ec =
build(ts, ba, NULL);
857 #if defined(RPM_VENDOR_OPENPKG) 870 #if defined(RPM_VENDOR_MANDRIVA) 897 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK) 916 if (!poptPeekArg(optCon)) {
918 argerror(
_(
"no spec files given for build"));
920 argerror(
_(
"no tar files given for build"));
923 while ((ba->
specFile = poptGetArg(optCon))) {
932 ec =
build(ts, ba, NULL);
944 if (!poptPeekArg(optCon)) {
946 argerror(
_(
"no packages given for erase"));
954 ec +=
rpmErase(ts, ia, (
const char **) poptGetArgs(optCon));
985 if (!poptPeekArg(optCon)) {
987 argerror(
_(
"no packages given for install"));
996 ec +=
rpmcliInstall(ts, ia, (
const char **)poptGetArgs(optCon));
1005 if (!poptPeekArg(optCon)
1007 argerror(
_(
"no arguments given for query"));
1011 ec =
rpmcliQuery(ts, qva, (
const char **) poptGetArgs(optCon));
1020 *((
unsigned *)&vflags) &= ~qva->
qva_flags;
1026 if (!poptPeekArg(optCon)
1028 argerror(
_(
"no arguments given for verify"));
1029 ec =
rpmcliVerify(ts, qva, (
const char **) poptGetArgs(optCon));
1042 *((
unsigned *)&vflags) &= ~ka->
qva_flags;
1049 if (!poptPeekArg(optCon))
1052 ec =
rpmcliSign(ts, ka, (
const char **)poptGetArgs(optCon));
1056 #if !defined(IAM_RPMQV) 1060 #if !defined(IAM_RPMK) 1064 #if !defined(IAM_RPMDB) 1067 #if !defined(IAM_RPMBT) 1073 #if !defined(IAM_RPMEIU) 1079 if (poptPeekArg(optCon) != NULL || argc <= 1 ||
rpmIsVerbose()) {
1080 printUsage(optCon, stderr, 0);
1087 #if defined(IAM_RPMBT) || defined(IAM_RPMK) 1095 (void) fclose(stdout);
1096 (void) waitpid(pipeChild, &status, 0);
1120 #if !defined(HAVE_SETPROCTITLE) && defined(__linux__) 1121 (void) finiproctitle();
1126 if (ec > 254) ec = 254;
rpmRelocation relocations
void rpmFreeMacros(MacroContext mc)
Destroy macro context.
enum rpmQueryFlags_e rpmQueryFlags
Bit(s) to control rpmQuery() operation, stored in qva_flags.
int build(rpmts ts, BTA_t ba, const char *rcfile)
rpmQueryFlags rpmcliQueryFlags
Bit(s) from common command line options.
struct poptOption rpmcliDepFlagsPoptTable[]
struct poptOption rpmDatabasePoptTable[]
#define VSF_SET(_vsflags, _FLAG)
int rpmErase(rpmts ts, QVA_t ia, const char **argv)
Erase binary rpm package.
int rpmcliVerify(rpmts ts, QVA_t qva, const char **argv)
Verify package install.
int rpmcliQuery(rpmts ts, QVA_t qva, const char **argv)
Display package information.
char * xstrdup(const char *str)
int rpmCheckPassPhrase(const char *passPhrase)
Check for valid pass phrase by invoking a helper.
int rpmReadConfigFiles(const char *file, const char *target)
void rpmluaSetPrintBuffer(rpmlua _lua, int flag)
struct poptOption rpmcliAllPoptTable[]
Popt option table for options shared by all modes and executables.
static struct poptOption optionsTable[]
urltype urlIsURL(const char *url)
Return type of URL.
int main(int argc, const char **argv, char **envp)
struct poptOption rpmioFtsPoptTable[]
int Stat(const char *path, struct stat *st)
stat(2) clone.
static rpmVSFlags vsflags
Access mounted file system information.
struct poptOption rpmQueryPoptTable[]
Query mode options.
struct rpmBuildArguments_s rpmBTArgs
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
int rpmcliInstallRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
Install/erase package elements in a transaction set, reporting problems.
static void rpmlog(int code, const char *fmt,...)
#define QVA_ISSET(_qvaflags, _FLAG)
char *(* Getpass)(const char *prompt)
Return a password.
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption *optionsTable)
Initialize most everything needed by an rpm CLI executable context.
struct rpmQVKArguments_s rpmIArgs
int(* rbRun)(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
Command line option information.
const char * rpmioPipeOutput
int rpmiobSlurp(const char *fn, rpmiob *iobp)
#define VSF_CLR(_vsflags, _FLAG)
rpmuint32_t rpmlibVendor(void)
rpmRC rpmnsProbeSignature(void *_ts, const char *fn, const char *sigfn, const char *pubfn, const char *pubid, int flags)
Verify OpenPGP signature on a file.
Structures and prototypes used for an "rpmps" problem set.
int rpmcliInstallOrder(rpmts ts)
Order package elements in a transaction set, reporting problems.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
const char * rpmioRootDir
#define QVA_SET(_qvaflags, _FLAG)
int rpmDefineMacro(MacroContext mc, const char *macro, int level)
Define macro in context.
int rpmfiAddRelocation(rpmRelocation *relp, int *nrelp, const char *oldPath, const char *newPath)
Add relocation element to array.
static void argerror(const char *desc)
int rpmtsRebuildDB(rpmts ts)
Rebuild the database used by the transaction.
struct poptOption rpmInstallPoptTable[]
int rpmcliInstall(rpmts ts, QVA_t ia, const char **argv)
Install/upgrade/freshen binary rpm package.
int rpmRollback(rpmts ts, QVA_t ia, const char **argv)
Generate and verify rpm package signatures.
const char * qva_queryFormat
int rpmInstallSource(rpmts ts, const char *arg, const char **specFilePtr, const char **cookie)
Install source rpm package.
void * rpmluaFree(rpmlua lua)
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
void rpmtsSetRootDir(rpmts ts, const char *rootDir)
Set transaction rootDir, i.e.
rpmRelocation rpmfiFreeRelocations(rpmRelocation relocs)
Free relocation array.
rpmInstallInterfaceFlags installInterfaceFlags
rpmuint32_t rpmlibVersion(void)
int rpmcliInstallCheck(rpmts ts)
Check package element dependencies in a transaction set, reporting problems.
rpmprobFilterFlags probFilter
enum rpmVerifyFlags_e rpmVerifyFlags
Bit(s) to control rpmVerify() operation, stored in qva_flags.
rpmuint32_t rpmlibTimestamp(void)
struct poptOption rpmSignPoptTable[]
Signature mode options.
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
This is the only module users of librpmbuild should need to include.
struct poptOption rpmBuildPoptTable[]
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
int rpmspecQuery(rpmts ts, QVA_t qva, const char *arg)
Function to query spec file(s).
rpmts rpmtsCreate(void)
Create an empty transaction set.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
void rpmcliConfigured(void)
Make sure that rpm configuration has been read.
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.
struct rpmQVKArguments_s rpmQVKArgs
int rpmcliSign(rpmts ts, QVA_t qva, const char **argv)
Create/Modify/Check elements from signature header.
void freeNames(void)
Destroy uid/gid caches.
struct poptOption rpmVerifyPoptTable[]
Verify mode options.
int rpmtsOpenDB(rpmts ts, int dbmode)
Open the database used by the transaction.
struct rpmQVKArguments_s rpmDBArgs
Access RPM indices using Berkeley DB interface(s).
static void printVersion(FILE *fp)
Display rpm version.
Describe build command line request.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
poptContext rpmcliFini(poptContext optCon)
Destroy most everything needed by an rpm CLI executable context.
rpmioPool rpmioFreePool(rpmioPool pool)
Reclaim memory pool items.
#define rpmIncreaseVerbosity()