root / synthbench / bonnie++ / .svn / text-base / bon_suid.cpp.svn-base @ 0:839f52ef7657
History | View | Annotate | Download (1.5 kB)
1 |
#include <pwd.h> |
---|---|
2 |
#include <grp.h> |
3 |
#include <sys/types.h> |
4 |
#include <unistd.h> |
5 |
#include <stdio.h> |
6 |
#include "bonnie.h" |
7 |
|
8 |
int bon_setugid(CPCCHAR userName, CPCCHAR groupName, bool quiet) |
9 |
{ |
10 |
int id = 0; |
11 |
uid_t userId = 0; |
12 |
gid_t groupId = 0; |
13 |
bool setGroup = false; |
14 |
struct passwd *pw; |
15 |
struct group *gr; |
16 |
if(userName) |
17 |
{ |
18 |
if(sscanf(userName, "%d", &id) == 1) |
19 |
{ |
20 |
userId = uid_t(id); |
21 |
pw = getpwuid(userId); |
22 |
if(pw) |
23 |
{ |
24 |
groupId = pw->pw_gid; |
25 |
setGroup = true; |
26 |
} |
27 |
else |
28 |
{ |
29 |
gr = getgrnam("nogroup"); |
30 |
if(gr) |
31 |
groupId = gr->gr_gid; |
32 |
setGroup = true; |
33 |
} |
34 |
} |
35 |
else |
36 |
{ |
37 |
pw = getpwnam(userName); |
38 |
if(!pw) |
39 |
{ |
40 |
fprintf(stderr, "Can't find user %s\n", userName); |
41 |
return 1; |
42 |
} |
43 |
userId = pw->pw_uid; |
44 |
groupId = pw->pw_gid; |
45 |
setGroup = true; |
46 |
} |
47 |
} |
48 |
if(groupName) |
49 |
{ |
50 |
if(sscanf(groupName, "%d", &id) == 1) |
51 |
{ |
52 |
groupId = gid_t(id); |
53 |
setGroup = true; |
54 |
} |
55 |
else |
56 |
{ |
57 |
gr = getgrnam(groupName); |
58 |
if(!gr) |
59 |
{ |
60 |
fprintf(stderr, "Can't find group %s\n", groupName); |
61 |
return 1; |
62 |
} |
63 |
groupId = gr->gr_gid; |
64 |
setGroup = true; |
65 |
} |
66 |
} |
67 |
if(setGroup) |
68 |
{ |
69 |
if(setgid(groupId)) |
70 |
{ |
71 |
fprintf(stderr, "Can't set gid to %d.\n", int(groupId)); |
72 |
return 1; |
73 |
} |
74 |
} |
75 |
if(setuid(userId)) |
76 |
{ |
77 |
fprintf(stderr, "Can't set uid to %d.\n", int(userId)); |
78 |
return 1; |
79 |
} |
80 |
if(!quiet) |
81 |
fprintf(stderr, "Using uid:%d, gid:%d.\n", int(getuid()), int(getgid())); |
82 |
return 0; |
83 |
} |