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 \
hash.o \
md5.o \
create.o \
add.o \
del.o \
ver.o \

View File

@ -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,
};

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;
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";