]> pd.if.org Git - zpackage/blobdiff - src/script.c
expand script functionality
[zpackage] / src / script.c
index 7c03b241792ae1f91ea504215b1400526580c71b..f0b173fc2a5d72b1c0626a7563d30162e184ff24 100644 (file)
@@ -125,7 +125,7 @@ static int list_scripts(void *ud, const char *pkg, const char *stage,
 int main(int ac, char **av){
        struct zpm zpm;
        int rv;
-       int status;
+       int status = 0;
        int required = 0;
        int fail = 0;
        char *pkgstr;
@@ -137,12 +137,13 @@ int main(int ac, char **av){
 
        char *rootdir = 0;
        char *db = "/var/lib/zpm/local.db";
-       char *script = "/var/tmp/zpm-script";
-       char *output = "/var/tmp/zpm-script.out";
+       char *script = 0;
+       char *output = 0;
        char *phase = 0;
-       char *envvar = 0;
-       int quiet = 0;
-       int scriptishash = 0;
+       int quiet = 0, verbose = 0;
+       int allowempty = 0, notealways = 0, makenote = 0, showoutput = 0;
+       int scriptishash = 0, notenever = 0, noteifwritable = 0;
+       size_t outsize;
        int mode = RUN;
 
        if (getenv("ZPMDB")) {
@@ -151,16 +152,8 @@ int main(int ac, char **av){
        /* ZPM_PACKAGE_FILE ? */
 
        rootdir = getenv("ZPM_ROOT_DIR");
-
-       envvar = getenv("ZPM_SCRIPT_FILE");
-       if (envvar) {
-               script = envvar;
-       }
-
-       envvar = getenv("ZPM_SCRIPT_OUTPUT");
-       if (envvar) {
-               output = envvar;
-       }
+       script = getenv("ZPM_SCRIPT_FILE");
+       output = getenv("ZPM_SCRIPT_OUTPUT");
 
        /* run, set, show, hash */
        /* set -S, if -H set the hash, output hash, unless quiet
@@ -176,7 +169,7 @@ int main(int ac, char **av){
         * show: zpm-script -l [-a] [-o outfile] <pkgid>
         * show hash: zpm-script -lh <pkgid>
         */
-       while ((opt = getopt(ac, av, "f:p:rslRFho:S:q")) != -1) {
+       while ((opt = getopt(ac, av, "f:p:rslRFho:S:qv")) != -1) {
                switch (opt) {
                        case 'f': db = optarg; break;
                        case 'p': phase = optarg; break;
@@ -185,11 +178,15 @@ int main(int ac, char **av){
                        case 'l': mode = LIST; break;
                        case 'R': rootdir = optarg; break;
                        case 'F': required = 1; break;
-
+                       case 'a': notealways = 1; break;
+                       case 'n': notenever = 1; break;
+                       case 'N': noteifwritable = 1; break;
+                       case 'e': allowempty = 1; break;
                        case 'h': scriptishash = 1; break;
                        case 'o': output = optarg; break;
                        case 'S': script = optarg; break;
                        case 'q': quiet = 1; break;
+                       case 'v': verbose = 1; break;
 
                        default:
                                  usage();
@@ -305,33 +302,79 @@ int main(int ac, char **av){
 
                if (!zpm_script_hash(&zpm, pkgid, phase, hash)) {
                        fail = SOFT;
+                       status = EXIT_FAILURE;
                        goto cleanup;
                }
 
                if (!setdir(rootdir)) {
                        fail = HARD;
+                       status = EXIT_FAILURE;
                        goto cleanup;
                }
 
                if (!zpm_extract(&zpm, hash, script, 0700)) {
                        fprintf(stderr, "unable to extract script");
                        fail = HARD;
+                       status = EXIT_FAILURE;
                        zpm_note_add(&zpm, pkgid, NULL, hash, "unable to extract %s script", phase);
                        goto cleanup;
                }
 
                rv = run(script, args, output, &status);
-               if (rv) {
-                       fprintf(stderr, "package %s script failed with code %d\n",
-                                       pkgid, rv);
-                       
-                       zpm_import(&zpm, output, 0, hash);
-                       zpm_note_add(&zpm, pkgid, NULL, hash, "package %s script failed with code %d", phase, rv);
 
+               status = WEXITSTATUS(status);
+               if (status != 0) {
                        fail = HARD;
                }
 
-               /* TODO log output */
+               if (zpm_readonly(&zpm) && noteifwritable) {
+                       notenever = 1;
+               }
+
+               if (output && !notenever) {
+                       struct stat outstat;
+                       stat(output, &outstat);
+                       outsize = outstat.st_size;
+                       if (notealways || (outsize && status && (outsize || allowempty))) {
+                               makenote = 1;
+                       }
+               }
+               
+               if (makenote) {
+                       char note[1024];
+
+                       zpm_import(&zpm, output, 0, hash);
+
+                       if (status) {
+                               sprintf(note, "%.64s script failed with code %d",
+                                               phase, status);
+
+                               fail = HARD;
+                       } else {
+                               sprintf(note, "%.64s script succeeded", phase);
+                       }
+                       zpm_note_add(&zpm, pkgid, NULL, hash, note);
+               }
+
+               if (output && showoutput) {
+                       char buf[4096];
+                       int out = open(output, O_RDONLY);
+                       ssize_t bytes;
+                       if (out == -1) {
+                               perror("can't open output file");
+                       } else {
+                               while ((bytes = read(out, buf, sizeof buf)) > 0) {
+                                       write(1, buf, bytes);
+                               }
+                               if (bytes == -1) {
+                                       perror("output file read error");
+                               }
+                       }
+                       if (out != -1) {
+                               close(out);
+                       }
+               }
+
                if (script) {
                        unlink(script);
                }
@@ -344,5 +387,5 @@ cleanup:
        free(pkgid);
        zpm_close(&zpm);
 
-       return (fail == HARD || (required && fail)) ? EXIT_FAILURE : 0;
+       return (fail == HARD || (required && fail)) ? status : 0;
 }