Commit fe41ae07 authored by Timo Teräs's avatar Timo Teräs

apk: use string array in applet mains, separate apk_name_foreach_matching

parent c51d82f8
...@@ -58,13 +58,14 @@ static int non_repository_check(struct apk_database *db) ...@@ -58,13 +58,14 @@ static int non_repository_check(struct apk_database *db)
return 1; return 1;
} }
static int add_main(void *ctx, struct apk_database *db, int argc, char **argv) static int add_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct add_ctx *actx = (struct add_ctx *) ctx; struct add_ctx *actx = (struct add_ctx *) ctx;
struct apk_package *virtpkg = NULL; struct apk_package *virtpkg = NULL;
struct apk_dependency virtdep; struct apk_dependency virtdep;
struct apk_dependency_array *world = NULL; struct apk_dependency_array *world = NULL;
int i, r = 0; char **parg;
int r = 0;
apk_dependency_array_copy(&world, db->world); apk_dependency_array_copy(&world, db->world);
...@@ -96,10 +97,10 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -96,10 +97,10 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv)
virtpkg = apk_db_pkg_add(db, virtpkg); virtpkg = apk_db_pkg_add(db, virtpkg);
} }
for (i = 0; i < argc; i++) { foreach_array_item(parg, args) {
struct apk_dependency dep; struct apk_dependency dep;
if (strstr(argv[i], ".apk") != NULL) { if (strstr(*parg, ".apk") != NULL) {
struct apk_package *pkg = NULL; struct apk_package *pkg = NULL;
struct apk_sign_ctx sctx; struct apk_sign_ctx sctx;
...@@ -108,20 +109,20 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -108,20 +109,20 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv)
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY_AND_GENERATE, apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY_AND_GENERATE,
NULL, db->keys_fd); NULL, db->keys_fd);
r = apk_pkg_read(db, argv[i], &sctx, &pkg); r = apk_pkg_read(db, *parg, &sctx, &pkg);
apk_sign_ctx_free(&sctx); apk_sign_ctx_free(&sctx);
if (r != 0) { if (r != 0) {
apk_error("%s: %s", argv[i], apk_error_str(r)); apk_error("%s: %s", *parg, apk_error_str(r));
return -1; return -1;
} }
apk_dep_from_pkg(&dep, db, pkg); apk_dep_from_pkg(&dep, db, pkg);
} else { } else {
apk_blob_t b = APK_BLOB_STR(argv[i]); apk_blob_t b = APK_BLOB_STR(*parg);
apk_blob_pull_dep(&b, db, &dep); apk_blob_pull_dep(&b, db, &dep);
if (APK_BLOB_IS_NULL(b) || b.len > 0) { if (APK_BLOB_IS_NULL(b) || b.len > 0) {
apk_error("'%s' is not a valid dependency, format is name(@tag)([<>=]version)", apk_error("'%s' is not a valid dependency, format is name(@tag)([<>=]version)",
argv[i]); *parg);
return -1; return -1;
} }
} }
......
...@@ -291,6 +291,7 @@ int main(int argc, char **argv) ...@@ -291,6 +291,7 @@ int main(int argc, char **argv)
struct apk_repository_list *repo = NULL; struct apk_repository_list *repo = NULL;
struct apk_database db; struct apk_database db;
struct apk_db_options dbopts; struct apk_db_options dbopts;
struct apk_string_array *args;
#ifdef TEST_MODE #ifdef TEST_MODE
const char *test_installed_db = NULL; const char *test_installed_db = NULL;
const char *test_world = NULL; const char *test_world = NULL;
...@@ -495,7 +496,11 @@ int main(int argc, char **argv) ...@@ -495,7 +496,11 @@ int main(int argc, char **argv)
} }
#endif #endif
r = applet->main(ctx, &db, argc, argv); apk_string_array_init(&args);
apk_string_array_resize(&args, argc);
memcpy(args->item, argv, argc * sizeof(*argv));
r = applet->main(ctx, &db, args);
apk_db_close(&db); apk_db_close(&db);
if (r == -EINVAL) if (r == -EINVAL)
......
...@@ -36,7 +36,7 @@ struct apk_applet { ...@@ -36,7 +36,7 @@ struct apk_applet {
int (*parse)(void *ctx, struct apk_db_options *dbopts, int (*parse)(void *ctx, struct apk_db_options *dbopts,
int optch, int optindex, const char *optarg); int optch, int optindex, const char *optarg);
int (*main)(void *ctx, struct apk_database *db, int argc, char **argv); int (*main)(void *ctx, struct apk_database *db, struct apk_string_array *args);
}; };
extern struct apk_applet *__start_apkapplets, *__stop_apkapplets; extern struct apk_applet *__start_apkapplets, *__stop_apkapplets;
......
...@@ -90,8 +90,13 @@ struct apk_name { ...@@ -90,8 +90,13 @@ struct apk_name {
union { union {
struct apk_solver_name_state ss; struct apk_solver_name_state ss;
void *state_ptr; struct {
int state_int; unsigned int foreach_genid;
union {
void *state_ptr;
int state_int;
};
};
}; };
}; };
...@@ -239,4 +244,8 @@ int apk_db_install_pkg(struct apk_database *db, ...@@ -239,4 +244,8 @@ int apk_db_install_pkg(struct apk_database *db,
struct apk_package *newpkg, struct apk_package *newpkg,
apk_progress_cb cb, void *cb_ctx); apk_progress_cb cb, void *cb_ctx);
void apk_name_foreach_matching(struct apk_database *db, struct apk_string_array *filter, unsigned int match,
void (*cb)(struct apk_database *db, const char *match, struct apk_name *name, void *ctx),
void *ctx);
#endif #endif
...@@ -236,39 +236,40 @@ done: ...@@ -236,39 +236,40 @@ done:
return reason < 0 ? reason : 0; return reason < 0 ? reason : 0;
} }
static int audit_main(void *ctx, struct apk_database *db, int argc, char **argv) static int audit_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct audit_tree_ctx atctx; struct audit_tree_ctx atctx;
int i, r = 0; char **parg, *arg;
int r = 0;
atctx.db = db; atctx.db = db;
atctx.actx = (struct audit_ctx *) ctx; atctx.actx = (struct audit_ctx *) ctx;
atctx.pathlen = 0; atctx.pathlen = 0;
atctx.path[0] = 0; atctx.path[0] = 0;
if (argc == 0) { if (args->num == 0) {
atctx.dir = apk_db_dir_get(db, APK_BLOB_PTR_LEN(atctx.path, atctx.pathlen)); atctx.dir = apk_db_dir_get(db, APK_BLOB_PTR_LEN(atctx.path, atctx.pathlen));
r = apk_dir_foreach_file(dup(db->root_fd), audit_directory_tree_item, &atctx); r = apk_dir_foreach_file(dup(db->root_fd), audit_directory_tree_item, &atctx);
apk_db_dir_unref(db, atctx.dir, FALSE); apk_db_dir_unref(db, atctx.dir, FALSE);
} else { return r;
for (i = 0; i < argc; i++) { }
if (argv[i][0] != '/') {
apk_warning("%s: relative path skipped.\n", foreach_array_item(parg, args) {
argv[i]); arg = *parg;
continue; if (arg[0] != '/') {
} apk_warning("%s: relative path skipped.\n", arg);
argv[i]++; continue;
atctx.pathlen = strlen(argv[i]);
memcpy(atctx.path, argv[i], atctx.pathlen);
if (atctx.path[atctx.pathlen-1] != '/')
atctx.path[atctx.pathlen++] = '/';
atctx.dir = apk_db_dir_get(db, APK_BLOB_PTR_LEN(atctx.path, atctx.pathlen));
r |= apk_dir_foreach_file(
openat(db->root_fd, argv[i], O_RDONLY|O_CLOEXEC),
audit_directory_tree_item, &atctx);
apk_db_dir_unref(db, atctx.dir, FALSE);
} }
arg++;
atctx.pathlen = strlen(arg);
memcpy(atctx.path, arg, atctx.pathlen);
if (atctx.path[atctx.pathlen-1] != '/')
atctx.path[atctx.pathlen++] = '/';
atctx.dir = apk_db_dir_get(db, APK_BLOB_PTR_LEN(atctx.path, atctx.pathlen));
r |= apk_dir_foreach_file(openat(db->root_fd, arg, O_RDONLY|O_CLOEXEC),
audit_directory_tree_item, &atctx);
apk_db_dir_unref(db, atctx.dir, FALSE);
} }
return r; return r;
} }
......
...@@ -111,18 +111,20 @@ static int cache_clean(struct apk_database *db) ...@@ -111,18 +111,20 @@ static int cache_clean(struct apk_database *db)
return apk_db_cache_foreach_item(db, cache_clean_item); return apk_db_cache_foreach_item(db, cache_clean_item);
} }
static int cache_main(void *ctx, struct apk_database *db, int argc, char **argv) static int cache_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
{ {
char *arg;
int r = 0, actions = 0; int r = 0, actions = 0;
if (argc != 1) if (args->num != 1)
return -EINVAL; return -EINVAL;
if (strcmp(argv[0], "sync") == 0) arg = args->item[0];
if (strcmp(arg, "sync") == 0)
actions = CACHE_CLEAN | CACHE_DOWNLOAD; actions = CACHE_CLEAN | CACHE_DOWNLOAD;
else if (strcmp(argv[0], "clean") == 0) else if (strcmp(arg, "clean") == 0)
actions = CACHE_CLEAN; actions = CACHE_CLEAN;
else if (strcmp(argv[0], "download") == 0) else if (strcmp(arg, "download") == 0)
actions = CACHE_DOWNLOAD; actions = CACHE_DOWNLOAD;
else else
return -EINVAL; return -EINVAL;
...@@ -137,7 +139,6 @@ static int cache_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -137,7 +139,6 @@ static int cache_main(void *ctx, struct apk_database *db, int argc, char **argv)
r = cache_clean(db); r = cache_clean(db);
if (r == 0 && (actions & CACHE_DOWNLOAD)) if (r == 0 && (actions & CACHE_DOWNLOAD))
r = cache_download(db); r = cache_download(db);
err: err:
return r; return r;
} }
......
...@@ -2673,3 +2673,80 @@ ret_r: ...@@ -2673,3 +2673,80 @@ ret_r:
free(script_args[2]); free(script_args[2]);
return r; return r;
} }
struct match_ctx {
struct apk_database *db;
struct apk_string_array *filter;
unsigned int match;
void (*cb)(struct apk_database *db, const char *match, struct apk_name *name, void *ctx);
void *cb_ctx;
};
static int match_names(apk_hash_item item, void *pctx)
{
struct match_ctx *ctx = (struct match_ctx *) pctx;
struct apk_name *name = (struct apk_name *) item;
unsigned int genid = ctx->match & APK_FOREACH_GENID_MASK;
char **pmatch;
if (genid) {
if (name->foreach_genid >= genid)
return 0;
name->foreach_genid = genid;
}
if (ctx->filter->num == 0) {
ctx->cb(ctx->db, NULL, name, ctx->cb_ctx);
return 0;
}
foreach_array_item(pmatch, ctx->filter) {
if (fnmatch(*pmatch, name->name, FNM_CASEFOLD) == 0) {
ctx->cb(ctx->db, *pmatch, name, ctx->cb_ctx);
if (genid)
break;
}
}
return 0;
}
void apk_name_foreach_matching(struct apk_database *db, struct apk_string_array *filter, unsigned int match,
void (*cb)(struct apk_database *db, const char *match, struct apk_name *name, void *ctx),
void *ctx)
{
char **pmatch;
unsigned int genid = match & APK_FOREACH_GENID_MASK;
struct apk_name *name;
struct match_ctx mctx = {
.db = db,
.filter = filter,
.match = match,
.cb = cb,
.cb_ctx = ctx,
};
if (filter == NULL || filter->num == 0) {
apk_string_array_init(&mctx.filter);
goto all;
}
foreach_array_item(pmatch, filter)
if (strchr(*pmatch, '*') != NULL)
goto all;
foreach_array_item(pmatch, filter) {
name = (struct apk_name *) apk_hash_get(&db->available.names, APK_BLOB_STR(*pmatch));
if (name == NULL)
continue;
if (genid) {
if (name->foreach_genid >= genid)
continue;
name->foreach_genid = genid;
}
cb(db, *pmatch, name, ctx);
}
return;
all:
apk_hash_foreach(&db->available.names, match_names, &mctx);
}
...@@ -75,22 +75,24 @@ static void delete_from_world( ...@@ -75,22 +75,24 @@ static void delete_from_world(
delete_from_world, pctx); delete_from_world, pctx);
} }
static int del_main(void *pctx, struct apk_database *db, int argc, char **argv) static int del_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct del_ctx *ctx = (struct del_ctx *) pctx; struct del_ctx *ctx = (struct del_ctx *) pctx;
struct not_deleted_ctx ndctx = {}; struct not_deleted_ctx ndctx = {};
struct apk_name **name; struct apk_name_array *names;
struct apk_name **pname;
struct apk_changeset changeset = {}; struct apk_changeset changeset = {};
struct apk_change *change; struct apk_change *change;
struct apk_provider *p; struct apk_provider *p;
int i, r = 0; int r = 0, i;
apk_name_array_init(&names);
apk_name_array_resize(&names, args->num);
apk_dependency_array_copy(&ctx->world, db->world); apk_dependency_array_copy(&ctx->world, db->world);
name = alloca(argc * sizeof(struct apk_name*)); for (i = 0; i < args->num; i++) {
for (i = 0; i < argc; i++) { names->item[i] = apk_db_get_name(db, APK_BLOB_STR(args->item[i]));
name[i] = apk_db_get_name(db, APK_BLOB_STR(argv[i])); delete_from_world(apk_pkg_get_installed(names->item[i]), NULL, NULL, ctx);
delete_from_world(apk_pkg_get_installed(name[i]), NULL, NULL, ctx);
} }
r = apk_solver_solve(db, 0, ctx->world, &changeset); r = apk_solver_solve(db, 0, ctx->world, &changeset);
...@@ -102,11 +104,11 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv) ...@@ -102,11 +104,11 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv)
continue; continue;
pkg->marked = 1; pkg->marked = 1;
} }
for (i = 0; i < argc; i++) { foreach_array_item(pname, names) {
ndctx.indent.indent = 0; ndctx.indent.indent = 0;
ndctx.name = name[i]; ndctx.name = *pname;
ndctx.matches = apk_foreach_genid() | APK_FOREACH_MARKED | APK_DEP_SATISFIES; ndctx.matches = apk_foreach_genid() | APK_FOREACH_MARKED | APK_DEP_SATISFIES;
foreach_array_item(p, name[i]->providers) { foreach_array_item(p, (*pname)->providers) {
if (!p->pkg->marked) if (!p->pkg->marked)
continue; continue;
print_not_deleted_message(p->pkg, NULL, NULL, &ndctx); print_not_deleted_message(p->pkg, NULL, NULL, &ndctx);
...@@ -122,6 +124,7 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv) ...@@ -122,6 +124,7 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv)
apk_solver_print_errors(db, &changeset, ctx->world); apk_solver_print_errors(db, &changeset, ctx->world);
} }
apk_dependency_array_free(&ctx->world); apk_dependency_array_free(&ctx->world);
apk_name_array_free(&names);
return r; return r;
} }
...@@ -144,4 +147,3 @@ static struct apk_applet apk_del = { ...@@ -144,4 +147,3 @@ static struct apk_applet apk_del = {
}; };
APK_DEFINE_APPLET(apk_del); APK_DEFINE_APPLET(apk_del);
...@@ -120,15 +120,15 @@ static int foreach_pkg(apk_hash_item item, void *ctx) ...@@ -120,15 +120,15 @@ static int foreach_pkg(apk_hash_item item, void *ctx)
return 0; return 0;
} }
static int dot_main(void *pctx, struct apk_database *db, int argc, char **argv) static int dot_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct dot_ctx *ctx = (struct dot_ctx *) pctx; struct dot_ctx *ctx = (struct dot_ctx *) pctx;
struct apk_provider *p; struct apk_provider *p;
int i; char **parg;
if (argc) { if (args->num) {
for (i = 0; i < argc; i++) { foreach_array_item(parg, args) {
struct apk_name *name = apk_db_get_name(db, APK_BLOB_STR(argv[i])); struct apk_name *name = apk_db_get_name(db, APK_BLOB_STR(*parg));
if (!name) if (!name)
continue; continue;
foreach_array_item(p, name->providers) foreach_array_item(p, name->providers)
......
...@@ -190,26 +190,27 @@ static void mark_package(struct fetch_ctx *ctx, struct apk_package *pkg) ...@@ -190,26 +190,27 @@ static void mark_package(struct fetch_ctx *ctx, struct apk_package *pkg)
pkg->marked = 1; pkg->marked = 1;
} }
static int fetch_main(void *pctx, struct apk_database *db, int argc, char **argv) static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct fetch_ctx *ctx = (struct fetch_ctx *) pctx; struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
struct apk_dependency_array *world; struct apk_dependency_array *world;
struct apk_change *change; struct apk_change *change;
int r = 0, i; char **parg;
int r = 0;
if (ctx->outdir_fd == 0) if (ctx->outdir_fd == 0)
ctx->outdir_fd = AT_FDCWD; ctx->outdir_fd = AT_FDCWD;
if ((argc > 0) && (strcmp(argv[0], "coffee") == 0)) { if ((args->num == 1) && (strcmp(args->item[0], "coffee") == 0)) {
if (apk_flags & APK_FORCE) if (apk_flags & APK_FORCE)
return cup(); return cup();
apk_message("Go and fetch your own coffee."); apk_message("Go and fetch your own coffee.");
return 0; return 0;
} }
for (i = 0; i < argc; i++) { foreach_array_item(parg, args) {
struct apk_dependency dep = (struct apk_dependency) { struct apk_dependency dep = (struct apk_dependency) {
.name = apk_db_get_name(db, APK_BLOB_STR(argv[i])), .name = apk_db_get_name(db, APK_BLOB_STR(*parg)),
.version = apk_blob_atomize(APK_BLOB_NULL), .version = apk_blob_atomize(APK_BLOB_NULL),
.result_mask = APK_DEPMASK_ANY, .result_mask = APK_DEPMASK_ANY,
}; };
...@@ -222,7 +223,7 @@ static int fetch_main(void *pctx, struct apk_database *db, int argc, char **argv ...@@ -222,7 +223,7 @@ static int fetch_main(void *pctx, struct apk_database *db, int argc, char **argv
r = apk_solver_solve(db, 0, world, &changeset); r = apk_solver_solve(db, 0, world, &changeset);
apk_dependency_array_free(&world); apk_dependency_array_free(&world);
if (r != 0) { if (r != 0) {
apk_error("%s: unable to get dependencies", argv[i]); apk_error("%s: unable to get dependencies", dep.name->name);
ctx->errors++; ctx->errors++;
} else { } else {
foreach_array_item(change, changeset.changes) foreach_array_item(change, changeset.changes)
......
...@@ -52,12 +52,13 @@ static int mark_recalculate(apk_hash_item item, void *ctx) ...@@ -52,12 +52,13 @@ static int mark_recalculate(apk_hash_item item, void *ctx)
return 0; return 0;
} }
static int fix_main(void *pctx, struct apk_database *db, int argc, char **argv) static int fix_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct fix_ctx *ctx = (struct fix_ctx *) pctx; struct fix_ctx *ctx = (struct fix_ctx *) pctx;
struct apk_name *name; struct apk_name *name;
struct apk_package *pkg; struct apk_package *pkg;
int r = 0, i; char **parg;
int r = 0;
if (!ctx->solver_flags) if (!ctx->solver_flags)
ctx->solver_flags = APK_SOLVERF_REINSTALL; ctx->solver_flags = APK_SOLVERF_REINSTALL;
...@@ -65,22 +66,22 @@ static int fix_main(void *pctx, struct apk_database *db, int argc, char **argv) ...@@ -65,22 +66,22 @@ static int fix_main(void *pctx, struct apk_database *db, int argc, char **argv)
if (ctx->fix_directory_permissions) if (ctx->fix_directory_permissions)
apk_hash_foreach(&db->installed.dirs, mark_recalculate, db); apk_hash_foreach(&db->installed.dirs, mark_recalculate, db);
for (i = 0; i < argc; i++) { foreach_array_item(parg, args) {
pkg = NULL; pkg = NULL;
if (strstr(argv[i], ".apk") != NULL) { if (strstr(*parg, ".apk") != NULL) {
struct apk_sign_ctx sctx; struct apk_sign_ctx sctx;
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY_AND_GENERATE, apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY_AND_GENERATE,
NULL, db->keys_fd); NULL, db->keys_fd);
r = apk_pkg_read(db, argv[i], &sctx, &pkg); r = apk_pkg_read(db, *parg, &sctx, &pkg);
apk_sign_ctx_free(&sctx); apk_sign_ctx_free(&sctx);
if (r != 0) { if (r != 0) {
apk_error("%s: %s", argv[i], apk_error_str(r)); apk_error("%s: %s", *parg, apk_error_str(r));
goto err; goto err;
} }
name = pkg->name; name = pkg->name;
} else { } else {
name = apk_db_get_name(db, APK_BLOB_STR(argv[i])); name = apk_db_get_name(db, APK_BLOB_STR(*parg));
pkg = apk_pkg_get_installed(name); pkg = apk_pkg_get_installed(name);
} }
if (pkg == NULL || pkg->ipkg == NULL) { if (pkg == NULL || pkg->ipkg == NULL) {
......
...@@ -87,14 +87,15 @@ static int warn_if_no_providers(apk_hash_item item, void *ctx) ...@@ -87,14 +87,15 @@ static int warn_if_no_providers(apk_hash_item item, void *ctx)
return 0; return 0;
} }
static int index_main(void *ctx, struct apk_database *db, int argc, char **argv) static int index_main(void *ctx, struct apk_database *db, struct apk_string_array *args)
{ {
struct counts counts = {0}; struct counts counts = {0};
struct apk_ostream *os; struct apk_ostream *os;
struct apk_file_info fi; struct apk_file_info fi;
int total, r, i, found, newpkgs = 0, errors = 0; int total, r, found, newpkgs = 0, errors = 0;
struct index_ctx *ictx = (struct index_ctx *) ctx; struct index_ctx *ictx = (struct index_ctx *) ctx;
struct apk_package *pkg; struct apk_package *pkg;
char **parg;
if (isatty(STDOUT_FILENO) && ictx->output == NULL && if (isatty(STDOUT_FILENO) && ictx->output == NULL &&
!(apk_flags & APK_FORCE)) { !(apk_flags & APK_FORCE)) {
...@@ -111,9 +112,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -111,9 +112,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv)
return r; return r;
} }
for (i = 0; i < argc; i++) { foreach_array_item(parg, args) {
if (apk_file_get_info(AT_FDCWD, argv[i], APK_CHECKSUM_NONE, &fi) < 0) { if (apk_file_get_info(AT_FDCWD, *parg, APK_CHECKSUM_NONE, &fi) < 0) {
apk_warning("File '%s' is unaccessible", argv[i]); apk_warning("File '%s' is unaccessible", *parg);
continue; continue;
} }
...@@ -129,9 +130,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -129,9 +130,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv)
break; break;
/* Check that it looks like a package name */ /* Check that it looks like a package name */
fname = strrchr(argv[i], '/'); fname = strrchr(*parg, '/');
if (fname == NULL) if (fname == NULL)
fname = argv[i]; fname = *parg;
else else
fname++; fname++;
fend = strstr(fname, ".apk"); fend = strstr(fname, ".apk");
...@@ -154,7 +155,7 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -154,7 +155,7 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv)
continue; continue;
if (pkg->size != fi.size) if (pkg->size != fi.size)
continue; continue;
pkg->filename = strdup(argv[i]); pkg->filename = strdup(*parg);
if (ictx->rewrite_arch != NULL) if (ictx->rewrite_arch != NULL)
pkg->arch = ictx->rewrite_arch; pkg->arch = ictx->rewrite_arch;
found = TRUE; found = TRUE;
...@@ -165,9 +166,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv) ...@@ -165,9 +166,9 @@ static int index_main(void *ctx, struct apk_database *db, int argc, char **argv)
if (!found) { if (!found) {
struct apk_sign_ctx sctx; struct apk_sign_ctx sctx;
apk_sign_ctx_init(&sctx, ictx->method, NULL, db->keys_fd); apk_sign_ctx_init(&sctx, ictx->method, NULL, db->keys_fd);
r = apk_pkg_read(db, argv[i], &sctx, &pkg); r = apk_pkg_read(db, *parg, &sctx, &pkg);
if (r < 0) { if (r < 0) {
apk_error("%s: %s", argv[i], apk_error_str(r)); apk_error("%s: %s", *parg, apk_error_str(r));
errors++; errors++;
} else { } else {
newpkgs++; newpkgs++;
......
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
struct info_ctx { struct info_ctx {
struct apk_database *db; struct apk_database *db;
int (*action)(struct info_ctx *ctx, struct apk_database *db, int (*action)(struct info_ctx *ctx, struct apk_database *db, struct apk_string_array *args);
int argc, char **argv);
int subaction_mask; int subaction_mask;
};