add: --initdb to replace create applet
parent
a59347fdac
commit
3309eaa900
|
@ -21,7 +21,6 @@ apk_OBJS = \
|
|||
blob.o \
|
||||
hash.o \
|
||||
md5.o \
|
||||
create.o \
|
||||
add.o \
|
||||
del.o \
|
||||
ver.o \
|
||||
|
|
58
src/add.c
58
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,
|
||||
};
|
||||
|
||||
|
|
33
src/create.c
33
src/create.c
|
@ -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);
|
||||
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue