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;