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))
74 #define TSF_ISSET(_tsflags, _FLAG) ((_tsflags) & (RPMTRANS_FLAG_##_FLAG))
75 #define TSF_SET(_tsflags, _FLAG) \
76 (*((unsigned *)&(_tsflags)) |= (RPMTRANS_FLAG_##_FLAG))
77 #define TSF_CLR(_tsflags, _FLAG) \
78 (*((unsigned *)&(_tsflags)) &= ~(RPMTRANS_FLAG_##_FLAG))
80 #define IIF_ISSET(_iflags, _FLAG) ((_iflags) & (INSTALL_##_FLAG))
81 #define IIF_SET(_iflags, _FLAG) \
82 (*((unsigned *)&(_iflags)) |= (INSTALL_##_FLAG))
83 #define IIF_CLR(_iflags, _FLAG) \
84 (*((unsigned *)&(_iflags)) &= ~(INSTALL_##_FLAG))
86 #define PFF_ISSET(_pfflags, _FLAG) ((_pfflags) & (RPMPROB_FILTER_##_FLAG))
87 #define PFF_SET(_pfflags, _FLAG) \
88 (*((unsigned *)&(_pfflags)) |= (RPMPROB_FILTER_##_FLAG))
89 #define PFF_CLR(_pfflags, _FLAG) \
90 (*((unsigned *)&(_pfflags)) &= ~(RPMPROB_FILTER_##_FLAG))
94 #define QVA_ISSET(_qvaflags, _FLAG) ((_qvaflags) & (VERIFY_##_FLAG))
95 #define QVA_SET(_qvaflags, _FLAG) (_qvaflags) |= (VERIFY_##_FLAG)
96 #define QVA_CLR(_qvaflags, _FLAG) (_qvaflags) &= ~(VERIFY_##_FLAG)
98 #define VSF_ISSET(_vsflags, _FLAG) ((_vsflags) & (RPMVSF_##_FLAG))
99 #define VSF_SET(_vsflags, _FLAG) (_vsflags) |= (RPMVSF_##_FLAG)
100 #define VSF_CLR(_vsflags, _FLAG) (_vsflags) &= ~(RPMVSF_##_FLAG)
102 #define TSF_ISSET(_tsflags, _FLAG) ((_tsflags) & (RPMTRANS_FLAG_##_FLAG))
103 #define TSF_SET(_tsflags, _FLAG) (_tsflags) |= (RPMTRANS_FLAG_##_FLAG)
104 #define TSF_CLR(_tsflags, _FLAG) (_tsflags) &= ~(RPMTRANS_FLAG_##_FLAG)
106 #define IIF_ISSET(_iflags, _FLAG) ((_iflags) & (INSTALL_##_FLAG))
107 #define IIF_SET(_iflags, _FLAG) (_iflags) |= (INSTALL_##_FLAG)
108 #define IIF_CLR(_iflags, _FLAG) (_iflags) &= ~(INSTALL_##_FLAG)
110 #define PFF_ISSET(_pfflags, _FLAG) ((_pfflags) & (RPMPROB_FILTER_##_FLAG))
111 #define PFF_SET(_pfflags, _FLAG) (_pfflags) |= (RPMPROB_FILTER_##_FLAG)
112 #define PFF_CLR(_pfflags, _FLAG) (_pfflags) &= ~(RPMPROB_FILTER_##_FLAG)
121 #define MODES_QV (MODE_QUERY | MODE_VERIFY)
125 #define MODES_IE (MODE_INSTALL | MODE_ERASE)
131 #define MODES_BT (MODE_BUILD | MODE_TARBUILD | MODE_REBUILD | MODE_RECOMPILE)
135 #define MODES_K (MODE_CHECKSIG | MODE_RESIGN)
141 #define MODES_FOR_DBPATH (MODES_BT | MODES_IE | MODES_QV | MODES_DB)
142 #define MODES_FOR_NODEPS (MODES_BT | MODES_IE | MODE_VERIFY)
143 #define MODES_FOR_TEST (MODES_BT | MODES_IE)
144 #define MODES_FOR_ROOT (MODES_BT | MODES_IE | MODES_QV | MODES_DB | MODES_K)
152 N_(
"Query options (with -q or --query):"),
155 N_(
"Verify options (with -V or --verify):"),
158 {
NULL,
'\0', POPT_ARG_INCLUDE_TABLE, rpmcliQVSourcePoptTable, 0,
159 N_(
"Source options (with --query or --verify):"),
164 #if defined(IAM_RPMQV) || defined(IAM_RPMEIU)
166 N_(
"Dependency check/order options:"),
172 N_(
"File tree walk options (with --ftswalk):"),
178 N_(
"Signature options:"),
184 N_(
"Database options:"),
190 N_(
"Build options with [ <specfile> | <tarball> | <source package> ]:"),
196 N_(
"Install/Upgrade/Erase options:"),
201 N_(
"Common options:"),
211 long _stksize = 64 * 1024
L;
229 fprintf(fp,
"rpmlib 0x%08x,0x%08x,0x%08x\n",
241 poptPrintHelp(con, fp, flags);
243 poptPrintUsage(con, fp, flags);
247 #if defined(RPM_VENDOR_OPENPKG)
249 #if !defined(RPM_INTEGRITY_FP)
250 #error required RPM_INTEGRITY_FP (fingerprint of public key of integrity authority) not defined!
255 INTEGRITY_WARNING = 1,
259 static void integrity_check_message(
const char *fmt, ...)
264 fprintf(stderr,
"rpm: ATTENTION: INTEGRITY CHECKING DETECTED AN ENVIRONMENT ANOMALY!\nrpm: ");
265 vfprintf(stderr, fmt, ap);
270 static void integrity_check(
const char *
progname,
enum modes progmode_num)
274 char *spec_fn =
NULL;
275 char *proc_fn =
NULL;
276 char *pkey_fn =
NULL;
282 const char *error =
NULL;
284 const char *progmode;
285 int rc = INTEGRITY_ERROR;
288 spec_fn =
rpmExpand(
"%{?_integrity_spec_cfg}%{!?_integrity_spec_cfg:scripts/integrity.cfg}",
NULL);
289 if (spec_fn ==
NULL || spec_fn[0] ==
'\0') {
290 integrity_check_message(
"ERROR: Integrity Configuration Specification file not configured.\n"
291 "rpm: HINT: macro %%{_integrity_spec_cfg} not configured correctly.\n");
294 proc_fn =
rpmExpand(
"%{?_integrity_proc_lua}%{!?_integrity_proc_lua:scripts/integrity.lua}",
NULL);
295 if (proc_fn ==
NULL || proc_fn[0] ==
'\0') {
296 integrity_check_message(
"ERROR: Integrity Validation Processor file not configured.\n"
297 "rpm: HINT: macro %%{_integrity_proc_lua} not configured correctly.\n");
300 pkey_fn =
rpmExpand(
"%{?_integrity_pkey_pgp}%{!?_integrity_pkey_pgp:scripts/integrity.pgp}",
NULL);
301 if (pkey_fn ==
NULL || pkey_fn[0] ==
'\0') {
302 integrity_check_message(
"ERROR: Integrity Authority Public-Key file not configured.\n"
303 "rpm: HINT: macro %%{_integrity_pkey_pgp} not configured correctly.\n");
313 integrity_check_message(
"ERROR: Integrity Configuration Specification file contains invalid signature.\n"
314 "rpm: HINT: Check file \"%s\".\n", spec_fn);
320 integrity_check_message(
"ERROR: Integrity Validation Processor file contains invalid signature.\n"
321 "rpm: HINT: Check file \"%s\".\n", proc_fn);
327 if (!(xx == 0 && spec_iob !=
NULL)) {
328 integrity_check_message(
"ERROR: Unable to load Integrity Configuration Specification file.\n"
329 "rpm: HINT: Check file \"%s\".\n", spec_fn);
336 if (!(xx == 0 && proc_iob !=
NULL)) {
337 integrity_check_message(
"ERROR: Unable to load Integrity Validation Processor file.\n"
338 "rpm: HINT: Check file \"%s\".\n", proc_fn);
344 if (progname ==
NULL || progname[0] ==
'\0')
346 switch (progmode_num) {
359 default: progmode =
"unknown";
break;
365 rpmluaextActivate(lua);
366 lua_getfield(lua->L, LUA_GLOBALSINDEX,
"integrity");
367 lua_getfield(lua->L, -1,
"processor");
368 lua_remove(lua->L, -2);
369 lua_pushstring(lua->L, progname);
370 lua_pushstring(lua->L, progmode);
371 lua_pushstring(lua->L, spec_fn);
372 lua_pushstring(lua->L, spec);
373 lua_pushstring(lua->L, proc_fn);
374 lua_pushstring(lua->L, proc);
375 #ifdef RPM_INTEGRITY_MV
376 lua_pushstring(lua->L, RPM_INTEGRITY_MV);
378 lua_pushstring(lua->L,
"0");
380 if (lua_pcall(lua->L, 7, 1, 0) != 0) {
381 error = lua_isstring(lua->L, -1) ? lua_tostring(lua->L, -1) :
"unknown error";
383 integrity_check_message(
"ERROR: Failed to execute Integrity Validation Processor.\n"
384 "rpm: ERROR: Lua: %s.\n"
385 "rpm: HINT: Check file \"%s\".\n", error, proc_fn);
390 if (!lua_isstring(lua->L, -1)) {
391 integrity_check_message(
"ERROR: Failed to fetch Integrity Validation Processor results.\n"
392 "rpm: HINT: Check file \"%s\".\n", proc_fn);
395 result = lua_tostring(lua->L, -1);
396 if (
strcmp(result,
"OK") == 0)
398 else if (strncmp(result,
"WARNING:", 8) == 0) {
399 rc = INTEGRITY_WARNING;
400 integrity_check_message(
"%s\n", result);
403 rc = INTEGRITY_ERROR;
404 integrity_check_message(
"%s\n", result);
414 if (spec_iob !=
NULL)
416 if (proc_iob !=
NULL)
420 if (rc != INTEGRITY_OK) {
421 if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO))
423 if (rc == INTEGRITY_ERROR)
432 #if !defined(__GLIBC__) && !defined(__LCLINT__)
433 int main(
int argc,
const char **
argv,
char ** envp)
435 int main(
int argc,
const char ** argv)
447 #if defined(IAM_RPMQV)
459 #if defined(IAM_RPMDB)
463 #if defined(IAM_RPMK)
467 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
479 #if !defined(__GLIBC__) && !defined(__LCLINT__)
483 #if 0 && !defined(HAVE_SETPROCTITLE) && defined(__linux__)
511 #if defined(IAM_RPMQV)
552 argerror(
_(
"only one major mode may be specified"));
568 argerror(
_(
"one type of query/verify may be performed at a "
571 if (qva->
qva_flags && (bigMode & ~MODES_QV))
589 argerror(
_(
"only one major mode may be specified"));
618 #if defined(IAM_RPMEIU)
621 argerror(
_(
"only installation, upgrading, rmsource and rmspec may be forced"));
623 argerror(
_(
"files may only be relocated during package installation"));
626 argerror(
_(
"cannot use --prefix with --relocate or --excludepath"));
629 argerror(
_(
"--relocate and --excludepath may only be used when installing new packages"));
632 argerror(
_(
"--prefix may only be used when installing new packages"));
635 argerror(
_(
"arguments to --prefix must begin with a /"));
638 argerror(
_(
"--hash (-h) may only be specified during package "
642 argerror(
_(
"--percent may only be specified during package "
646 argerror(
_(
"--replacepkgs may only be specified during package "
650 argerror(
_(
"--excludedocs may only be specified during package "
654 argerror(
_(
"--includedocs may only be specified during package "
658 argerror(
_(
"only one of --excludedocs and --includedocs may be "
662 argerror(
_(
"--ignorearch may only be specified during package "
666 argerror(
_(
"--ignoreos may only be specified during package "
670 argerror(
_(
"--allmatches may only be specified during package "
674 argerror(
_(
"--allfiles may only be specified during package "
679 argerror(
_(
"--justdb may only be specified during package "
680 "installation and erasure"));
684 argerror(
_(
"script disabling options may only be specified during "
685 "package installation and erasure"));
689 argerror(
_(
"trigger disabling options may only be specified during "
690 "package installation and erasure"));
693 argerror(
_(
"--nodeps may only be specified during package "
694 "building, rebuilding, recompilation, installation, "
695 "erasure, and verification"));
698 argerror(
_(
"--test may only be specified during package installation, "
699 "erasure, and building"));
703 argerror(
_(
"--root (-r) may only be specified during "
704 "installation, erasure, querying, and "
705 "database rebuilds"));
715 argerror(
_(
"arguments to --root (-r) must begin with a /"));
720 #if defined(RPM_VENDOR_OPENPKG)
724 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
726 #
if defined(IAM_RPMBT)
729 #
if defined(IAM_RPMK)
742 if ((av = poptGetArgs(optCon)) ==
NULL) {
743 fprintf(stderr,
_(
"no files to sign\n"));
747 if (
Stat(*av, &sb)) {
748 fprintf(stderr,
_(
"cannot access file %s\n"), *av);
760 if (poptPeekArg(optCon)
761 #
if defined(IAM_RPMBT)
764 #
if defined(IAM_RPMK)
769 passPhrase =
Getpass(
_(
"Enter pass phrase: "));
771 fprintf(stderr,
_(
"Pass phrase check failed\n"));
775 fprintf(stderr,
_(
"Pass phrase is good.\n"));
777 passPhrase =
xstrdup(passPhrase);
786 fprintf(stderr,
_(
"creating a pipe for --pipe failed: %m\n"));
790 if (!(pipeChild = fork())) {
792 (
void) dup2(p[0], STDIN_FILENO);
795 fprintf(stderr,
_(
"exec failed\n"));
799 (
void) dup2(p[1], STDOUT_FILENO);
813 #if defined(SUPPORT_NOSIGNATURES)
815 VSF_SET(vsflags, NOSHA1HEADER);
847 if (!poptPeekArg(optCon))
848 argerror(
_(
"no packages files given for rebuild"));
860 while ((pkg = poptGetArg(optCon))) {
887 #if defined(RPM_VENDOR_OPENPKG)
900 #if defined(RPM_VENDOR_MANDRIVA)
927 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_ARK)
946 if (!poptPeekArg(optCon)) {
948 argerror(
_(
"no spec files given for build"));
950 argerror(
_(
"no tar files given for build"));
953 while ((ba->
specFile = poptGetArg(optCon))) {
974 if (!poptPeekArg(optCon)) {
976 argerror(
_(
"no packages given for erase"));
984 ec +=
rpmErase(ts, ia, (
const char **) poptGetArgs(optCon));
1015 if (!poptPeekArg(optCon)) {
1017 argerror(
_(
"no packages given for install"));
1026 ec +=
rpmcliInstall(ts, ia, (
const char **)poptGetArgs(optCon));
1035 if (!poptPeekArg(optCon)
1037 argerror(
_(
"no arguments given for query"));
1041 ec =
rpmcliQuery(ts, qva, (
const char **) poptGetArgs(optCon));
1050 *((
unsigned *)&vflags) &= ~qva->
qva_flags;
1056 if (!poptPeekArg(optCon)
1058 argerror(
_(
"no arguments given for verify"));
1059 ec =
rpmcliVerify(ts, qva, (
const char **) poptGetArgs(optCon));
1072 *((
unsigned *)&vflags) &= ~ka->
qva_flags;
1079 if (!poptPeekArg(optCon))
1082 ec =
rpmcliSign(ts, ka, (
const char **)poptGetArgs(optCon));
1086 #if !defined(IAM_RPMQV)
1090 #if !defined(IAM_RPMK)
1094 #if !defined(IAM_RPMDB)
1097 #if !defined(IAM_RPMBT)
1103 #if !defined(IAM_RPMEIU)
1110 printUsage(optCon, stderr, 0);
1117 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
1125 (
void) fclose(stdout);
1126 (
void) waitpid(pipeChild, &status, 0);
1147 optCon = rpmcliFini(optCon);
1150 #if 0 && !defined(HAVE_SETPROCTITLE) && defined(__linux__)
1151 (
void) finiproctitle();
1156 if (ec > 254) ec = 254;
rpmRelocation relocations
int build(rpmts ts, BTA_t ba, const char *rcfile)
rpmlog(RPMLOG_ERR,"%s\n", buf)
struct poptOption rpmcliDepFlagsPoptTable[]
#define VSF_SET(_vsflags, _FLAG)
struct poptOption rpmBuildPoptTable[]
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)
int rpmspecQuery(rpmts ts, QVA_t qva, const char *arg)
Function to query spec file(s).
struct rpmts_s * rpmts
The RPM Transaction Set.
static struct poptOption optionsTable[]
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
urltype urlIsURL(const char *url)
Return type of URL.
int main(int argc, const char **argv, char **envp)
#define PFF_SET(_pfflags, _FLAG)
struct poptOption rpmioFtsPoptTable[]
struct rpmBuildArguments_s rpmBTArgs
int Stat(const char *path, struct stat *st)
stat(2) clone.
Access mounted file system information.
int rpmtsRebuildDB(rpmts ts)
Rebuild the database used by the transaction.
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
#define QVA_ISSET(_qvaflags, _FLAG)
int rpmcliVerify(rpmts ts, QVA_t qva, const char **argv)
Verify package install.
Command line option information.
const char * rpmioPipeOutput
int rpmiobSlurp(const char *fn, rpmiob *iobp)
struct rpmQVKArguments_s rpmQVKArgs
#define VSF_CLR(_vsflags, _FLAG)
int rpmcliInstallOrder(rpmts ts)
Order package elements in a transaction set, reporting problems.
rpmuint32_t rpmlibVendor(void)
rpmts rpmtsCreate(void)
Create an empty transaction set.
void rpmtsSetRootDir(rpmts ts, const char *rootDir)
Set transaction rootDir, i.e.
rpmQueryFlags rpmcliQueryFlags
Bit(s) from common command line options.
struct poptOption rpmInstallPoptTable[]
rpmRC rpmnsProbeSignature(void *_ts, const char *fn, const char *sigfn, const char *pubfn, const char *pubid, int flags)
Verify OpenPGP signature on a file.
enum rpmVerifyFlags_e rpmVerifyFlags
Bit(s) to control rpmVerify() operation, stored in qva_flags.
Structures and prototypes used for an "rpmps" problem set.
fprintf(stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
struct poptOption rpmQueryPoptTable[]
Query mode options.
const char * rpmioRootDir
#define QVA_SET(_qvaflags, _FLAG)
int rpmcliInstall(rpmts ts, QVA_t ia, const char **argv)
Install/upgrade/freshen binary rpm package.
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 rpmRollback(rpmts ts, QVA_t ia, const char **argv)
Generate and verify rpm package signatures.
const char * qva_queryFormat
void * rpmluaFree(rpmlua lua)
void freeNames(void)
Destroy uid/gid caches.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
struct poptOption rpmDatabasePoptTable[]
int rpmtsOpenDB(rpmts ts, int dbmode)
Open the database used by the transaction.
rpmRelocation rpmfiFreeRelocations(rpmRelocation relocs)
Free relocation array.
pgpVSFlags rpmVSFlags
Bit(s) to control digest and signature verification.
rpmInstallInterfaceFlags installInterfaceFlags
rpmuint32_t rpmlibVersion(void)
rpmprobFilterFlags probFilter
int rpmcliQuery(rpmts ts, QVA_t qva, const char **argv)
Display package information.
int rpmInstallSource(rpmts ts, const char *arg, const char **specFilePtr, const char **cookie)
Install source rpm package.
rpmuint32_t rpmlibTimestamp(void)
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
struct poptOption rpmcliAllPoptTable[]
Popt option table for options shared by all modes and executables.
char * rpmiobStr(rpmiob iob)
Return I/O buffer (as string).
return strcmp(ame->name, bme->name)
#define IIF_SET(_iflags, _FLAG)
This is the only module users of librpmbuild should need to include.
struct rpmQVKArguments_s rpmIArgs
struct rpmQVKArguments_s rpmDBArgs
void rpmcliConfigured(void)
Make sure that rpm configuration has been read.
Structures and prototypes used for an "rpmts" transaction set.
struct poptOption rpmVerifyPoptTable[]
Verify mode options.
enum rpmQueryFlags_e rpmQueryFlags
Bit(s) to control rpmQuery() operation, stored in qva_flags.
int rpmcliInstallCheck(rpmts ts)
Check package element dependencies in a transaction set, reporting problems.
#define TSF_SET(_tsflags, _FLAG)
int rpmErase(rpmts ts, QVA_t ia, const char **argv)
Erase binary rpm package.
int rpmcliSign(rpmts ts, QVA_t qva, const char **argv)
Create/Modify/Check elements from signature header.
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
Access RPM indices using Berkeley DB interface(s).
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static void printVersion(FILE *fp)
Display rpm version.
Describe build command line request.
enum rpmdepFlags_e rpmdepFlags
Bit(s) to control rpmtsCheck() and rpmtsOrder() operation.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
struct poptOption rpmSignPoptTable[]
Signature mode options.
rpmioPool rpmioFreePool(rpmioPool pool)
Reclaim memory pool items.
#define rpmIncreaseVerbosity()
int(* rbRun)(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
int rpmcliInstallRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
Install/erase package elements in a transaction set, reporting problems.
char *(* Getpass)(const char *prompt)
Return a password.