* autoload.cc: Autoload CharToOemA.
* dcrt0.cc (dll_crt0_1): Translate command line to OEM if current codepage is OEM. * environ.cc: Add new option 'codepage' to CYGWIN environment variable. * fhandler_clipboard.cc (fhandler_clipboard::read): Read clipboard in OEM mode if current codepage is OEM. * fhandler_console.cc (fhandler_console::read): Only translate console input if current codepage is ANSI. * fhandler_console.cc (fhandler_console::write_normal): Translate output data if current codepage is ANSI. * pinfo.cc (codepage_init): New function. Setup current codepage from CYGWIN environment variable and set codepage for file APIs. * security.cc (read_sd): Translate file name to it if current codepage is OEM. * winsup.h: (sys_wcstombs,sys_mbstowcs): Use current codepage for translations between multibyte and widechar string and vice versa.
This commit is contained in:
parent
307cb8ba82
commit
ee1d77e4b7
|
@ -1,3 +1,22 @@
|
||||||
|
2000-12-09 Egor Duda <deo@logos-m.ru>
|
||||||
|
|
||||||
|
* autoload.cc: Autoload CharToOemA.
|
||||||
|
* dcrt0.cc (dll_crt0_1): Translate command line to OEM if current
|
||||||
|
codepage is OEM.
|
||||||
|
* environ.cc: Add new option 'codepage' to CYGWIN environment variable.
|
||||||
|
* fhandler_clipboard.cc (fhandler_clipboard::read): Read clipboard in
|
||||||
|
OEM mode if current codepage is OEM.
|
||||||
|
* fhandler_console.cc (fhandler_console::read): Only translate console
|
||||||
|
input if current codepage is ANSI.
|
||||||
|
* fhandler_console.cc (fhandler_console::write_normal): Translate
|
||||||
|
output data if current codepage is ANSI.
|
||||||
|
* pinfo.cc (codepage_init): New function. Setup current codepage from
|
||||||
|
CYGWIN environment variable and set codepage for file APIs.
|
||||||
|
* security.cc (read_sd): Translate file name to it if current codepage
|
||||||
|
is OEM.
|
||||||
|
* winsup.h: (sys_wcstombs,sys_mbstowcs): Use current codepage for
|
||||||
|
translations between multibyte and widechar string and vice versa.
|
||||||
|
|
||||||
Sat Dec 9 16:29:45 2000 Christopher Faylor <cgf@cygnus.com>
|
Sat Dec 9 16:29:45 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* path.cc (normalize_win32_path): Check for explicit use of two slashes
|
* path.cc (normalize_win32_path): Check for explicit use of two slashes
|
||||||
|
|
|
@ -247,6 +247,7 @@ LoadDLLfuncEx (RtlNtStatusToDosError, 4, ntdll, 1)
|
||||||
LoadDLLfuncEx (ZwQuerySystemInformation, 16, ntdll, 1)
|
LoadDLLfuncEx (ZwQuerySystemInformation, 16, ntdll, 1)
|
||||||
|
|
||||||
LoadDLLinit (user32)
|
LoadDLLinit (user32)
|
||||||
|
LoadDLLfunc (CharToOemA, 8, user32)
|
||||||
LoadDLLfunc (CharToOemBuffA, 12, user32)
|
LoadDLLfunc (CharToOemBuffA, 12, user32)
|
||||||
LoadDLLfunc (CloseClipboard, 0, user32)
|
LoadDLLfunc (CloseClipboard, 0, user32)
|
||||||
LoadDLLfunc (CreateWindowExA, 48, user32)
|
LoadDLLfunc (CreateWindowExA, 48, user32)
|
||||||
|
|
|
@ -15,6 +15,8 @@ details. */
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <wingdi.h>
|
||||||
|
#include <winuser.h>
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "sigproc.h"
|
#include "sigproc.h"
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
|
@ -55,6 +57,7 @@ per_thread NO_COPY *threadstuff[] = {&waitq_storage,
|
||||||
BOOL display_title = FALSE;
|
BOOL display_title = FALSE;
|
||||||
BOOL strip_title_path = FALSE;
|
BOOL strip_title_path = FALSE;
|
||||||
BOOL allow_glob = TRUE;
|
BOOL allow_glob = TRUE;
|
||||||
|
codepage_type current_codepage = ansi_cp;
|
||||||
|
|
||||||
int cygwin_finished_initializing = 0;
|
int cygwin_finished_initializing = 0;
|
||||||
|
|
||||||
|
@ -789,6 +792,9 @@ dll_crt0_1 ()
|
||||||
char *line = GetCommandLineA ();
|
char *line = GetCommandLineA ();
|
||||||
line = strcpy ((char *) alloca (strlen (line) + 1), line);
|
line = strcpy ((char *) alloca (strlen (line) + 1), line);
|
||||||
|
|
||||||
|
if (current_codepage == oem_cp)
|
||||||
|
CharToOemA ( line, line );
|
||||||
|
|
||||||
/* Scan the command line and build argv. Expand wildcards if not
|
/* Scan the command line and build argv. Expand wildcards if not
|
||||||
called from another cygwin process. */
|
called from another cygwin process. */
|
||||||
build_argv (line, __argv, __argc,
|
build_argv (line, __argv, __argc,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* environ.cc: Cygwin-adopted functions from newlib to manipulate
|
/* environ.cc: Cygwin-adopted functions from newlib to manipulate
|
||||||
process's environment.
|
process's environment.
|
||||||
|
|
||||||
Copyright 1997, 1998, 1999, 2000 Cygnus Solutions.
|
Copyright 1997, 1998, 1999, 2000 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -42,12 +42,11 @@ static char **lastenviron = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* List of names which are converted from dos to unix
|
/* List of names which are converted from dos to unix
|
||||||
* on the way in and back again on the way out.
|
on the way in and back again on the way out.
|
||||||
*
|
|
||||||
* PATH needs to be here because CreateProcess uses it and gdb uses
|
PATH needs to be here because CreateProcess uses it and gdb uses
|
||||||
* CreateProcess. HOME is here because most shells use it and would be
|
CreateProcess. HOME is here because most shells use it and would be
|
||||||
* confused by Windows style path names.
|
confused by Windows style path names. */
|
||||||
*/
|
|
||||||
static int return_MAX_PATH (const char *) {return MAX_PATH;}
|
static int return_MAX_PATH (const char *) {return MAX_PATH;}
|
||||||
static win_env conv_envvars[] =
|
static win_env conv_envvars[] =
|
||||||
{
|
{
|
||||||
|
@ -282,10 +281,7 @@ _addenv (const char *name, const char *value, int overwrite)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* putenv --
|
/* putenv Sets an environment variable */
|
||||||
* Sets an environment variable
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
putenv (const char *str)
|
putenv (const char *str)
|
||||||
{
|
{
|
||||||
|
@ -306,12 +302,8 @@ putenv (const char *str)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* setenv -- Set the value of the environment variable "name" to be
|
||||||
* setenv --
|
"value". If overwrite is set, replace any current value. */
|
||||||
* Set the value of the environment variable "name" to be
|
|
||||||
* "value". If overwrite is set, replace any current value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
setenv (const char *name, const char *value, int overwrite)
|
setenv (const char *name, const char *value, int overwrite)
|
||||||
{
|
{
|
||||||
|
@ -333,11 +325,7 @@ setenv (const char *name, const char *value, int overwrite)
|
||||||
return _addenv (name, value, !!overwrite);
|
return _addenv (name, value, !!overwrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* unsetenv(name) -- Delete environment variable "name". */
|
||||||
* unsetenv(name) --
|
|
||||||
* Delete environment variable "name".
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
unsetenv (const char *name)
|
unsetenv (const char *name)
|
||||||
{
|
{
|
||||||
|
@ -352,7 +340,6 @@ unsetenv (const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Turn environment variable part of a=b string into uppercase. */
|
/* Turn environment variable part of a=b string into uppercase. */
|
||||||
|
|
||||||
static __inline__ void
|
static __inline__ void
|
||||||
ucenv (char *p, char *eq)
|
ucenv (char *p, char *eq)
|
||||||
{
|
{
|
||||||
|
@ -382,10 +369,9 @@ enum settings
|
||||||
};
|
};
|
||||||
|
|
||||||
/* When BUF is:
|
/* When BUF is:
|
||||||
* null or empty: disables globbing
|
null or empty: disables globbing
|
||||||
* "ignorecase": enables case-insensitive globbing
|
"ignorecase": enables case-insensitive globbing
|
||||||
* anything else: enables case-sensitive globbing
|
anything else: enables case-sensitive globbing */
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
glob_init (const char *buf)
|
glob_init (const char *buf)
|
||||||
{
|
{
|
||||||
|
@ -407,9 +393,8 @@ glob_init (const char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The structure below is used to set up an array which is used to
|
/* The structure below is used to set up an array which is used to
|
||||||
* parse the CYGWIN environment variable or, if enabled, options from
|
parse the CYGWIN environment variable or, if enabled, options from
|
||||||
* the registry.
|
the registry. */
|
||||||
*/
|
|
||||||
struct parse_thing
|
struct parse_thing
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -431,6 +416,7 @@ struct parse_thing
|
||||||
} known[] =
|
} known[] =
|
||||||
{
|
{
|
||||||
{"binmode", {x: &binmode}, justset, NULL, {{O_TEXT}, {O_BINARY}}},
|
{"binmode", {x: &binmode}, justset, NULL, {{O_TEXT}, {O_BINARY}}},
|
||||||
|
{"codepage", {func: &codepage_init}, isfunc, NULL, {{0}, {0}}},
|
||||||
{"envcache", {&envcache}, justset, NULL, {{TRUE}, {FALSE}}},
|
{"envcache", {&envcache}, justset, NULL, {{TRUE}, {FALSE}}},
|
||||||
{"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}},
|
{"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}},
|
||||||
{"export", {&export_settings}, justset, NULL, {{FALSE}, {TRUE}}},
|
{"export", {&export_settings}, justset, NULL, {{FALSE}, {TRUE}}},
|
||||||
|
@ -446,8 +432,7 @@ struct parse_thing
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Parse a string of the form "something=stuff somethingelse=more-stuff",
|
/* Parse a string of the form "something=stuff somethingelse=more-stuff",
|
||||||
* silently ignoring unknown "somethings".
|
silently ignoring unknown "somethings". */
|
||||||
*/
|
|
||||||
static void __stdcall
|
static void __stdcall
|
||||||
parse_options (char *buf)
|
parse_options (char *buf)
|
||||||
{
|
{
|
||||||
|
@ -531,7 +516,6 @@ parse_options (char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set options from the registry. */
|
/* Set options from the registry. */
|
||||||
|
|
||||||
static void __stdcall
|
static void __stdcall
|
||||||
regopt (const char *name)
|
regopt (const char *name)
|
||||||
{
|
{
|
||||||
|
@ -557,8 +541,7 @@ regopt (const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the environ array. Look for the CYGWIN environment
|
/* Initialize the environ array. Look for the CYGWIN environment
|
||||||
* environment variable and set appropriate options from it.
|
environment variable and set appropriate options from it. */
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
environ_init (char **envp, int envc)
|
environ_init (char **envp, int envc)
|
||||||
{
|
{
|
||||||
|
@ -661,8 +644,7 @@ out:
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function called by qsort to sort environment strings.
|
/* Function called by qsort to sort environment strings. */
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
env_sort (const void *a, const void *b)
|
env_sort (const void *a, const void *b)
|
||||||
{
|
{
|
||||||
|
@ -673,10 +655,9 @@ env_sort (const void *a, const void *b)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a Windows-style environment block, i.e. a typical character buffer
|
/* Create a Windows-style environment block, i.e. a typical character buffer
|
||||||
* filled with null terminated strings, terminated by double null characters.
|
filled with null terminated strings, terminated by double null characters.
|
||||||
* Converts environment variables noted in conv_envvars into win32 form
|
Converts environment variables noted in conv_envvars into win32 form
|
||||||
* prior to placing them in the string.
|
prior to placing them in the string. */
|
||||||
*/
|
|
||||||
char * __stdcall
|
char * __stdcall
|
||||||
winenv (const char * const *envp, int keep_posix)
|
winenv (const char * const *envp, int keep_posix)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,7 +52,7 @@ fhandler_dev_clipboard::read (void *ptr, size_t len)
|
||||||
if (!clipboard_eof)
|
if (!clipboard_eof)
|
||||||
{
|
{
|
||||||
OpenClipboard(0);
|
OpenClipboard(0);
|
||||||
hglb = GetClipboardData(CF_TEXT);
|
hglb = GetClipboardData((current_codepage==ansi_cp ? CF_TEXT : CF_OEMTEXT));
|
||||||
lpstr = (LPSTR) GlobalLock(hglb);
|
lpstr = (LPSTR) GlobalLock(hglb);
|
||||||
if (len < sizeof (lpstr))
|
if (len < sizeof (lpstr))
|
||||||
{
|
{
|
||||||
|
|
|
@ -217,7 +217,7 @@ fhandler_console::read (void *pv, size_t buflen)
|
||||||
tmp[1] = ich;
|
tmp[1] = ich;
|
||||||
/* Need this check since US code page seems to have a bug when
|
/* Need this check since US code page seems to have a bug when
|
||||||
converting a CTRL-U. */
|
converting a CTRL-U. */
|
||||||
if ((unsigned char)ich > 0x7f)
|
if ((unsigned char)ich > 0x7f && current_codepage == ansi_cp)
|
||||||
OemToCharBuff (tmp + 1, tmp + 1, 1);
|
OemToCharBuff (tmp + 1, tmp + 1, 1);
|
||||||
if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
|
if (!(input_rec.Event.KeyEvent.dwControlKeyState & LEFT_ALT_PRESSED))
|
||||||
toadd = tmp + 1;
|
toadd = tmp + 1;
|
||||||
|
@ -1163,7 +1163,10 @@ fhandler_console::write_normal (const unsigned char *src,
|
||||||
size_t len = found - src;
|
size_t len = found - src;
|
||||||
do {
|
do {
|
||||||
size_t l2 = min (sizeof (buf), len);
|
size_t l2 = min (sizeof (buf), len);
|
||||||
CharToOemBuff ((LPCSTR)src, buf, l2);
|
if (current_codepage == ansi_cp)
|
||||||
|
CharToOemBuff ((LPCSTR)src, buf, l2);
|
||||||
|
else
|
||||||
|
strncpy (buf, (LPCSTR)src, l2);
|
||||||
if (! WriteFile (get_output_handle (), buf, l2, &done, 0))
|
if (! WriteFile (get_output_handle (), buf, l2, &done, 0))
|
||||||
{
|
{
|
||||||
debug_printf ("write failed, handle %p", get_output_handle ());
|
debug_printf ("write failed, handle %p", get_output_handle ());
|
||||||
|
|
|
@ -87,6 +87,31 @@ set_myself (pid_t pid, HANDLE h)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
codepage_init (const char *buf)
|
||||||
|
{
|
||||||
|
if (!buf || !*buf)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( strcmp ( buf, "oem" ) == 0 )
|
||||||
|
{
|
||||||
|
current_codepage = oem_cp;
|
||||||
|
SetFileApisToOEM ();
|
||||||
|
debug_printf ( "File APIs set to OEM" );
|
||||||
|
}
|
||||||
|
else if ( strcmp ( buf, "ansi" ) == 0 )
|
||||||
|
{
|
||||||
|
current_codepage = ansi_cp;
|
||||||
|
SetFileApisToANSI ();
|
||||||
|
debug_printf ( "File APIs set to ANSI" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug_printf ( "Wrong codepage name: %s", buf );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the process table entry for the current task.
|
/* Initialize the process table entry for the current task.
|
||||||
This is not called for fork'd tasks, only exec'd ones. */
|
This is not called for fork'd tasks, only exec'd ones. */
|
||||||
void __stdcall
|
void __stdcall
|
||||||
|
|
|
@ -22,6 +22,8 @@ details. */
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/acl.h>
|
#include <sys/acl.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <wingdi.h>
|
||||||
|
#include <winuser.h>
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include "fhandler.h"
|
#include "fhandler.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
|
@ -513,8 +515,18 @@ read_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size)
|
||||||
debug_printf("file = %s", file);
|
debug_printf("file = %s", file);
|
||||||
|
|
||||||
DWORD len = 0;
|
DWORD len = 0;
|
||||||
if (! GetFileSecurity (file,
|
const char *pfile = file;
|
||||||
OWNER_SECURITY_INFORMATION
|
char fbuf [PATH_MAX];
|
||||||
|
if (current_codepage == oem_cp)
|
||||||
|
{
|
||||||
|
DWORD fname_len = min (sizeof (fbuf) - 1, strlen (file));
|
||||||
|
bzero (fbuf, sizeof (fbuf));
|
||||||
|
OemToCharBuff(file, fbuf, fname_len);
|
||||||
|
pfile = fbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! GetFileSecurity (pfile,
|
||||||
|
OWNER_SECURITY_INFORMATION
|
||||||
| GROUP_SECURITY_INFORMATION
|
| GROUP_SECURITY_INFORMATION
|
||||||
| DACL_SECURITY_INFORMATION,
|
| DACL_SECURITY_INFORMATION,
|
||||||
sd_buf, *sd_size, &len))
|
sd_buf, *sd_size, &len))
|
||||||
|
|
|
@ -83,13 +83,16 @@ extern "C" DWORD WINAPI GetLastError (void);
|
||||||
enum os_type {winNT = 1, win95, win98, winME, win32s, unknown};
|
enum os_type {winNT = 1, win95, win98, winME, win32s, unknown};
|
||||||
extern os_type os_being_run;
|
extern os_type os_being_run;
|
||||||
|
|
||||||
|
enum codepage_type {ansi_cp, oem_cp};
|
||||||
|
extern codepage_type current_codepage;
|
||||||
|
|
||||||
/* Used to check if Cygwin DLL is dynamically loaded. */
|
/* Used to check if Cygwin DLL is dynamically loaded. */
|
||||||
extern int dynamically_loaded;
|
extern int dynamically_loaded;
|
||||||
|
|
||||||
#define sys_wcstombs(tgt,src,len) \
|
#define sys_wcstombs(tgt,src,len) \
|
||||||
WideCharToMultiByte(CP_ACP,0,(src),-1,(tgt),(len),NULL,NULL)
|
WideCharToMultiByte((current_codepage==ansi_cp?CP_ACP:CP_OEMCP),0,(src),-1,(tgt),(len),NULL,NULL)
|
||||||
#define sys_mbstowcs(tgt,src,len) \
|
#define sys_mbstowcs(tgt,src,len) \
|
||||||
MultiByteToWideChar(CP_ACP,0,(src),-1,(tgt),(len))
|
MultiByteToWideChar((current_codepage==ansi_cp?CP_ACP:CP_OEMCP),0,(src),-1,(tgt),(len))
|
||||||
|
|
||||||
#define TITLESIZE 1024
|
#define TITLESIZE 1024
|
||||||
#define MAX_USER_NAME 20
|
#define MAX_USER_NAME 20
|
||||||
|
@ -182,6 +185,8 @@ extern HANDLE netapi32_handle;
|
||||||
extern "C" void error_start_init (const char*);
|
extern "C" void error_start_init (const char*);
|
||||||
extern "C" int try_to_debug ();
|
extern "C" int try_to_debug ();
|
||||||
|
|
||||||
|
extern "C" void codepage_init (const char*);
|
||||||
|
|
||||||
extern int cygwin_finished_initializing;
|
extern int cygwin_finished_initializing;
|
||||||
|
|
||||||
/**************************** Miscellaneous ******************************/
|
/**************************** Miscellaneous ******************************/
|
||||||
|
|
Loading…
Reference in New Issue