From 3309eaa90008dcd4febf907f619a2f4f060d08b6 Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Tue, 13 Jan 2009 20:58:08 +0200 Subject: [PATCH] add: --initdb to replace create applet --- src/Makefile | 1 - src/add.c | 58 ++++++++++++++++++++++++++++++++++++++++++++------ src/create.c | 33 ---------------------------- src/database.c | 23 +++++++++----------- 4 files changed, 62 insertions(+), 53 deletions(-) delete mode 100644 src/create.c diff --git a/src/Makefile b/src/Makefile index 74cab62..745e1da 100644 --- a/src/Makefile +++ b/src/Makefile @@ -21,7 +21,6 @@ apk_OBJS = \ blob.o \ hash.o \ md5.o \ - create.o \ add.o \ del.o \ ver.o \ 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 #include #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, }; diff --git a/src/create.c b/src/create.c deleted file mode 100644 index d12abfb..0000000 --- a/src/create.c +++ /dev/null @@ -1,33 +0,0 @@ -/* create.c - Alpine Package Keeper (APK) - * - * Copyright (C) 2005-2008 Natanael Copa - * Copyright (C) 2008 Timo Teräs - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. See http://www.gnu.org/ for details. - */ - -#include -#include "apk_applet.h" -#include "apk_database.h" - -static int create_main(void *ctx, int argc, char **argv) -{ - if (strcmp(apk_root, "/") == 0) { - apk_error("Will not recreate system root."); - return 1; - } - - return apk_db_create(apk_root); -} - -static struct apk_applet apk_create = { - .name = "create", - .usage = "", - .main = create_main, -}; - -APK_DEFINE_APPLET(apk_create); - diff --git a/src/database.c b/src/database.c index 6c21f50..d0207f2 100644 --- a/src/database.c +++ b/src/database.c @@ -511,10 +511,8 @@ int apk_db_create(const char *root) int fd; fchdir(apk_cwd_fd); - if (chdir(root) == -1) { - apk_error("%s: %s", root, strerror(errno)); - return -1; - } + if (chdir(root) == -1) + return -errno; mkdir("tmp", 01777); mkdir("dev", 0755); @@ -525,7 +523,7 @@ int apk_db_create(const char *root) fd = creat("var/lib/apk/world", 0600); if (fd < 0) - return -1; + return -errno; write(fd, deps.ptr, deps.len); close(fd); @@ -551,10 +549,8 @@ static int apk_db_read_state(struct apk_database *db) fchdir(db->root_fd); blob = apk_blob_from_file("var/lib/apk/world"); - if (APK_BLOB_IS_NULL(blob)) { - apk_error("Please run 'apk create' to initialize root"); - return -1; - } + if (APK_BLOB_IS_NULL(blob)) + return -ENOENT; apk_deps_parse(db, &db->world, blob); free(blob.ptr); @@ -585,6 +581,7 @@ int apk_db_open(struct apk_database *db, const char *root) { apk_blob_t blob; const char *apk_repos = getenv("APK_REPOS"); + int r; memset(db, 0, sizeof(*db)); apk_hash_init(&db->available.names, &pkg_name_hash_ops, 1000); @@ -597,17 +594,17 @@ int apk_db_open(struct apk_database *db, const char *root) db->root = strdup(root); db->root_fd = open(root, O_RDONLY); if (db->root_fd < 0) { - apk_error("%s: %s", root, strerror(errno)); free(db->root); - return -1; + return -errno; } } blob = APK_BLOB_STR("etc:-etc/init.d"); apk_blob_for_each_segment(blob, ":", add_protected_path, db); - if (apk_db_read_state(db) != 0) - return -1; + r = apk_db_read_state(db); + if (r != 0) + return r; if (apk_repos == NULL) apk_repos="/etc/apk/repositories";