Merge "afm-user-daemon: Remove it by default"
[src/app-framework-main.git] / src / wgtpkg-sign.c
index cd506fc..76abce1 100644 (file)
@@ -1,5 +1,7 @@
 /*
- Copyright 2015 IoT.bzh
+ Copyright (C) 2015-2019 IoT.bzh
+
+ author: José Bollo <jose.bollo@iot.bzh>
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
 #include <unistd.h>
 #include <limits.h>
 #include <errno.h>
-#include <syslog.h>
 #include <getopt.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
-#include "wgtpkg.h"
+#include <libxml/tree.h>
+
+#include "verbose.h"
+#include "wgtpkg-files.h"
+#include "wgtpkg-workdir.h"
+#include "wgtpkg-digsig.h"
+#include "wgtpkg-xmlsec.h"
 
 #if !defined(MAXCERT)
 #define MAXCERT 20
@@ -47,16 +54,30 @@ static unsigned int get_number(const char *value)
 
        val = strtoul(value, &end, 10);
        if (*end || 0 == val || val >= UINT_MAX || *value == '-') {
-               syslog(LOG_ERR, "bad number value %s", value);
+               ERROR("bad number value %s", value);
                exit(1);
        }
        return (unsigned int)val;
 }
 
+static void version()
+{
+       printf(
+               "\n"
+               "  %s  version="AFM_VERSION"\n"
+               "\n"
+               "  Copyright (C) 2015-2019 \"IoT.bzh\"\n"
+               "  AFB comes with ABSOLUTELY NO WARRANTY.\n"
+               "  Licence Apache 2\n"
+               "\n",
+               appname
+       );
+}
+
 static void usage()
 {
        printf(
-               "usage: %s [-f] [-k keyfile] [-c certfile]... [-o wgtfile] [-d number | -a] directory\n"
+               "usage: %s [-f] [-k keyfile] [-c certfile]... [-d number | -a] directory\n"
                "\n"
                "   -k keyfile       the private key to use for author signing\n"
                "   -c certfile      the certificate(s) to use for author signing\n"
@@ -65,6 +86,7 @@ static void usage()
                "   -f               force overwriting\n"
                "   -q               quiet\n"
                "   -v               verbose\n"
+               "   -V               version\n"
                "\n",
                appname
        );
@@ -79,6 +101,7 @@ static struct option options[] = {
        { "help",        no_argument,       NULL, 'h' },
        { "quiet",       no_argument,       NULL, 'q' },
        { "verbose",     no_argument,       NULL, 'v' },
+       { "version",     no_argument,       NULL, 'V' },
        { NULL, 0, NULL, 0 }
 };
 
@@ -90,19 +113,19 @@ int main(int ac, char **av)
        char *keyfile, *certfiles[MAXCERT+1], *directory, **x;
        struct stat s;
 
-       openlog(appname, LOG_PERROR, LOG_USER);
+       LOGUSER(appname);
 
        force = ncert = author = 0;
        number = UINT_MAX;
        keyfile = directory = NULL;
        for (;;) {
-               i = getopt_long(ac, av, "hfak:c:d:", options, NULL);
+               i = getopt_long(ac, av, "hfqvVak:c:d:", options, NULL);
                if (i < 0)
                        break;
                switch (i) {
                case 'c':
                        if (ncert == MAXCERT) {
-                               syslog(LOG_ERR, "maximum count of certificates reached");
+                               ERROR("maximum count of certificates reached");
                                return 1;
                        }
                        certfiles[ncert++] = optarg;
@@ -112,15 +135,23 @@ int main(int ac, char **av)
                case 'f': force = 1; continue;
                case 'a': author = 1; continue;
                case 'h': usage(); return 0;
+               case 'V': version(); return 0;
+               case 'q':
+                       if (verbosity)
+                               verbosity--;
+                       break;
+               case 'v':
+                       verbosity++;
+                       break;
                case ':':
-                       syslog(LOG_ERR, "missing argument");
+                       ERROR("missing argument");
                        return 1;
                default:
-                       syslog(LOG_ERR, "unrecognized option");
+                       ERROR("unrecognized option");
                        return 1;
                }
                if (*x != NULL) {
-                       syslog(LOG_ERR, "option set twice");
+                       ERROR("option set twice");
                        return 1;
                }
                *x = optarg;
@@ -128,12 +159,12 @@ int main(int ac, char **av)
 
        /* remaining arguments and final checks */
        if (optind >= ac) {
-               syslog(LOG_ERR, "no directory set");
+               ERROR("no directory set");
                return 1;
        }
        directory = av[optind++];
        if (optind < ac) {
-               syslog(LOG_ERR, "extra parameters found");
+               ERROR("extra parameters found");
                return 1;
        }
 
@@ -145,20 +176,20 @@ int main(int ac, char **av)
 
        /* check values */
        if (stat(directory, &s)) {
-               syslog(LOG_ERR, "can't find directory %s", directory);
+               ERROR("can't find directory %s", directory);
                return 1;
        }
        if (!S_ISDIR(s.st_mode)) {
-               syslog(LOG_ERR, "%s isn't a directory", directory);
+               ERROR("%s isn't a directory", directory);
                return 1;
        }
        if (access(keyfile, R_OK) != 0) {
-               syslog(LOG_ERR, "can't access private key %s", keyfile);
+               ERROR("can't access private key %s", keyfile);
                return 1;
        }
        for(i = 0 ; i < ncert ; i++) 
                if (access(certfiles[i], R_OK) != 0) {
-                       syslog(LOG_ERR, "can't access certificate %s", certfiles[i]);
+                       ERROR("can't access certificate %s", certfiles[i]);
                        return 1;
                }
 
@@ -168,14 +199,14 @@ int main(int ac, char **av)
 
 
        /* compute absolutes paths */
-#define rp(x) do { char *p = realpath(x, NULL); if (p != NULL) x = p; else { syslog(LOG_ERR, "realpath failed for %s",x); return 1; } } while(0)
+#define rp(x) do { char *p = realpath(x, NULL); if (p != NULL) x = p; else { ERROR("realpath failed for %s",x); return 1; } } while(0)
        rp(keyfile);
        for(i = 0 ; i < ncert ; i++) 
                rp(certfiles[i]);
 #undef rp
 
        /* set and enter the workdir */
-       if (set_workdir(directory, 0) || enter_workdir(0))
+       if (set_workdir(directory, 0))
                return 1;
 
        if (fill_files())
@@ -187,11 +218,11 @@ int main(int ac, char **av)
                for (number = 1; get_signature(number) != NULL ; number++);
 
        if (!force && get_signature(number) != NULL) {
-               syslog(LOG_ERR, "can't overwrite existing signature %s", get_signature(number)->name);
+               ERROR("can't overwrite existing signature %s", get_signature(number)->name);
                return 1;
        }
 
-       notice("-- SIGNING content of directory %s for number %u", directory, number);
+       NOTICE("-- SIGNING content of directory %s for number %u", directory, number);
 
        certfiles[ncert] = NULL;
        return !!create_digsig(number, keyfile, (const char**)certfiles);