forked from gammu/gammu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuid.c
101 lines (82 loc) · 1.78 KB
/
uid.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
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <stdlib.h>
#include <string.h>
#include "uid.h"
/**
* Sets UID.
*/
gboolean set_uid_gid(SMSD_Parameters *params)
{
/* gid is set allways (either through fill_uid or by user */
if (setgid(params->gid) != 0)
return FALSE;
/* Only set group */
if (params->uid == -1)
return TRUE;
if (initgroups(params->user, params->gid) != 0)
return FALSE;
if (setuid(params->uid) != 0)
return FALSE;
if (seteuid(params->uid) != 0)
return FALSE;
return TRUE;
}
/**
* Sets GID.
*/
gboolean set_gid(int gid)
{
return setgid(gid) == 0;
}
/**
* Gets UID from string.
*/
gboolean fill_uid(SMSD_Parameters *params, const char *name)
{
struct passwd *pwd;
char *endptr;
long uid;
pwd = getpwnam(name);
if (pwd == NULL) {
/* Try to handle it as a number */
uid = strtol(name, &endptr, 10);
if (*endptr == 0 && uid > 0) {
pwd = getpwuid(uid);
}
}
if (pwd != NULL) {
params->uid = pwd->pw_uid;
params->user = strdup(pwd->pw_name);
if (params->gid == -1) {
params->gid = pwd->pw_gid;
}
return TRUE;
}
return FALSE;
}
/**
* Gets GID from string.
*/
gboolean fill_gid(SMSD_Parameters *params, const char *name)
{
struct group *grp;
char *endptr;
long gid;
grp = getgrnam(name);
/* Try to handle it as a number */
if (grp == NULL) {
gid = strtol(name, &endptr, 10);
if (*endptr == 0 && gid > 0) {
grp = getgrgid(gid);
}
}
if (grp != NULL) {
params->gid = grp->gr_gid;
params->group = strdup(grp->gr_name);
return TRUE;
}
return FALSE;
}