diff options
author | William A. Rowe Jr <wrowe@apache.org> | 2001-11-24 21:15:43 +0000 |
---|---|---|
committer | William A. Rowe Jr <wrowe@apache.org> | 2001-11-24 21:15:43 +0000 |
commit | b20eeae9d714bb1f62cb24439d702ad57e76bf6e (patch) | |
tree | dd67e48760d72fb5bec284e3b4dc67bd75666007 /user | |
parent | dac43a5e04d0582846f1fd9ae4896f7849821c18 (diff) | |
download | apr-b20eeae9d714bb1f62cb24439d702ad57e76bf6e.tar.gz |
The missing Win32 apr_get_groupid, brings Win32 back to par with Unix.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@62545 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'user')
-rw-r--r-- | user/win32/groupinfo.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/user/win32/groupinfo.c b/user/win32/groupinfo.c index 6b8b74cff..3d533a19c 100644 --- a/user/win32/groupinfo.c +++ b/user/win32/groupinfo.c @@ -60,6 +60,46 @@ #include <sys/types.h> #endif +APR_DECLARE(apr_status_t) apr_get_groupid(apr_gid_t *gid, + const char *groupname, apr_pool_t *p) +{ + SID_NAME_USE sidtype; + char anydomain[256]; + char *domain; + DWORD sidlen = 0; + DWORD domlen = sizeof(anydomain); + DWORD rv; + char *pos; + + if (pos = strchr(groupname, '/')) { + domain = apr_pstrndup(p, groupname, pos - groupname); + groupname = pos + 1; + } + else if (pos = strchr(groupname, '\\')) { + domain = apr_pstrndup(p, groupname, pos - groupname); + groupname = pos + 1; + } + else { + domain = NULL; + } + /* Get nothing on the first pass ... need to size the sid buffer + */ + rv = LookupAccountName(domain, groupname, domain, &sidlen, + anydomain, &domlen, &sidtype); + if (sidlen) { + /* Give it back on the second pass + */ + *gid = apr_palloc(p, sidlen); + domlen = sizeof(anydomain); + rv = LookupAccountName(domain, groupname, *gid, &sidlen, + anydomain, &domlen, &sidtype); + } + if (!sidlen || !rv) { + return apr_get_os_error(); + } + return APR_SUCCESS; +} + APR_DECLARE(apr_status_t) apr_get_groupname(char **groupname, apr_gid_t groupid, apr_pool_t *p) { SID_NAME_USE type; |