summaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..23de13b
--- /dev/null
+++ b/main.c
@@ -0,0 +1,91 @@
+
+#define _GNU_SOURCE
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <limits.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include "aports-cache.h"
+
+static void usage(int exitcode)
+{
+ printf("usage %s [OPTS] DIR\n"
+ "options:\n"
+ " -h,--help show this help\n"
+ " -c,--check only check if cache is updated\n"
+ " -u,--update force cache update\n"
+ " -v,--verbose enable verbose mode\n"
+ " -s,--shell PROG use PROG as shell instead of /bin/sh\n"
+ "\n", program_invocation_name);
+}
+
+int main(int argc, char *argv[])
+{
+ static struct option opts[] = {
+ {"check", no_argument, 0, 'c' },
+ {"help", no_argument, 0, 'h' },
+
+ {"verbose", no_argument, 0, 'v' },
+ {"update", no_argument, 0, 'u' },
+ {"shell", required_argument, 0, 's' },
+ { 0, 0, 0, 0}
+ };
+ int i, c, verbose=0, check_only=0, force_update=0;
+ const char *cachefile = ".aports.cache.yaml";
+ char dirpath_buf[PATH_MAX];
+ char *dirpath = dirpath_buf;
+ int dirfd;
+
+ char *shell_argv[] = {"/bin/sh", NULL};
+
+ while ((c = getopt_long(argc, argv, "fs:v", opts, &i)) != -1) {
+ switch(c) {
+ case 'c':
+ check_only = 1;
+ break;
+ case 'h':
+ usage(0);
+ break;
+ case 's':
+ shell_argv[0] = optarg;
+ break;
+ case 'u':
+ force_update = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ }
+ }
+
+ if (optind < argc) {
+ dirpath = argv[optind];
+ } else {
+ dirpath = getcwd(dirpath_buf, sizeof(dirpath_buf));
+ }
+
+ dirfd = open(dirpath, O_DIRECTORY);
+ if (dirfd < 0)
+ err(1, "%s", dirpath);
+ fchdir(dirfd);
+
+ if (!force_update)
+ c =aports_cache_check(dirfd, cachefile);
+
+ if (check_only || !c) {
+ if (verbose)
+ printf("cache is %sup to date\n", c ? "not " : "");
+ return c;
+ }
+
+ if (verbose)
+ printf("updating cache for %s\n", dirpath);
+ aports_cache_refresh(dirfd, cachefile, shell_argv);
+ close(dirfd);
+
+ return 0;
+}
+