diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-07-24 18:25:52 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-07-24 18:25:52 +0000 |
commit | 520fcc974702602a1a3b246346e726492bad52e6 (patch) | |
tree | d57b580ba4493d8f1e886548044b4771544905fd /winsup/cygwin/shared.cc | |
parent | 410c1d122d8c65b747d55138f00d32d5c1b607bc (diff) | |
download | newlib-520fcc974702602a1a3b246346e726492bad52e6.zip newlib-520fcc974702602a1a3b246346e726492bad52e6.tar.gz newlib-520fcc974702602a1a3b246346e726492bad52e6.tar.bz2 |
* shared.cc (user_shared_initialize): Fetch potentially changed Cygwin
username from /etc/passwd before loading mount table.
(shared_info::init_installation_root): New function fetching Cygwin's
installation root dir and storing as native NT path in global shared
memory.
(shared_info::initialize): Call init_installation_root exactly once at
first startup.
* shared_info.h (SHARED_INFO_CB): Accommodate change to shared_info.
(CURR_SHARED_MAGIC): Ditto.
(class shared_info): Add installation_root member.
(shared_info::init_installation_root): Declare.
* grp.cc (pwdgrp::read_group): Call pwdgrp::load with native WCHAR path.
* passwd.cc (pwdgrp::read_passwd): Ditto. Avoid recursion.
(etc::init): Take POBJECT_ATTRIBUTES instead of path_conv.
* path.h (etc::init): Change prototype accordingly.
* pwdgrp.h (class pwdgrp): Store path as UNICODE_STRING/PWCHAR instead
of as path_conv.
(pwdgrp::load): Accommodate prototype.
* uinfo.cc (pwdgrp::load): Change argument type from char to wchar_t.
Create native NT path here instead of calling path_conv.
* mount.cc (find_root_from_cygwin_dll): Drop in favor of global
initializaion in shared_info.
(mount_info::init): Fetch native NT root dir from cygwin_shared.
(mount_info::from_fstab): Expect native NT path and use native NT
functions to access file. Convert username part in user fstab path
according to special char transformation rules.
* path.cc (tfx_chars): Convert slash to backslash.
(transform_chars): Implement for path given as PWCHAR.
(transform_chars): PUNICODE_STRING version calls PWCHAR version.
Remove useless commented code.
Diffstat (limited to 'winsup/cygwin/shared.cc')
-rw-r--r-- | winsup/cygwin/shared.cc | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc index 8f25379..fca79e4 100644 --- a/winsup/cygwin/shared.cc +++ b/winsup/cygwin/shared.cc @@ -22,8 +22,10 @@ details. */ #include "shared_info_magic.h" #include "registry.h" #include "cygwin_version.h" +#include "pwdgrp.h" #include "ntdll.h" #include <alloca.h> +#include <wchar.h> shared_info NO_COPY *cygwin_shared; user_info NO_COPY *user_shared; @@ -225,7 +227,12 @@ user_shared_initialize (bool reinit) /* Initialize the Cygwin per-user shared, if necessary */ if (!sversion) { - debug_printf ("initializing user shared"); + cygpsid sid (cygheap->user.sid ()); + struct passwd *pw = internal_getpwsid (sid); + /* Correct the user name with what's defined in /etc/passwd before + loading the user fstab file. */ + if (pw) + cygheap->user.set_name (pw->pw_name); user_shared->mountinfo.init (); /* Initialize the mount table. */ user_shared->cb = sizeof (*user_shared); } @@ -240,6 +247,46 @@ user_shared_initialize (bool reinit) } } +/* Use absolute path of cygwin1.dll to derive the Win32 dir which + is our installation root. Note that we can't handle Cygwin installation + root dirs of more than 4K path length. I assume that's ok... */ +void +shared_info::init_installation_root () +{ + if (!GetModuleFileNameW (cygwin_hmodule, installation_root, PATH_MAX)) + api_fatal ("Can't initialize Cygwin installation root dir.\n" + "GetModuleFileNameW(%p, %p, %u), %E", + cygwin_hmodule, installation_root, PATH_MAX); + PWCHAR p = installation_root; + if (wcsncmp (p, L"\\\\?\\", 4)) /* No long path prefix. */ + { + if (!wcsncasecmp (p, L"\\\\", 2)) /* UNC */ + { + p = wcpcpy (p, L"\\??\\UN"); + GetModuleFileNameW (cygwin_hmodule, p, PATH_MAX - 6); + *p = L'C'; + } + else + { + p = wcpcpy (p, L"\\??\\"); + GetModuleFileNameW (cygwin_hmodule, p, PATH_MAX - 4); + } + } + installation_root[1] = L'?'; + + PWCHAR w = wcsrchr (installation_root, L'\\'); + if (w) + { + *w = L'\0'; + w = wcsrchr (installation_root, L'\\'); + } + if (!w) + api_fatal ("Can't initialize Cygwin installation root dir.\n" + "Invalid DLL path"); + + *w = L'\0'; +} + /* Initialize obcaseinsensitive. Default to case insensitive on pre-XP. */ void shared_info::init_obcaseinsensitive () @@ -279,10 +326,10 @@ shared_info::initialize () if (!sversion) { - + init_installation_root ();/* Initialize installation root dir. */ + init_obcaseinsensitive ();/* Initialize obcaseinsensitive. */ tty.init (); /* Initialize tty table. */ mt.initialize (); /* Initialize shared tape information. */ - init_obcaseinsensitive ();/* Initialize obcaseinsensitive. */ cb = sizeof (*this); /* Do last, after all shared memory initialization */ } |