(fillout_mntent): Ditto.
* path.cc (path_conv::get_nt_native_path): Use path_conv's
has_dos_filenames_only method.
(path_conv::check): Add PATH_IHASH flag if FS has unreliable inode
numbers.
(symlink_info::check_shortcut): Or symlink flags to pflags.
(symlink_info::check_sysfile): Ditto. Change test accordingly.
(symlink_info::check_reparse_point): Ditto.
(symlink_info::check_nfs_symlink): Ditto.
(symlink_info::check): Check PATH_DOS flag in call to get_nt_native_path
to utilize mount flag. Ditto in test for potential restarting. Set
PATH_DOS if FS only allows DOS filename rules.
* path.h (enum path_types): Add PATH_DOS and PATH_IHASH.
(path_conv::hasgood_inode): Check PATH_IHASH instead of
fs.hasgood_inode.
(path_conv::has_dos_filenames_only): New method.
* include/sys/mount.h (MOUNT_DOS): New mount flag.
(MOUNT_IHASH): Ditto.
(usage): Call cygwin_internal (CW_LST_MNT_OPTS) to create list of
mount options.
(print_version): Fix copyright date.
(main): Replace option processing loop with single call to
cygwin_internal (CW_CVT_MNT_OPTS).
flag parsing. Add CW_LST_MNT_OPTS case to allow mount flag listing.
* mount.cc (fstab_read_flags): Rename from read_flags. Make externally
available. Change input string to char ** to allow returning faulty
option. Add flag for avoiding debug output.
(fstab_list_flags): New function to create list of options.
* include/sys/cygwin.h (cygwin_getinfo_types): Add CW_CVT_MNT_OPTS and
CW_LST_MNT_OPTS.
(enum type_t): Change according to the fact that nl_langinfo now returns
all locale category values.
(lc_ctype_names): Add new category members. Redefine for exclusive
nl_langinfo usage.
(lc_numeric_names): Ditto.
(lc_time_names): Ditto.
(lc_collate_names): Ditto.
(lc_monetary_names): Ditto.
(lc_messages_names): Ditto.
(print_lc): Change switch according to new type_t values.
* nlsfuncs.cc (__getlocaleinfo): Drop conversion to multibyte.
(__charfromwchar): New function to convert to multibyte.
(__eval_datetimefmt): Convert to return wchar_t pointer. Work on
wide char string.
(__set_lc_time_from_win): Take additional pointer to "C" category info
to accommodate C.foo locales. Rework to fill wide char members in
category info.
(__set_lc_ctype_from_win): New function.
(__set_lc_numeric_from_win): Take additional pointer to "C" category
info to accommodate C.foo locales. Rework to fill wide char members
in category info.
(__set_lc_monetary_from_win): Ditto.
(__set_lc_messages_from_win): Ditto.
(__get_current_collate_codeset): New function, called from nl_langinfo.
* include/cygwin/config.h (__HAVE_LOCALE_INFO_EXTENDED__): Define.
* path.cc (path_conv::check): Clear filesystem info if following a
symlink. Use new fs_info::inited method to check if FS info is already
available.
(symlink_info::check): Drop fs_update_called. Use fs_info::inited
method instead. Streamline test for leading space and trailing dot or
space. Add comments.
declare with regparms.
* path.cc (get_nt_native_path): Add third parameter to allow conversion
of leading and trailing dots and spaces on filesystems only supporting
filenames following DOS rules.
(path_conv::get_nt_native_path): Call get_nt_native_path according to
fs.has_dos_filenames_only flag.
(getfileattr): Accommodate new parameter to get_nt_native_path.
(symlink_info::check): Revamp fs_update_called handling to call
fs.update only once per call. Call get_nt_native_path according to
fs.has_dos_filenames_only flag. Streamline filesystem dependent code
not to be called more than once unnecessarily. Drop code tweaking
incoming path for broken filesystems only allowing DOS pathnames.
Rely on changed get_nt_native_path instead.
* mount.cc (fillout_mntent): Accommodate new parameter to
get_nt_native_path.
* strfuncs.cc (tfx_rev_chars): New conversion table with comment.
(sys_cp_wcstombs): Use tfx_rev_chars rather than tfx_chars.
from mask. Expand the comment a bit.
(WIN_FAT_FLAGS): New define.
(FS_IS_WINDOWS_FAT): New macro.
(fs_info::update): Handle remote FS faking to be FAT. Subsume under
CIFS. Check for NWFS and has_buggy_basic_info only for remote
filesystems. Add check for has_dos_filenames_only.
* mount.h (class fs_info): Add has_dos_filenames_only status flag.
Implement accessors.
* path.cc (symlink_info::check): Rearrange variable definitions to
clear them up. Add a restart label to allow a clean restart within
the method. Add a check for broken filesystems only allowing DOS
pathnames in case we encounter a STATUS_OBJECT_NAME_NOT_FOUND status.
If all checks point to one of that, restart method with tweaked
incoming path. Add lengthy comments to explain what we do.
Replace with...
* fhandler_tty.cc (fhandler_tty_slave::init): Become process group
leader if called from dtable::init_std_file_from_handle. Add comment
to explain.
* cygheap.cc (cygheap_init): Initialize rlim_core to RLIM_INFINITY.
* exceptions.cc (stackdump): Drop extern declaration of rlim_core.
Refer to cygheap->rlim_core instead.
(exception::handle): Disable stackdumping if cygheap->rlim_core is 0.
Don't set WCOREDUMP flag in exit code, if cygheap->rlim_core is 0.
(sigpacket::process): Ditto.
* resource.cc (rlim_core): Remove.
(getrlimit): Fetch RLIMIT_CORE value from cygheap->rlim_core.
(setrlimit): Store RLIMIT_CORE value in cygheap->rlim_core.
* fhandler.h (fhandler_tty_slave::fch_open_handles): Declare private.
(fhandler_tty_slave::fch_close_handles): Ditto.
(fhandler_tty_slave::cygserver_attach_tty): Drop declaration.
(fhandler_tty_slave::fstat): Declare public.
(fhandler_tty_slave::fchmod): Declare public.
(fhandler_tty_slave::fchown): Declare public.
(class fhandler_pty_master): Add master_ctl handle.
(fhandler_pty_master::pty_master_thread): Declare public.
* fhandler_termios.cc (fhandler_termios::tcinit): If the process
is started from a non-Cygwin process, make it tty process group
leader.
* fhandler_tty.cc: Throughout accommodate additional security related
arguments in calls to functions creating or opening objects.
(close_maybe): Move to start of file to reuse it
in other methods.
(struct pipe_request): Define.
(struct pipe_reply): Define.
(fhandler_tty_slave::open): Throughout, try to open synchronization
objects with MAXIMUM_ALLOWED permissions. Drop call to cygserver.
Try to duplicate pipe handles via master_ctl pipe if duplicating
directly doesn't work.
(fhandler_tty_slave::cygserver_attach_tty): Remove.
(fhandler_tty_slave::init): Close unused incoming pipe handle.
(fhandler_pty_master::close): Send exit message to master control
thread and close master_ctl handle.
(fhandler_pty_master::pty_master_thread): New method, implementing the
master control thread.
(pty_master_thread): Static helper to start master control thread.
(fhandler_pty_master::setup): Simplify creating pipe inheritance.
Make sure we're the one creating the input_available_event. Add
comment to explain why. Create master_ctl pipe and start master
control thread. Close master_ctl handle in case of error.
* security.cc (alloc_sd): Add code to handle tty objects. Add comments
to explain what exactly is required.
(get_object_sd): New function.
(get_object_attribute): New function.
(create_object_sd_from_attribute): New function.
(set_object_sd): New function.
(set_object_attribute): New function.
(set_file_attribute): Change attribute type to mode_t.
* security.h (set_file_attribute): Change attribute type to mode_t.
(get_object_sd): Declare.
(get_object_attribute): Declare.
(create_object_sd_from_attribute): Declare.
(set_object_sd): Declare.
(set_object_attribute): Declare.
* tty.cc (tty::slave_alive): Implement directly instead of via alive.
(tty::exists): Open mutex handle with READ_CONTROL access.
(tty::alive): Remove.
(tty::open_output_mutex): Convert to inline method.
(tty::open_input_mutex): Ditto.
(tty::open_mutex): Take additional ACCESS_MASK parameter for the
mutex open access mask.
(tty::open_inuse): New method.
(tty::create_inuse): Take PSECURITY_ATTRIBUTES parameter. Drop fmt
name parameter. Always create TTY_SLAVE_ALIVE event.
(tty::get_event): Take additional PSECURITY_ATTRIBUTES parameter for
CreateEvent.
* tty.h (class tty): Change declarations according to aforementioned
changes.
(tty::open_output_mutex): Implement as inline method.
(tty::open_input_mutex): Ditto.
valid content for ptys. Remove setting FILE_CREATE_PIPE_INSTANCE
in access flags since it's not needed. Set the access mask for
kernel objects according to what's returned by NtQueryInformationFile,
info class FileAccessInformation.
(__seterrno_from_nt_status): Call seterrno_from_nt_status.
* errno.cc (seterrno_from_win_error): Set errno without calling
set_errno to avoid packing strace output with errno messages.
(seterrno_from_nt_status): New function to print NT status as well as
resulting Windows error.
socket after opening it. Retry if opening failed with sharing
violation. Explain why we do this.
(fhandler_socket::bind): Create file with no sharing allowed.
handles within a single process to simplify openpty case.
(fhandler_tty_slave::cygserver_attach_tty): Correctly send Windows PID
to cygserver, rather than the Cygwin PID.
memory leak.
* path.h (path_conv::operator =): Just use cstrdup to allocate normalized_path,
avoiding attempt to free a pointer which is allocated in another pc.
* select.cc (peek_pipe): Reorganize slightly. Don't attempt to check a handle
if it has ongoing I/O.
(select_pipe_info::select_pipe_info): Delete definition.
(select_pipe_info::~select_pipe_info): Delete definition.
(thread_pipe): Get rid of WFMO call. Reorganize loop.
(pipe_cleanup): Remove dependence on destructor.
(thread_serial): Reorganize loop.
* select.h (select_pipe_info): Empty this class since it no longer has any
special requirements (for now).
* syscalls.cc (readv): Remove an unneeded debug printf.
we know that it is good.
* fhandler_tty.cc (fhandler_tty_slave::fhandler_tty_slave): Handle error
conditions more consistently. Avoid handle leakage on error.
function pointers in locale structures. Explain why this is necessary.
(__set_lc_time_from_win): Use rebase_locale_buf after realloc.
(__set_lc_numeric_from_win): Ditto.
(__set_lc_monetary_from_win): Ditto.
a friend until the fhandler_tty intertangling can be worked out.
* select.cc (select_pipe_info::add_watch_handle): Don't inspect the overlapped
event if we're not waiting for I/O.
(fhandler_tty_common::select_*): Change to standard function. Don't do kludgy
fhandler_pipe coercion.
(fhandler_base::fork_fixup): Ditto.
(fhandler_base::fixup_after_fork): Ditto.
(fhandler_base::fixup_after_exec): Ditto.
(fhandler_base_overlapped::setup_overlapped): Move to this class from
fhandler_base.
(handler_base_overlapped::destroy_overlapped): Ditto.
(fhandler_base_overlapped::wait_overlapped): Ditto. Track when we expect
pending I/O.
(fhandler_base_overlapped::read_overlapped): Move to this class from
fhandler_base. Return error if ongoing I/O.
(fhandler_base_overlapped::write_overlapped): Ditto.
(fhandler_base_overlapped::has_ongoing_io): Semi-reinstate previous function.
* fhandler.h (fhandler_base::wait_overlapped): Move to fhandler_base_overlapped
class.
(fhandler_base::write_overlapped): Ditto.
(fhandler_base::get_overlapped): Ditto.
(fhandler_base::get_overlapped_buffer): Ditto.
(fhandler_base_overlapped): New class.
(fhandler_pipe): Inherit from fhandler_base_overlapped. Remove overlapped
stuff as a result.
(fhandler_fifo): Ditto.
* pipe.cc (fhandler_pipe::fhandler_pipe): Initialize fhandler_base_overlapped.
(pipe): Put a descriptive name in the fhandler.
* dcrt0.cc (cygwin_exit): Set exit_state to ES_EXIT_STARTING prior to calling
real exit.
* dll_init.cc (dll_list::detach): Remove dll from linked list and call
destructors even if exiting. Don't call __cxa_finalize in exiting case.
const in parameter list.
(fhandler_socket::wait_for_events): Take a DWORD flags value instead of
just a bool. Call evaluate_events with erase flag according to
MSG_PEEK value in flags. Replace check for dontwait with check for
MSG_DONTWAIT in flags.
(fhandler_socket::connect): Call wait_for_events with 0 flags value.
(fhandler_socket::accept4): Ditto.
(fhandler_socket::recv_internal): Save flags in wait_flags. Drop
dontwait variable. Call wait_for_events with wait_flags.
(fhandler_socket::send_internal): Save MSG_DONTWAIT flag in wait_flags
and call wait_for_events with wait_flags as argument. Drop dontwait
variable.
* fhandler.h (class fhandler_socket): Change second parameter in
declaration of wait_for_events to const DWORD.
(user_info::version): Make LONG to accommodate spinlock use.
(user_info::create): New static function renamed from user_info_create.
(user_info::initialize): New private function renamed from
user_info_initialize.
(SHARED_VERSION): Delete.
(SHARED_VERSION_MAGIC): Ditto.
(USER_VERSION_MAGIC): Ditto.
(SHARED_INFO_CB): Ditto.
(USER_VERSION): Ditto.
(USER_VERSION_MAGIC): Ditto.
(CURR_SHARED_MAGIC): Update.
(CURR_USER_MAGIC): Ditto.
(shared_info::version): Make LONG to accommodate spinlock use.
(shared_info::create): New static function mirroring user_info::create.
(dll_crt0_1): Accommodate change to user_info::initialize.
* spinlock.h (spinlock::setto): New variable member.
(spinlock::done): New function.
(spinlock::spinlock): Generalize to allow arbitrary values and timeouts. Call
done() when lock is not needed.
* ntdll.h: Make multiple-inclusion safe.
(NtQuerySystemTime): Declare.
* shared.cc (installation_root_inited): Rename from shared_mem_inited.
(init_installation_root): Make inline. Use a spinlock to ensure that this is
initialized only once per session.
(user_info::initialize): Rename from user_shared_initialize. Protect with
spinlock on sversion and remove other spinlock-like things. Remove reference
to user_shared since it is now implicit. Refer to spinlock version of
multiple_cygwin_problem to ensure that any spinlock is released.
(user_info::create): Rename from user_shared_create. Accommodate change from
user_shared_initialize to user_info::initialize.
(shared_info::create): New inline function.
(shared_info::initialize): Protect with spinlock on sversion. Move heap_init
back under specific control of shared_info spinlock. Remove reference to
SHARED_INFO_CB and just use sizeof(*this).
(memory_init): Move all locking into respective functions where it is needed.
Accommodate name changes. Remove call to heap_init().
* syscalls.cc (seteuid32): Accommodate name change to user_info::create().
* mount.cc (mount_info::create_root_entry): Report on errors from add_item
since they should be nonexistent.
(mount_info::init): Don't initialize nmounts. It should already be zero. Give
more verbose error when root_idx < 0. Implicitly use this pointer rather than
explicitly referencing mount_table->.
(mount_info::add_item): Minor whitespace fix.
(spinlock): New class.
* shared.cc: Include spinlock.h.
(memory_init): Use new spinlock methods rather than roll-your-own. Time out
after ten seconds if shared_mem_inited is not initialized.
* sync.h: Update copyright. Remove vanity attribution.
* sigproc.cc (sigproc_terminate): Avoid attempts to kill the signal thread
while we're still initializing or suffer a deadlock.
* miscfuncs.cc (yield): Rename from low_priority_sleep. Remove all of the
logic which called Sleep() and just use SwitchToThread.
* miscfuncs.h (yield): Rename from low_priority_sleep.
(SLEEP_0_STAY_LOW): Delete unused define.
* shared.cc (memory_init): Move heap_init() call directly after shared memory
initialization to more closely mimic long-standing program flow.
* tty.cc (tty_list::terminate): Replace call to low_priority_sleep with Sleep.