diff options
author | kientzle <kientzle@FreeBSD.org> | 2007-02-26 02:07:02 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2007-02-26 02:07:02 +0000 |
commit | 3de91924d236e02aa3078c572f2cc3b4c0e25a46 (patch) | |
tree | d4793a624b4061ae71b705bad60ae9052aad0901 /lib/libc/posix1e/acl_from_text.c | |
parent | 89842b0829560bcf6bede7ab2e0a2f5d32193ac1 (diff) | |
download | FreeBSD-src-3de91924d236e02aa3078c572f2cc3b4c0e25a46.zip FreeBSD-src-3de91924d236e02aa3078c572f2cc3b4c0e25a46.tar.gz |
Move _posix1e_acl_name_to_id out of acl_support.c and into
acl_from_text.c. Since acl_from_text.c is the only place it
is used, we can now make this internal utility function "static."
As a bonus, acl_set_fd() no longer pulls in getpwuid() for no reason.
MFC after: 7 days
Diffstat (limited to 'lib/libc/posix1e/acl_from_text.c')
-rw-r--r-- | lib/libc/posix1e/acl_from_text.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/lib/libc/posix1e/acl_from_text.c b/lib/libc/posix1e/acl_from_text.c index 59d9142..c679b17 100644 --- a/lib/libc/posix1e/acl_from_text.c +++ b/lib/libc/posix1e/acl_from_text.c @@ -35,12 +35,15 @@ __FBSDID("$FreeBSD$"); #include <sys/acl.h> #include "un-namespace.h" #include <sys/errno.h> +#include <grp.h> +#include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "acl_support.h" +static int _posix1e_acl_name_to_id(acl_tag_t tag, char *name, uid_t *id); static acl_tag_t acl_string_to_tag(char *tag, char *qualifier); static char *string_skip_whitespace(char *string); static void string_trim_trailing_whitespace(char *string); @@ -234,5 +237,53 @@ error_label: return(NULL); } +/* + * Given a username/groupname from a text form of an ACL, return the uid/gid + * XXX NOT THREAD SAFE, RELIES ON GETPWNAM, GETGRNAM + * XXX USES *PW* AND *GR* WHICH ARE STATEFUL AND THEREFORE THIS ROUTINE + * MAY HAVE SIDE-EFFECTS + * + * XXX currently doesn't deal correctly with a numeric uid being passed + * instead of a username. What is correct behavior here? Check chown. + */ +static int +_posix1e_acl_name_to_id(acl_tag_t tag, char *name, uid_t *id) +{ + struct group *g; + struct passwd *p; + unsigned long l; + char *endp; + + switch(tag) { + case ACL_USER: + p = getpwnam(name); + if (p == NULL) { + l = strtoul(name, &endp, 0); + if (*endp != '\0' || l != (unsigned long)(uid_t)l) { + errno = EINVAL; + return (-1); + } + *id = (uid_t)l; + return (0); + } + *id = p->pw_uid; + return (0); + + case ACL_GROUP: + g = getgrnam(name); + if (g == NULL) { + l = strtoul(name, &endp, 0); + if (*endp != '\0' || l != (unsigned long)(gid_t)l) { + errno = EINVAL; + return (-1); + } + *id = (gid_t)l; + return (0); + } + *id = g->gr_gid; + return (0); - + default: + return (EINVAL); + } +} |