-
Notifications
You must be signed in to change notification settings - Fork 0
/
users.c
120 lines (91 loc) · 2.62 KB
/
users.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#define BINARY_USERADD "/usr/sbin/useradd"
#define BINARY_USERDEL "/usr/sbin/userdel"
#define BINARY_GROUPADD "/usr/sbin/groupadd"
#define BINARY_GROUPDEL "/usr/sbin/groupdel"
#define SHELL_DEFAULT "/sbin/nologin"
#define DEBUG_USERS
#include "manager.h"
#ifdef DEBUG_USERS
#define DPRINTF(fmt, args...) \
do { printf("users: " fmt , ##args); } while (0)
#else
#define DPRINTF(fmt, args...) do {} while(0)
#endif
int users_check_user(char *name)
{
struct passwd *pw;
pw = getpwnam(name);
if (pw == NULL)
return -ENOENT;
DPRINTF("User %s details:\n", name);
DPRINTF("\tUsername: %s\n",pw->pw_name);
DPRINTF("\tPassword: %s\n", pw->pw_passwd);
DPRINTF("\tReal name: %s\n", pw->pw_gecos);
DPRINTF("\tUID/GID: %d/%d\n", pw->pw_uid, pw->pw_gid);
DPRINTF("\tHome directory: %s\n", pw->pw_dir);
DPRINTF("\tShell: %s\n", pw->pw_shell);
return 0;
}
int users_check_group(char *name)
{
struct group *gr;
gr = getgrnam(name);
if (gr == NULL)
return -ENOENT;
DPRINTF("Group %s details:\n", name);
DPRINTF("\tGroup name: %s\n", gr->gr_name);
DPRINTF("\tGroup password: %s\n", gr->gr_passwd);
DPRINTF("\tGID: %d\n", gr->gr_gid);
return 0;
}
gid_t users_group_id(char *name)
{
struct group *gr;
gr = getgrnam(name);
if (gr == NULL)
return -1;
return gr->gr_gid;
}
uid_t users_user_id(char *name)
{
struct passwd *pw;
pw = getpwnam(name);
if (pw == NULL)
return -1;
return pw->pw_uid;
}
int users_group_add(char *name)
{
char cmd[BUFSIZE];
if (users_check_group(name) == 0)
return -EEXIST;
snprintf(cmd, sizeof(cmd), "%s %s 2> /dev/null > /dev/null", BINARY_GROUPADD, name);
DPRINTF("%s: Running '%s'\n", __FUNCTION__, cmd);
return WEXITSTATUS(system(cmd));
}
int users_add(char *name, char *password, char *groupName, char *description, char *homeDir, char *shell)
{
int ret;
char cmd[BUFSIZE];
char homedir[BUFSIZE];
if (name == NULL)
return -EINVAL;
if (users_check_user(name) == 0) {
DPRINTF("%s: User %s already exists\n", __FUNCTION__, name);
return -EEXIST;
}
ret = users_group_add(groupName);
if ((ret != 0) && (ret != -EEXIST)) {
DPRINTF("%s: Group creation failed\n", __FUNCTION__);
return -EIO;
}
if (homeDir == NULL)
snprintf(homedir, sizeof(homedir), "/home/%s", name);
else
strncpy(homedir, homeDir, sizeof(homedir));
snprintf(cmd, sizeof(cmd), "%s -c \"%s\" -d %s -p %s -m -g %s -s %s %s 2> /dev/null > /dev/null", BINARY_USERADD,
description ? description : "-", homedir, crypt(password, name), groupName, shell ? shell : SHELL_DEFAULT, name);
ret = WEXITSTATUS(system(cmd));
DPRINTF("%s: Addition of user %s exited with code %d\n", __FUNCTION__, name, ret);
return ret;
}