Cygwin: cygheap: convert installation paths to UNICODE_STRINGS
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
a7f392686b
commit
866901441b
@ -139,11 +139,11 @@ init_cygheap::init_installation_root ()
|
|||||||
{
|
{
|
||||||
ptrdiff_t len = 0;
|
ptrdiff_t len = 0;
|
||||||
|
|
||||||
if (!GetModuleFileNameW (cygwin_hmodule, installation_root, PATH_MAX))
|
if (!GetModuleFileNameW (cygwin_hmodule, installation_root_buf, PATH_MAX))
|
||||||
api_fatal ("Can't initialize Cygwin installation root dir.\n"
|
api_fatal ("Can't initialize Cygwin installation root dir.\n"
|
||||||
"GetModuleFileNameW(%p, %p, %u), %E",
|
"GetModuleFileNameW(%p, %p, %u), %E",
|
||||||
cygwin_hmodule, installation_root, PATH_MAX);
|
cygwin_hmodule, installation_root_buf, PATH_MAX);
|
||||||
PWCHAR p = installation_root;
|
PWCHAR p = installation_root_buf;
|
||||||
if (wcsncasecmp (p, L"\\\\", 2)) /* Normal drive letter path */
|
if (wcsncasecmp (p, L"\\\\", 2)) /* Normal drive letter path */
|
||||||
{
|
{
|
||||||
len = 4;
|
len = 4;
|
||||||
@ -170,18 +170,18 @@ init_cygheap::init_installation_root ()
|
|||||||
p = wcschr (p + 1, L'\\'); /* Skip share name */
|
p = wcschr (p + 1, L'\\'); /* Skip share name */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
installation_root[1] = L'?';
|
installation_root_buf[1] = L'?';
|
||||||
RtlInitEmptyUnicodeString (&installation_key, installation_key_buf,
|
RtlInitEmptyUnicodeString (&installation_key, installation_key_buf,
|
||||||
sizeof installation_key_buf);
|
sizeof installation_key_buf);
|
||||||
RtlInt64ToHexUnicodeString (hash_path_name (0, installation_root),
|
RtlInt64ToHexUnicodeString (hash_path_name (0, installation_root_buf),
|
||||||
&installation_key, FALSE);
|
&installation_key, FALSE);
|
||||||
|
|
||||||
/* Strip off last path component ("\\cygwin1.dll") */
|
/* Strip off last path component ("\\cygwin1.dll") */
|
||||||
PWCHAR w = wcsrchr (installation_root, L'\\');
|
PWCHAR w = wcsrchr (installation_root_buf, L'\\');
|
||||||
if (w)
|
if (w)
|
||||||
{
|
{
|
||||||
*w = L'\0';
|
*w = L'\0';
|
||||||
w = wcsrchr (installation_root, L'\\');
|
w = wcsrchr (installation_root_buf, L'\\');
|
||||||
}
|
}
|
||||||
if (!w)
|
if (!w)
|
||||||
api_fatal ("Can't initialize Cygwin installation root dir.\n"
|
api_fatal ("Can't initialize Cygwin installation root dir.\n"
|
||||||
@ -190,15 +190,14 @@ init_cygheap::init_installation_root ()
|
|||||||
/* Copy result into installation_dir before stripping off "bin" dir and
|
/* Copy result into installation_dir before stripping off "bin" dir and
|
||||||
revert to Win32 path. This path is added to the Windows environment
|
revert to Win32 path. This path is added to the Windows environment
|
||||||
in build_env. See there for a description. */
|
in build_env. See there for a description. */
|
||||||
installation_dir_len = wcpncpy (installation_dir, installation_root + len,
|
wcpncpy (installation_dir_buf, installation_root_buf + len, PATH_MAX);
|
||||||
PATH_MAX)
|
|
||||||
- installation_dir;
|
|
||||||
if (len == 4) /* Local path */
|
if (len == 4) /* Local path */
|
||||||
;
|
;
|
||||||
else if (len == 6) /* UNC path */
|
else if (len == 6) /* UNC path */
|
||||||
installation_dir[0] = L'\\';
|
installation_dir_buf[0] = L'\\';
|
||||||
else /* Long, prefixed path */
|
else /* Long, prefixed path */
|
||||||
installation_dir[1] = L'\\';
|
installation_dir_buf[1] = L'\\';
|
||||||
|
|
||||||
/* If w < p, the Cygwin DLL resides in the root dir of a drive or network
|
/* If w < p, the Cygwin DLL resides in the root dir of a drive or network
|
||||||
path. In that case, if we strip off yet another backslash, the path
|
path. In that case, if we strip off yet another backslash, the path
|
||||||
@ -208,12 +207,15 @@ init_cygheap::init_installation_root ()
|
|||||||
if (w > p)
|
if (w > p)
|
||||||
*w = L'\0';
|
*w = L'\0';
|
||||||
|
|
||||||
|
RtlInitUnicodeString (&installation_root, installation_root_buf);
|
||||||
|
RtlInitUnicodeString (&installation_dir, installation_dir_buf);
|
||||||
|
|
||||||
for (int i = 1; i >= 0; --i)
|
for (int i = 1; i >= 0; --i)
|
||||||
{
|
{
|
||||||
reg_key r (i, KEY_WRITE, _WIDE (CYGWIN_INFO_INSTALLATIONS_NAME),
|
reg_key r (i, KEY_WRITE, _WIDE (CYGWIN_INFO_INSTALLATIONS_NAME),
|
||||||
NULL);
|
NULL);
|
||||||
if (NT_SUCCESS (r.set_string (installation_key_buf,
|
if (NT_SUCCESS (r.set_string (installation_key_buf,
|
||||||
installation_root)))
|
installation_root_buf)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -557,9 +557,10 @@ struct init_cygheap: public mini_cygheap
|
|||||||
_cmalloc_entry *chain;
|
_cmalloc_entry *chain;
|
||||||
unsigned bucket_val[NBUCKETS];
|
unsigned bucket_val[NBUCKETS];
|
||||||
char *buckets[NBUCKETS];
|
char *buckets[NBUCKETS];
|
||||||
WCHAR installation_root[PATH_MAX];
|
UNICODE_STRING installation_root;
|
||||||
WCHAR installation_dir[PATH_MAX];
|
WCHAR installation_root_buf[PATH_MAX];
|
||||||
size_t installation_dir_len;
|
UNICODE_STRING installation_dir;
|
||||||
|
WCHAR installation_dir_buf[PATH_MAX];
|
||||||
UNICODE_STRING installation_key;
|
UNICODE_STRING installation_key;
|
||||||
WCHAR installation_key_buf[18];
|
WCHAR installation_key_buf[18];
|
||||||
cygheap_root root;
|
cygheap_root root;
|
||||||
|
@ -1282,10 +1282,11 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
|
|||||||
during execve. */
|
during execve. */
|
||||||
if (!saw_PATH)
|
if (!saw_PATH)
|
||||||
{
|
{
|
||||||
new_tl += cygheap->installation_dir_len + 5;
|
new_tl += cygheap->installation_dir.Length / sizeof (WCHAR) + 5;
|
||||||
if (new_tl > tl)
|
if (new_tl > tl)
|
||||||
tl = raise_envblock (new_tl, envblock, s);
|
tl = raise_envblock (new_tl, envblock, s);
|
||||||
s = wcpcpy (wcpcpy (s, L"PATH="), cygheap->installation_dir) + 1;
|
s = wcpcpy (wcpcpy (s, L"PATH="),
|
||||||
|
cygheap->installation_dir.Buffer) + 1;
|
||||||
}
|
}
|
||||||
*s = L'\0'; /* Two null bytes at the end */
|
*s = L'\0'; /* Two null bytes at the end */
|
||||||
assert ((s - envblock) <= tl); /* Detect if we somehow ran over end
|
assert ((s - envblock) <= tl); /* Detect if we somehow ran over end
|
||||||
|
@ -492,7 +492,7 @@ mount_info::init (bool user_init)
|
|||||||
PWCHAR pathend;
|
PWCHAR pathend;
|
||||||
WCHAR path[PATH_MAX];
|
WCHAR path[PATH_MAX];
|
||||||
|
|
||||||
pathend = wcpcpy (path, cygheap->installation_root);
|
pathend = wcpcpy (path, cygheap->installation_root.Buffer);
|
||||||
if (!user_init)
|
if (!user_init)
|
||||||
create_root_entry (path);
|
create_root_entry (path);
|
||||||
|
|
||||||
|
@ -1305,11 +1305,11 @@ cygheap_pwdgrp::_nss_init ()
|
|||||||
char *buf = tp.c_get ();
|
char *buf = tp.c_get ();
|
||||||
|
|
||||||
PCWSTR rel_path = L"\\etc\\nsswitch.conf";
|
PCWSTR rel_path = L"\\etc\\nsswitch.conf";
|
||||||
path.Length = (wcslen (cygheap->installation_root) + wcslen (rel_path))
|
path.Length = cygheap->installation_root.Length
|
||||||
* sizeof (WCHAR);
|
+ wcslen (rel_path) * sizeof (WCHAR);
|
||||||
path.MaximumLength = path.Length + sizeof (WCHAR);
|
path.MaximumLength = path.Length + sizeof (WCHAR);
|
||||||
path.Buffer = (PWCHAR) alloca (path.MaximumLength);
|
path.Buffer = (PWCHAR) alloca (path.MaximumLength);
|
||||||
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root), rel_path);
|
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root.Buffer), rel_path);
|
||||||
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
|
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
if (rl.init (&attr, buf, NT_MAX_PATH))
|
if (rl.init (&attr, buf, NT_MAX_PATH))
|
||||||
@ -1665,11 +1665,12 @@ pwdgrp::check_file ()
|
|||||||
if (!path.Buffer)
|
if (!path.Buffer)
|
||||||
{
|
{
|
||||||
PCWSTR rel_path = is_group () ? L"\\etc\\group" : L"\\etc\\passwd";
|
PCWSTR rel_path = is_group () ? L"\\etc\\group" : L"\\etc\\passwd";
|
||||||
path.Length = (wcslen (cygheap->installation_root) + wcslen (rel_path))
|
path.Length = cygheap->installation_root.Length
|
||||||
* sizeof (WCHAR);
|
+ wcslen (rel_path) * sizeof (WCHAR);
|
||||||
path.MaximumLength = path.Length + sizeof (WCHAR);
|
path.MaximumLength = path.Length + sizeof (WCHAR);
|
||||||
path.Buffer = (PWCHAR) cmalloc_abort (HEAP_BUF, path.MaximumLength);
|
path.Buffer = (PWCHAR) cmalloc_abort (HEAP_BUF, path.MaximumLength);
|
||||||
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root), rel_path);
|
wcpcpy (wcpcpy (path.Buffer, cygheap->installation_root.Buffer),
|
||||||
|
rel_path);
|
||||||
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
|
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user