summaryrefslogtreecommitdiffstats
path: root/server/tools/sss_usermod.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/sss_usermod.c')
-rw-r--r--server/tools/sss_usermod.c128
1 files changed, 73 insertions, 55 deletions
diff --git a/server/tools/sss_usermod.c b/server/tools/sss_usermod.c
index a49dc8e5f..b410ed1f0 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);
}