diff --git a/configure.ac b/configure.ac index e6f0b28..76ceb94 100644 --- a/configure.ac +++ b/configure.ac @@ -39,6 +39,21 @@ UL_WARN_ADD([-pedantic]) AC_SUBST([WARN_CFLAGS]) +##### configuration options ##### + +AC_DEFINE([REPODIR], ["./"], [Default package repository directory]) +AC_DEFINE([INSTALLROOT], ["./"], [Default package installation root]) + +AC_ARG_WITH([repo-dir], + [AS_HELP_STRING([--with-repo-dir], + [Set the default package repository directory])], + [AC_DEFINE_UNQUOTED([REPODIR], "$withval")]) + +AC_ARG_WITH([install-root], + [AS_HELP_STRING([--with-install-root], + [Set the default package installation directory])], + [AC_DEFINE_UNQUOTED([INSTALLROOT], "$withval")]) + ##### search for dependencies ##### have_zlib="no" diff --git a/main/cmd/depgraph.c b/main/cmd/depgraph.c index e2865ee..5a49253 100644 --- a/main/cmd/depgraph.c +++ b/main/cmd/depgraph.c @@ -9,6 +9,7 @@ #include "depgraph.h" #include "command.h" +#include "config.h" static const struct option long_opts[] = { { "no-dependencies", no_argument, NULL, 'd' }, @@ -37,7 +38,7 @@ static void print_dot_graph(struct pkg_dep_list *list) static int cmd_depgraph(int argc, char **argv) { - int i, repofd = AT_FDCWD, ret = EXIT_FAILURE; + int i, repofd = -1, ret = EXIT_FAILURE; struct pkg_dep_list list; bool resolve_deps = true; @@ -53,7 +54,7 @@ static int cmd_depgraph(int argc, char **argv) resolve_deps = false; break; case 'R': - if (repofd != AT_FDCWD) { + if (repofd != -1) { fputs("repo specified more than once\n", stderr); tell_read_help(argv[0]); @@ -71,6 +72,14 @@ static int cmd_depgraph(int argc, char **argv) } } + if (repofd == -1) { + repofd = open(REPODIR, O_RDONLY | O_DIRECTORY); + if (repofd < 0) { + perror(REPODIR); + goto out; + } + } + for (i = optind; i < argc; ++i) { if (append_pkg(&list, argv[i]) == NULL) goto out; @@ -84,7 +93,7 @@ static int cmd_depgraph(int argc, char **argv) print_dot_graph(&list); ret = EXIT_SUCCESS; out: - if (repofd != AT_FDCWD) + if (repofd != -1) close(repofd); pkg_list_cleanup(&list); return ret; @@ -101,6 +110,7 @@ static command_t depgraph = { "Possible options:\n" " --repo-dir, -R Specify the input repository path to fetch the\n" " packages from.\n" +" If not set, defaults to " REPODIR ".\n" " --no-dependencies, -d Do not resolve dependencies, only process the\n" " packages listed on the command line.\n", .run_cmd = cmd_depgraph, diff --git a/main/cmd/install.c b/main/cmd/install.c index 9295e27..847b6b2 100644 --- a/main/cmd/install.c +++ b/main/cmd/install.c @@ -11,6 +11,7 @@ #include "util/util.h" #include "depgraph.h" #include "command.h" +#include "config.h" enum { INSTALL_MODE_INSTALL = 0, @@ -95,8 +96,8 @@ static int list_files(int repofd, const char *rootdir, TOC_FORMAT format, static int cmd_install(int argc, char **argv) { - int i, rootfd = AT_FDCWD, repofd = AT_FDCWD, flags = 0; int ret = EXIT_FAILURE, mode = INSTALL_MODE_INSTALL; + int i, rootfd = -1, repofd = -1, flags = 0; TOC_FORMAT format = TOC_FORMAT_PRETTY; const char *rootdir = NULL; struct pkg_dep_list list; @@ -131,7 +132,7 @@ static int cmd_install(int argc, char **argv) } break; case 'R': - if (repofd != AT_FDCWD) { + if (repofd != -1) { fputs("repo specified more than once\n", stderr); tell_read_help(argv[0]); @@ -144,7 +145,7 @@ static int cmd_install(int argc, char **argv) } break; case 'r': - if (rootfd != AT_FDCWD) { + if (rootfd != -1) { fputs("root specified more than once\n", stderr); tell_read_help(argv[0]); @@ -180,6 +181,22 @@ static int cmd_install(int argc, char **argv) } } + if (repofd == -1) { + repofd = open(REPODIR, O_RDONLY | O_DIRECTORY); + if (repofd < 0) { + perror(REPODIR); + goto out; + } + } + + if (rootfd == -1) { + rootfd = open(INSTALLROOT, O_RDONLY | O_DIRECTORY); + if (rootfd < 0) { + perror(INSTALLROOT); + goto out; + } + } + for (i = optind; i < argc; ++i) { if (append_pkg(&list, argv[i]) == NULL) goto out; @@ -209,9 +226,9 @@ static int cmd_install(int argc, char **argv) ret = EXIT_SUCCESS; out: - if (rootfd != AT_FDCWD) + if (rootfd != -1) close(rootfd); - if (repofd != AT_FDCWD) + if (repofd != -1) close(repofd); pkg_list_cleanup(&list); return ret; @@ -229,11 +246,12 @@ static command_t install = { "Possible options:\n" " --repo-dir, -R Specify the input repository path to fetch the\n" " packages from.\n" -" --root, -r A root directory to unpack the package. Default\n" -" if not set is the current working directory.\n" +" If not set, defaults to " REPODIR ".\n" +" --root, -r A root directory to unpack the package.\n" +" If not set, defaults to " INSTALLROOT ".\n" " --no-chown, -o Do not change ownership of the extracted data.\n" " Keep the uid/gid of the user who runs the \n" -" program." +" program.\n" " --no-chmod, -m Do not change permission flags of the extarcted\n" " data. Use 0644 for all files and 0755 for all\n" " directories.\n" diff --git a/main/cmd/pack/pack.c b/main/cmd/pack/pack.c index 15c0d90..f26d2b6 100644 --- a/main/cmd/pack/pack.c +++ b/main/cmd/pack/pack.c @@ -65,9 +65,7 @@ static int cmd_pack(int argc, char **argv) } if (repodir == NULL) { - fputs("missing argument: repository directory\n", stderr); - tell_read_help(argv[0]); - return EXIT_FAILURE; + repodir = REPODIR; } if (optind < argc) @@ -117,6 +115,7 @@ static command_t pack = { " --file-list, -l Specify a file containing a list of input files.\n" " --repo-dir, -r Specify the output repository path to store the\n" " package in.\n" +" If not set, defaults to " REPODIR ".\n" " --description, -d Specify a file containing a description of the\n" " package, including information such as package\n" " dependencies, the actual package name, etc.\n" diff --git a/main/cmd/pack/pack.h b/main/cmd/pack/pack.h index 8f155dc..57b1e8e 100644 --- a/main/cmd/pack/pack.h +++ b/main/cmd/pack/pack.h @@ -25,6 +25,7 @@ #include "pkg/pkgformat.h" #include "pkg/pkgwriter.h" #include "command.h" +#include "config.h" typedef struct dependency_t { struct dependency_t *next;