diff options
Diffstat (limited to 'server/tools/sss_usermod.c')
-rw-r--r-- | server/tools/sss_usermod.c | 128 |
1 files changed, 73 insertions, 55 deletions
diff --git a/server/tools/sss_usermod.c b/server/tools/sss_usermod.c index a49dc8e5..b410ed1f 100644 --- a/server/tools/sss_usermod.c +++ b/server/tools/sss_usermod.c @@ -25,8 +25,6 @@ #include <popt.h> #include <errno.h> #include <pwd.h> -#include <sys/types.h> -#include <sys/wait.h> #include <unistd.h> #include "util/util.h" @@ -61,7 +59,7 @@ static void mod_user_done(struct ops_ctx *data, int error) goto fail; } - req = sysdb_transaction_commit_send(data, data->ev, data->handle); + req = sysdb_transaction_commit_send(data, data->ctx->ev, data->handle); if (!req) { error = ENOMEM; goto fail; @@ -99,7 +97,7 @@ static void mod_user(struct tevent_req *req) } if (data->attrs->num != 0) { - subreq = sysdb_set_user_attr_send(data, data->ev, data->handle, + subreq = sysdb_set_user_attr_send(data, data->ctx->ev, data->handle, data->domain, data->name, data->attrs, SYSDB_MOD_REP); if (!subreq) { @@ -159,7 +157,7 @@ static void remove_from_groups(struct ops_ctx *data) } req = sysdb_mod_group_member_send(data, - data->ev, + data->ctx->ev, data->handle, member_dn, parent_dn, @@ -216,7 +214,7 @@ static void add_to_groups(struct ops_ctx *data) } req = sysdb_mod_group_member_send(data, - data->ev, + data->ctx->ev, data->handle, member_dn, parent_dn, @@ -274,9 +272,8 @@ int main(int argc, const char **argv) }; poptContext pc = NULL; struct ops_ctx *data = NULL; - struct tools_ctx *ctx = NULL; struct tevent_req *req; - char *groups; + char *addgroups = NULL, *rmgroups = NULL; int ret; struct passwd *pwd_info; uid_t old_uid = 0; @@ -291,66 +288,44 @@ int main(int argc, const char **argv) ret = EXIT_FAILURE; goto fini; } - CHECK_ROOT(ret, debug_prg_name); - ret = init_sss_tools(&ctx); - if (ret != EOK) { - DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); - ERROR("Error initializing the tools\n"); - ret = EXIT_FAILURE; - goto fini; - } - - data = talloc_zero(ctx, struct ops_ctx); - if (data == NULL) { - DEBUG(1, ("Could not allocate memory for data context\n")); - ERROR("Out of memory\n"); - return ENOMEM; - } - data->ctx = ctx; - data->ev = ctx->ev; - - data->attrs = sysdb_new_attrs(ctx); - if (data->attrs == NULL) { - DEBUG(1, ("Could not allocate memory for sysdb_attrs context\n")); - ERROR("Out of memory\n"); - return ENOMEM; - } - - /* parse ops_ctx */ + /* parse parameters */ pc = poptGetContext(NULL, argc, argv, long_options, 0); poptSetOtherOptionHelp(pc, "USERNAME"); while ((ret = poptGetNextOpt(pc)) > 0) { - if (ret == 'a' || ret == 'r') { - groups = poptGetOptArg(pc); - if (!groups) { - ret = -1; + switch (ret) { + case 'a': + addgroups = poptGetOptArg(pc); + if (addgroups == NULL) { + ret = -1; + } break; - } - ret = parse_groups(ctx, - groups, - (ret == 'a') ? (&data->addgroups) : (&data->rmgroups)); + case 'r': + rmgroups = poptGetOptArg(pc); + if (rmgroups == NULL) { + ret = -1; + } + break; + + case 'L': + pc_lock = DO_LOCK; + break; - free(groups); - if (ret != EOK) { + case 'U': + pc_lock = DO_UNLOCK; break; - } - } else if (ret == 'L') { - pc_lock = DO_LOCK; - } else if (ret == 'U') { - pc_lock = DO_UNLOCK; } } - debug_level = pc_debug; - - if(ret != -1) { + if (ret != -1) { usage(pc, poptStrerror(ret)); ret = EXIT_FAILURE; goto fini; } + debug_level = pc_debug; + /* username is an argument without --option */ pc_username = poptGetArg(pc); if (pc_username == NULL) { @@ -359,6 +334,23 @@ int main(int argc, const char **argv) goto fini; } + CHECK_ROOT(ret, debug_prg_name); + + ret = init_sss_tools(&data); + if (ret != EOK) { + DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret))); + ERROR("Error initializing the tools\n"); + ret = EXIT_FAILURE; + goto fini; + } + + data->attrs = sysdb_new_attrs(data->ctx); + if (data->attrs == NULL) { + DEBUG(1, ("Could not allocate memory for sysdb_attrs context\n")); + ERROR("Out of memory\n"); + return ENOMEM; + } + /* if the domain was not given as part of FQDN, default to local domain */ ret = get_domain(data, pc_username); if (ret != EOK) { @@ -378,6 +370,28 @@ int main(int argc, const char **argv) goto fini; } + if (addgroups) { + ret = parse_groups(data, + addgroups, + &data->addgroups); + if (ret != EOK) { + DEBUG(1, ("Cannot parse groups to add the user to\n")); + ERROR("Internal error while parsing parameters\n"); + goto fini; + } + } + + if (rmgroups) { + ret = parse_groups(data, + rmgroups, + &data->rmgroups); + if (ret != EOK) { + DEBUG(1, ("Cannot parse groups to remove the user from\n")); + ERROR("Internal error while parsing parameters\n"); + goto fini; + } + } + /* add parameters to changeset */ /* FIXME - might want to do this via attr:pc_var mapping in a loop */ @@ -413,6 +427,7 @@ int main(int argc, const char **argv) "Could not add attribute to changeset\n"); } + if(pc_gid) { ret = sysdb_attrs_add_long(data->attrs, SYSDB_GIDNUM, @@ -438,7 +453,8 @@ int main(int argc, const char **argv) "Could not add attribute to changeset\n"); } - req = sysdb_transaction_send(ctx, ctx->ev, data->ctx->sysdb); + + req = sysdb_transaction_send(data, data->ctx->ev, data->ctx->sysdb); if (!req) { DEBUG(1, ("Could not start transaction (%d)[%s]\n", ret, strerror(ret))); ERROR("Transaction error. Could not modify user.\n"); @@ -448,7 +464,7 @@ int main(int argc, const char **argv) tevent_req_set_callback(req, mod_user, data); while (!data->done) { - tevent_loop_once(ctx->ev); + tevent_loop_once(data->ctx->ev); } if (data->error) { @@ -476,7 +492,9 @@ int main(int argc, const char **argv) ret = EXIT_SUCCESS; fini: + free(addgroups); + free(rmgroups); poptFreeContext(pc); - talloc_free(ctx); + talloc_free(data); exit(ret); } |