summaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
authorWilliam A. Rowe Jr <wrowe@apache.org>2001-11-24 21:15:43 +0000
committerWilliam A. Rowe Jr <wrowe@apache.org>2001-11-24 21:15:43 +0000
commitb20eeae9d714bb1f62cb24439d702ad57e76bf6e (patch)
treedd67e48760d72fb5bec284e3b4dc67bd75666007 /user
parentdac43a5e04d0582846f1fd9ae4896f7849821c18 (diff)
downloadapr-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.c40
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;