]> pd.if.org Git - zpackage/commitdiff
add -o option to runscript
authorNathan Wagner <nw@hydaspes.if.org>
Fri, 21 Sep 2018 22:26:26 +0000 (22:26 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 24 Sep 2018 10:40:18 +0000 (10:40 +0000)
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.

t/scripts.t
zpm-runscript.c

index 47ac6f35dcb32516fbf96eacd6b07fb28b1bf637..83284261a66b3a60229d206ae8fd227c84841a03 100755 (executable)
@@ -4,11 +4,15 @@
 
 . tap.sh
 
-plan 8
+plan 16
 
 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
 
@@ -22,6 +26,27 @@ zpm runscript -f $PF -p nosuchphase -R 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
+
 finish
 
 rm -f $PF
index 84764b6acf2b4d7ee46193540c7cd33a583953ee..db337beef3d9d154fa090be93c36daa43f645d4a 100644 (file)
@@ -2,13 +2,14 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
-
+#include <unistd.h>
 
 #include <sys/mman.h>
 
@@ -32,7 +33,7 @@ int run(char *program, char **args, char *output, int *status) {
        /* 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;
@@ -51,7 +52,7 @@ int run(char *program, char **args, char *output, int *status) {
 
        if (pid == 0) {
                /* child */
-               if (output) {
+               if (output && strcmp(output, "-") != 0) {
                        close(2);
                        rv = open(output, O_NOFOLLOW|O_TRUNC|O_CREAT|O_WRONLY,
                                        0600);
@@ -97,10 +98,10 @@ int main(int ac, char **av){
        int required = 0;
 
        char hash[ZPM_HASH_STRLEN+1];
-       char *args[3];
+       char *args[4];
        char *pkgid;
 
-       char *chroot = 0;
+       char *rootdir = 0;
        char *db = "/var/lib/zpm/zpm.db";
        char *script = "/var/tmp/zpm-script";
        char *output = "/var/tmp/zpm-script.out";
@@ -111,12 +112,15 @@ int main(int ac, char **av){
        }
        /* 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;
-                       case 'r': chroot = optarg; break;
+                       case 'o': output = optarg; break;
+                       case 'r': rootdir = optarg; break;
                        case 'R': required = 1; break;
                        default:
                                  usage();
@@ -151,8 +155,29 @@ int main(int ac, char **av){
                        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) {