add: --initdb to replace create applet

cute-signatures
Timo Teras 2009-01-13 20:58:08 +02:00
parent a59347fdac
commit 3309eaa900
4 changed files with 62 additions and 53 deletions

View File

@ -21,7 +21,6 @@ apk_OBJS = \
blob.o \ blob.o \
hash.o \ hash.o \
md5.o \ md5.o \
create.o \
add.o \ add.o \
del.o \ del.o \
ver.o \ ver.o \

View File

@ -9,17 +9,55 @@
* by the Free Software Foundation. See http://www.gnu.org/ for details. * by the Free Software Foundation. See http://www.gnu.org/ for details.
*/ */
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include "apk_applet.h" #include "apk_applet.h"
#include "apk_database.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) static int add_main(void *ctx, int argc, char **argv)
{ {
struct add_ctx *actx = (struct add_ctx *) ctx;
struct apk_database db; struct apk_database db;
int i; int i, r, ret = 1;
if (apk_db_open(&db, apk_root) < 0) r = apk_db_open(&db, apk_root);
return -1; 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++) { for (i = 0; i < argc; i++) {
struct apk_dependency dep; 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_deps_add(&db.world, &dep);
} }
apk_db_recalculate_and_commit(&db); ret = apk_db_recalculate_and_commit(&db);
err: err:
apk_db_close(&db); apk_db_close(&db);
return 0; return ret;
} }
static struct option add_options[] = {
{ "initdb", no_argument, NULL, 0x10000 },
};
static struct apk_applet apk_add = { static struct apk_applet apk_add = {
.name = "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, .main = add_main,
}; };

View File

@ -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);

View File

@ -511,10 +511,8 @@ int apk_db_create(const char *root)
int fd; int fd;
fchdir(apk_cwd_fd); fchdir(apk_cwd_fd);
if (chdir(root) == -1) { if (chdir(root) == -1)
apk_error("%s: %s", root, strerror(errno)); return -errno;
return -1;
}
mkdir("tmp", 01777); mkdir("tmp", 01777);
mkdir("dev", 0755); mkdir("dev", 0755);
@ -525,7 +523,7 @@ int apk_db_create(const char *root)
fd = creat("var/lib/apk/world", 0600); fd = creat("var/lib/apk/world", 0600);
if (fd < 0) if (fd < 0)
return -1; return -errno;
write(fd, deps.ptr, deps.len); write(fd, deps.ptr, deps.len);
close(fd); close(fd);
@ -551,10 +549,8 @@ static int apk_db_read_state(struct apk_database *db)
fchdir(db->root_fd); fchdir(db->root_fd);
blob = apk_blob_from_file("var/lib/apk/world"); blob = apk_blob_from_file("var/lib/apk/world");
if (APK_BLOB_IS_NULL(blob)) { if (APK_BLOB_IS_NULL(blob))
apk_error("Please run 'apk create' to initialize root"); return -ENOENT;
return -1;
}
apk_deps_parse(db, &db->world, blob); apk_deps_parse(db, &db->world, blob);
free(blob.ptr); free(blob.ptr);
@ -585,6 +581,7 @@ int apk_db_open(struct apk_database *db, const char *root)
{ {
apk_blob_t blob; apk_blob_t blob;
const char *apk_repos = getenv("APK_REPOS"); const char *apk_repos = getenv("APK_REPOS");
int r;
memset(db, 0, sizeof(*db)); memset(db, 0, sizeof(*db));
apk_hash_init(&db->available.names, &pkg_name_hash_ops, 1000); 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 = strdup(root);
db->root_fd = open(root, O_RDONLY); db->root_fd = open(root, O_RDONLY);
if (db->root_fd < 0) { if (db->root_fd < 0) {
apk_error("%s: %s", root, strerror(errno));
free(db->root); free(db->root);
return -1; return -errno;
} }
} }
blob = APK_BLOB_STR("etc:-etc/init.d"); blob = APK_BLOB_STR("etc:-etc/init.d");
apk_blob_for_each_segment(blob, ":", add_protected_path, db); apk_blob_for_each_segment(blob, ":", add_protected_path, db);
if (apk_db_read_state(db) != 0) r = apk_db_read_state(db);
return -1; if (r != 0)
return r;
if (apk_repos == NULL) if (apk_repos == NULL)
apk_repos="/etc/apk/repositories"; apk_repos="/etc/apk/repositories";