-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathutil.c
72 lines (65 loc) · 1.62 KB
/
util.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
/* Copyright (C) 2017 mod_auth_gssapi contributors - See COPYING for (C) terms */
#include "mod_auth_gssapi.h"
#define NSS_BUF_MIN 1024
#define NSS_BUF_MAX 1024*1024
static char *get_buf(char *cur, size_t *len)
{
if (*len == 0) {
*len = NSS_BUF_MIN;
} else {
*len *= 2;
}
if (*len > NSS_BUF_MAX) {
*len = 0; /* will free the buf and return NULL */
}
return realloc(cur, *len);
}
int mag_get_user_uid(const char *name, uid_t *uid)
{
struct passwd pwd, *user;
size_t buflen = 0;
char *buf = NULL;
int ret;
do {
buf = get_buf(buf, &buflen);
if (buf == NULL || buflen == 0) {
ret = ENOMEM;
break;
}
ret = getpwnam_r(name, &pwd, buf, buflen, &user);
} while (ret == ERANGE);
if (ret != 0 || user != &pwd) {
ret = (ret == 0) ? EINVAL : ret;
} else {
*uid = user->pw_uid;
}
free(buf);
return ret;
}
int mag_get_group_gid(const char *name, gid_t *gid)
{
struct group grp, *group;
size_t buflen = 0;
char *buf = NULL;
int ret;
do {
buf = get_buf(buf, &buflen);
if (buf == NULL || buflen == 0) {
ret = ENOMEM;
break;
}
ret = getgrnam_r(name, &grp, buf, buflen, &group);
} while (ret == ERANGE);
if (ret != 0 || group != &grp) {
ret = (ret == 0) ? EINVAL : ret;
} else {
*gid = group->gr_gid;
}
free(buf);
return ret;
}
bool mag_strbuf_equal(const char *str, gss_buffer_t buf)
{
if (strncmp(str, buf->value, buf->length) != 0) return false;
return buf->length == strlen(str);
}