Statistics
| Branch: | Revision:

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
}