summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/shared.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-07-24 18:25:52 +0000
committerCorinna Vinschen <corinna@vinschen.de>2008-07-24 18:25:52 +0000
commit520fcc974702602a1a3b246346e726492bad52e6 (patch)
treed57b580ba4493d8f1e886548044b4771544905fd /winsup/cygwin/shared.cc
parent410c1d122d8c65b747d55138f00d32d5c1b607bc (diff)
downloadcygnal-520fcc974702602a1a3b246346e726492bad52e6.tar.gz
cygnal-520fcc974702602a1a3b246346e726492bad52e6.tar.bz2
cygnal-520fcc974702602a1a3b246346e726492bad52e6.zip
* 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.cc53
1 files changed, 50 insertions, 3 deletions
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
index 8f2537915..fca79e487 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 */
}