summaryrefslogtreecommitdiff
path: root/runit/uidgid.c
blob: a8fec409da0fb4d0818d855dab0d41fec83b52a3 (plain)
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
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include "uidgid.h"

static unsigned str_chr(const char *s, int c)
{
	const char *t = s;
	while (t[0] && t[0] != (char)c)
		t++;
	return t - s;
}


unsigned uidgid_get(struct uidgid *u, char *ug, unsigned dogrp) {
	char *g = 0;
	struct passwd *pwd = 0;
	struct group *gr = 0;
	int i, d = 0;

	if (dogrp)
		d = str_chr(ug, ':');
	if (ug[d] == ':') {
		ug[d] = 0;
		g = ug + d + 1;
	}
	pwd = getpwnam(ug);
	if (!pwd) {
		if (g) ug[d] = ':';
		return 0;
	}
	if (g) {
		ug[d] = ':';
		for (i = 0; i < 60; ++i) {
			d = str_chr(g, ':');
			if (g[d] == ':') {
				g[d] = 0;
				gr = getgrnam(g);
				if (!gr) {
					g[d] = ':';
					return 0;
				}
				g[d] = ':';
				u->gid[i] = gr->gr_gid;
				g += d+1;
			}
			else {
				gr = getgrnam(g);
				if (!gr) return 0;
				u->gid[i++] = gr->gr_gid;
				break;
			}
		}
		u->gid[i] = 0;
		u->gids = i;
	}
	if (!g) {
		u->gid[0] = pwd->pw_gid;
		u->gids = 1;
	}
	u->uid = pwd->pw_uid;
	return 1;
}