summaryrefslogtreecommitdiffstats
path: root/src/add.c
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2009-01-13 20:58:08 +0200
committerTimo Teras <timo.teras@iki.fi>2009-01-13 20:58:08 +0200
commit3309eaa90008dcd4febf907f619a2f4f060d08b6 (patch)
treee49dbfbb7c534060170bada25b06ecd14dfcfb5b /src/add.c
parenta59347fdacd80e26394e519e578ba73de729e7a2 (diff)
downloadapk-tools-3309eaa90008dcd4febf907f619a2f4f060d08b6.tar.bz2
apk-tools-3309eaa90008dcd4febf907f619a2f4f060d08b6.tar.xz
add: --initdb to replace create applet
Diffstat (limited to 'src/add.c')
-rw-r--r--src/add.c58
1 files changed, 52 insertions, 6 deletions
diff --git a/src/add.c b/src/add.c
index 2716fe4..d8cb62a 100644
--- a/src/add.c
+++ b/src/add.c
@@ -9,17 +9,55 @@
* by the Free Software Foundation. See http://www.gnu.org/ for details.
*/
+#include <errno.h>
#include <stdio.h>
#include "apk_applet.h"
#include "apk_database.h"
+#define FLAG_INITDB 0x001
+
+struct add_ctx {
+ unsigned int flags;
+};
+
+static int add_parse(void *ctx, int optch, int optindex, const char *optarg)
+{
+ struct add_ctx *actx = (struct add_ctx *) ctx;
+
+ switch (optch) {
+ case 0x10000:
+ actx->flags |= FLAG_INITDB;
+ break;
+ default:
+ return -1;
+ }
+ return 0;
+}
+
static int add_main(void *ctx, int argc, char **argv)
{
+ struct add_ctx *actx = (struct add_ctx *) ctx;
struct apk_database db;
- int i;
+ int i, r, ret = 1;
- if (apk_db_open(&db, apk_root) < 0)
- return -1;
+ r = apk_db_open(&db, apk_root);
+ if ((r == -ENOENT) && (actx->flags & FLAG_INITDB)) {
+ if (strcmp(apk_root, "/") == 0) {
+ apk_error("Will not recreate system root.");
+ return 1;
+ }
+ r = apk_db_create(apk_root);
+ if (r != 0) {
+ apk_error("Failed to create apkdb: %s",
+ strerror(-r));
+ return 1;
+ }
+ r = apk_db_open(&db, apk_root);
+ }
+ if (r != 0) {
+ apk_error("APK database not present (use --initdb to create one)");
+ return 1;
+ }
for (i = 0; i < argc; i++) {
struct apk_dependency dep;
@@ -45,15 +83,23 @@ static int add_main(void *ctx, int argc, char **argv)
}
apk_deps_add(&db.world, &dep);
}
- apk_db_recalculate_and_commit(&db);
+ ret = apk_db_recalculate_and_commit(&db);
err:
apk_db_close(&db);
- return 0;
+ return ret;
}
+static struct option add_options[] = {
+ { "initdb", no_argument, NULL, 0x10000 },
+};
+
static struct apk_applet apk_add = {
.name = "add",
- .usage = "apkname...",
+ .usage = "[--initdb] apkname...",
+ .context_size = sizeof(struct add_ctx),
+ .num_options = ARRAY_SIZE(add_options),
+ .options = add_options,
+ .parse = add_parse,
.main = add_main,
};