summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog17
-rw-r--r--winsup/cygwin/external.cc24
-rw-r--r--winsup/cygwin/grp.cc8
-rw-r--r--winsup/cygwin/include/sys/cygwin.h22
-rw-r--r--winsup/cygwin/passwd.cc33
-rw-r--r--winsup/cygwin/pwdgrp.h17
-rw-r--r--winsup/cygwin/uinfo.cc4
7 files changed, 98 insertions, 27 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index a0cce104a..7e2147b51 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,20 @@
+2014-02-22 Corinna Vinschen <corinna@vinschen.de>
+
+ * external.cc (cygwin_internal): Add cases for CW_GETNSSSEP,
+ CW_GETPWSID and CW_GETGRSID.
+ * grp.cc (internal_getgrsid_from_db): New function.
+ * passwd.cc (internal_getpwsid_from_db): New function.
+ (pg_ent::setent): Add special case for call from mkpasswd/mkgroup.
+ * pwdgrp.h (internal_getpwsid_from_db): Declare.
+ (internal_getgrsid_from_db): Declare.
+ (enum nss_enum_t): Move to include/sys/cygwin.h.
+ (class pg_ent): Add comment.
+ * uinfo.cc (pwdgrp::fetch_account_from_windows): Fix typo in comment.
+ Change "UNIX" to "Unix" in domain name.
+ * include/sys/cygwin.h (cygwin_getinfo_types): Add CW_GETNSSSEP,
+ CW_GETPWSID and CW_GETGRSID.
+ (enum nss_enum_t): Define here.
+
2014-02-21 Corinna Vinschen <corinna@vinschen.de>
* pwdgrp.h (pwdgrp::fetch_account_from_windows): Add bool parameter
diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc
index eb602fbf6..a99cfef33 100644
--- a/winsup/cygwin/external.cc
+++ b/winsup/cygwin/external.cc
@@ -595,6 +595,30 @@ cygwin_internal (cygwin_getinfo_types t, ...)
}
break;
+ case CW_GETNSSSEP:
+ res = (uintptr_t) cygheap->pg.nss_separator ();
+ break;
+
+ case CW_GETPWSID:
+ {
+ int db_only = va_arg (arg, int);
+ PSID psid = va_arg (arg, PSID);
+ cygpsid sid (psid);
+ res = (uintptr_t) (db_only ? internal_getpwsid_from_db (sid)
+ : internal_getpwsid (sid));
+ }
+ break;
+
+ case CW_GETGRSID:
+ {
+ int db_only = va_arg (arg, int);
+ PSID psid = va_arg (arg, PSID);
+ cygpsid sid (psid);
+ res = (uintptr_t) (db_only ? internal_getgrsid_from_db (sid)
+ : internal_getgrsid (sid));
+ }
+ break;
+
default:
set_errno (ENOSYS);
}
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
index e4aed4d55..2ced0678e 100644
--- a/winsup/cygwin/grp.cc
+++ b/winsup/cygwin/grp.cc
@@ -139,6 +139,14 @@ internal_getgrsid (cygpsid &sid)
return NULL;
}
+/* This function gets only called from mkgroup via cygwin_internal. */
+struct group *
+internal_getgrsid_from_db (cygpsid &sid)
+{
+ cygheap->pg.nss_init ();
+ return cygheap->pg.grp_cache.win.add_group_from_windows (sid);
+}
+
struct group *
internal_getgrnam (const char *name)
{
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index 46c3595e6..32b9172a8 100644
--- a/winsup/cygwin/include/sys/cygwin.h
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -146,7 +146,10 @@ typedef enum
CW_FREE_DRIVE_MAP,
CW_SETENT,
CW_GETENT,
- CW_ENDENT
+ CW_ENDENT,
+ CW_GETNSSSEP,
+ CW_GETPWSID,
+ CW_GETGRSID
} cygwin_getinfo_types;
#define CW_LOCK_PINFO CW_LOCK_PINFO
@@ -200,6 +203,9 @@ typedef enum
#define CW_SETENT CW_SETENT
#define CW_GETENT CW_GETENT
#define CW_ENDENT CW_ENDENT
+#define CW_GETNSSSEP CW_GETNSSSEP
+#define CW_GETPWSID CW_GETPWSID
+#define CW_GETGRSID CW_GETGRSID
/* Token type for CW_SET_EXTERNAL_TOKEN */
enum
@@ -208,6 +214,20 @@ CW_TOKEN_IMPERSONATION = 0,
CW_TOKEN_RESTRICTED = 1
};
+/* Enumeration source constants for CW_SETENT called from mkpasswd/mkgroup. */
+enum nss_enum_t
+{
+ ENUM_NONE = 0x00,
+ ENUM_CACHE = 0x01,
+ ENUM_FILES = 0x02,
+ ENUM_BUILTIN = 0x04,
+ ENUM_LOCAL = 0x08,
+ ENUM_PRIMARY = 0x10,
+ ENUM_TDOMS = 0x20,
+ ENUM_TDOMS_ALL = 0x40,
+ ENUM_ALL = 0x7f
+};
+
#define CW_NEXTPID 0x80000000 /* or with pid to get next one */
uintptr_t cygwin_internal (cygwin_getinfo_types, ...);
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index 54a125066..1a5564904 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -123,6 +123,14 @@ internal_getpwsid (cygpsid &sid)
return NULL;
}
+/* This function gets only called from mkpasswd via cygwin_internal. */
+struct passwd *
+internal_getpwsid_from_db (cygpsid &sid)
+{
+ cygheap->pg.nss_init ();
+ return cygheap->pg.pwd_cache.win.add_user_from_windows (sid);
+}
+
struct passwd *
internal_getpwnam (const char *name)
{
@@ -300,23 +308,28 @@ pg_ent::setent (bool _group, int _enums, PCWSTR _enum_tdoms)
endent (_group);
if (!_enums && !_enum_tdoms)
{
+ /* This is the default, when called from the usual setpwent/setgrent
+ functions. */
enums = cygheap->pg.nss_db_enums ();
enum_tdoms = cygheap->pg.nss_db_enum_tdoms ();
+ if (_group)
+ {
+ from_files = cygheap->pg.nss_grp_files ();
+ from_db = cygheap->pg.nss_grp_db ();
+ }
+ else
+ {
+ from_files = cygheap->pg.nss_pwd_files ();
+ from_db = cygheap->pg.nss_pwd_db ();
+ }
}
else
{
+ /* This case is when called from mkpasswd/mkgroup via cygwin_internal. */
enums = _enums;
enum_tdoms = _enum_tdoms;
- }
- if (_group)
- {
- from_files = cygheap->pg.nss_grp_files ();
- from_db = cygheap->pg.nss_grp_db ();
- }
- else
- {
- from_files = cygheap->pg.nss_pwd_files ();
- from_db = cygheap->pg.nss_pwd_db ();
+ from_files = false;
+ from_db = true;
}
state = from_cache;
}
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index d3546633f..808bddb9f 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -15,9 +15,11 @@ details. */
/* These functions are needed to allow searching and walking through
the passwd and group lists */
extern struct passwd *internal_getpwsid (cygpsid &);
+extern struct passwd *internal_getpwsid_from_db (cygpsid &sid);
extern struct passwd *internal_getpwnam (const char *);
extern struct passwd *internal_getpwuid (uid_t);
extern struct group *internal_getgrsid (cygpsid &);
+extern struct group *internal_getgrsid_from_db (cygpsid &sid);
extern struct group *internal_getgrgid (gid_t);
extern struct group *internal_getgrnam (const char *);
int internal_getgroups (int, gid_t *, cygpsid * = NULL);
@@ -158,19 +160,6 @@ public:
struct group *find_group (gid_t gid);
};
-enum nss_enum_t
-{
- ENUM_NONE = 0x00,
- ENUM_CACHE = 0x01,
- ENUM_FILES = 0x02,
- ENUM_BUILTIN = 0x04,
- ENUM_LOCAL = 0x08,
- ENUM_PRIMARY = 0x10,
- ENUM_TDOMS = 0x20,
- ENUM_TDOMS_ALL = 0x40,
- ENUM_ALL = 0x7f
-};
-
class pg_ent
{
protected:
@@ -184,7 +173,7 @@ protected:
ULONG cnt;
ULONG max;
ULONG_PTR resume;
- int enums;
+ int enums; /* ENUM_xxx values defined in sys/cygwin.h. */
PCWSTR enum_tdoms;
bool from_files;
bool from_db;
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 46e311eb6..20b218851 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -1720,12 +1720,12 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, bool group,
{
/* Samba UNIX Users/Groups
- This *might* colide with a posix_offset of some trusted domain.
+ This *might* collide with a posix_offset of some trusted domain.
It's just very unlikely. */
uid = MAP_UNIX_TO_CYGWIN_ID (sid_sub_auth_rid (sid));
/* Unfortunately we have no access to the file server from here,
so we can't generate correct user names. */
- p = wcpcpy (dom, L"UNIX_");
+ p = wcpcpy (dom, L"Unix_");
wcpcpy (p, sid_sub_auth (sid, 0) == 1 ? L"User" : L"Group");
__small_swprintf (name = namebuf, L"%d", uid & UNIX_POSIX_MASK);
name_style = fully_qualified;