add: --initdb to replace create applet
parent
a59347fdac
commit
3309eaa900
|
@ -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 \
|
||||||
|
|
58
src/add.c
58
src/add.c
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
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;
|
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";
|
||||||
|
|
Loading…
Reference in New Issue