* 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.
This commit is contained in:
@@ -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 */
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user