diff options
author | José Bollo <jose.bollo@iot.bzh> | 2015-12-10 16:39:05 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2015-12-10 16:39:05 +0100 |
commit | f3d64b7c741677cd28e2a11deed67196cd02b46a (patch) | |
tree | 57b6ee3ca5a206d78a39dbcdae49cac5a75ae59a /src/wgtpkg-info.c | |
parent | 63f8720a3e610c0dc37bda3138d2e8de98ec1a78 (diff) |
added info retrieval
Change-Id: I6f91b15e87308cf01db4ddafa3c2715c251f5fe5
Diffstat (limited to 'src/wgtpkg-info.c')
-rw-r--r-- | src/wgtpkg-info.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/wgtpkg-info.c b/src/wgtpkg-info.c new file mode 100644 index 0000000..1a7724b --- /dev/null +++ b/src/wgtpkg-info.c @@ -0,0 +1,182 @@ +/* + Copyright 2015 IoT.bzh + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#define _BSD_SOURCE /* see readdir */ + +#include <stdlib.h> +#include <stdio.h> +#include <dirent.h> +#include <unistd.h> +#include <limits.h> +#include <errno.h> +#include <syslog.h> +#include <getopt.h> + +#include "verbose.h" +#include "wgtpkg.h" +#include "wgt.h" +#include "wgt-info.h" + +static const char appname[] = "wgtpkg-info"; + +static void show(const char *wgtfile); + +static void usage() +{ + printf( + "usage: %s [-f] [-q] [-v] wgtfile...\n" + "\n" + " -q quiet\n" + " -v verbose\n" + "\n", + appname + ); +} + +static struct option options[] = { + { "help", no_argument, NULL, 'h' }, + { "quiet", no_argument, NULL, 'q' }, + { "verbose", no_argument, NULL, 'v' }, + { NULL, 0, NULL, 0 } +}; + +/* info the widgets of the list */ +int main(int ac, char **av) +{ + int i; + char *wpath; + + openlog(appname, LOG_PERROR, LOG_USER); + + xmlsec_init(); + + for (;;) { + i = getopt_long(ac, av, "hqv", options, NULL); + if (i < 0) + break; + switch (i) { + case 'h': + usage(); + return 0; + case 'q': + if (verbosity) + verbosity--; + break; + case 'v': + verbosity++; + break; + case ':': + syslog(LOG_ERR, "missing argument value"); + return 1; + default: + syslog(LOG_ERR, "unrecognized option"); + return 1; + } + } + + /* canonic names for files */ + av += optind; + for (i = 0 ; av[i] != NULL ; i++) { + wpath = realpath(av[i], NULL); + if (wpath == NULL) { + syslog(LOG_ERR, "error while getting realpath of %dth widget: %s", i+1, av[i]); + return 1; + } + av[i] = wpath; + } + + /* info widgets */ + for ( ; *av ; av++) + show(*av); + + return 0; +} + +static struct wgt *wgt_at_workdir() +{ + int rc, wfd; + struct wgt *wgt; + + wfd = workdirfd(); + if (wfd < 0) + return NULL; + + wgt = wgt_create(); + if (!wgt) { + syslog(LOG_ERR, "failed to allocate wgt"); + close(wfd); + return NULL; + } + + rc = wgt_connectat(wgt, wfd, NULL); + if (rc) { + syslog(LOG_ERR, "failed to connect wgt to workdir"); + close(wfd); + wgt_unref(wgt); + return NULL; + } + + return wgt; +} + + +static int check_and_show() +{ + struct wgt *wgt; + struct wgt_info *ifo; + + wgt = wgt_at_workdir(); + if (!wgt) + return -1; + + ifo = wgt_info_get(wgt, 1, 1, 1); + if (!ifo) { + wgt_unref(wgt); + return -1; + } + wgt_info_dump(ifo, 1, ""); + wgt_info_unref(ifo); + wgt_unref(wgt); + return 0; +} + +/* install the widget of the file */ +static void show(const char *wgtfile) +{ + notice("-- INFO for widget %s --", wgtfile); + + /* workdir */ + if (make_workdir_base("/tmp", "UNPACK", 0)) { + syslog(LOG_ERR, "failed to create a working directory"); + return; + } + + if (enter_workdir(0)) + goto error2; + + if (zread(wgtfile, 0)) + goto error2; + + if (check_all_signatures()) + goto error2; + + check_and_show(); + +error2: + remove_workdir(); + return; +} + |