honor ZPM_ROOT_DIR environment variable
Change directory to either / or the rootdir. Actually doing a chroot(2)
call is apparently deprecated and has been removed from posix. Doing
this will require OS specific code. Unless and until that is done,
scripts will need to be aware of that and make changes in the correct
place.
PF=test.db
pkgid=scriptrunner-1.0-1
PF=test.db
pkgid=scriptrunner-1.0-1
+require rm -rf tmp
+require mkdir tmp
+cd tmp 2>/dev/null || bailout "can't cd to tmp"
+
require zpm init $PF
require zpm newpackage -f $PF $pkgid
require zpm init $PF
require zpm newpackage -f $PF $pkgid
failsok required non-existing script fails
tryrun zpm runscript -f $PF -p nosuchphase scriptrunner-1.0-1 2>/dev/null
failsok required non-existing script fails
tryrun zpm runscript -f $PF -p nosuchphase scriptrunner-1.0-1 2>/dev/null
+cat >script <<-'EOC'
+#!/bin/sh
+echo $1
+EOC
+tryrun zpm setscript -f $PF scriptrunner-1.0-1 configure script
+first=$(zpm runscript -f $PF -p configure -o - scriptrunner-1.0-1)
+okexit first arg script
+okstreq "$first" "scriptrunner-1.0-1" "first arg value"
+
+cat >script <<-'EOC'
+#!/bin/sh
+echo $2
+EOC
+tryrun zpm setscript -f $PF scriptrunner-1.0-1 configure script
+second=$(zpm runscript -f $PF -p configure -o - scriptrunner-1.0-1 secondarg)
+okexit second arg script
+okstreq "$second" "secondarg" "second arg value"
+
+cd ..
+rm -rf tmp
+
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
/* if stdout is a terminal, leave stdout where it goes,
* if it's not a terminal, redirect stdout to output.
* in either case, send stderr to output, unless null
/* if stdout is a terminal, leave stdout where it goes,
* if it's not a terminal, redirect stdout to output.
* in either case, send stderr to output, unless null
- * if output is null, just run the program
+ * if output is null or "-", just run the program
*/
int interactive = 0;
pid_t pid;
*/
int interactive = 0;
pid_t pid;
if (pid == 0) {
/* child */
if (pid == 0) {
/* child */
+ if (output && strcmp(output, "-") != 0) {
close(2);
rv = open(output, O_NOFOLLOW|O_TRUNC|O_CREAT|O_WRONLY,
0600);
close(2);
rv = open(output, O_NOFOLLOW|O_TRUNC|O_CREAT|O_WRONLY,
0600);
int required = 0;
char hash[ZPM_HASH_STRLEN+1];
int required = 0;
char hash[ZPM_HASH_STRLEN+1];
char *db = "/var/lib/zpm/zpm.db";
char *script = "/var/tmp/zpm-script";
char *output = "/var/tmp/zpm-script.out";
char *db = "/var/lib/zpm/zpm.db";
char *script = "/var/tmp/zpm-script";
char *output = "/var/tmp/zpm-script.out";
}
/* ZPM_PACKAGE_FILE ? */
}
/* ZPM_PACKAGE_FILE ? */
- while ((opt = getopt(ac, av, "f:p:s:r:R")) != -1) {
+ rootdir = getenv("ZPM_ROOT_DIR");
+
+ while ((opt = getopt(ac, av, "f:p:o:s:r:R")) != -1) {
switch (opt) {
case 'f': db = optarg; break;
case 'p': phase = optarg; break;
case 's': script = optarg; break;
switch (opt) {
case 'f': db = optarg; break;
case 'p': phase = optarg; break;
case 's': script = optarg; break;
- case 'r': chroot = optarg; break;
+ case 'o': output = optarg; break;
+ case 'r': rootdir = optarg; break;
case 'R': required = 1; break;
default:
usage();
case 'R': required = 1; break;
default:
usage();
args[0] = script;
args[1] = pkgid;
args[2] = 0;
args[0] = script;
args[1] = pkgid;
args[2] = 0;
- if (chroot) {
- fprintf(stderr, "failing to chroot %s\n", chroot);
+ args[3] = 0;
+ if (argn + 1 <= ac) {
+ args[2] = av[argn+1];
+ }
+ if (rootdir) {
+ if (chdir(rootdir) == -1) {
+ perror("can not chdir to rootdir");
+ exit(EXIT_FAILURE);
+ }
+ if (geteuid() == 0) {
+ /* chroot is deprecated, and not in
+ * posix. need to use OS/kernel
+ * specific code.
+ */
+ fprintf(stderr, "support for chroot equivalent not supported on this OS\n");
+ } else {
+ fprintf(stderr, "unable to chroot as non root use\n");
+ }
+ } else {
+ if (chdir("/") == -1) {
+ perror("can not chdir to /");
+ exit(EXIT_FAILURE);
+ }
}
rv = run(script, args, output, &status);
if (rv) {
}
rv = run(script, args, output, &status);
if (rv) {