We should not blindly set the home directory of the SYSTEM account (or
of Microsoft accounts) to `/home/<name>`, especially
`/etc/nsswitch.conf` defines `db_home: env`, in which case we want to
respect the `HOME` variable.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Per https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/xbd_chap04.html:
"A pathname that begins with two successive slashes may be interpreted
in an implementation-defined manner, although more than two leading
slashes shall be treated as a single slash."
So more than 2 leading slashes are supposed to be folded into one,
which our dirname neglected. Fix that.
Fixes: 24e8fc6872 ("* cygwin.din (basename): Export.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This patch hails from Git for Windows (where the Cygwin runtime is used
in the form of a slightly modified MSYS2 runtime), where it is a
well-established technique to let the `$HOME` variable define where the
current user's home directory is, falling back to `$HOMEDRIVE$HOMEPATH`
and `$USERPROFILE`.
The idea is that we want to share user-specific settings between
programs, whether they be Cygwin, MSYS2 or not. Unfortunately, we
cannot blindly activate the "db_home: windows" setting because in some
setups, the user's home directory is set to a hidden directory via an
UNC path (\\share\some\hidden\folder$) -- something many programs
cannot handle correctly, e.g. `cmd.exe` and other native Windows
applications that users want to employ as Git helpers.
The established technique is to allow setting the user's home directory
via the environment variables mentioned above: `$HOMEDRIVE$HOMEPATH` or
`$USERPROFILE`. This has the additional advantage that it is much
faster than querying the Windows user database.
Of course this scheme needs to be opt-in. For that reason, it needs
to be activated explicitly via `db_home: env` in `/etc/nsswitch.conf`.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Latest Windows supports more EU locales than GLibc, so some of the
@euro locales are not covered by checking the GLibc locale defaults.
Those locales have no long history, they are all UTF-8. So just
check for @euro in the UTF-8 case and set them to ISO-8859-15.
Fixes: 2483e54be8 ("Cygwin: locale: Set default charset from Linux locale -> codeset mapping")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
@cjknarrow and @cjkwide modifiers are newlib only, so they need
some tweaking in __set_charset_from_locale.
Fixes: 2483e54be8 ("Cygwin: locale: Set default charset from Linux locale -> codeset mapping")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Drop usage of newlocale/nl_langinfo_l/freelocale.
Call __set_charset_from_locale instead, and make sure to call it
with modifier, if any, otherwise suffer wrong results.
Fixes: c42b98bdc6 ("Cygwin: introduce /proc/codesets and /proc/locales")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
ResolveLocaleName does not simply return an error value if it
can't resolve a locale. Rather, it returns an empty string and
the length of this string: 1.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This reverts commit 15898b9588.
The idea behind this patch was wrong. Systems are supposed to
support iso639-only strings as settings for the locale environment
variables, and they are not necessarily available in the
/usr/share/locale/locale.alias file.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
The Windows function ResolveLocaleName is next to useless to
convert a partial locale identifier into a full, supported
locale identifier. It converts anything which vaguely resembles
a locale into some other locale it supports.
Bad examples are:
"en-XY" gets converted to "en-US", and worse,
"ff-BF" gets converted to "ff-Latn-SN", even though "ff-Adlm-BF"
exists!
To check if a locale is supported, we have to enumerate all valid
Windows locales, and return the match, even if the locale in Windows
requires a script. Implement resolve_locale_name() as replacement
function for ResolveLocaleName.
Fixes: e95a7a7955 ("Cygwin: convert Windows locale handling from LCID to ISO5646 strings")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This was incorrect behaviour. The only valid way to support those
is by adding them to /usr/share/locale/locale.alias.
Fixes: e95a7a7955 ("Cygwin: convert Windows locale handling from LCID to ISO5646 strings")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This allows newlocale to return with a valid errno if the
locale is invalid.
Fixes: e95a7a7955 ("Cygwin: convert Windows locale handling from LCID to ISO5646 strings")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
The sr_XY locales are supposed to default to cyrillic, but the code
always attached a @cyrillic, same reason as in the previous commit.
Special case "sr" further to workaround that issue.
Fixes: c42b98bdc6 ("Cygwin: introduce /proc/codesets and /proc/locales")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Due to the way locales are evaluated in Windows, we can't ask for
the script of the "sd-IN" locale, because Windows only knows the
"sd-Deva-IN" locale. So asking for the script of the "sd" locale
returns "Arab;", because "sd" is converted to "sd-Arab-PK".
Special case "sd-IN" to workaround that issue.
Fixes: c42b98bdc6 ("Cygwin: introduce /proc/codesets and /proc/locales")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Renaming files returns STATUS_INVALID_PARAMETE on a bind mounted file system
in hyper-v container with FILE_RENAME_POSIX_SEMANTICS.
Disable the use_posix_semantics flag and retry.
Signed-off-by: Yoshinao Muramatsu <ysno@ac.auone-net.jp>
Deleting files returns STATUS_INVALID_PARAMETE on a bind mounted file system
in hyper-v container with FILE_DISPOSITION_POSIX_SEMANTICS.
Therefore fall back to default method.
This code is suggested by Johannes Schindelin on github
and I change it more simple.
Signed-off-by: Yoshinao Muramatsu <ysno@ac.auone-net.jp>
If a host NTFS is mapped into a Hyper-V isolated container, the
OPEN_BY_FILE_ID filesystem flag is missing, just as if that NTFS
is a remote drive. However, NtQueryVolumeInformationFile claims
the drive is a local drive.
We can use this fact to learn that the process is running under
Hyper-V, and that the Hyper-V isolated process can't use rename/unlink
with POSIX semantics. Strange enough, the POSIX_UNLINK_RENAME filesystem
flag is still set...
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
These flags are used to check a remote filesystem. Not all
flags supported by a local NTFS are available when checking
a remote NTFS. Fix the flag set accordingly, otherwise
the remote NTFS will ba handled as CIFS.
Fixes: fcccdc4021 ("Cygwin: fs_info: update filesystem flags and check Windows 7 flags")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Except for the "C" or "POSIX" locale, checking for start <= finish
is always wrong. Range start must be <= range finish in terms of the
locale's collating order. So make sure to call always wcscoll(), even
in the "C"/"POSIX" locale, which makes wcscoll equivalent to wcscmp
anyway.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
computejumps() moves g->charjump to a position relativ to the value of
CHAR_MIN. As such, g->charjump doesn't necessarily point to the address
actually allocated. While regfree() takes that into account, the low
memory handling in regcomp_internal() doesn't. Fix that by free'ing
the actually allocated address, as in regfree().
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Useless indirection. Rename _unlink_nt back to unlink_nt
and call the function directly with `sharable' flag as needed.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Update the list of filesystem flags to the flags supported since
Windows 7. Make sure to use the new flags only with Windows
filesystems, not with 3rd party filesystems.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
wint_t is unsigned int and the test checks for a negative value. Thus,
it's optimized out by gcc. Add the cast from commit 44caccfca2 to
avoid this.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
...and use __wcollate_range_cmp. This will have to be tweaked further
when supporting collation symbols...
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Make kill -V and kill -l exit immediately, thus stopping to
print "not enough arguments" accidentally.
Fixes: ef48a2cad3 ("* kill.cc (prog_name) New global variable.")
Fixes: c49fa76263 ("* Makefile.in (kill.exe): Add as a specific target.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
The signal names for the real-time signals contain spaces from
the beginning of their availability. Fix that.
Fixes: 61522196c7 ("* Merge in cygwin-64bit-branch.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Addresses https://cygwin.com/pipermail/cygwin/2023-March/253220.html
Take the opportunity to follow FreeBSD's and Linux's lead in recasting
macro inline code as calls to static inline functions. This allows the
macros to be type-safe. In addition, added a lower bound check to the
functions that use a cpu number to avoid a potential buffer underrun on
a bad argument. h/t to Corinna for the advice on recasting.
Fixes: 362b98b49a ("Cygwin: Implement CPU_SET(3) macros")
Remove old 'kludge' code which does not seem necessary anymore. The
comment of the 'kludge' is as follows.
* syscalls.cc (setsid): On second thought, in the spirit of keeping
things kludgy, set ctty to -2 here as a special flag, and...
(open): ...only eschew setting O_NOCTTY when that case is detected.
Fixes: c38a2d8373
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This patch replaces ctty constants with more descriptive macros
(CTTY_UNINITIALIZED and CTTY_RELEASED) rather than -1 and -2 as
well as checking sign with CTTY_IS_VALID().
Fixes: 3b7df69aaa (Cygwin: ctty: Add comments for the special values: -1 and -2.)
Suggested-by: Corinna Vinschen <corinna@vinschen.de>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
The conversion function g_Ctoc missed to drop the flag
values from the wint_t value. That wasn't noticable with
the original version because it used a 64 bit Char type
and the flags were in the upper 32 bit region. So the
flag values were silently dropped when wcrtomb was called.
After converting Char to wint_t, we have to do drop the
flags explicitely.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This requires quite a few changes in how fnmatch operates.
It always operates on wint_t strings now, just like regex and glob,
and it always keeps a pointer on the character inside the string,
rather than operating on a single character.
As a result, just drop the ifdef's for Cygwin. The code is
non-portable now anyway...
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Deviation from standard: If the input is broken, the output will be
broken. I. e., we just copy the current byte over into the wint_t
destination and try to pick up on the next byte. This is in line
with the way fnmatch works.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
fnmatch calls fnmatch1 with a static mbstate_t. This breaks
calling fnmatch from multiple threads. Fix it by folding
fnmatch1 into fnmatch and moving all mbstates to local variables.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
The comment that the first arg must be the pattern was added
during development, before it turned out that __wscollate_range_cmp
can be implemented in an order independent way.
Better explain why this function uses pointers to strings.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
As the former call to `locale -av' has the unwanted side effect
to shorten the locale name to <= 15 chars, don't use it. Use
`locale -a' instead and fetch the codeset from another call to
`locale' for each locale.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Effectively revert commit 57bac33359. The fact that the
devanagari modifier was called devanagar (missing the trailing 'i')
is a result of `locale -av' shortening the locale name to a maximum
of 15 characters.
D'oh. I guess we need a better way to do this...
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>