diff options
-rw-r--r-- | src/tools/common/sss_tools.c | 45 | ||||
-rw-r--r-- | src/tools/common/sss_tools.h | 11 | ||||
-rw-r--r-- | src/tools/sss_override.c | 26 | ||||
-rw-r--r-- | src/tools/sssctl/sssctl.c | 22 |
4 files changed, 66 insertions, 38 deletions
diff --git a/src/tools/common/sss_tools.c b/src/tools/common/sss_tools.c index a78a5ba19..686b53a07 100644 --- a/src/tools/common/sss_tools.c +++ b/src/tools/common/sss_tools.c @@ -136,7 +136,6 @@ static errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx, } ret = sysdb_init(mem_ctx, domains); - SYSDB_VERSION_ERROR(ret); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Could not initialize connection to the sysdb\n"); @@ -178,8 +177,9 @@ static errno_t sss_tool_domains_init(TALLOC_CTX *mem_ctx, return ret; } -struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx, - int *argc, const char **argv) +errno_t sss_tool_init(TALLOC_CTX *mem_ctx, + int *argc, const char **argv, + struct sss_tool_ctx **_tool_ctx) { struct sss_tool_ctx *tool_ctx; errno_t ret; @@ -187,7 +187,7 @@ struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx, tool_ctx = talloc_zero(mem_ctx, struct sss_tool_ctx); if (tool_ctx == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero() failed\n"); - return NULL; + return ENOMEM; } sss_tool_common_opts(tool_ctx, argc, argv); @@ -221,11 +221,16 @@ struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx, ret = EOK; done: - if (ret != EOK) { - talloc_zfree(tool_ctx); + switch (ret) { + case EOK: + case ERR_SYSDB_VERSION_TOO_OLD: + *_tool_ctx = tool_ctx; + break; + default: + break; } - return tool_ctx; + return ret; } static bool sss_tool_is_delimiter(struct sss_route_cmd *command) @@ -237,6 +242,16 @@ static bool sss_tool_is_delimiter(struct sss_route_cmd *command) return false; } +static bool sss_tools_handles_init_error(struct sss_route_cmd *command, + errno_t init_err) +{ + if (init_err == EOK) { + return true; + } + + return command->handles_init_err == init_err; +} + static size_t sss_tool_max_length(struct sss_route_cmd *commands) { size_t max = 0; @@ -316,6 +331,14 @@ errno_t sss_tool_route(int argc, const char **argv, cmdline.argc = argc - 2; cmdline.argv = argv + 2; + if (!sss_tools_handles_init_error(&commands[i], tool_ctx->init_err)) { + DEBUG(SSSDBG_FATAL_FAILURE, + "Command %s does not handle initialization error [%d] %s\n", + cmdline.command, tool_ctx->init_err, + sss_strerror(tool_ctx->init_err)); + return tool_ctx->init_err; + } + return commands[i].fn(&cmdline, tool_ctx, pvt); } } @@ -477,15 +500,17 @@ int sss_tool_main(int argc, const char **argv, return EXIT_FAILURE; } - tool_ctx = sss_tool_init(NULL, &argc, argv); - if (tool_ctx == NULL) { + ret = sss_tool_init(NULL, &argc, argv, &tool_ctx); + if (ret == ERR_SYSDB_VERSION_TOO_OLD) { + tool_ctx->init_err = ret; + } else if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create tool context\n"); return EXIT_FAILURE; } ret = sss_tool_route(argc, argv, tool_ctx, commands, pvt); + SYSDB_VERSION_ERROR(ret); talloc_free(tool_ctx); - if (ret != EOK) { return EXIT_FAILURE; } diff --git a/src/tools/common/sss_tools.h b/src/tools/common/sss_tools.h index 0dfd4834f..a9ebabe21 100644 --- a/src/tools/common/sss_tools.h +++ b/src/tools/common/sss_tools.h @@ -29,12 +29,14 @@ struct sss_tool_ctx { struct confdb_ctx *confdb; + errno_t init_err; char *default_domain; struct sss_domain_info *domains; }; -struct sss_tool_ctx *sss_tool_init(TALLOC_CTX *mem_ctx, - int *argc, const char **argv); +errno_t sss_tool_init(TALLOC_CTX *mem_ctx, + int *argc, const char **argv, + struct sss_tool_ctx **_tool_ctx); struct sss_cmdline; @@ -43,12 +45,13 @@ typedef errno_t struct sss_tool_ctx *tool_ctx, void *pvt); -#define SSS_TOOL_COMMAND(cmd, msg, fn) {cmd, _(msg), fn} -#define SSS_TOOL_DELIMITER(message) {"", (message), NULL} +#define SSS_TOOL_COMMAND(cmd, msg, err, fn) {cmd, _(msg), err, fn} +#define SSS_TOOL_DELIMITER(message) {"", (message), 0, NULL} struct sss_route_cmd { const char *command; const char *description; + errno_t handles_init_err; sss_route_fn fn; }; diff --git a/src/tools/sss_override.c b/src/tools/sss_override.c index e497d12b9..45a28fd7f 100644 --- a/src/tools/sss_override.c +++ b/src/tools/sss_override.c @@ -1913,19 +1913,19 @@ static int override_group_export(struct sss_cmdline *cmdline, int main(int argc, const char **argv) { struct sss_route_cmd commands[] = { - {"user-add", NULL, override_user_add}, - {"user-del", NULL, override_user_del}, - {"user-find", NULL, override_user_find}, - {"user-show", NULL, override_user_show}, - {"user-import", NULL, override_user_import}, - {"user-export", NULL, override_user_export}, - {"group-add", NULL, override_group_add}, - {"group-del", NULL, override_group_del}, - {"group-find", NULL, override_group_find}, - {"group-show", NULL, override_group_show}, - {"group-import", NULL, override_group_import}, - {"group-export", NULL, override_group_export}, - {NULL, NULL, NULL} + {"user-add", NULL, 0, override_user_add}, + {"user-del", NULL, 0, override_user_del}, + {"user-find", NULL, 0, override_user_find}, + {"user-show", NULL, 0, override_user_show}, + {"user-import", NULL, 0, override_user_import}, + {"user-export", NULL, 0, override_user_export}, + {"group-add", NULL, 0, override_group_add}, + {"group-del", NULL, 0, override_group_del}, + {"group-find", NULL, 0, override_group_find}, + {"group-show", NULL, 0, override_group_show}, + {"group-import", NULL, 0, override_group_import}, + {"group-export", NULL, 0, override_group_export}, + {NULL, NULL, 0, NULL} }; return sss_tool_main(argc, argv, commands, NULL); diff --git a/src/tools/sssctl/sssctl.c b/src/tools/sssctl/sssctl.c index 58bbbf283..8e18569d8 100644 --- a/src/tools/sssctl/sssctl.c +++ b/src/tools/sssctl/sssctl.c @@ -257,20 +257,20 @@ int main(int argc, const char **argv) { struct sss_route_cmd commands[] = { SSS_TOOL_DELIMITER("SSSD Status:"), - SSS_TOOL_COMMAND("list-domains", "List available domains", sssctl_list_domains), - SSS_TOOL_COMMAND("domain-status", "Print information about domain", sssctl_domain_status), + SSS_TOOL_COMMAND("list-domains", "List available domains", 0, sssctl_list_domains), + SSS_TOOL_COMMAND("domain-status", "Print information about domain", 0, sssctl_domain_status), SSS_TOOL_DELIMITER("Information about cached content:"), - SSS_TOOL_COMMAND("user", "Information about cached user", sssctl_user), - SSS_TOOL_COMMAND("group", "Information about cached group", sssctl_group), - SSS_TOOL_COMMAND("netgroup", "Information about cached netgroup", sssctl_netgroup), + SSS_TOOL_COMMAND("user", "Information about cached user", 0, sssctl_user), + SSS_TOOL_COMMAND("group", "Information about cached group", 0, sssctl_group), + SSS_TOOL_COMMAND("netgroup", "Information about cached netgroup", 0, sssctl_netgroup), SSS_TOOL_DELIMITER("Local data tools:"), - SSS_TOOL_COMMAND("backup-local-data", "Backup local data", sssctl_backup_local_data), - SSS_TOOL_COMMAND("restore-local-data", "Restore local data from backup", sssctl_restore_local_data), - SSS_TOOL_COMMAND("remove-cache", "Backup local data and remove cached content", sssctl_remove_cache), + SSS_TOOL_COMMAND("backup-local-data", "Backup local data", 0, sssctl_backup_local_data), + SSS_TOOL_COMMAND("restore-local-data", "Restore local data from backup", 0, sssctl_restore_local_data), + SSS_TOOL_COMMAND("remove-cache", "Backup local data and remove cached content", 0, sssctl_remove_cache), SSS_TOOL_DELIMITER("Log files tools:"), - SSS_TOOL_COMMAND("remove-logs", "Remove existing SSSD log files", sssctl_remove_logs), - SSS_TOOL_COMMAND("fetch-logs", "Archive SSSD log files in tarball", sssctl_fetch_logs), - {NULL, NULL, NULL} + SSS_TOOL_COMMAND("remove-logs", "Remove existing SSSD log files", 0, sssctl_remove_logs), + SSS_TOOL_COMMAND("fetch-logs", "Archive SSSD log files in tarball", 0, sssctl_fetch_logs), + {NULL, NULL, 0, NULL} }; return sss_tool_main(argc, argv, commands, NULL); |