summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile1
-rw-r--r--src/add.c58
-rw-r--r--src/create.c33
-rw-r--r--src/database.c23
4 files changed, 62 insertions, 53 deletions
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 <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,
};
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 <n@tanael.org>
- * Copyright (C) 2008 Timo Teräs <timo.teras@iki.fi>
- * 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 <stdio.h>
-#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";