mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-20 13:29:24 +08:00
* 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:
parent
410c1d122d
commit
520fcc9747
@ -1,3 +1,38 @@
|
|||||||
|
2008-07-24 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2008-07-22 Corinna Vinschen <corinna@vinschen.de>
|
2008-07-22 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* spawn.cc (spawn_guts): Fix previous patch for UNC paths.
|
* spawn.cc (spawn_guts): Fix previous patch for UNC paths.
|
||||||
|
@ -72,7 +72,7 @@ pwdgrp::read_group ()
|
|||||||
if ((*group_buf)[i].gr_mem != &null_ptr)
|
if ((*group_buf)[i].gr_mem != &null_ptr)
|
||||||
free ((*group_buf)[i].gr_mem);
|
free ((*group_buf)[i].gr_mem);
|
||||||
|
|
||||||
load ("/etc/group");
|
load (L"\\etc\\group");
|
||||||
|
|
||||||
/* Complete /etc/group in memory if needed */
|
/* Complete /etc/group in memory if needed */
|
||||||
if (!internal_getgrgid (myself->gid))
|
if (!internal_getgrgid (myself->gid))
|
||||||
|
@ -72,32 +72,6 @@ win32_device_name (const char *src_path, char *win32_path, device& dev)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use absolute path of cygwin1.dll to derive a "root".
|
|
||||||
Return false if GetModuleFileNameW fails or path is "funny".
|
|
||||||
Otherwise return true. */
|
|
||||||
static inline PWCHAR
|
|
||||||
find_root_from_cygwin_dll (WCHAR *path)
|
|
||||||
{
|
|
||||||
if (!GetModuleFileNameW (cygwin_hmodule, path, NT_MAX_PATH))
|
|
||||||
{
|
|
||||||
debug_printf ("GetModuleFileNameW(%p, %p, %u), %E", cygwin_hmodule, path, NT_MAX_PATH);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
PWCHAR w = wcsrchr (path, L'\\');
|
|
||||||
if (w)
|
|
||||||
{
|
|
||||||
*w = L'\0';
|
|
||||||
w = wcsrchr (path, L'\\');
|
|
||||||
}
|
|
||||||
if (!w)
|
|
||||||
{
|
|
||||||
debug_printf ("Invalid DLL path");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
*w = L'\0';
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
mount_info::create_root_entry (const PWCHAR root)
|
mount_info::create_root_entry (const PWCHAR root)
|
||||||
{
|
{
|
||||||
@ -121,14 +95,13 @@ mount_info::init ()
|
|||||||
nmounts = 0;
|
nmounts = 0;
|
||||||
PWCHAR pathend;
|
PWCHAR pathend;
|
||||||
WCHAR path[NT_MAX_PATH];
|
WCHAR path[NT_MAX_PATH];
|
||||||
if ((pathend = find_root_from_cygwin_dll (path)))
|
|
||||||
{
|
pathend = wcpcpy (path, cygwin_shared->installation_root);
|
||||||
create_root_entry (path);
|
create_root_entry (path);
|
||||||
pathend = wcpcpy (pathend, L"\\etc\\fstab");
|
pathend = wcpcpy (pathend, L"\\etc\\fstab");
|
||||||
if (from_fstab (false, path, pathend) /* The single | is correct! */
|
if (from_fstab (false, path, pathend) /* The single | is correct! */
|
||||||
| from_fstab (true, path, pathend))
|
| from_fstab (true, path, pathend))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: Remove warning message before releasing 1.7.0. */
|
/* FIXME: Remove warning message before releasing 1.7.0. */
|
||||||
small_printf ("Huh? No /etc/fstab file? Using default root and cygdrive prefix...\n");
|
small_printf ("Huh? No /etc/fstab file? Using default root and cygdrive prefix...\n");
|
||||||
@ -737,27 +710,45 @@ mount_info::from_fstab_line (char *line, bool user)
|
|||||||
bool
|
bool
|
||||||
mount_info::from_fstab (bool user, WCHAR fstab[], PWCHAR fstab_end)
|
mount_info::from_fstab (bool user, WCHAR fstab[], PWCHAR fstab_end)
|
||||||
{
|
{
|
||||||
|
UNICODE_STRING upath;
|
||||||
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
NTSTATUS status;
|
||||||
|
HANDLE fh;
|
||||||
|
|
||||||
if (user)
|
if (user)
|
||||||
sys_mbstowcs (wcpcpy (fstab_end, L".d\\"),
|
|
||||||
NT_MAX_PATH - (fstab_end - fstab),
|
|
||||||
cygheap->user.name ());
|
|
||||||
debug_printf ("Try to read mounts from %W", fstab);
|
|
||||||
HANDLE h = CreateFileW (fstab, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih,
|
|
||||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
{
|
||||||
debug_printf ("CreateFileW, %E");
|
extern void transform_chars (PWCHAR, PWCHAR);
|
||||||
|
PWCHAR username;
|
||||||
|
sys_mbstowcs (username = wcpcpy (fstab_end, L".d\\"),
|
||||||
|
NT_MAX_PATH - (fstab_end - fstab),
|
||||||
|
cygheap->user.name ());
|
||||||
|
/* Make sure special chars in the username are converted according to
|
||||||
|
the rules. */
|
||||||
|
transform_chars (username, username + wcslen (username) - 1);
|
||||||
|
}
|
||||||
|
RtlInitUnicodeString (&upath, fstab);
|
||||||
|
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||||
|
debug_printf ("Try to read mounts from %W", fstab);
|
||||||
|
status = NtOpenFile (&fh, SYNCHRONIZE | FILE_READ_DATA, &attr, &io,
|
||||||
|
FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
|
if (!NT_SUCCESS (status))
|
||||||
|
{
|
||||||
|
system_printf ("NtOpenFile(%S) failed, %p", &upath, status);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf[NT_MAX_PATH];
|
char buf[NT_MAX_PATH];
|
||||||
char *got = buf;
|
char *got = buf;
|
||||||
DWORD len = 0;
|
DWORD len = 0;
|
||||||
unsigned line = 1;
|
unsigned line = 1;
|
||||||
/* Using buffer size - 2 leaves space to append two \0. */
|
/* Using buffer size - 2 leaves space to append two \0. */
|
||||||
while (ReadFile (h, got, (sizeof (buf) - 2) - (got - buf), &len, NULL))
|
while (NT_SUCCESS (NtReadFile (fh, NULL, NULL, NULL, &io, got,
|
||||||
|
(sizeof (buf) - 2) - (got - buf), NULL, NULL)))
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
|
|
||||||
|
len = io.Information;
|
||||||
/* Set end marker. */
|
/* Set end marker. */
|
||||||
got[len] = got[len + 1] = '\0';
|
got[len] = got[len + 1] = '\0';
|
||||||
/* Set len to the absolute len of bytes in buf. */
|
/* Set len to the absolute len of bytes in buf. */
|
||||||
@ -783,8 +774,10 @@ retry:
|
|||||||
if (!got_nl)
|
if (!got_nl)
|
||||||
{
|
{
|
||||||
system_printf ("%W: Line %d too long, skipping...", fstab, line);
|
system_printf ("%W: Line %d too long, skipping...", fstab, line);
|
||||||
while (ReadFile (h, buf, (sizeof (buf) - 2), &len, NULL))
|
while (NT_SUCCESS (NtReadFile (fh, NULL, NULL, NULL, &io, buf,
|
||||||
|
(sizeof (buf) - 2), NULL, NULL)))
|
||||||
{
|
{
|
||||||
|
len = io.Information;
|
||||||
buf[len] = buf[len + 1] = '\0';
|
buf[len] = buf[len + 1] = '\0';
|
||||||
got = strchr (buf, '\n');
|
got = strchr (buf, '\n');
|
||||||
if (got)
|
if (got)
|
||||||
@ -809,7 +802,7 @@ retry:
|
|||||||
if (got > buf)
|
if (got > buf)
|
||||||
from_fstab_line (got, user);
|
from_fstab_line (got, user);
|
||||||
done:
|
done:
|
||||||
CloseHandle (h);
|
NtClose (fh);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ pwdgrp::parse_passwd ()
|
|||||||
void
|
void
|
||||||
pwdgrp::read_passwd ()
|
pwdgrp::read_passwd ()
|
||||||
{
|
{
|
||||||
load ("/etc/passwd");
|
load (L"\\etc\\passwd");
|
||||||
|
|
||||||
char strbuf[128] = "";
|
char strbuf[128] = "";
|
||||||
bool searchentry = true;
|
bool searchentry = true;
|
||||||
@ -72,7 +72,6 @@ pwdgrp::read_passwd ()
|
|||||||
{
|
{
|
||||||
static char linebuf[1024]; // must be static and
|
static char linebuf[1024]; // must be static and
|
||||||
// should not be NO_COPY
|
// should not be NO_COPY
|
||||||
cygheap->user.ontherange (CH_HOME, NULL);
|
|
||||||
snprintf (linebuf, sizeof (linebuf), "%s:*:%lu:%lu:,%s:%s:/bin/sh",
|
snprintf (linebuf, sizeof (linebuf), "%s:*:%lu:%lu:,%s:%s:/bin/sh",
|
||||||
cygheap->user.name (),
|
cygheap->user.name (),
|
||||||
myself->uid == ILLEGAL_UID ? UNKNOWN_UID : myself->uid,
|
myself->uid == ILLEGAL_UID ? UNKNOWN_UID : myself->uid,
|
||||||
|
@ -574,7 +574,7 @@ WCHAR tfx_chars[] NO_COPY = {
|
|||||||
16, 17, 18, 19, 20, 21, 22, 23,
|
16, 17, 18, 19, 20, 21, 22, 23,
|
||||||
24, 25, 26, 27, 28, 29, 30, 31,
|
24, 25, 26, 27, 28, 29, 30, 31,
|
||||||
32, '!', 0xf000 | '"', '#', '$', '%', '&', 39,
|
32, '!', 0xf000 | '"', '#', '$', '%', '&', 39,
|
||||||
'(', ')', 0xf000 | '*', '+', ',', '-', '.', '/',
|
'(', ')', 0xf000 | '*', '+', ',', '-', '.', '\\',
|
||||||
'0', '1', '2', '3', '4', '5', '6', '7',
|
'0', '1', '2', '3', '4', '5', '6', '7',
|
||||||
'8', '9', 0xf000 | ':', ';', 0xf000 | '<', '=', 0xf000 | '>', 0xf000 | '?',
|
'8', '9', 0xf000 | ':', ';', 0xf000 | '<', '=', 0xf000 | '>', 0xf000 | '?',
|
||||||
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
|
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
|
||||||
@ -587,22 +587,20 @@ WCHAR tfx_chars[] NO_COPY = {
|
|||||||
'x', 'y', 'z', '{', 0xf000 | '|', '}', '~', 127
|
'x', 'y', 'z', '{', 0xf000 | '|', '}', '~', 127
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
void
|
||||||
|
transform_chars (PWCHAR path, PWCHAR path_end)
|
||||||
|
{
|
||||||
|
for (; path <= path_end; ++path)
|
||||||
|
if (*path < 128)
|
||||||
|
*path = tfx_chars[*path];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void
|
||||||
transform_chars (PUNICODE_STRING upath, USHORT start_idx)
|
transform_chars (PUNICODE_STRING upath, USHORT start_idx)
|
||||||
{
|
{
|
||||||
register PWCHAR buf = upath->Buffer;
|
transform_chars (upath->Buffer + start_idx,
|
||||||
register PWCHAR end = buf + upath->Length / sizeof (WCHAR) - 1;
|
upath->Buffer + upath->Length / sizeof (WCHAR) - 1);
|
||||||
for (buf += start_idx; buf <= end; ++buf)
|
|
||||||
if (*buf < 128)
|
|
||||||
*buf = tfx_chars[*buf];
|
|
||||||
#if 0
|
|
||||||
/* Win32 can't handle trailing dots and spaces. Transform the last of them
|
|
||||||
to the private use area, too, to create a valid Win32 filename. */
|
|
||||||
if (*end == L'\\')
|
|
||||||
--end;
|
|
||||||
if (*end == L'.' || *end == L' ')
|
|
||||||
*end |= 0xf000;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PUNICODE_STRING
|
PUNICODE_STRING
|
||||||
@ -3391,7 +3389,7 @@ OBJECT_ATTRIBUTES etc::fn[MAX_ETC_FILES + 1];
|
|||||||
LARGE_INTEGER etc::last_modified[MAX_ETC_FILES + 1];
|
LARGE_INTEGER etc::last_modified[MAX_ETC_FILES + 1];
|
||||||
|
|
||||||
int
|
int
|
||||||
etc::init (int n, path_conv &pc)
|
etc::init (int n, POBJECT_ATTRIBUTES attr)
|
||||||
{
|
{
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
/* ok */;
|
/* ok */;
|
||||||
@ -3400,7 +3398,7 @@ etc::init (int n, path_conv &pc)
|
|||||||
else
|
else
|
||||||
api_fatal ("internal error");
|
api_fatal ("internal error");
|
||||||
|
|
||||||
pc.get_object_attr (fn[n], sec_none_nih);
|
fn[n] = *attr;
|
||||||
change_possible[n] = false;
|
change_possible[n] = false;
|
||||||
test_file_change (n);
|
test_file_change (n);
|
||||||
paranoid_printf ("fn[%d] %S, curr_ix %d", n, fn[n].ObjectName, curr_ix);
|
paranoid_printf ("fn[%d] %S, curr_ix %d", n, fn[n].ObjectName, curr_ix);
|
||||||
|
@ -350,7 +350,7 @@ class etc
|
|||||||
static OBJECT_ATTRIBUTES fn[MAX_ETC_FILES + 1];
|
static OBJECT_ATTRIBUTES fn[MAX_ETC_FILES + 1];
|
||||||
static LARGE_INTEGER last_modified[MAX_ETC_FILES + 1];
|
static LARGE_INTEGER last_modified[MAX_ETC_FILES + 1];
|
||||||
static bool dir_changed (int);
|
static bool dir_changed (int);
|
||||||
static int init (int, path_conv &pc);
|
static int init (int, POBJECT_ATTRIBUTES);
|
||||||
static bool file_changed (int);
|
static bool file_changed (int);
|
||||||
static bool test_file_change (int);
|
static bool test_file_change (int);
|
||||||
friend class pwdgrp;
|
friend class pwdgrp;
|
||||||
|
@ -35,7 +35,8 @@ class pwdgrp
|
|||||||
void (pwdgrp::*read) ();
|
void (pwdgrp::*read) ();
|
||||||
bool (pwdgrp::*parse) ();
|
bool (pwdgrp::*parse) ();
|
||||||
int etc_ix;
|
int etc_ix;
|
||||||
path_conv pc;
|
UNICODE_STRING upath;
|
||||||
|
PWCHAR path;
|
||||||
char *buf, *lptr;
|
char *buf, *lptr;
|
||||||
int max_lines;
|
int max_lines;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
@ -67,7 +68,7 @@ class pwdgrp
|
|||||||
public:
|
public:
|
||||||
int curr_lines;
|
int curr_lines;
|
||||||
|
|
||||||
void load (const char *);
|
void load (const wchar_t *);
|
||||||
inline void refresh (bool check)
|
inline void refresh (bool check)
|
||||||
{
|
{
|
||||||
if (!check && initialized)
|
if (!check && initialized)
|
||||||
|
@ -22,8 +22,10 @@ details. */
|
|||||||
#include "shared_info_magic.h"
|
#include "shared_info_magic.h"
|
||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
#include "cygwin_version.h"
|
#include "cygwin_version.h"
|
||||||
|
#include "pwdgrp.h"
|
||||||
#include "ntdll.h"
|
#include "ntdll.h"
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
shared_info NO_COPY *cygwin_shared;
|
shared_info NO_COPY *cygwin_shared;
|
||||||
user_info NO_COPY *user_shared;
|
user_info NO_COPY *user_shared;
|
||||||
@ -225,7 +227,12 @@ user_shared_initialize (bool reinit)
|
|||||||
/* Initialize the Cygwin per-user shared, if necessary */
|
/* Initialize the Cygwin per-user shared, if necessary */
|
||||||
if (!sversion)
|
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->mountinfo.init (); /* Initialize the mount table. */
|
||||||
user_shared->cb = sizeof (*user_shared);
|
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. */
|
/* Initialize obcaseinsensitive. Default to case insensitive on pre-XP. */
|
||||||
void
|
void
|
||||||
shared_info::init_obcaseinsensitive ()
|
shared_info::init_obcaseinsensitive ()
|
||||||
@ -279,10 +326,10 @@ shared_info::initialize ()
|
|||||||
|
|
||||||
if (!sversion)
|
if (!sversion)
|
||||||
{
|
{
|
||||||
|
init_installation_root ();/* Initialize installation root dir. */
|
||||||
|
init_obcaseinsensitive ();/* Initialize obcaseinsensitive. */
|
||||||
tty.init (); /* Initialize tty table. */
|
tty.init (); /* Initialize tty table. */
|
||||||
mt.initialize (); /* Initialize shared tape information. */
|
mt.initialize (); /* Initialize shared tape information. */
|
||||||
init_obcaseinsensitive ();/* Initialize obcaseinsensitive. */
|
|
||||||
cb = sizeof (*this); /* Do last, after all shared memory initialization */
|
cb = sizeof (*this); /* Do last, after all shared memory initialization */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ details. */
|
|||||||
#include "tty.h"
|
#include "tty.h"
|
||||||
#include "security.h"
|
#include "security.h"
|
||||||
#include "mtinfo.h"
|
#include "mtinfo.h"
|
||||||
|
#include "limits.h"
|
||||||
|
|
||||||
/* Mount table entry */
|
/* Mount table entry */
|
||||||
|
|
||||||
@ -117,9 +118,9 @@ public:
|
|||||||
cygwin_version.api_minor)
|
cygwin_version.api_minor)
|
||||||
#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION)
|
#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION)
|
||||||
|
|
||||||
#define SHARED_INFO_CB 31136
|
#define SHARED_INFO_CB 39328
|
||||||
|
|
||||||
#define CURR_SHARED_MAGIC 0x18da899eU
|
#define CURR_SHARED_MAGIC 0x22f9ff0bU
|
||||||
|
|
||||||
/* NOTE: Do not make gratuitous changes to the names or organization of the
|
/* NOTE: Do not make gratuitous changes to the names or organization of the
|
||||||
below class. The layout is checksummed to determine compatibility between
|
below class. The layout is checksummed to determine compatibility between
|
||||||
@ -135,10 +136,12 @@ class shared_info
|
|||||||
DWORD sys_mount_table_counter;
|
DWORD sys_mount_table_counter;
|
||||||
tty_list tty;
|
tty_list tty;
|
||||||
LONG last_used_bindresvport;
|
LONG last_used_bindresvport;
|
||||||
|
WCHAR installation_root[PATH_MAX];
|
||||||
DWORD obcaseinsensitive;
|
DWORD obcaseinsensitive;
|
||||||
mtinfo mt;
|
mtinfo mt;
|
||||||
|
|
||||||
void initialize ();
|
void initialize ();
|
||||||
|
void init_installation_root ();
|
||||||
void init_obcaseinsensitive ();
|
void init_obcaseinsensitive ();
|
||||||
unsigned heap_chunk_size ();
|
unsigned heap_chunk_size ();
|
||||||
unsigned heap_slop_size ();
|
unsigned heap_slop_size ();
|
||||||
|
@ -13,6 +13,7 @@ details. */
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wininet.h>
|
#include <wininet.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
#include <lm.h>
|
#include <lm.h>
|
||||||
#include <iptypes.h>
|
#include <iptypes.h>
|
||||||
#include <sys/cygwin.h>
|
#include <sys/cygwin.h>
|
||||||
@ -22,6 +23,7 @@ details. */
|
|||||||
#include "fhandler.h"
|
#include "fhandler.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
|
#include "shared_info.h"
|
||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
#include "child_info.h"
|
#include "child_info.h"
|
||||||
#include "environ.h"
|
#include "environ.h"
|
||||||
@ -508,7 +510,7 @@ pwdgrp::add_line (char *eptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pwdgrp::load (const char *posix_fname)
|
pwdgrp::load (const wchar_t *rel_path)
|
||||||
{
|
{
|
||||||
static const char failed[] = "failed";
|
static const char failed[] = "failed";
|
||||||
static const char succeeded[] = "succeeded";
|
static const char succeeded[] = "succeeded";
|
||||||
@ -526,23 +528,26 @@ pwdgrp::load (const char *posix_fname)
|
|||||||
buf = NULL;
|
buf = NULL;
|
||||||
curr_lines = 0;
|
curr_lines = 0;
|
||||||
|
|
||||||
pc.check (posix_fname);
|
if (!path &&
|
||||||
etc_ix = etc::init (etc_ix, pc);
|
!(path = (PWCHAR) malloc ((wcslen (cygwin_shared->installation_root)
|
||||||
|
+ wcslen (rel_path) + 1) * sizeof (WCHAR))))
|
||||||
paranoid_printf ("%s", posix_fname);
|
|
||||||
|
|
||||||
if (pc.error || !pc.exists () || pc.isdir ())
|
|
||||||
{
|
{
|
||||||
paranoid_printf ("strange path_conv problem");
|
paranoid_printf ("malloc (%W) failed", rel_path);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
status = NtOpenFile (&fh, FILE_READ_DATA,
|
wcpcpy (wcpcpy (path, cygwin_shared->installation_root), rel_path);
|
||||||
pc.get_object_attr (attr, sec_none_nih), &io,
|
RtlInitUnicodeString (&upath, path);
|
||||||
|
|
||||||
|
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||||
|
etc_ix = etc::init (etc_ix, &attr);
|
||||||
|
|
||||||
|
paranoid_printf ("%S", &upath);
|
||||||
|
|
||||||
|
status = NtOpenFile (&fh, FILE_READ_DATA, &attr, &io,
|
||||||
FILE_SHARE_VALID_FLAGS, 0);
|
FILE_SHARE_VALID_FLAGS, 0);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
paranoid_printf ("NtOpenFile(%S) failed, status %p",
|
paranoid_printf ("NtOpenFile(%S) failed, status %p", &upath, status);
|
||||||
pc.get_nt_native_path (), status);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
status = NtQueryInformationFile (fh, &io, &fsi, sizeof fsi,
|
status = NtQueryInformationFile (fh, &io, &fsi, sizeof fsi,
|
||||||
@ -550,7 +555,7 @@ pwdgrp::load (const char *posix_fname)
|
|||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
paranoid_printf ("NtQueryInformationFile(%S) failed, status %p",
|
paranoid_printf ("NtQueryInformationFile(%S) failed, status %p",
|
||||||
pc.get_nt_native_path (), status);
|
&upath, status);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* FIXME: Should we test for HighPart set? If so, the
|
/* FIXME: Should we test for HighPart set? If so, the
|
||||||
@ -567,8 +572,7 @@ pwdgrp::load (const char *posix_fname)
|
|||||||
fsi.EndOfFile.LowPart, &off, NULL);
|
fsi.EndOfFile.LowPart, &off, NULL);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
paranoid_printf ("NtReadFile(%S) failed, status %p",
|
paranoid_printf ("NtReadFile(%S) failed, status %p", &upath, status);
|
||||||
pc.get_nt_native_path (), status);
|
|
||||||
free (buf);
|
free (buf);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -576,12 +580,12 @@ pwdgrp::load (const char *posix_fname)
|
|||||||
char *eptr = buf;
|
char *eptr = buf;
|
||||||
while ((eptr = add_line (eptr)))
|
while ((eptr = add_line (eptr)))
|
||||||
continue;
|
continue;
|
||||||
debug_printf ("%s curr_lines %d", posix_fname, curr_lines);
|
debug_printf ("%W curr_lines %d", rel_path, curr_lines);
|
||||||
res = succeeded;
|
res = succeeded;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (fh)
|
if (fh)
|
||||||
NtClose (fh);
|
NtClose (fh);
|
||||||
debug_printf ("%s load %s", posix_fname, res);
|
debug_printf ("%W load %s", rel_path, res);
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user