Newer
Older
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
Description: nss_name_to_uid/gud() search also Local-Realms
--- a/nss.c
+++ b/nss.c
@@ -203,32 +203,44 @@
return NULL;
}
-static int nss_name_to_uid(char *name, uid_t *uid)
+static int nss_name_domain_to_uid(char *name, char *domain, uid_t *uid)
{
struct passwd *pw = NULL;
- char *domain;
int err = -ENOENT;
-
- domain = get_default_domain();
pw = nss_getpwnam(name, domain, &err);
- if (pw == NULL)
- goto out;
+ if (pw == NULL) return err;
*uid = pw->pw_uid;
free(pw);
- err = 0;
-out:
+ return 0;
+}
+
+static int nss_name_to_uid(char *name, uid_t *uid)
+{
+ struct conf_list *realms;
+ struct conf_list_node *r;
+ char *domain;
+ int err;
+
+ domain = get_default_domain();
+ err = nss_name_domain_to_uid(name, domain, uid);
+ if (!err) return err;
+
+ realms = get_local_realms();
+ TAILQ_FOREACH(r, &realms->fields, link) {
+ if (!nss_name_domain_to_uid(name, r->field, uid)) return 0;
+ }
+
return err;
}
-static int nss_name_to_gid(char *name, gid_t *gid)
+static int nss_name_domain_to_gid(char *name, char *domain, gid_t *gid)
{
struct group *gr = NULL;
struct group grbuf;
- char *buf, *localname, *domain;
+ char *buf, *localname;
size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
int err = -EINVAL;
- domain = get_default_domain();
localname = strip_domain(name, domain);
if (!localname)
goto out;
@@ -258,6 +270,25 @@
return err;
}
+static int nss_name_to_gid(char *name, gid_t *gid)
+{
+ char *domain;
+ int err;
+ struct conf_list *realms;
+ struct conf_list_node *r;
+
+ domain = get_default_domain();
+ err = nss_name_domain_to_gid(name, domain, gid);
+ if (!err) return 0;
+
+ realms = get_local_realms();
+ TAILQ_FOREACH(r, &realms->fields, link) {
+ if (!nss_name_domain_to_gid(name, r->field, gid)) return 0;
+ }
+
+ return err;
+}
+
static int nss_gss_princ_to_ids(char *secname, char *princ,
uid_t *uid, uid_t *gid,
extra_mapping_params **ex)