2001-11-21 07:47:57 +01:00
|
|
|
/* fhandler_disk_file.cc
|
|
|
|
|
2005-01-10 14:09:56 +01:00
|
|
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
2010-01-10 12:12:52 +01:00
|
|
|
2005, 2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
|
2001-11-21 07:47:57 +01:00
|
|
|
|
|
|
|
This file is part of Cygwin.
|
|
|
|
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
|
|
details. */
|
|
|
|
|
|
|
|
#include "winsup.h"
|
|
|
|
#include <stdlib.h>
|
2004-04-14 18:36:26 +02:00
|
|
|
#include <sys/acl.h>
|
2007-02-27 13:58:56 +01:00
|
|
|
#include <sys/statvfs.h>
|
2001-11-21 07:47:57 +01:00
|
|
|
#include "cygerrno.h"
|
|
|
|
#include "security.h"
|
|
|
|
#include "path.h"
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
#include "fhandler.h"
|
2001-11-21 07:47:57 +01:00
|
|
|
#include "dtable.h"
|
|
|
|
#include "cygheap.h"
|
|
|
|
#include "shared_info.h"
|
|
|
|
#include "pinfo.h"
|
2004-04-06 12:19:31 +02:00
|
|
|
#include "ntdll.h"
|
2008-04-13 18:47:21 +02:00
|
|
|
#include "tls_pbuf.h"
|
2008-05-20 17:11:23 +02:00
|
|
|
#include "nfs.h"
|
2009-04-09 11:19:03 +02:00
|
|
|
#include "pwdgrp.h"
|
2005-02-02 23:42:06 +01:00
|
|
|
#include <winioctl.h>
|
2001-11-21 07:47:57 +01:00
|
|
|
|
|
|
|
#define _COMPILING_NEWLIB
|
|
|
|
#include <dirent.h>
|
|
|
|
|
2006-03-01 23:37:25 +01:00
|
|
|
class __DIR_mounts
|
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
int count;
|
|
|
|
const char *parent_dir;
|
|
|
|
int parent_dir_len;
|
|
|
|
UNICODE_STRING mounts[MAX_MOUNTS];
|
|
|
|
bool found[MAX_MOUNTS + 2];
|
|
|
|
UNICODE_STRING cygdrive;
|
2006-03-01 23:37:25 +01:00
|
|
|
|
|
|
|
#define __DIR_PROC (MAX_MOUNTS)
|
|
|
|
#define __DIR_CYGDRIVE (MAX_MOUNTS+1)
|
|
|
|
|
|
|
|
__ino64_t eval_ino (int idx)
|
|
|
|
{
|
|
|
|
__ino64_t ino = 0;
|
2007-10-19 14:22:49 +02:00
|
|
|
char fname[parent_dir_len + mounts[idx].Length + 2];
|
2006-03-01 23:37:25 +01:00
|
|
|
struct __stat64 st;
|
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
char *c = stpcpy (fname, parent_dir);
|
|
|
|
if (c[- 1] != '/')
|
|
|
|
*c++ = '/';
|
2007-10-19 14:22:49 +02:00
|
|
|
sys_wcstombs (c, mounts[idx].Length + 1,
|
2007-07-26 19:30:54 +02:00
|
|
|
mounts[idx].Buffer, mounts[idx].Length / sizeof (WCHAR));
|
|
|
|
path_conv pc (fname, PC_SYM_NOFOLLOW | PC_POSIX);
|
|
|
|
if (!stat_worker (pc, &st))
|
2006-03-01 23:37:25 +01:00
|
|
|
ino = st.st_ino;
|
|
|
|
return ino;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
__DIR_mounts (const char *posix_path)
|
|
|
|
: parent_dir (posix_path)
|
|
|
|
{
|
|
|
|
parent_dir_len = strlen (parent_dir);
|
2007-07-26 19:30:54 +02:00
|
|
|
count = mount_table->get_mounts_here (parent_dir, parent_dir_len, mounts,
|
|
|
|
&cygdrive);
|
2006-03-01 23:37:25 +01:00
|
|
|
rewind ();
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
~__DIR_mounts ()
|
|
|
|
{
|
|
|
|
for (int i = 0; i < count; ++i)
|
2008-02-15 18:53:11 +01:00
|
|
|
RtlFreeUnicodeString (&mounts[i]);
|
2007-07-26 19:30:54 +02:00
|
|
|
RtlFreeUnicodeString (&cygdrive);
|
|
|
|
}
|
|
|
|
__ino64_t check_mount (PUNICODE_STRING fname, __ino64_t ino,
|
|
|
|
bool eval = true)
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
if (parent_dir_len == 1) /* root dir */
|
2006-05-28 17:50:14 +02:00
|
|
|
{
|
2009-07-14 19:37:42 +02:00
|
|
|
if (RtlEqualUnicodeString (fname, &ro_u_proc, FALSE))
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
found[__DIR_PROC] = true;
|
2007-07-26 19:30:54 +02:00
|
|
|
return 2;
|
2006-03-01 23:37:25 +01:00
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
if (fname->Length / sizeof (WCHAR) == mount_table->cygdrive_len - 2
|
2008-07-16 22:20:45 +02:00
|
|
|
&& RtlEqualUnicodeString (fname, &cygdrive, FALSE))
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
found[__DIR_CYGDRIVE] = true;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (int i = 0; i < count; ++i)
|
2008-07-16 22:20:45 +02:00
|
|
|
if (RtlEqualUnicodeString (fname, &mounts[i], FALSE))
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
found[i] = true;
|
|
|
|
return eval ? eval_ino (i) : 1;
|
|
|
|
}
|
|
|
|
return ino;
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
__ino64_t check_missing_mount (PUNICODE_STRING retname = NULL)
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
for (int i = 0; i < count; ++i)
|
2006-05-28 17:50:14 +02:00
|
|
|
if (!found[i])
|
2006-03-01 23:37:25 +01:00
|
|
|
{
|
|
|
|
found[i] = true;
|
2007-07-26 19:30:54 +02:00
|
|
|
if (retname)
|
|
|
|
{
|
|
|
|
*retname = mounts[i];
|
|
|
|
return eval_ino (i);
|
|
|
|
}
|
|
|
|
return 1;
|
2006-03-01 23:37:25 +01:00
|
|
|
}
|
|
|
|
if (parent_dir_len == 1) /* root dir */
|
2006-05-28 17:50:14 +02:00
|
|
|
{
|
2006-03-01 23:37:25 +01:00
|
|
|
if (!found[__DIR_PROC])
|
|
|
|
{
|
|
|
|
found[__DIR_PROC] = true;
|
2007-07-26 19:30:54 +02:00
|
|
|
if (retname)
|
|
|
|
RtlInitUnicodeString (retname, L"proc");
|
|
|
|
return 2;
|
2006-03-01 23:37:25 +01:00
|
|
|
}
|
|
|
|
if (!found[__DIR_CYGDRIVE])
|
|
|
|
{
|
|
|
|
found[__DIR_CYGDRIVE] = true;
|
2007-07-26 19:30:54 +02:00
|
|
|
if (cygdrive.Length > 0)
|
2006-05-28 17:50:14 +02:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
if (retname)
|
|
|
|
*retname = cygdrive;
|
2006-03-02 10:48:42 +01:00
|
|
|
return 2;
|
|
|
|
}
|
2006-03-01 23:37:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
void rewind () { memset (found, 0, sizeof found); }
|
|
|
|
};
|
|
|
|
|
2009-03-12 23:03:28 +01:00
|
|
|
inline bool
|
|
|
|
path_conv::isgood_inode (__ino64_t ino) const
|
|
|
|
{
|
|
|
|
/* We can't trust remote inode numbers of only 32 bit. That means,
|
|
|
|
all remote inode numbers when running under NT4, as well as remote NT4
|
|
|
|
NTFS, as well as shares of Samba version < 3.0.
|
|
|
|
The known exception are SFU NFS shares, which return the valid 32 bit
|
|
|
|
inode number from the remote file system unchanged. */
|
|
|
|
return hasgood_inode () && (ino > UINT32_MAX || !isremote () || fs_is_nfs ());
|
|
|
|
}
|
|
|
|
|
2007-07-27 11:00:12 +02:00
|
|
|
static inline bool
|
|
|
|
is_volume_mountpoint (POBJECT_ATTRIBUTES attr)
|
|
|
|
{
|
|
|
|
bool ret = false;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
HANDLE reph;
|
2009-11-10 09:54:24 +01:00
|
|
|
UNICODE_STRING subst;
|
2007-07-27 11:00:12 +02:00
|
|
|
|
|
|
|
if (NT_SUCCESS (NtOpenFile (&reph, READ_CONTROL, attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_OPEN_REPARSE_POINT)))
|
|
|
|
{
|
|
|
|
PREPARSE_DATA_BUFFER rp = (PREPARSE_DATA_BUFFER)
|
|
|
|
alloca (MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
|
|
|
|
if (NT_SUCCESS (NtFsControlFile (reph, NULL, NULL, NULL,
|
|
|
|
&io, FSCTL_GET_REPARSE_POINT, NULL, 0,
|
|
|
|
(LPVOID) rp, MAXIMUM_REPARSE_DATA_BUFFER_SIZE))
|
|
|
|
&& rp->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT
|
2009-11-10 09:54:24 +01:00
|
|
|
&& (RtlInitCountedUnicodeString (&subst,
|
|
|
|
(WCHAR *)((char *)rp->MountPointReparseBuffer.PathBuffer
|
|
|
|
+ rp->MountPointReparseBuffer.SubstituteNameOffset),
|
|
|
|
rp->MountPointReparseBuffer.SubstituteNameLength),
|
|
|
|
RtlEqualUnicodePathPrefix (&subst, &ro_u_volume, TRUE)))
|
2007-07-27 11:00:12 +02:00
|
|
|
ret = true;
|
|
|
|
NtClose (reph);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-03-31 20:03:25 +02:00
|
|
|
static inline __ino64_t
|
2009-03-12 23:03:28 +01:00
|
|
|
get_ino_by_handle (path_conv &pc, HANDLE hdl)
|
2008-03-31 20:03:25 +02:00
|
|
|
{
|
|
|
|
IO_STATUS_BLOCK io;
|
2008-05-21 12:23:19 +02:00
|
|
|
FILE_INTERNAL_INFORMATION fai;
|
2008-03-31 20:03:25 +02:00
|
|
|
|
2008-05-21 12:23:19 +02:00
|
|
|
if (NT_SUCCESS (NtQueryInformationFile (hdl, &io, &fai, sizeof fai,
|
2009-03-12 23:03:28 +01:00
|
|
|
FileInternalInformation))
|
|
|
|
&& pc.isgood_inode (fai.FileId.QuadPart))
|
2008-05-21 12:23:19 +02:00
|
|
|
return fai.FileId.QuadPart;
|
2008-03-31 20:03:25 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-09-12 01:30:26 +02:00
|
|
|
unsigned __stdcall
|
|
|
|
path_conv::ndisk_links (DWORD nNumberOfLinks)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
2003-09-12 01:30:26 +02:00
|
|
|
if (!isdir () || isremote ())
|
|
|
|
return nNumberOfLinks;
|
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
HANDLE fh;
|
|
|
|
|
|
|
|
if (!NT_SUCCESS (NtOpenFile (&fh, SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
|
|
|
get_object_attr (attr, sec_none_nih),
|
|
|
|
&io, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_SYNCHRONOUS_IO_NONALERT
|
|
|
|
| FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_DIRECTORY_FILE)))
|
|
|
|
return nNumberOfLinks;
|
2001-11-21 07:47:57 +01:00
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
unsigned count = 0;
|
|
|
|
bool first = true;
|
2010-01-29 12:20:06 +01:00
|
|
|
PFILE_BOTH_DIRECTORY_INFORMATION fdibuf = (PFILE_BOTH_DIRECTORY_INFORMATION)
|
2007-07-26 19:30:54 +02:00
|
|
|
alloca (65536);
|
2006-03-01 23:37:25 +01:00
|
|
|
__DIR_mounts *dir = new __DIR_mounts (normalized_path);
|
2008-12-18 19:54:25 +01:00
|
|
|
while (NT_SUCCESS (NtQueryDirectoryFile (fh, NULL, NULL, NULL, &io, fdibuf,
|
2010-01-29 12:20:06 +01:00
|
|
|
65536, FileBothDirectoryInformation,
|
2007-07-26 19:30:54 +02:00
|
|
|
FALSE, NULL, first)))
|
2003-09-12 01:30:26 +02:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
if (first)
|
|
|
|
{
|
|
|
|
first = false;
|
|
|
|
/* All directories have . and .. as their first entries.
|
|
|
|
If . is not present as first entry, we're on a drive's
|
|
|
|
root direcotry, which doesn't have these entries. */
|
|
|
|
if (fdibuf->FileNameLength != 2 || fdibuf->FileName[0] != L'.')
|
|
|
|
count = 2;
|
|
|
|
}
|
2010-01-29 12:20:06 +01:00
|
|
|
for (PFILE_BOTH_DIRECTORY_INFORMATION pfdi = fdibuf;
|
2007-07-26 19:30:54 +02:00
|
|
|
pfdi;
|
2010-01-29 12:20:06 +01:00
|
|
|
pfdi = (PFILE_BOTH_DIRECTORY_INFORMATION)
|
2007-07-26 19:30:54 +02:00
|
|
|
(pfdi->NextEntryOffset ? (PBYTE) pfdi + pfdi->NextEntryOffset
|
|
|
|
: NULL))
|
|
|
|
{
|
|
|
|
switch (pfdi->FileAttributes
|
|
|
|
& (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT))
|
|
|
|
{
|
|
|
|
case FILE_ATTRIBUTE_DIRECTORY:
|
|
|
|
/* Just a directory */
|
|
|
|
++count;
|
|
|
|
break;
|
|
|
|
case FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT:
|
|
|
|
/* Volume mount point or symlink to directory */
|
|
|
|
{
|
|
|
|
UNICODE_STRING fname;
|
|
|
|
|
2007-07-28 18:00:35 +02:00
|
|
|
RtlInitCountedUnicodeString (&fname, pfdi->FileName,
|
|
|
|
pfdi->FileNameLength);
|
2007-07-26 19:30:54 +02:00
|
|
|
InitializeObjectAttributes (&attr, &fname,
|
2008-07-16 22:20:45 +02:00
|
|
|
objcaseinsensitive (), fh, NULL);
|
2007-07-27 11:00:12 +02:00
|
|
|
if (is_volume_mountpoint (&attr))
|
|
|
|
++count;
|
2007-07-26 19:30:54 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
UNICODE_STRING fname;
|
2007-07-28 18:00:35 +02:00
|
|
|
RtlInitCountedUnicodeString (&fname, pfdi->FileName,
|
|
|
|
pfdi->FileNameLength);
|
2007-07-26 19:30:54 +02:00
|
|
|
dir->check_mount (&fname, 0, false);
|
|
|
|
}
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
while (dir->check_missing_mount ())
|
2006-03-01 23:37:25 +01:00
|
|
|
++count;
|
2007-08-02 12:22:30 +02:00
|
|
|
NtClose (fh);
|
2006-03-01 23:37:25 +01:00
|
|
|
delete dir;
|
2007-07-26 19:30:54 +02:00
|
|
|
return count;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
|
2008-05-20 17:11:23 +02:00
|
|
|
/* For files on NFS shares, we request an EA of type NfsV3Attributes.
|
|
|
|
This returns the content of a struct fattr3 as defined in RFC 1813.
|
|
|
|
The content is the NFS equivalent of struct stat. so there's not much
|
|
|
|
to do here except for copying. */
|
|
|
|
int __stdcall
|
|
|
|
fhandler_base::fstat_by_nfs_ea (struct __stat64 *buf)
|
|
|
|
{
|
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
struct {
|
|
|
|
FILE_FULL_EA_INFORMATION ffei;
|
|
|
|
char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
|
|
|
|
} ffei_buf;
|
|
|
|
struct {
|
|
|
|
FILE_GET_EA_INFORMATION fgei;
|
|
|
|
char buf[sizeof (NFS_V3_ATTR)];
|
|
|
|
} fgei_buf;
|
|
|
|
|
|
|
|
fgei_buf.fgei.NextEntryOffset = 0;
|
|
|
|
fgei_buf.fgei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
|
|
|
stpcpy (fgei_buf.fgei.EaName, NFS_V3_ATTR);
|
|
|
|
status = NtQueryEaFile (get_handle (), &io,
|
|
|
|
&ffei_buf.ffei, sizeof ffei_buf, TRUE,
|
|
|
|
&fgei_buf.fgei, sizeof fgei_buf, NULL, TRUE);
|
|
|
|
if (NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
fattr3 *nfs_attr = (fattr3 *) (ffei_buf.ffei.EaName
|
|
|
|
+ ffei_buf.ffei.EaNameLength + 1);
|
|
|
|
buf->st_dev = nfs_attr->fsid;
|
|
|
|
buf->st_ino = nfs_attr->fileid;
|
|
|
|
buf->st_mode = (nfs_attr->mode & 0xfff)
|
|
|
|
| nfs_type_mapping[nfs_attr->type & 7];
|
|
|
|
buf->st_nlink = nfs_attr->nlink;
|
|
|
|
/* FIXME: How to convert UNIX uid/gid to Windows SIDs? */
|
|
|
|
#if 0
|
|
|
|
buf->st_uid = nfs_attr->uid;
|
|
|
|
buf->st_gid = nfs_attr->gid;
|
|
|
|
#else
|
|
|
|
buf->st_uid = myself->uid;
|
|
|
|
buf->st_gid = myself->gid;
|
|
|
|
#endif
|
|
|
|
buf->st_rdev = makedev (nfs_attr->rdev.specdata1,
|
|
|
|
nfs_attr->rdev.specdata2);
|
|
|
|
buf->st_size = nfs_attr->size;
|
|
|
|
buf->st_blksize = PREFERRED_IO_BLKSIZE;
|
|
|
|
buf->st_blocks = nfs_attr->used / 512;
|
|
|
|
buf->st_atim = nfs_attr->atime;
|
|
|
|
buf->st_mtim = nfs_attr->mtime;
|
|
|
|
buf->st_ctim = nfs_attr->ctime;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
debug_printf ("%p = NtQueryEaFile(%S)", status, pc.get_nt_native_path ());
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2002-05-28 03:55:40 +02:00
|
|
|
int __stdcall
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_base::fstat_by_handle (struct __stat64 *buf)
|
2002-05-28 03:55:40 +02:00
|
|
|
{
|
2007-02-22 11:54:47 +01:00
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
2008-05-20 17:11:23 +02:00
|
|
|
|
|
|
|
if (pc.fs_is_nfs ())
|
|
|
|
return fstat_by_nfs_ea (buf);
|
|
|
|
|
2009-07-12 15:00:36 +02:00
|
|
|
/* Don't use FileAllInformation info class. It returns a pathname rather
|
|
|
|
than a filename, so it needs a really big buffer for no good reason
|
|
|
|
since we don't need the name anyway. So we just call the three info
|
|
|
|
classes necessary to get all information required by stat(2). */
|
2010-01-12 15:47:46 +01:00
|
|
|
|
|
|
|
union {
|
|
|
|
FILE_BASIC_INFORMATION fbi;
|
|
|
|
FILE_NETWORK_OPEN_INFORMATION fnoi;
|
|
|
|
} fi;
|
2009-07-12 15:00:36 +02:00
|
|
|
FILE_STANDARD_INFORMATION fsi;
|
|
|
|
FILE_INTERNAL_INFORMATION fii;
|
2005-04-12 16:26:31 +02:00
|
|
|
|
2010-01-12 15:47:46 +01:00
|
|
|
if (pc.has_buggy_basic_info ())
|
|
|
|
{
|
|
|
|
status = NtQueryInformationFile (get_handle (), &io, &fi, sizeof fi,
|
|
|
|
FileNetworkOpenInformation);
|
|
|
|
/* The timestamps are in the same relative memory location, only
|
|
|
|
the DOS attributes have to be moved. */
|
|
|
|
fi.fbi.FileAttributes = fi.fnoi.FileAttributes;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
status = NtQueryInformationFile (get_handle (), &io, &fi.fbi, sizeof fi.fbi,
|
|
|
|
FileBasicInformation);
|
2009-07-12 15:00:36 +02:00
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
debug_printf ("%p = NtQueryInformationFile(%S, FileBasicInformation)",
|
|
|
|
status, pc.get_nt_native_path ());
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
status = NtQueryInformationFile (get_handle (), &io, &fsi, sizeof fsi,
|
|
|
|
FileStandardInformation);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
debug_printf ("%p = NtQueryInformationFile(%S, FileStandardInformation)",
|
|
|
|
status, pc.get_nt_native_path ());
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
status = NtQueryInformationFile (get_handle (), &io, &fii, sizeof fii,
|
|
|
|
FileInternalInformation);
|
2008-05-21 12:23:19 +02:00
|
|
|
if (!NT_SUCCESS (status))
|
2006-10-31 12:40:47 +01:00
|
|
|
{
|
2009-07-12 15:00:36 +02:00
|
|
|
debug_printf ("%p = NtQueryInformationFile(%S, FileInternalInformation)",
|
2008-05-21 12:23:19 +02:00
|
|
|
status, pc.get_nt_native_path ());
|
|
|
|
return -1;
|
2007-02-22 11:54:47 +01:00
|
|
|
}
|
2008-05-21 12:23:19 +02:00
|
|
|
/* If the change time is 0, it's a file system which doesn't
|
|
|
|
support a change timestamp. In that case use the LastWriteTime
|
|
|
|
entry, as in other calls to fstat_helper. */
|
|
|
|
if (pc.is_rep_symlink ())
|
2010-01-12 15:47:46 +01:00
|
|
|
fi.fbi.FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
|
|
|
pc.file_attributes (fi.fbi.FileAttributes);
|
2008-05-21 12:23:19 +02:00
|
|
|
return fstat_helper (buf,
|
2010-01-12 15:47:46 +01:00
|
|
|
fi.fbi.ChangeTime.QuadPart ? &fi.fbi.ChangeTime
|
|
|
|
: &fi.fbi.LastWriteTime,
|
|
|
|
&fi.fbi.LastAccessTime,
|
|
|
|
&fi.fbi.LastWriteTime,
|
|
|
|
&fi.fbi.CreationTime,
|
|
|
|
get_dev (),
|
|
|
|
fsi.EndOfFile.QuadPart,
|
|
|
|
fsi.AllocationSize.QuadPart,
|
|
|
|
fii.FileId.QuadPart,
|
|
|
|
fsi.NumberOfLinks,
|
|
|
|
fi.fbi.FileAttributes);
|
2002-05-28 03:55:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int __stdcall
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_base::fstat_by_name (struct __stat64 *buf)
|
2002-05-28 03:55:40 +02:00
|
|
|
{
|
2007-07-19 19:22:34 +02:00
|
|
|
NTSTATUS status;
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
2007-07-26 19:30:54 +02:00
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
UNICODE_STRING dirname;
|
|
|
|
UNICODE_STRING basename;
|
|
|
|
HANDLE dir;
|
2008-05-21 12:23:19 +02:00
|
|
|
struct {
|
|
|
|
FILE_ID_BOTH_DIR_INFORMATION fdi;
|
|
|
|
WCHAR buf[NAME_MAX + 1];
|
|
|
|
} fdi_buf;
|
2007-07-26 19:30:54 +02:00
|
|
|
LARGE_INTEGER FileId;
|
2002-05-28 03:55:40 +02:00
|
|
|
|
2007-07-27 12:10:57 +02:00
|
|
|
RtlSplitUnicodePath (pc.get_nt_native_path (), &dirname, &basename);
|
2008-07-16 22:20:45 +02:00
|
|
|
InitializeObjectAttributes (&attr, &dirname, pc.objcaseinsensitive (),
|
2007-07-26 19:30:54 +02:00
|
|
|
NULL, NULL);
|
|
|
|
if (!NT_SUCCESS (status = NtOpenFile (&dir, SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
|
|
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_SYNCHRONOUS_IO_NONALERT
|
|
|
|
| FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_DIRECTORY_FILE)))
|
|
|
|
{
|
2007-08-21 14:09:38 +02:00
|
|
|
debug_printf ("%p = NtOpenFile(%S)", status, pc.get_nt_native_path ());
|
2007-07-26 19:30:54 +02:00
|
|
|
goto too_bad;
|
|
|
|
}
|
2008-07-30 16:41:59 +02:00
|
|
|
if (wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ()
|
2008-12-18 19:54:25 +01:00
|
|
|
&& NT_SUCCESS (status = NtQueryDirectoryFile (dir, NULL, NULL, NULL, &io,
|
2008-05-21 12:23:19 +02:00
|
|
|
&fdi_buf.fdi, sizeof fdi_buf,
|
2007-07-26 19:30:54 +02:00
|
|
|
FileIdBothDirectoryInformation,
|
|
|
|
TRUE, &basename, TRUE)))
|
2008-05-21 12:23:19 +02:00
|
|
|
FileId = fdi_buf.fdi.FileId;
|
2008-12-18 19:54:25 +01:00
|
|
|
else if (NT_SUCCESS (status = NtQueryDirectoryFile (dir, NULL, NULL, NULL,
|
|
|
|
&io, &fdi_buf.fdi,
|
|
|
|
sizeof fdi_buf,
|
2010-01-29 12:20:06 +01:00
|
|
|
FileBothDirectoryInformation,
|
2007-07-26 19:30:54 +02:00
|
|
|
TRUE, &basename, TRUE)))
|
2008-03-31 20:03:25 +02:00
|
|
|
FileId.QuadPart = 0; /* get_ino is called in fstat_helper. */
|
2007-07-26 19:30:54 +02:00
|
|
|
if (!NT_SUCCESS (status))
|
2002-05-28 03:55:40 +02:00
|
|
|
{
|
2007-08-21 14:09:38 +02:00
|
|
|
debug_printf ("%p = NtQueryDirectoryFile(%S)", status,
|
|
|
|
pc.get_nt_native_path ());
|
2007-07-26 19:30:54 +02:00
|
|
|
NtClose (dir);
|
|
|
|
goto too_bad;
|
|
|
|
}
|
|
|
|
NtClose (dir);
|
|
|
|
/* If the change time is 0, it's a file system which doesn't
|
|
|
|
support a change timestamp. In that case use the LastWriteTime
|
|
|
|
entry, as in other calls to fstat_helper. */
|
|
|
|
if (pc.is_rep_symlink ())
|
2008-05-21 12:23:19 +02:00
|
|
|
fdi_buf.fdi.FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
|
|
|
pc.file_attributes (fdi_buf.fdi.FileAttributes);
|
2007-07-26 19:30:54 +02:00
|
|
|
return fstat_helper (buf,
|
2010-01-10 12:12:52 +01:00
|
|
|
fdi_buf.fdi.ChangeTime.QuadPart
|
|
|
|
? &fdi_buf.fdi.ChangeTime : &fdi_buf.fdi.LastWriteTime,
|
|
|
|
&fdi_buf.fdi.LastAccessTime,
|
|
|
|
&fdi_buf.fdi.LastWriteTime,
|
|
|
|
&fdi_buf.fdi.CreationTime,
|
2008-05-21 12:23:19 +02:00
|
|
|
pc.fs_serial_number (),
|
|
|
|
fdi_buf.fdi.EndOfFile.QuadPart,
|
|
|
|
fdi_buf.fdi.AllocationSize.QuadPart,
|
|
|
|
FileId.QuadPart,
|
2007-07-26 19:30:54 +02:00
|
|
|
1,
|
2008-05-21 12:23:19 +02:00
|
|
|
fdi_buf.fdi.FileAttributes);
|
2007-07-26 19:30:54 +02:00
|
|
|
|
|
|
|
too_bad:
|
|
|
|
LARGE_INTEGER ft;
|
|
|
|
/* Arbitrary value: 2006-12-01 */
|
|
|
|
RtlSecondsSince1970ToTime (1164931200L, &ft);
|
|
|
|
return fstat_helper (buf,
|
2010-01-10 12:12:52 +01:00
|
|
|
&ft,
|
|
|
|
&ft,
|
|
|
|
&ft,
|
|
|
|
&ft,
|
2007-08-01 14:55:25 +02:00
|
|
|
0,
|
2007-07-26 19:30:54 +02:00
|
|
|
0ULL,
|
|
|
|
-1LL,
|
2007-07-19 19:22:34 +02:00
|
|
|
0ULL,
|
|
|
|
1,
|
2007-07-26 19:30:54 +02:00
|
|
|
pc.file_attributes ());
|
2002-05-28 03:55:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int __stdcall
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_base::fstat_fs (struct __stat64 *buf)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
int res = -1;
|
|
|
|
int oret;
|
2004-04-08 09:57:28 +02:00
|
|
|
int open_flags = O_RDONLY | O_BINARY;
|
2001-11-21 07:47:57 +01:00
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
if (get_handle ())
|
2002-09-19 05:30:20 +02:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
if (!nohandle () && !is_fs_special ())
|
2008-02-15 18:53:11 +01:00
|
|
|
res = fstat_by_handle (buf);
|
2007-07-26 19:30:54 +02:00
|
|
|
if (res)
|
|
|
|
res = fstat_by_name (buf);
|
|
|
|
return res;
|
2002-09-19 05:30:20 +02:00
|
|
|
}
|
2007-07-27 10:38:00 +02:00
|
|
|
query_open (query_read_attributes);
|
|
|
|
oret = open_fs (open_flags, 0);
|
2004-03-23 12:26:54 +01:00
|
|
|
if (oret)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
2004-03-23 12:26:54 +01:00
|
|
|
/* We now have a valid handle, regardless of the "nohandle" state.
|
2004-05-28 21:50:07 +02:00
|
|
|
Since fhandler_base::open only calls CloseHandle if !nohandle,
|
2007-08-13 19:16:05 +02:00
|
|
|
we have to set it to false before calling close and restore
|
2004-03-23 12:26:54 +01:00
|
|
|
the state afterwards. */
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
res = fstat_by_handle (buf);
|
2004-04-10 15:45:10 +02:00
|
|
|
bool no_handle = nohandle ();
|
|
|
|
nohandle (false);
|
2007-08-13 21:15:47 +02:00
|
|
|
close_fs ();
|
2004-04-10 15:45:10 +02:00
|
|
|
nohandle (no_handle);
|
2004-03-23 12:26:54 +01:00
|
|
|
set_io_handle (NULL);
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
if (res)
|
2004-03-23 12:26:54 +01:00
|
|
|
res = fstat_by_name (buf);
|
2001-11-21 07:47:57 +01:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2010-01-10 12:12:52 +01:00
|
|
|
/* The ChangeTime is taken from the NTFS ChangeTime entry, if reading
|
2005-04-12 16:26:31 +02:00
|
|
|
the file information using NtQueryInformationFile succeeded. If not,
|
|
|
|
it's faked using the LastWriteTime entry from GetFileInformationByHandle
|
|
|
|
or FindFirstFile. We're deliberatly not using the creation time anymore
|
|
|
|
to simplify interaction with native Windows applications which choke on
|
2005-09-22 17:52:02 +02:00
|
|
|
creation times >= access or write times.
|
|
|
|
|
|
|
|
Note that the dwFileAttributes member of the file information evaluated
|
|
|
|
in the calling function is used here, not the pc.fileattr member, since
|
|
|
|
the latter might be old and not reflect the actual state of the file. */
|
2002-05-28 03:55:40 +02:00
|
|
|
int __stdcall
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_base::fstat_helper (struct __stat64 *buf,
|
2010-01-10 12:12:52 +01:00
|
|
|
PLARGE_INTEGER ChangeTime,
|
|
|
|
PLARGE_INTEGER LastAccessTime,
|
|
|
|
PLARGE_INTEGER LastWriteTime,
|
|
|
|
PLARGE_INTEGER CreationTime,
|
2005-02-20 17:14:53 +01:00
|
|
|
DWORD dwVolumeSerialNumber,
|
2006-04-26 18:51:09 +02:00
|
|
|
ULONGLONG nFileSize,
|
2005-04-12 16:26:31 +02:00
|
|
|
LONGLONG nAllocSize,
|
2006-04-26 18:51:09 +02:00
|
|
|
ULONGLONG nFileIndex,
|
2005-09-22 17:52:02 +02:00
|
|
|
DWORD nNumberOfLinks,
|
|
|
|
DWORD dwFileAttributes)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
2004-04-06 12:19:31 +02:00
|
|
|
IO_STATUS_BLOCK st;
|
|
|
|
FILE_COMPRESSION_INFORMATION fci;
|
|
|
|
|
2010-01-10 12:12:52 +01:00
|
|
|
to_timestruc_t ((PFILETIME) LastAccessTime, &buf->st_atim);
|
|
|
|
to_timestruc_t ((PFILETIME) LastWriteTime, &buf->st_mtim);
|
|
|
|
to_timestruc_t ((PFILETIME) ChangeTime, &buf->st_ctim);
|
|
|
|
to_timestruc_t ((PFILETIME) CreationTime, &buf->st_birthtim);
|
2007-07-26 19:30:54 +02:00
|
|
|
buf->st_dev = dwVolumeSerialNumber;
|
2006-04-26 18:51:09 +02:00
|
|
|
buf->st_size = (_off64_t) nFileSize;
|
2003-06-04 03:57:44 +02:00
|
|
|
/* The number of links to a directory includes the
|
|
|
|
number of subdirectories in the directory, since all
|
|
|
|
those subdirectories point to it.
|
|
|
|
This is too slow on remote drives, so we do without it.
|
|
|
|
Setting the count to 2 confuses `find (1)' command. So
|
2002-06-10 03:25:47 +02:00
|
|
|
let's try it with `1' as link count. */
|
2008-04-24 19:15:17 +02:00
|
|
|
#if 0
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
buf->st_nlink = pc.ndisk_links (nNumberOfLinks);
|
2008-04-24 19:15:17 +02:00
|
|
|
#else
|
|
|
|
buf->st_nlink = nNumberOfLinks;
|
|
|
|
#endif
|
2001-11-21 07:47:57 +01:00
|
|
|
|
2006-04-26 18:51:09 +02:00
|
|
|
/* Enforce namehash as inode number on untrusted file systems. */
|
|
|
|
if (pc.isgood_inode (nFileIndex))
|
|
|
|
buf->st_ino = (__ino64_t) nFileIndex;
|
2006-01-27 22:50:42 +01:00
|
|
|
else
|
2008-03-31 20:03:25 +02:00
|
|
|
buf->st_ino = get_ino ();
|
2001-11-21 07:47:57 +01:00
|
|
|
|
2007-01-04 10:17:55 +01:00
|
|
|
buf->st_blksize = PREFERRED_IO_BLKSIZE;
|
2003-02-20 12:12:44 +01:00
|
|
|
|
2005-04-12 16:26:31 +02:00
|
|
|
if (nAllocSize >= 0LL)
|
|
|
|
/* A successful NtQueryInformationFile returns the allocation size
|
|
|
|
correctly for compressed and sparse files as well. */
|
|
|
|
buf->st_blocks = (nAllocSize + S_BLKSIZE - 1) / S_BLKSIZE;
|
2005-09-22 17:52:02 +02:00
|
|
|
else if (::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED
|
|
|
|
| FILE_ATTRIBUTE_SPARSE_FILE)
|
2007-07-29 10:23:04 +02:00
|
|
|
&& get_handle () && !is_fs_special ()
|
|
|
|
&& !NtQueryInformationFile (get_handle (), &st, (PVOID) &fci,
|
2005-09-22 17:52:02 +02:00
|
|
|
sizeof fci, FileCompressionInformation))
|
2005-04-12 16:26:31 +02:00
|
|
|
/* Otherwise we request the actual amount of bytes allocated for
|
|
|
|
compressed and sparsed files. */
|
2007-09-27 11:35:06 +02:00
|
|
|
buf->st_blocks = (fci.CompressedFileSize.QuadPart + S_BLKSIZE - 1)
|
|
|
|
/ S_BLKSIZE;
|
2003-02-20 12:12:44 +01:00
|
|
|
else
|
2005-04-12 16:26:31 +02:00
|
|
|
/* Otherwise compute no. of blocks from file size. */
|
2003-02-20 12:12:44 +01:00
|
|
|
buf->st_blocks = (buf->st_size + S_BLKSIZE - 1) / S_BLKSIZE;
|
2001-11-21 07:47:57 +01:00
|
|
|
|
|
|
|
buf->st_mode = 0;
|
2009-11-27 15:27:22 +01:00
|
|
|
/* Using a side effect: get_file_attributes checks for directory.
|
|
|
|
This is used, to set S_ISVTX, if needed. */
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
if (pc.isdir ())
|
2001-11-21 07:47:57 +01:00
|
|
|
buf->st_mode = S_IFDIR;
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
else if (pc.issymlink ())
|
2003-04-11 11:38:07 +02:00
|
|
|
{
|
2004-04-14 05:08:00 +02:00
|
|
|
buf->st_size = pc.get_symlink_length ();
|
2003-04-11 11:38:07 +02:00
|
|
|
/* symlinks are everything for everyone! */
|
|
|
|
buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO;
|
2007-07-29 10:23:04 +02:00
|
|
|
get_file_attribute (get_handle (), pc, NULL,
|
2007-07-20 16:29:43 +02:00
|
|
|
&buf->st_uid, &buf->st_gid);
|
2003-04-11 11:38:07 +02:00
|
|
|
goto done;
|
|
|
|
}
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
else if (pc.issocket ())
|
2001-11-21 07:47:57 +01:00
|
|
|
buf->st_mode = S_IFSOCK;
|
2002-05-28 03:55:40 +02:00
|
|
|
|
2007-08-13 19:16:05 +02:00
|
|
|
if (!get_file_attribute (is_fs_special () && !pc.issocket ()
|
|
|
|
? NULL : get_handle (), pc,
|
2007-07-20 16:29:43 +02:00
|
|
|
&buf->st_mode, &buf->st_uid, &buf->st_gid))
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
/* If read-only attribute is set, modify ntsec return value */
|
2005-09-22 17:52:02 +02:00
|
|
|
if (::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_READONLY)
|
2007-10-30 13:32:16 +01:00
|
|
|
&& !pc.isdir () && !pc.issymlink ())
|
2001-11-21 07:47:57 +01:00
|
|
|
buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
|
|
|
|
|
2004-12-26 03:10:30 +01:00
|
|
|
if (buf->st_mode & S_IFMT)
|
|
|
|
/* nothing */;
|
|
|
|
else if (!is_fs_special ())
|
2001-11-21 07:47:57 +01:00
|
|
|
buf->st_mode |= S_IFREG;
|
2004-12-26 03:10:30 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
buf->st_dev = dev ();
|
|
|
|
buf->st_mode = dev ().mode;
|
2005-12-01 18:33:59 +01:00
|
|
|
buf->st_size = 0;
|
2004-12-26 03:10:30 +01:00
|
|
|
}
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
buf->st_mode |= STD_RBITS;
|
|
|
|
|
2007-12-11 19:57:44 +01:00
|
|
|
if (!::has_attribute (dwFileAttributes, FILE_ATTRIBUTE_READONLY))
|
2001-11-21 07:47:57 +01:00
|
|
|
buf->st_mode |= STD_WBITS;
|
|
|
|
/* | S_IWGRP | S_IWOTH; we don't give write to group etc */
|
|
|
|
|
2007-12-11 19:57:44 +01:00
|
|
|
if (pc.isdir ())
|
|
|
|
buf->st_mode |= S_IFDIR | STD_WBITS | STD_XBITS;
|
2001-11-21 07:47:57 +01:00
|
|
|
else if (buf->st_mode & S_IFMT)
|
|
|
|
/* nothing */;
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
else if (is_fs_special ())
|
|
|
|
{
|
|
|
|
buf->st_dev = dev ();
|
|
|
|
buf->st_mode = dev ().mode;
|
2005-12-01 18:33:59 +01:00
|
|
|
buf->st_size = 0;
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
}
|
2001-11-21 07:47:57 +01:00
|
|
|
else
|
2002-05-28 03:55:40 +02:00
|
|
|
{
|
|
|
|
buf->st_mode |= S_IFREG;
|
2008-10-09 16:23:09 +02:00
|
|
|
/* Check suffix for executable file. */
|
|
|
|
if (pc.exec_state () == dont_know_if_executable)
|
|
|
|
{
|
|
|
|
PUNICODE_STRING path = pc.get_nt_native_path ();
|
|
|
|
|
2009-07-14 19:37:42 +02:00
|
|
|
if (RtlEqualUnicodePathSuffix (path, &ro_u_exe, TRUE)
|
|
|
|
|| RtlEqualUnicodePathSuffix (path, &ro_u_lnk, TRUE)
|
|
|
|
|| RtlEqualUnicodePathSuffix (path, &ro_u_com, TRUE))
|
2008-10-09 16:23:09 +02:00
|
|
|
pc.set_exec ();
|
|
|
|
}
|
2009-11-27 15:27:22 +01:00
|
|
|
/* No known suffix, check file header. This catches binaries and
|
2008-10-09 16:23:09 +02:00
|
|
|
shebang scripts. */
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
if (pc.exec_state () == dont_know_if_executable)
|
2002-10-22 23:35:21 +02:00
|
|
|
{
|
2007-08-21 17:37:10 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
2010-02-03 17:05:33 +01:00
|
|
|
NTSTATUS status;
|
2007-08-21 17:37:10 +02:00
|
|
|
HANDLE h;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
|
2010-02-03 17:05:33 +01:00
|
|
|
/* The NWFS implementation is frighteningly incomplete. When
|
|
|
|
re-opening a file by handle, the subsequent NtReadFile
|
|
|
|
returns with the weird status STATUS_FILE_IS_A_DIRECTORY.
|
|
|
|
We're still using the re-open by handle method for all
|
|
|
|
other filesystems since it's 8-10% faster than opening
|
|
|
|
by name. */
|
|
|
|
if (pc.fs_is_nwfs ())
|
|
|
|
InitializeObjectAttributes (&attr, pc.get_nt_native_path (),
|
|
|
|
OBJ_CASE_INSENSITIVE, NULL, NULL)
|
|
|
|
else
|
|
|
|
InitializeObjectAttributes (&attr, &ro_u_empty, 0,
|
|
|
|
get_handle (), NULL);
|
|
|
|
status = NtOpenFile (&h, SYNCHRONIZE | FILE_READ_DATA,
|
|
|
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_SYNCHRONOUS_IO_NONALERT);
|
|
|
|
if (NT_SUCCESS (status))
|
2008-02-15 18:53:11 +01:00
|
|
|
{
|
2007-08-21 17:37:10 +02:00
|
|
|
LARGE_INTEGER off = { QuadPart:0LL };
|
|
|
|
char magic[3];
|
|
|
|
|
2010-02-03 17:05:33 +01:00
|
|
|
status = NtReadFile (h, NULL, NULL, NULL, &io, magic,
|
|
|
|
3, &off, NULL);
|
|
|
|
if (NT_SUCCESS (status)
|
2007-08-21 17:37:10 +02:00
|
|
|
&& has_exec_chars (magic, io.Information))
|
2002-10-23 04:32:34 +02:00
|
|
|
{
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
pc.set_exec ();
|
2002-10-23 04:32:34 +02:00
|
|
|
buf->st_mode |= STD_XBITS;
|
|
|
|
}
|
2010-02-03 17:05:33 +01:00
|
|
|
else
|
|
|
|
debug_printf ("%p = NtReadFile(%S)", status,
|
|
|
|
pc.get_nt_native_path ());
|
2007-08-21 17:37:10 +02:00
|
|
|
NtClose (h);
|
2002-10-23 04:32:34 +02:00
|
|
|
}
|
2010-02-03 17:05:33 +01:00
|
|
|
else
|
|
|
|
debug_printf ("%p = NtOpenFile(%S)", status,
|
|
|
|
pc.get_nt_native_path ());
|
2002-10-22 23:35:21 +02:00
|
|
|
}
|
|
|
|
}
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
if (pc.exec_state () == is_executable)
|
2002-10-23 04:32:34 +02:00
|
|
|
buf->st_mode |= STD_XBITS;
|
2003-05-27 09:44:26 +02:00
|
|
|
|
|
|
|
/* This fakes the permissions of all files to match the current umask. */
|
|
|
|
buf->st_mode &= ~(cygheap->umask);
|
2009-11-08 11:22:28 +01:00
|
|
|
/* If the FS supports ACLs, we're here because we couldn't even open
|
|
|
|
the file for READ_CONTROL access. Chances are high that the file's
|
|
|
|
security descriptor has no ACE for "Everyone", so we should not fake
|
|
|
|
any access for "others". */
|
|
|
|
if (has_acls ())
|
|
|
|
buf->st_mode &= ~(S_IROTH | S_IWOTH | S_IXOTH);
|
2002-10-22 23:35:21 +02:00
|
|
|
}
|
2002-10-22 22:41:31 +02:00
|
|
|
|
2003-04-11 11:38:07 +02:00
|
|
|
done:
|
2005-12-21 14:01:27 +01:00
|
|
|
syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%D, st_mode=%p, st_ino=%D, sizeof=%d",
|
2002-05-28 03:55:40 +02:00
|
|
|
buf, buf->st_atime, buf->st_size, buf->st_mode,
|
2005-12-21 14:01:27 +01:00
|
|
|
buf->st_ino, sizeof (*buf));
|
2001-11-21 07:47:57 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
int __stdcall
|
|
|
|
fhandler_disk_file::fstat (struct __stat64 *buf)
|
2001-11-22 06:59:07 +01:00
|
|
|
{
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
return fstat_fs (buf);
|
2001-11-22 06:59:07 +01:00
|
|
|
}
|
|
|
|
|
2007-02-27 13:58:56 +01:00
|
|
|
int __stdcall
|
|
|
|
fhandler_disk_file::fstatvfs (struct statvfs *sfs)
|
|
|
|
{
|
2007-07-27 12:10:57 +02:00
|
|
|
int ret = -1, opened = 0;
|
2007-02-27 13:58:56 +01:00
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
FILE_FS_FULL_SIZE_INFORMATION full_fsi;
|
|
|
|
FILE_FS_SIZE_INFORMATION fsi;
|
2007-07-27 12:10:57 +02:00
|
|
|
HANDLE fh = get_handle ();
|
2007-02-27 13:58:56 +01:00
|
|
|
|
2007-07-27 12:10:57 +02:00
|
|
|
if (!fh)
|
2007-02-27 13:58:56 +01:00
|
|
|
{
|
2007-07-27 12:10:57 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
opened = NT_SUCCESS (NtOpenFile (&fh, READ_CONTROL,
|
|
|
|
pc.get_object_attr (attr, sec_none_nih),
|
|
|
|
&io, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT));
|
|
|
|
if (!opened)
|
2007-07-07 18:46:35 +02:00
|
|
|
{
|
2007-07-27 12:10:57 +02:00
|
|
|
/* Can't open file. Try again with parent dir. */
|
|
|
|
UNICODE_STRING dirname;
|
|
|
|
RtlSplitUnicodePath (pc.get_nt_native_path (), &dirname, NULL);
|
|
|
|
attr.ObjectName = &dirname;
|
|
|
|
opened = NT_SUCCESS (NtOpenFile (&fh, READ_CONTROL, &attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT));
|
|
|
|
if (!opened)
|
2007-02-27 13:58:56 +01:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sfs->f_files = ULONG_MAX;
|
|
|
|
sfs->f_ffree = ULONG_MAX;
|
|
|
|
sfs->f_favail = ULONG_MAX;
|
2008-05-21 12:23:19 +02:00
|
|
|
sfs->f_fsid = pc.fs_serial_number ();
|
|
|
|
sfs->f_flag = pc.fs_flags ();
|
|
|
|
sfs->f_namemax = pc.fs_name_len ();
|
2007-02-27 13:58:56 +01:00
|
|
|
/* Get allocation related information. Try to get "full" information
|
|
|
|
first, which is only available since W2K. If that fails, try to
|
|
|
|
retrieve normal allocation information. */
|
2007-07-27 12:10:57 +02:00
|
|
|
status = NtQueryVolumeInformationFile (fh, &io, &full_fsi, sizeof full_fsi,
|
2007-02-27 13:58:56 +01:00
|
|
|
FileFsFullSizeInformation);
|
|
|
|
if (NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
sfs->f_bsize = full_fsi.BytesPerSector * full_fsi.SectorsPerAllocationUnit;
|
|
|
|
sfs->f_frsize = sfs->f_bsize;
|
|
|
|
sfs->f_blocks = full_fsi.TotalAllocationUnits.LowPart;
|
|
|
|
sfs->f_bfree = full_fsi.ActualAvailableAllocationUnits.LowPart;
|
|
|
|
sfs->f_bavail = full_fsi.CallerAvailableAllocationUnits.LowPart;
|
|
|
|
if (sfs->f_bfree > sfs->f_bavail)
|
2007-07-07 18:46:35 +02:00
|
|
|
{
|
2007-02-27 13:58:56 +01:00
|
|
|
/* Quotas active. We can't trust TotalAllocationUnits. */
|
|
|
|
NTFS_VOLUME_DATA_BUFFER nvdb;
|
|
|
|
|
2007-07-27 12:10:57 +02:00
|
|
|
status = NtFsControlFile (fh, NULL, NULL, NULL, &io,
|
|
|
|
FSCTL_GET_NTFS_VOLUME_DATA,
|
|
|
|
NULL, 0, &nvdb, sizeof nvdb);
|
|
|
|
if (!NT_SUCCESS (status))
|
2007-10-15 10:25:38 +02:00
|
|
|
debug_printf ("%p = NtFsControlFile(%S, FSCTL_GET_NTFS_VOLUME_DATA)",
|
2007-08-21 14:09:38 +02:00
|
|
|
status, pc.get_nt_native_path ());
|
2007-02-27 13:58:56 +01:00
|
|
|
else
|
|
|
|
sfs->f_blocks = nvdb.TotalClusters.QuadPart;
|
|
|
|
}
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-07-27 12:10:57 +02:00
|
|
|
status = NtQueryVolumeInformationFile (fh, &io, &fsi, sizeof fsi,
|
|
|
|
FileFsSizeInformation);
|
2007-02-27 13:58:56 +01:00
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
sfs->f_bsize = fsi.BytesPerSector * fsi.SectorsPerAllocationUnit;
|
|
|
|
sfs->f_frsize = sfs->f_bsize;
|
|
|
|
sfs->f_blocks = fsi.TotalAllocationUnits.LowPart;
|
|
|
|
sfs->f_bfree = fsi.AvailableAllocationUnits.LowPart;
|
|
|
|
sfs->f_bavail = sfs->f_bfree;
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
out:
|
2007-07-27 12:10:57 +02:00
|
|
|
if (opened)
|
|
|
|
NtClose (fh);
|
2007-02-27 13:58:56 +01:00
|
|
|
syscall_printf ("%d = fstatvfs (%s, %p)", ret, get_name (), sfs);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2004-04-13 22:36:58 +02:00
|
|
|
int __stdcall
|
|
|
|
fhandler_disk_file::fchmod (mode_t mode)
|
|
|
|
{
|
|
|
|
extern int chmod_device (path_conv& pc, mode_t mode);
|
|
|
|
int res = -1;
|
|
|
|
int oret = 0;
|
2008-05-20 17:11:23 +02:00
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
2004-04-13 22:36:58 +02:00
|
|
|
|
|
|
|
if (pc.is_fs_special ())
|
|
|
|
return chmod_device (pc, mode);
|
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2004-04-14 15:40:07 +02:00
|
|
|
{
|
2005-04-04 12:26:35 +02:00
|
|
|
query_open (query_write_control);
|
|
|
|
if (!(oret = open (O_BINARY, 0)))
|
2005-05-03 21:03:20 +02:00
|
|
|
{
|
2007-07-29 10:23:04 +02:00
|
|
|
/* Need WRITE_DAC|WRITE_OWNER to write ACLs. */
|
2008-07-14 22:22:03 +02:00
|
|
|
if (pc.has_acls ())
|
2005-05-03 21:03:20 +02:00
|
|
|
return -1;
|
2007-07-29 10:23:04 +02:00
|
|
|
/* Otherwise FILE_WRITE_ATTRIBUTES is sufficient. */
|
|
|
|
query_open (query_write_attributes);
|
|
|
|
if (!(oret = open (O_BINARY, 0)))
|
|
|
|
return -1;
|
2005-05-03 21:03:20 +02:00
|
|
|
}
|
2005-04-04 12:26:35 +02:00
|
|
|
}
|
2004-04-13 22:36:58 +02:00
|
|
|
|
2008-05-20 17:11:23 +02:00
|
|
|
if (pc.fs_is_nfs ())
|
|
|
|
{
|
|
|
|
/* chmod on NFS shares works by writing an EA of type NfsV3Attributes.
|
2008-11-26 18:21:04 +01:00
|
|
|
Only type and mode have to be set. Apparently type isn't checked
|
2008-05-20 17:11:23 +02:00
|
|
|
for consistency, so it's sufficent to set it to NF3REG all the time. */
|
|
|
|
struct {
|
|
|
|
FILE_FULL_EA_INFORMATION ffei;
|
|
|
|
char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
|
|
|
|
} ffei_buf;
|
|
|
|
ffei_buf.ffei.NextEntryOffset = 0;
|
|
|
|
ffei_buf.ffei.Flags = 0;
|
|
|
|
ffei_buf.ffei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
|
|
|
ffei_buf.ffei.EaValueLength = sizeof (fattr3);
|
|
|
|
strcpy (ffei_buf.ffei.EaName, NFS_V3_ATTR);
|
|
|
|
fattr3 *nfs_attr = (fattr3 *) (ffei_buf.ffei.EaName
|
|
|
|
+ ffei_buf.ffei.EaNameLength + 1);
|
|
|
|
memset (nfs_attr, 0, sizeof (fattr3));
|
|
|
|
nfs_attr->type = NF3REG;
|
|
|
|
nfs_attr->mode = mode;
|
|
|
|
status = NtSetEaFile (get_handle (), &io,
|
|
|
|
&ffei_buf.ffei, sizeof ffei_buf);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
else
|
2008-11-26 18:21:04 +01:00
|
|
|
res = 0;
|
2008-05-20 17:11:23 +02:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2008-07-14 22:22:03 +02:00
|
|
|
if (pc.has_acls ())
|
2005-04-04 12:26:35 +02:00
|
|
|
{
|
2004-04-20 17:51:24 +02:00
|
|
|
if (pc.isdir ())
|
|
|
|
mode |= S_IFDIR;
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!set_file_attribute (get_handle (), pc,
|
2008-07-14 22:22:03 +02:00
|
|
|
ILLEGAL_UID, ILLEGAL_GID, mode))
|
2004-04-20 17:51:24 +02:00
|
|
|
res = 0;
|
|
|
|
}
|
2004-04-13 22:36:58 +02:00
|
|
|
|
2008-08-14 16:05:04 +02:00
|
|
|
/* If the mode has any write bits set, the DOS R/O flag is in the way. */
|
2004-04-13 22:36:58 +02:00
|
|
|
if (mode & (S_IWUSR | S_IWGRP | S_IWOTH))
|
2005-03-22 20:00:31 +01:00
|
|
|
pc &= (DWORD) ~FILE_ATTRIBUTE_READONLY;
|
2008-08-14 16:05:04 +02:00
|
|
|
else if (!pc.has_acls ()) /* Never set DOS R/O if security is used. */
|
2005-03-22 20:00:31 +01:00
|
|
|
pc |= (DWORD) FILE_ATTRIBUTE_READONLY;
|
2008-05-20 23:08:39 +02:00
|
|
|
if (S_ISSOCK (mode))
|
2007-08-16 18:59:25 +02:00
|
|
|
pc |= (DWORD) FILE_ATTRIBUTE_SYSTEM;
|
2004-04-13 22:36:58 +02:00
|
|
|
|
2009-07-16 17:28:57 +02:00
|
|
|
status = NtSetAttributesFile (get_handle (), pc.file_attributes ());
|
2009-07-21 10:10:36 +02:00
|
|
|
/* MVFS needs a good amount of kicking to be convinced that it has to write
|
|
|
|
back metadata changes and to invalidate the cached metadata information
|
|
|
|
stored for the given handle. This method to open a second handle to
|
|
|
|
the file and write the same metadata information twice has been found
|
|
|
|
experimentally: http://cygwin.com/ml/cygwin/2009-07/msg00533.html */
|
|
|
|
if (pc.fs_is_mvfs () && NT_SUCCESS (status) && !oret)
|
|
|
|
{
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
HANDLE fh;
|
|
|
|
|
|
|
|
InitializeObjectAttributes (&attr, &ro_u_empty, 0, get_handle (), NULL);
|
|
|
|
if (NT_SUCCESS (NtOpenFile (&fh, FILE_WRITE_ATTRIBUTES, &attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT)))
|
|
|
|
{
|
|
|
|
NtSetAttributesFile (fh, pc.file_attributes ());
|
|
|
|
NtClose (fh);
|
|
|
|
}
|
|
|
|
}
|
2008-05-20 17:11:23 +02:00
|
|
|
/* Correct NTFS security attributes have higher priority */
|
2008-07-14 22:22:03 +02:00
|
|
|
if (!pc.has_acls ())
|
2008-05-20 17:11:23 +02:00
|
|
|
{
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
else
|
|
|
|
res = 0;
|
|
|
|
}
|
2004-04-13 22:36:58 +02:00
|
|
|
|
2008-05-20 17:11:23 +02:00
|
|
|
out:
|
2005-01-13 23:56:20 +01:00
|
|
|
if (oret)
|
2008-02-29 17:38:51 +01:00
|
|
|
close_fs ();
|
2005-01-13 23:56:20 +01:00
|
|
|
|
2004-04-13 22:36:58 +02:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2004-04-14 15:40:07 +02:00
|
|
|
int __stdcall
|
|
|
|
fhandler_disk_file::fchown (__uid32_t uid, __gid32_t gid)
|
|
|
|
{
|
|
|
|
int oret = 0;
|
2004-04-16 23:22:13 +02:00
|
|
|
|
2008-07-14 22:22:03 +02:00
|
|
|
if (!pc.has_acls ())
|
2004-04-20 17:51:24 +02:00
|
|
|
{
|
|
|
|
/* fake - if not supported, pretend we're like win95
|
2004-05-28 21:50:07 +02:00
|
|
|
where it just works */
|
2008-05-20 17:11:23 +02:00
|
|
|
/* FIXME: Could be supported on NFS when user->uid mapping is in place. */
|
2004-04-20 17:51:24 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2004-04-14 15:40:07 +02:00
|
|
|
{
|
2005-02-19 22:53:36 +01:00
|
|
|
query_open (query_write_control);
|
2005-06-02 03:50:23 +02:00
|
|
|
if (!(oret = fhandler_disk_file::open (O_BINARY, 0)))
|
2005-02-19 22:53:36 +01:00
|
|
|
return -1;
|
2004-04-14 15:40:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
mode_t attrib = 0;
|
|
|
|
if (pc.isdir ())
|
|
|
|
attrib |= S_IFDIR;
|
2009-04-09 11:19:03 +02:00
|
|
|
__uid32_t old_uid;
|
|
|
|
int res = get_file_attribute (get_handle (), pc, &attrib, &old_uid, NULL);
|
2004-04-14 15:40:07 +02:00
|
|
|
if (!res)
|
2005-12-21 14:01:27 +01:00
|
|
|
{
|
|
|
|
/* Typical Windows default ACLs can contain permissions for one
|
|
|
|
group, while being owned by another user/group. The permission
|
|
|
|
bits returned above are pretty much useless then. Creating a
|
|
|
|
new ACL with these useless permissions results in a potentially
|
|
|
|
broken symlink. So what we do here is to set the underlying
|
|
|
|
permissions of symlinks to a sensible value which allows the
|
2005-12-21 14:37:28 +01:00
|
|
|
world to read the symlink and only the new owner to change it. */
|
2005-12-21 14:01:27 +01:00
|
|
|
if (pc.issymlink ())
|
2005-12-22 06:57:54 +01:00
|
|
|
attrib = S_IFLNK | STD_RBITS | STD_WBITS;
|
2007-07-29 10:23:04 +02:00
|
|
|
res = set_file_attribute (get_handle (), pc, uid, gid, attrib);
|
2009-04-09 11:19:03 +02:00
|
|
|
/* If you're running a Samba server which has no winbidd running, the
|
|
|
|
uid<->SID mapping is disfunctional. Even trying to chown to your
|
|
|
|
own account fails since the account used on the server is the UNIX
|
|
|
|
account which gets used for the standard user mapping. This is a
|
|
|
|
default mechanism which doesn't know your real Windows SID.
|
|
|
|
There are two possible error codes in different Samba releases for
|
|
|
|
this situation, one of them is unfortunately the not very significant
|
|
|
|
STATUS_ACCESS_DENIED. Instead of relying on the error codes, we're
|
|
|
|
using the below very simple heuristic. If set_file_attribute failed,
|
|
|
|
and the original user account was either already unknown, or one of
|
|
|
|
the standard UNIX accounts, we're faking success. */
|
|
|
|
if (res == -1 && pc.fs_is_samba ())
|
|
|
|
{
|
|
|
|
cygsid sid;
|
|
|
|
|
|
|
|
if (old_uid == ILLEGAL_UID
|
|
|
|
|| (sid.getfrompw (internal_getpwuid (old_uid))
|
|
|
|
&& EqualPrefixSid (sid, well_known_samba_unix_user_fake_sid)))
|
|
|
|
{
|
|
|
|
debug_printf ("Faking chown worked on standalone Samba");
|
|
|
|
res = 0;
|
|
|
|
}
|
|
|
|
}
|
2005-12-21 14:01:27 +01:00
|
|
|
}
|
2004-04-14 15:40:07 +02:00
|
|
|
if (oret)
|
2008-02-29 17:38:51 +01:00
|
|
|
close_fs ();
|
2004-04-14 15:40:07 +02:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2004-04-14 18:36:26 +02:00
|
|
|
int _stdcall
|
|
|
|
fhandler_disk_file::facl (int cmd, int nentries, __aclent32_t *aclbufp)
|
|
|
|
{
|
|
|
|
int res = -1;
|
|
|
|
int oret = 0;
|
|
|
|
|
2008-07-14 22:22:03 +02:00
|
|
|
if (!pc.has_acls ())
|
2004-04-14 18:36:26 +02:00
|
|
|
{
|
2007-07-30 12:58:16 +02:00
|
|
|
cant_access_acl:
|
2004-04-14 18:36:26 +02:00
|
|
|
switch (cmd)
|
2004-05-28 21:50:07 +02:00
|
|
|
{
|
2004-04-14 18:36:26 +02:00
|
|
|
struct __stat64 st;
|
|
|
|
|
|
|
|
case SETACL:
|
2005-01-14 23:03:40 +01:00
|
|
|
/* Open for writing required to be able to set ctime
|
|
|
|
(even though setting the ACL is just pretended). */
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2005-02-11 16:37:26 +01:00
|
|
|
oret = open (O_WRONLY | O_BINARY, 0);
|
2005-01-14 23:03:40 +01:00
|
|
|
res = 0;
|
2004-04-14 18:36:26 +02:00
|
|
|
break;
|
|
|
|
case GETACL:
|
|
|
|
if (!aclbufp)
|
2006-10-22 21:31:33 +02:00
|
|
|
set_errno (EFAULT);
|
2004-04-14 18:36:26 +02:00
|
|
|
else if (nentries < MIN_ACL_ENTRIES)
|
|
|
|
set_errno (ENOSPC);
|
2004-04-16 23:22:13 +02:00
|
|
|
else
|
2004-04-14 18:36:26 +02:00
|
|
|
{
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2004-04-16 23:22:13 +02:00
|
|
|
{
|
2007-02-27 13:58:56 +01:00
|
|
|
query_open (query_read_attributes);
|
2007-07-26 19:30:54 +02:00
|
|
|
oret = open (O_BINARY, 0);
|
2004-04-16 23:22:13 +02:00
|
|
|
}
|
2008-12-18 19:54:25 +01:00
|
|
|
if ((oret && !fstat_by_handle (&st))
|
2007-07-26 19:30:54 +02:00
|
|
|
|| !fstat_by_name (&st))
|
2004-04-16 23:22:13 +02:00
|
|
|
{
|
|
|
|
aclbufp[0].a_type = USER_OBJ;
|
|
|
|
aclbufp[0].a_id = st.st_uid;
|
|
|
|
aclbufp[0].a_perm = (st.st_mode & S_IRWXU) >> 6;
|
|
|
|
aclbufp[1].a_type = GROUP_OBJ;
|
|
|
|
aclbufp[1].a_id = st.st_gid;
|
|
|
|
aclbufp[1].a_perm = (st.st_mode & S_IRWXG) >> 3;
|
|
|
|
aclbufp[2].a_type = OTHER_OBJ;
|
|
|
|
aclbufp[2].a_id = ILLEGAL_GID;
|
|
|
|
aclbufp[2].a_perm = st.st_mode & S_IRWXO;
|
2004-05-28 21:50:07 +02:00
|
|
|
aclbufp[3].a_type = CLASS_OBJ;
|
2004-04-16 23:22:13 +02:00
|
|
|
aclbufp[3].a_id = ILLEGAL_GID;
|
|
|
|
aclbufp[3].a_perm = S_IRWXU | S_IRWXG | S_IRWXO;
|
|
|
|
res = MIN_ACL_ENTRIES;
|
|
|
|
}
|
2004-04-14 18:36:26 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GETACLCNT:
|
|
|
|
res = MIN_ACL_ENTRIES;
|
|
|
|
break;
|
2004-04-16 23:22:13 +02:00
|
|
|
default:
|
|
|
|
set_errno (EINVAL);
|
|
|
|
break;
|
2004-04-14 18:36:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2004-04-16 23:22:13 +02:00
|
|
|
{
|
2007-07-30 12:58:16 +02:00
|
|
|
query_open (cmd == SETACL ? query_write_control : query_read_control);
|
2005-02-19 22:53:36 +01:00
|
|
|
if (!(oret = open (O_BINARY, 0)))
|
2007-07-30 12:58:16 +02:00
|
|
|
{
|
|
|
|
if (cmd == GETACL || cmd == GETACLCNT)
|
|
|
|
goto cant_access_acl;
|
|
|
|
return -1;
|
|
|
|
}
|
2004-04-16 23:22:13 +02:00
|
|
|
}
|
2004-04-14 18:36:26 +02:00
|
|
|
switch (cmd)
|
|
|
|
{
|
|
|
|
case SETACL:
|
|
|
|
if (!aclsort32 (nentries, 0, aclbufp))
|
2007-01-07 13:44:10 +01:00
|
|
|
{
|
|
|
|
bool rw = false;
|
2007-07-29 10:23:04 +02:00
|
|
|
res = setacl (get_handle (), pc, nentries, aclbufp, rw);
|
2007-01-07 13:44:10 +01:00
|
|
|
if (rw)
|
2007-07-29 10:23:04 +02:00
|
|
|
{
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
FILE_BASIC_INFORMATION fbi;
|
|
|
|
fbi.CreationTime.QuadPart
|
|
|
|
= fbi.LastAccessTime.QuadPart
|
|
|
|
= fbi.LastWriteTime.QuadPart
|
|
|
|
= fbi.ChangeTime.QuadPart = 0LL;
|
2007-07-29 17:57:41 +02:00
|
|
|
fbi.FileAttributes = (pc.file_attributes ()
|
|
|
|
& ~FILE_ATTRIBUTE_READONLY)
|
|
|
|
?: FILE_ATTRIBUTE_NORMAL;
|
2007-07-29 10:23:04 +02:00
|
|
|
NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
|
|
|
FileBasicInformation);
|
|
|
|
}
|
2007-01-07 13:44:10 +01:00
|
|
|
}
|
2004-04-14 18:36:26 +02:00
|
|
|
break;
|
|
|
|
case GETACL:
|
|
|
|
if (!aclbufp)
|
|
|
|
set_errno(EFAULT);
|
|
|
|
else
|
2007-07-29 10:23:04 +02:00
|
|
|
res = getacl (get_handle (), pc, nentries, aclbufp);
|
2004-04-14 18:36:26 +02:00
|
|
|
break;
|
|
|
|
case GETACLCNT:
|
2007-07-29 10:23:04 +02:00
|
|
|
res = getacl (get_handle (), pc, 0, NULL);
|
2005-06-27 16:18:13 +02:00
|
|
|
break;
|
2004-04-14 18:36:26 +02:00
|
|
|
default:
|
|
|
|
set_errno (EINVAL);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (oret)
|
2008-02-29 17:38:51 +01:00
|
|
|
close_fs ();
|
2004-04-14 18:36:26 +02:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
* Makefile.in (DLL_OFILES): Add ntea.o.
* cygwin.din (getxattr, listxattr, removexattr, setxattr, lgetxattr,
llistxattr, lremovexattr, lsetxattr, fgetxattr, flistxattr,
fremovexattr, fsetxattr): Export Linux extended attribute functions.
Sort.
* errno.cc (errmap): Add mappings for ERROR_EAS_DIDNT_FIT,
ERROR_EAS_NOT_SUPPORTED, ERROR_EA_LIST_INCONSISTENT,
ERROR_EA_TABLE_FULL, ERROR_FILE_CORRUPT, ERROR_INVALID_EA_NAME.
* fhandler.h (class fhandler_base): Declare new fgetxattr and
fsetxattr methods.
(class fhandler_disk_file): Ditto.
* fhandler.cc (fhandler_base::fgetxattr): New method.
(fhandler_base::fsetxattr): New method.
* fhandler_disk_file.cc (fhandler_disk_file::fgetxattr): New method.
(fhandler_disk_file::fsetxattr): New method.
* ntdll.h (STATUS_EA_TOO_LARGE): Define.
(STATUS_NONEXISTENT_EA_ENTRY): Define.
(STATUS_NO_EAS_ON_FILE): Define.
* ntea.cc (read_ea): Rewrite for long pathnames and for using with
Linux extended attribute functions.
(write_ea): Ditto.
(getxattr_worker): New static function.
(getxattr): New function.
(lgetxattr): New function.
(fgetxattr): New function.
(listxattr): New function.
(llistxattr): New function.
(flistxattr): New function.
(setxattr_worker): New static function.
(setxattr): New function.
(lsetxattr): New function.
(fsetxattr): New function.
(removexattr): New function.
(lsetxattr): New function.
(fsetxattr): New function.
* security.h (read_ea): Change declaration according to above changes.
(write_ea): Ditto.
* include/cygwin/version.h: Bump API minor version.
2008-02-10 16:43:04 +01:00
|
|
|
ssize_t
|
|
|
|
fhandler_disk_file::fgetxattr (const char *name, void *value, size_t size)
|
|
|
|
{
|
|
|
|
if (pc.is_fs_special ())
|
|
|
|
{
|
|
|
|
set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return read_ea (get_handle (), pc, name, (char *) value, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_disk_file::fsetxattr (const char *name, const void *value, size_t size,
|
|
|
|
int flags)
|
|
|
|
{
|
|
|
|
if (pc.is_fs_special ())
|
|
|
|
{
|
|
|
|
set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return write_ea (get_handle (), pc, name, (const char *) value, size, flags);
|
|
|
|
}
|
|
|
|
|
2005-02-02 23:42:06 +01:00
|
|
|
int
|
2006-08-07 21:29:14 +02:00
|
|
|
fhandler_disk_file::fadvise (_off64_t offset, _off64_t length, int advice)
|
2005-02-02 23:42:06 +01:00
|
|
|
{
|
2006-08-07 21:29:14 +02:00
|
|
|
if (advice < POSIX_FADV_NORMAL || advice > POSIX_FADV_NOREUSE)
|
|
|
|
{
|
|
|
|
set_errno (EINVAL);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Windows only supports advice flags for the whole file. We're using
|
|
|
|
a simplified test here so that we don't have to ask for the actual
|
|
|
|
file size. Length == 0 means all bytes starting at offset anyway.
|
|
|
|
So we only actually follow the advice, if it's given for offset == 0. */
|
|
|
|
if (offset != 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* We only support normal and sequential mode for now. Everything which
|
|
|
|
is not POSIX_FADV_SEQUENTIAL is treated like POSIX_FADV_NORMAL. */
|
|
|
|
if (advice != POSIX_FADV_SEQUENTIAL)
|
|
|
|
advice = POSIX_FADV_NORMAL;
|
|
|
|
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
FILE_MODE_INFORMATION fmi;
|
|
|
|
NTSTATUS status = NtQueryInformationFile (get_handle (), &io,
|
|
|
|
&fmi, sizeof fmi,
|
|
|
|
FileModeInformation);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
fmi.Mode &= ~FILE_SEQUENTIAL_ONLY;
|
|
|
|
if (advice == POSIX_FADV_SEQUENTIAL)
|
2007-02-20 01:16:18 +01:00
|
|
|
fmi.Mode |= FILE_SEQUENTIAL_ONLY;
|
2006-08-07 21:29:14 +02:00
|
|
|
status = NtSetInformationFile (get_handle (), &io, &fmi, sizeof fmi,
|
|
|
|
FileModeInformation);
|
|
|
|
if (NT_SUCCESS (status))
|
|
|
|
return 0;
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_disk_file::ftruncate (_off64_t length, bool allow_truncate)
|
|
|
|
{
|
|
|
|
int res = -1;
|
2005-02-02 23:42:06 +01:00
|
|
|
|
2006-08-07 21:29:14 +02:00
|
|
|
if (length < 0 || !get_handle ())
|
2005-02-02 23:42:06 +01:00
|
|
|
set_errno (EINVAL);
|
|
|
|
else if (pc.isdir ())
|
|
|
|
set_errno (EISDIR);
|
|
|
|
else if (!(get_access () & GENERIC_WRITE))
|
|
|
|
set_errno (EBADF);
|
|
|
|
else
|
|
|
|
{
|
2007-02-22 11:54:47 +01:00
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
2007-07-27 15:19:41 +02:00
|
|
|
FILE_STANDARD_INFORMATION fsi;
|
2007-02-22 11:54:47 +01:00
|
|
|
FILE_END_OF_FILE_INFORMATION feofi;
|
|
|
|
|
2007-07-27 15:19:41 +02:00
|
|
|
status = NtQueryInformationFile (get_handle (), &io, &fsi, sizeof fsi,
|
|
|
|
FileStandardInformation);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
return -1;
|
|
|
|
}
|
2006-08-07 21:29:14 +02:00
|
|
|
|
|
|
|
/* If called through posix_fallocate, silently succeed if length
|
2007-02-20 01:16:18 +01:00
|
|
|
is less than the file's actual length. */
|
2007-07-27 15:19:41 +02:00
|
|
|
if (!allow_truncate && length < fsi.EndOfFile.QuadPart)
|
2006-08-07 21:29:14 +02:00
|
|
|
return 0;
|
|
|
|
|
2007-02-22 11:54:47 +01:00
|
|
|
feofi.EndOfFile.QuadPart = length;
|
|
|
|
/* Create sparse files only when called through ftruncate, not when
|
|
|
|
called through posix_fallocate. */
|
|
|
|
if (allow_truncate
|
2008-03-31 20:03:25 +02:00
|
|
|
&& (pc.fs_flags () & FILE_SUPPORTS_SPARSE_FILES)
|
2007-07-27 15:19:41 +02:00
|
|
|
&& length >= fsi.EndOfFile.QuadPart + (128 * 1024))
|
2007-02-20 01:16:18 +01:00
|
|
|
{
|
2007-07-27 15:19:41 +02:00
|
|
|
status = NtFsControlFile (get_handle (), NULL, NULL, NULL, &io,
|
|
|
|
FSCTL_SET_SPARSE, NULL, 0, NULL, 0);
|
2007-10-15 10:25:38 +02:00
|
|
|
syscall_printf ("%p = NtFsControlFile(%S, FSCTL_SET_SPARSE)",
|
2007-08-21 14:09:38 +02:00
|
|
|
status, pc.get_nt_native_path ());
|
2006-08-07 21:29:14 +02:00
|
|
|
}
|
2007-02-22 11:54:47 +01:00
|
|
|
status = NtSetInformationFile (get_handle (), &io,
|
|
|
|
&feofi, sizeof feofi,
|
|
|
|
FileEndOfFileInformation);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
__seterrno_from_nt_status (status);
|
2006-08-07 21:29:14 +02:00
|
|
|
else
|
2007-02-22 11:54:47 +01:00
|
|
|
res = 0;
|
2005-02-02 23:42:06 +01:00
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2005-02-19 22:53:36 +01:00
|
|
|
int
|
|
|
|
fhandler_disk_file::link (const char *newpath)
|
|
|
|
{
|
2009-09-26 17:51:53 +02:00
|
|
|
size_t nlen = strlen (newpath);
|
|
|
|
path_conv newpc (newpath, PC_SYM_NOFOLLOW | PC_POSIX | PC_NULLEMPTY, stat_suffixes);
|
2005-02-19 22:53:36 +01:00
|
|
|
if (newpc.error)
|
|
|
|
{
|
2008-07-16 22:20:45 +02:00
|
|
|
set_errno (newpc.error);
|
2005-02-20 12:44:32 +01:00
|
|
|
return -1;
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (newpc.exists ())
|
|
|
|
{
|
2007-08-14 16:48:52 +02:00
|
|
|
syscall_printf ("file '%S' exists?", newpc.get_nt_native_path ());
|
2005-02-19 22:53:36 +01:00
|
|
|
set_errno (EEXIST);
|
2005-02-20 12:44:32 +01:00
|
|
|
return -1;
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
|
|
|
|
2009-09-26 17:51:53 +02:00
|
|
|
if (isdirsep (newpath[nlen - 1]) || has_dot_last_component (newpath, false))
|
|
|
|
{
|
|
|
|
set_errno (ENOENT);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
char new_buf[nlen + 5];
|
2008-07-16 22:20:45 +02:00
|
|
|
if (!newpc.error)
|
2005-02-19 22:53:36 +01:00
|
|
|
{
|
2009-10-12 13:57:29 +02:00
|
|
|
/* If the original file is a lnk special file (except for sockets),
|
|
|
|
and if the original file has a .lnk suffix, add one to the hardlink
|
|
|
|
as well. */
|
|
|
|
if (pc.is_lnk_special () && !pc.issocket ()
|
|
|
|
&& RtlEqualUnicodePathSuffix (pc.get_nt_native_path (),
|
|
|
|
&ro_u_lnk, TRUE))
|
2006-02-05 19:18:02 +01:00
|
|
|
{
|
|
|
|
/* Shortcut hack. */
|
2007-07-27 18:24:07 +02:00
|
|
|
stpcpy (stpcpy (new_buf, newpath), ".lnk");
|
2006-02-05 19:18:02 +01:00
|
|
|
newpath = new_buf;
|
|
|
|
newpc.check (newpath, PC_SYM_NOFOLLOW);
|
|
|
|
}
|
2007-07-27 18:24:07 +02:00
|
|
|
else if (!pc.isdir ()
|
2007-07-31 17:20:00 +02:00
|
|
|
&& pc.is_binary ()
|
2009-01-07 15:12:40 +01:00
|
|
|
&& RtlEqualUnicodePathSuffix (pc.get_nt_native_path (),
|
2009-07-14 19:37:42 +02:00
|
|
|
&ro_u_exe, TRUE)
|
2007-07-28 18:08:45 +02:00
|
|
|
&& !RtlEqualUnicodePathSuffix (newpc.get_nt_native_path (),
|
2009-07-14 19:37:42 +02:00
|
|
|
&ro_u_exe, TRUE))
|
2006-05-28 17:50:14 +02:00
|
|
|
{
|
|
|
|
/* Executable hack. */
|
2007-07-27 18:24:07 +02:00
|
|
|
stpcpy (stpcpy (new_buf, newpath), ".exe");
|
2006-05-28 17:50:14 +02:00
|
|
|
newpath = new_buf;
|
|
|
|
newpc.check (newpath, PC_SYM_NOFOLLOW);
|
|
|
|
}
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
|
|
|
|
2007-07-27 18:24:07 +02:00
|
|
|
HANDLE fh;
|
|
|
|
NTSTATUS status;
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
IO_STATUS_BLOCK io;
|
2008-01-21 15:51:55 +01:00
|
|
|
status = NtOpenFile (&fh, READ_CONTROL,
|
2007-07-29 14:27:22 +02:00
|
|
|
pc.get_object_attr (attr, sec_none_nih), &io,
|
2007-07-27 18:24:07 +02:00
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT | FILE_OPEN_REPARSE_POINT);
|
|
|
|
if (!NT_SUCCESS (status))
|
2007-02-22 19:01:13 +01:00
|
|
|
{
|
2007-07-27 18:24:07 +02:00
|
|
|
__seterrno_from_nt_status (status);
|
2007-02-22 19:01:13 +01:00
|
|
|
return -1;
|
|
|
|
}
|
2007-07-27 18:24:07 +02:00
|
|
|
PUNICODE_STRING tgt = newpc.get_nt_native_path ();
|
|
|
|
ULONG size = sizeof (FILE_LINK_INFORMATION) + tgt->Length;
|
|
|
|
PFILE_LINK_INFORMATION pfli = (PFILE_LINK_INFORMATION) alloca (size);
|
|
|
|
pfli->ReplaceIfExists = FALSE;
|
|
|
|
pfli->RootDirectory = NULL;
|
|
|
|
memcpy (pfli->FileName, tgt->Buffer, pfli->FileNameLength = tgt->Length);
|
|
|
|
status = NtSetInformationFile (fh, &io, pfli, size, FileLinkInformation);
|
|
|
|
NtClose (fh);
|
|
|
|
if (!NT_SUCCESS (status))
|
2007-02-22 19:01:13 +01:00
|
|
|
{
|
2007-07-27 18:24:07 +02:00
|
|
|
if (status == STATUS_INVALID_DEVICE_REQUEST)
|
2008-02-15 18:53:11 +01:00
|
|
|
{
|
2009-09-21 12:56:50 +02:00
|
|
|
/* FS doesn't support hard links. Linux returns EPERM. */
|
|
|
|
set_errno (EPERM);
|
|
|
|
return -1;
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
2007-07-27 18:24:07 +02:00
|
|
|
else
|
2008-02-15 18:53:11 +01:00
|
|
|
{
|
2007-07-27 18:24:07 +02:00
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
return -1;
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
|
|
|
}
|
2007-02-22 19:01:13 +01:00
|
|
|
return 0;
|
2005-02-19 22:53:36 +01:00
|
|
|
}
|
|
|
|
|
2005-02-20 12:44:32 +01:00
|
|
|
int
|
2008-04-24 11:59:54 +02:00
|
|
|
fhandler_disk_file::utimens (const struct timespec *tvp)
|
2005-04-13 18:17:37 +02:00
|
|
|
{
|
2008-04-24 11:59:54 +02:00
|
|
|
return utimens_fs (tvp);
|
2005-04-13 18:17:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
2008-04-24 11:59:54 +02:00
|
|
|
fhandler_base::utimens_fs (const struct timespec *tvp)
|
2005-02-20 12:44:32 +01:00
|
|
|
{
|
2008-04-24 11:59:54 +02:00
|
|
|
struct timespec timeofday;
|
|
|
|
struct timespec tmp[2];
|
2007-07-29 10:23:04 +02:00
|
|
|
bool closeit = false;
|
2005-02-20 12:44:32 +01:00
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
if (!get_handle ())
|
2005-10-19 18:50:43 +02:00
|
|
|
{
|
|
|
|
query_open (query_write_attributes);
|
|
|
|
if (!open_fs (O_BINARY, 0))
|
2005-03-16 22:21:18 +01:00
|
|
|
{
|
2005-10-19 18:50:43 +02:00
|
|
|
/* It's documented in MSDN that FILE_WRITE_ATTRIBUTES is sufficient
|
|
|
|
to change the timestamps. Unfortunately it's not sufficient for a
|
|
|
|
remote HPFS which requires GENERIC_WRITE, so we just retry to open
|
|
|
|
for writing, though this fails for R/O files of course. */
|
|
|
|
query_open (no_query);
|
|
|
|
if (!open_fs (O_WRONLY | O_BINARY, 0))
|
|
|
|
{
|
|
|
|
syscall_printf ("Opening file failed");
|
|
|
|
return -1;
|
|
|
|
}
|
2005-03-16 22:21:18 +01:00
|
|
|
}
|
2005-10-19 18:50:43 +02:00
|
|
|
closeit = true;
|
2005-02-20 12:44:32 +01:00
|
|
|
}
|
|
|
|
|
2009-10-13 04:26:33 +02:00
|
|
|
clock_gettime (CLOCK_REALTIME, &timeofday);
|
2005-02-20 12:44:32 +01:00
|
|
|
if (!tvp)
|
2008-04-24 11:59:54 +02:00
|
|
|
tmp[1] = tmp[0] = timeofday;
|
|
|
|
else
|
2005-02-20 12:44:32 +01:00
|
|
|
{
|
2008-04-24 14:37:05 +02:00
|
|
|
if ((tvp[0].tv_nsec < UTIME_NOW || tvp[0].tv_nsec > 999999999L)
|
|
|
|
|| (tvp[1].tv_nsec < UTIME_NOW || tvp[1].tv_nsec > 999999999L))
|
2008-04-24 11:59:54 +02:00
|
|
|
{
|
2009-10-08 13:13:45 +02:00
|
|
|
if (closeit)
|
|
|
|
close_fs ();
|
2008-04-24 11:59:54 +02:00
|
|
|
set_errno (EINVAL);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
tmp[0] = (tvp[0].tv_nsec == UTIME_NOW) ? timeofday : tvp[0];
|
|
|
|
tmp[1] = (tvp[1].tv_nsec == UTIME_NOW) ? timeofday : tvp[1];
|
2005-02-20 12:44:32 +01:00
|
|
|
}
|
2008-04-24 11:59:54 +02:00
|
|
|
debug_printf ("incoming lastaccess %08x %08x", tmp[0].tv_sec, tmp[0].tv_nsec);
|
2005-04-13 18:17:37 +02:00
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
FILE_BASIC_INFORMATION fbi;
|
2009-07-21 10:10:36 +02:00
|
|
|
|
2007-07-29 10:23:04 +02:00
|
|
|
fbi.CreationTime.QuadPart = 0LL;
|
2009-07-21 10:10:36 +02:00
|
|
|
/* UTIME_OMIT is handled in timespec_to_filetime by setting FILETIME to 0. */
|
|
|
|
timespec_to_filetime (&tmp[0], (LPFILETIME) &fbi.LastAccessTime);
|
|
|
|
timespec_to_filetime (&tmp[1], (LPFILETIME) &fbi.LastWriteTime);
|
2007-07-29 10:23:04 +02:00
|
|
|
fbi.ChangeTime.QuadPart = 0LL;
|
|
|
|
fbi.FileAttributes = 0;
|
|
|
|
NTSTATUS status = NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
|
|
|
FileBasicInformation);
|
2009-07-21 10:10:36 +02:00
|
|
|
/* For this special case for MVFS see the comment in
|
|
|
|
fhandler_disk_file::fchmod. */
|
|
|
|
if (pc.fs_is_mvfs () && NT_SUCCESS (status) && !closeit)
|
|
|
|
{
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
HANDLE fh;
|
|
|
|
|
|
|
|
InitializeObjectAttributes (&attr, &ro_u_empty, 0, get_handle (), NULL);
|
|
|
|
if (NT_SUCCESS (NtOpenFile (&fh, FILE_WRITE_ATTRIBUTES, &attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT)))
|
|
|
|
{
|
|
|
|
NtSetInformationFile (fh, &io, &fbi, sizeof fbi,
|
|
|
|
FileBasicInformation);
|
|
|
|
NtClose (fh);
|
|
|
|
}
|
|
|
|
}
|
2007-08-14 16:48:52 +02:00
|
|
|
if (closeit)
|
|
|
|
close_fs ();
|
2005-04-16 19:17:33 +02:00
|
|
|
/* Opening a directory on a 9x share from a NT machine works(!), but
|
2007-07-29 10:23:04 +02:00
|
|
|
then NtSetInformationFile fails with STATUS_NOT_SUPPORTED. Oh well... */
|
|
|
|
if (!NT_SUCCESS (status) && status != STATUS_NOT_SUPPORTED)
|
2005-02-20 12:44:32 +01:00
|
|
|
{
|
2007-07-29 10:23:04 +02:00
|
|
|
__seterrno_from_nt_status (status);
|
2005-02-20 12:44:32 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2005-02-19 22:53:36 +01:00
|
|
|
|
2001-11-21 07:47:57 +01:00
|
|
|
fhandler_disk_file::fhandler_disk_file () :
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_base ()
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2005-02-20 12:44:32 +01:00
|
|
|
fhandler_disk_file::fhandler_disk_file (path_conv &pc) :
|
|
|
|
fhandler_base ()
|
|
|
|
{
|
|
|
|
set_name (pc);
|
|
|
|
}
|
|
|
|
|
2001-11-21 07:47:57 +01:00
|
|
|
int
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_disk_file::open (int flags, mode_t mode)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
return open_fs (flags, mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_base::open_fs (int flags, mode_t mode)
|
|
|
|
{
|
2005-01-06 18:43:55 +01:00
|
|
|
/* Unfortunately NT allows to open directories for writing, but that's
|
|
|
|
disallowed according to SUSv3. */
|
2005-12-14 17:38:22 +01:00
|
|
|
if (pc.isdir () && (flags & O_ACCMODE) != O_RDONLY)
|
2005-01-06 18:43:55 +01:00
|
|
|
{
|
|
|
|
set_errno (EISDIR);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
int res = fhandler_base::open (flags | O_DIROPEN, mode);
|
2001-11-21 07:47:57 +01:00
|
|
|
if (!res)
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
/* This is for file systems known for having a buggy CreateFile call
|
|
|
|
which might return a valid HANDLE without having actually opened
|
|
|
|
the file.
|
|
|
|
The only known file system to date is the SUN NFS Solstice Client 3.1
|
|
|
|
which returns a valid handle when trying to open a file in a nonexistent
|
|
|
|
directory. */
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
if (pc.has_buggy_open () && !pc.exists ())
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
debug_printf ("Buggy open detected.");
|
2007-08-13 21:15:47 +02:00
|
|
|
close_fs ();
|
2001-11-21 07:47:57 +01:00
|
|
|
set_errno (ENOENT);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-03-12 23:03:28 +01:00
|
|
|
ino = get_ino_by_handle (pc, get_handle ());
|
2008-03-31 20:03:25 +02:00
|
|
|
/* A unique ID is necessary to recognize fhandler entries which are
|
|
|
|
duplicated by dup(2) or fork(2). */
|
|
|
|
AllocateLocallyUniqueId ((PLUID) &unique_id);
|
2001-11-21 07:47:57 +01:00
|
|
|
|
|
|
|
out:
|
2007-08-14 16:48:52 +02:00
|
|
|
syscall_printf ("%d = fhandler_disk_file::open (%S, %p)", res,
|
|
|
|
pc.get_nt_native_path (), flags);
|
2001-11-21 07:47:57 +01:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2005-07-29 19:04:46 +02:00
|
|
|
ssize_t __stdcall
|
|
|
|
fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset)
|
|
|
|
{
|
2005-07-29 19:26:10 +02:00
|
|
|
ssize_t res;
|
|
|
|
_off64_t curpos = lseek (0, SEEK_CUR);
|
|
|
|
if (curpos < 0 || lseek (offset, SEEK_SET) < 0)
|
|
|
|
res = -1;
|
|
|
|
else
|
2005-07-29 19:04:46 +02:00
|
|
|
{
|
|
|
|
size_t tmp_count = count;
|
|
|
|
read (buf, tmp_count);
|
2006-08-19 23:44:58 +02:00
|
|
|
if (lseek (curpos, SEEK_SET) >= 0)
|
2005-07-29 19:26:10 +02:00
|
|
|
res = (ssize_t) tmp_count;
|
|
|
|
else
|
|
|
|
res = -1;
|
2005-07-29 19:04:46 +02:00
|
|
|
}
|
|
|
|
debug_printf ("%d = pread (%p, %d, %d)\n", res, buf, count, offset);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ssize_t __stdcall
|
|
|
|
fhandler_disk_file::pwrite (void *buf, size_t count, _off64_t offset)
|
|
|
|
{
|
2005-07-29 19:26:10 +02:00
|
|
|
int res;
|
|
|
|
_off64_t curpos = lseek (0, SEEK_CUR);
|
|
|
|
if (curpos < 0 || lseek (offset, SEEK_SET) < 0)
|
|
|
|
res = curpos;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
res = (ssize_t) write (buf, count);
|
|
|
|
if (lseek (curpos, SEEK_SET) < 0)
|
|
|
|
res = -1;
|
|
|
|
}
|
2005-07-29 19:04:46 +02:00
|
|
|
debug_printf ("%d = pwrite (%p, %d, %d)\n", res, buf, count, offset);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2005-05-25 06:32:59 +02:00
|
|
|
int
|
|
|
|
fhandler_disk_file::mkdir (mode_t mode)
|
|
|
|
{
|
|
|
|
int res = -1;
|
|
|
|
SECURITY_ATTRIBUTES sa = sec_none_nih;
|
2007-07-29 14:27:22 +02:00
|
|
|
NTSTATUS status;
|
|
|
|
HANDLE dir;
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
IO_STATUS_BLOCK io;
|
2008-05-20 18:24:06 +02:00
|
|
|
PFILE_FULL_EA_INFORMATION p = NULL;
|
|
|
|
ULONG plen = 0;
|
|
|
|
|
|
|
|
if (pc.fs_is_nfs ())
|
|
|
|
{
|
|
|
|
/* When creating a dir on an NFS share, we have to set the
|
|
|
|
file mode by writing a NFS fattr3 structure with the
|
|
|
|
correct mode bits set. */
|
|
|
|
plen = sizeof (FILE_FULL_EA_INFORMATION) + sizeof (NFS_V3_ATTR)
|
|
|
|
+ sizeof (fattr3);
|
|
|
|
p = (PFILE_FULL_EA_INFORMATION) alloca (plen);
|
|
|
|
p->NextEntryOffset = 0;
|
|
|
|
p->Flags = 0;
|
|
|
|
p->EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
|
|
|
p->EaValueLength = sizeof (fattr3);
|
|
|
|
strcpy (p->EaName, NFS_V3_ATTR);
|
|
|
|
fattr3 *nfs_attr = (fattr3 *) (p->EaName + p->EaNameLength + 1);
|
|
|
|
memset (nfs_attr, 0, sizeof (fattr3));
|
|
|
|
nfs_attr->type = NF3DIR;
|
|
|
|
nfs_attr->mode = (mode & 07777) & ~cygheap->umask;
|
|
|
|
}
|
2007-07-29 14:27:22 +02:00
|
|
|
status = NtCreateFile (&dir, FILE_LIST_DIRECTORY | SYNCHRONIZE,
|
|
|
|
pc.get_object_attr (attr, sa), &io, NULL,
|
2008-08-19 11:46:31 +02:00
|
|
|
FILE_ATTRIBUTE_DIRECTORY, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_CREATE,
|
2007-07-29 14:27:22 +02:00
|
|
|
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
|
|
|
|
| FILE_OPEN_FOR_BACKUP_INTENT,
|
2008-05-20 18:24:06 +02:00
|
|
|
p, plen);
|
2007-07-29 14:27:22 +02:00
|
|
|
if (NT_SUCCESS (status))
|
|
|
|
{
|
2009-10-30 20:58:53 +01:00
|
|
|
if (has_acls ())
|
2008-08-14 16:05:04 +02:00
|
|
|
set_file_attribute (dir, pc, ILLEGAL_UID, ILLEGAL_GID,
|
2009-10-30 20:58:53 +01:00
|
|
|
S_JUSTCREATED | S_IFDIR
|
|
|
|
| ((mode & 07777) & ~cygheap->umask));
|
2007-07-29 14:27:22 +02:00
|
|
|
NtClose (dir);
|
2005-05-25 06:32:59 +02:00
|
|
|
res = 0;
|
|
|
|
}
|
|
|
|
else
|
2007-07-29 14:27:22 +02:00
|
|
|
__seterrno_from_nt_status (status);
|
2005-05-25 06:32:59 +02:00
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_disk_file::rmdir ()
|
|
|
|
{
|
2007-07-29 14:27:22 +02:00
|
|
|
extern NTSTATUS unlink_nt (path_conv &pc);
|
2005-05-25 06:32:59 +02:00
|
|
|
|
2007-01-26 13:25:23 +01:00
|
|
|
if (!pc.isdir ())
|
|
|
|
{
|
|
|
|
set_errno (ENOTDIR);
|
|
|
|
return -1;
|
|
|
|
}
|
2007-07-29 14:27:22 +02:00
|
|
|
if (!pc.exists ())
|
|
|
|
{
|
|
|
|
set_errno (ENOENT);
|
|
|
|
return -1;
|
|
|
|
}
|
2005-05-25 06:32:59 +02:00
|
|
|
|
2007-07-29 14:27:22 +02:00
|
|
|
NTSTATUS status = unlink_nt (pc);
|
2005-05-25 06:32:59 +02:00
|
|
|
|
2007-07-29 14:27:22 +02:00
|
|
|
/* Check for existence of remote dirs after trying to delete them.
|
|
|
|
Two reasons:
|
|
|
|
- Sometimes SMB indicates failure when it really succeeds.
|
|
|
|
- Removeing a directory on a samba drive doesn't return an error if the
|
|
|
|
directory can't be removed because it's not empty. */
|
|
|
|
if (isremote ())
|
2006-11-30 11:17:24 +01:00
|
|
|
{
|
2007-07-29 14:27:22 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
FILE_BASIC_INFORMATION fbi;
|
2006-11-30 11:17:24 +01:00
|
|
|
|
2007-07-29 14:27:22 +02:00
|
|
|
if (NT_SUCCESS (NtQueryAttributesFile
|
|
|
|
(pc.get_object_attr (attr, sec_none_nih), &fbi)))
|
|
|
|
status = STATUS_DIRECTORY_NOT_EMPTY;
|
|
|
|
else
|
2008-02-15 18:53:11 +01:00
|
|
|
status = STATUS_SUCCESS;
|
2005-05-25 06:32:59 +02:00
|
|
|
}
|
2007-07-29 14:27:22 +02:00
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return 0;
|
2005-05-25 06:32:59 +02:00
|
|
|
}
|
|
|
|
|
2006-01-28 14:41:22 +01:00
|
|
|
/* This is the minimal number of entries which fit into the readdir cache.
|
|
|
|
The number of bytes allocated by the cache is determined by this number,
|
|
|
|
To tune caching, just tweak this number. To get a feeling for the size,
|
2007-07-26 19:30:54 +02:00
|
|
|
the size of the readdir cache is DIR_NUM_ENTRIES * 624 + 4 bytes. */
|
2006-01-28 14:41:22 +01:00
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
#define DIR_NUM_ENTRIES 100 /* Cache size 62404 bytes */
|
2006-01-28 14:41:22 +01:00
|
|
|
|
|
|
|
#define DIR_BUF_SIZE (DIR_NUM_ENTRIES \
|
|
|
|
* (sizeof (FILE_ID_BOTH_DIR_INFORMATION) \
|
2008-03-08 18:28:40 +01:00
|
|
|
+ (NAME_MAX + 1) * sizeof (WCHAR)))
|
2006-01-28 14:41:22 +01:00
|
|
|
|
2006-03-01 14:47:49 +01:00
|
|
|
struct __DIR_cache
|
2006-01-28 14:41:22 +01:00
|
|
|
{
|
2008-02-27 18:52:33 +01:00
|
|
|
char __cache[DIR_BUF_SIZE]; /* W2K needs this buffer 8 byte aligned. */
|
2006-01-28 14:41:22 +01:00
|
|
|
ULONG __pos;
|
|
|
|
};
|
|
|
|
|
2006-03-01 14:47:49 +01:00
|
|
|
#define d_cachepos(d) (((__DIR_cache *) (d)->__d_dirname)->__pos)
|
|
|
|
#define d_cache(d) (((__DIR_cache *) (d)->__d_dirname)->__cache)
|
|
|
|
|
|
|
|
#define d_mounts(d) ((__DIR_mounts *) (d)->__d_internal)
|
2006-01-28 14:41:22 +01:00
|
|
|
|
2001-11-21 07:47:57 +01:00
|
|
|
DIR *
|
2007-06-29 17:13:01 +02:00
|
|
|
fhandler_disk_file::opendir (int fd)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
DIR *dir;
|
|
|
|
DIR *res = NULL;
|
|
|
|
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
if (!pc.isdir ())
|
2001-11-21 07:47:57 +01:00
|
|
|
set_errno (ENOTDIR);
|
|
|
|
else if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL)
|
|
|
|
set_errno (ENOMEM);
|
2007-02-22 11:54:47 +01:00
|
|
|
else if ((dir->__d_dirname = (char *) malloc ( sizeof (struct __DIR_cache)))
|
|
|
|
== NULL)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
|
|
|
set_errno (ENOMEM);
|
2003-11-07 19:21:05 +01:00
|
|
|
goto free_dir;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
else if ((dir->__d_dirent =
|
|
|
|
(struct dirent *) malloc (sizeof (struct dirent))) == NULL)
|
|
|
|
{
|
2003-11-05 17:53:55 +01:00
|
|
|
set_errno (ENOMEM);
|
2003-11-07 19:21:05 +01:00
|
|
|
goto free_dirname;
|
2003-11-05 17:53:55 +01:00
|
|
|
}
|
2001-11-21 07:47:57 +01:00
|
|
|
else
|
|
|
|
{
|
2007-06-29 17:13:01 +02:00
|
|
|
cygheap_fdnew cfd;
|
|
|
|
if (cfd < 0 && fd < 0)
|
2003-11-07 19:21:05 +01:00
|
|
|
goto free_dirent;
|
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
dir->__d_dirent->__d_version = __DIRENT_VERSION;
|
2003-11-07 19:21:05 +01:00
|
|
|
dir->__d_cookie = __DIRENT_COOKIE;
|
|
|
|
dir->__handle = INVALID_HANDLE_VALUE;
|
|
|
|
dir->__d_position = 0;
|
2007-07-26 19:30:54 +02:00
|
|
|
dir->__flags = (get_name ()[0] == '/' && get_name ()[1] == '\0')
|
2006-08-20 14:31:07 +02:00
|
|
|
? dirent_isroot : 0;
|
2007-07-26 19:30:54 +02:00
|
|
|
dir->__d_internal = (unsigned) new __DIR_mounts (get_name ());
|
2007-02-22 11:54:47 +01:00
|
|
|
d_cachepos (dir) = 0;
|
|
|
|
|
2007-07-17 15:22:21 +02:00
|
|
|
if (!pc.iscygdrive ())
|
2006-02-28 05:23:17 +01:00
|
|
|
{
|
2007-07-09 19:02:37 +02:00
|
|
|
if (fd < 0)
|
2007-06-29 17:13:01 +02:00
|
|
|
{
|
|
|
|
/* opendir() case. Initialize with given directory name and
|
2007-07-07 18:46:35 +02:00
|
|
|
NULL directory handle. */
|
2007-07-09 19:02:37 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
|
|
|
|
status = NtOpenFile (&get_handle (),
|
|
|
|
SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
2007-07-19 13:41:17 +02:00
|
|
|
pc.get_object_attr (attr, sec_none_nih),
|
|
|
|
&io, FILE_SHARE_VALID_FLAGS,
|
2007-07-09 19:02:37 +02:00
|
|
|
FILE_SYNCHRONOUS_IO_NONALERT
|
|
|
|
| FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_DIRECTORY_FILE);
|
|
|
|
if (!NT_SUCCESS (status))
|
|
|
|
{
|
|
|
|
__seterrno_from_nt_status (status);
|
|
|
|
goto free_mounts;
|
|
|
|
}
|
2007-02-22 11:54:47 +01:00
|
|
|
}
|
2006-02-19 22:18:36 +01:00
|
|
|
|
2007-02-22 11:54:47 +01:00
|
|
|
/* FileIdBothDirectoryInformation is apparently unsupported on
|
|
|
|
XP when accessing directories on UDF. When trying to use it
|
|
|
|
so, NtQueryDirectoryFile returns with STATUS_ACCESS_VIOLATION.
|
|
|
|
It's not clear if the call isn't also unsupported on other
|
|
|
|
OS/FS combinations (say, Win2K/CDFS or so). Instead of
|
|
|
|
testing in readdir for yet another error code, let's use
|
|
|
|
FileIdBothDirectoryInformation only on filesystems supporting
|
2010-01-29 12:20:06 +01:00
|
|
|
persistent ACLs, FileBothDirectoryInformation otherwise.
|
2008-05-21 11:02:42 +02:00
|
|
|
|
2008-05-23 19:22:18 +02:00
|
|
|
NFS clients hide dangling symlinks from directory queries,
|
2008-11-26 18:21:04 +01:00
|
|
|
unless you use the FileNamesInformation info class.
|
2008-05-23 19:22:18 +02:00
|
|
|
On newer NFS clients (>=Vista) FileIdBothDirectoryInformation
|
|
|
|
works fine, but only if the NFS share is mounted to a drive
|
|
|
|
letter. TODO: We don't test that here for now, but it might
|
|
|
|
be worth to test if there's a speed gain in using
|
|
|
|
FileIdBothDirectoryInformation, because it doesn't require to
|
|
|
|
open the file to read the inode number. */
|
2007-02-22 11:54:47 +01:00
|
|
|
if (pc.hasgood_inode ())
|
|
|
|
{
|
|
|
|
dir->__flags |= dirent_set_d_ino;
|
2008-05-21 11:02:42 +02:00
|
|
|
if (pc.fs_is_nfs ())
|
2008-11-26 18:21:04 +01:00
|
|
|
dir->__flags |= dirent_nfs_d_ino;
|
2008-07-30 16:41:59 +02:00
|
|
|
else if (wincap.has_fileid_dirinfo ()
|
|
|
|
&& !pc.has_buggy_fileid_dirinfo ())
|
2008-05-23 19:22:18 +02:00
|
|
|
dir->__flags |= dirent_get_d_ino;
|
2006-02-09 15:42:48 +01:00
|
|
|
}
|
2006-01-27 22:50:42 +01:00
|
|
|
}
|
2007-06-29 17:13:01 +02:00
|
|
|
if (fd >= 0)
|
2007-07-09 19:02:37 +02:00
|
|
|
dir->__d_fd = fd;
|
2007-06-29 17:13:01 +02:00
|
|
|
else
|
2007-07-07 18:46:35 +02:00
|
|
|
{
|
2007-06-29 17:13:01 +02:00
|
|
|
/* Filling cfd with `this' (aka storing this in the file
|
|
|
|
descriptor table should only happen after it's clear that
|
|
|
|
opendir doesn't fail, otherwise we end up cfree'ing the
|
|
|
|
fhandler twice, once in opendir() in dir.cc, the second
|
|
|
|
time on exit. Nasty, nasty... */
|
|
|
|
cfd = this;
|
|
|
|
dir->__d_fd = cfd;
|
2007-07-17 15:22:21 +02:00
|
|
|
if (pc.iscygdrive ())
|
|
|
|
cfd->nohandle (true);
|
2007-06-29 17:13:01 +02:00
|
|
|
}
|
2007-07-09 19:02:37 +02:00
|
|
|
set_close_on_exec (true);
|
2006-03-03 21:19:26 +01:00
|
|
|
dir->__fh = this;
|
2006-01-27 22:50:42 +01:00
|
|
|
res = dir;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
|
2001-11-22 06:59:07 +01:00
|
|
|
syscall_printf ("%p = opendir (%s)", res, get_name ());
|
2001-11-21 07:47:57 +01:00
|
|
|
return res;
|
2003-11-07 19:21:05 +01:00
|
|
|
|
2006-03-03 21:19:26 +01:00
|
|
|
free_mounts:
|
|
|
|
delete d_mounts (dir);
|
2003-11-07 19:21:05 +01:00
|
|
|
free_dirent:
|
|
|
|
free (dir->__d_dirent);
|
|
|
|
free_dirname:
|
|
|
|
free (dir->__d_dirname);
|
|
|
|
free_dir:
|
|
|
|
free (dir);
|
|
|
|
return res;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
|
2006-01-27 22:50:42 +01:00
|
|
|
__ino64_t __stdcall
|
2007-07-26 19:30:54 +02:00
|
|
|
readdir_get_ino (const char *path, bool dot_dot)
|
2006-01-27 22:50:42 +01:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
char *fname;
|
2006-01-27 22:50:42 +01:00
|
|
|
struct __stat64 st;
|
|
|
|
HANDLE hdl;
|
2007-07-26 19:30:54 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
IO_STATUS_BLOCK io;
|
2006-01-27 22:50:42 +01:00
|
|
|
__ino64_t ino = 0;
|
|
|
|
|
2007-07-09 19:02:37 +02:00
|
|
|
if (dot_dot)
|
2007-07-26 19:30:54 +02:00
|
|
|
{
|
|
|
|
fname = (char *) alloca (strlen (path) + 4);
|
|
|
|
char *c = stpcpy (fname, path);
|
|
|
|
if (c[-1] != '/')
|
2008-02-15 18:53:11 +01:00
|
|
|
*c++ = '/';
|
2007-07-26 19:30:54 +02:00
|
|
|
strcpy (c, "..");
|
|
|
|
path = fname;
|
|
|
|
}
|
2008-12-14 07:01:46 +01:00
|
|
|
path_conv pc (path, PC_SYM_NOFOLLOW | PC_POSIX | PC_NOWARN);
|
2007-07-09 19:02:37 +02:00
|
|
|
if (pc.isspecial ())
|
2006-01-27 22:50:42 +01:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
if (!stat_worker (pc, &st))
|
2007-07-09 19:02:37 +02:00
|
|
|
ino = st.st_ino;
|
|
|
|
}
|
|
|
|
else if (!pc.hasgood_inode ())
|
2007-08-16 16:10:06 +02:00
|
|
|
ino = hash_path_name (0, pc.get_nt_native_path ());
|
2007-07-26 19:30:54 +02:00
|
|
|
else if (NT_SUCCESS (NtOpenFile (&hdl, READ_CONTROL,
|
|
|
|
pc.get_object_attr (attr, sec_none_nih),
|
|
|
|
&io, FILE_SHARE_VALID_FLAGS,
|
2007-08-02 17:13:56 +02:00
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| (pc.is_rep_symlink ()
|
|
|
|
? FILE_OPEN_REPARSE_POINT : 0))))
|
2007-07-09 19:02:37 +02:00
|
|
|
{
|
2009-03-12 23:03:28 +01:00
|
|
|
ino = get_ino_by_handle (pc, hdl);
|
|
|
|
if (!ino)
|
|
|
|
ino = hash_path_name (0, pc.get_nt_native_path ());
|
2007-07-26 19:30:54 +02:00
|
|
|
NtClose (hdl);
|
2006-01-27 22:50:42 +01:00
|
|
|
}
|
|
|
|
return ino;
|
|
|
|
}
|
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
int
|
|
|
|
fhandler_disk_file::readdir_helper (DIR *dir, dirent *de, DWORD w32_err,
|
|
|
|
DWORD attr, PUNICODE_STRING fname)
|
|
|
|
{
|
|
|
|
if (w32_err)
|
|
|
|
{
|
|
|
|
bool added = false;
|
|
|
|
if ((de->d_ino = d_mounts (dir)->check_missing_mount (fname)))
|
|
|
|
added = true;
|
|
|
|
if (!added)
|
2010-01-29 12:20:06 +01:00
|
|
|
{
|
|
|
|
fname->Length = 0;
|
|
|
|
return geterrno_from_win_error (w32_err);
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
|
|
|
|
attr = 0;
|
|
|
|
dir->__flags &= ~dirent_set_d_ino;
|
|
|
|
}
|
|
|
|
|
2008-11-28 10:04:35 +01:00
|
|
|
/* Set d_type if type can be determined from file attributes.
|
|
|
|
FILE_ATTRIBUTE_SYSTEM ommitted to leave DT_UNKNOWN for old symlinks.
|
|
|
|
For new symlinks, d_type will be reset to DT_UNKNOWN below. */
|
|
|
|
if (attr &&
|
|
|
|
!(attr & ( ~FILE_ATTRIBUTE_VALID_FLAGS
|
|
|
|
| FILE_ATTRIBUTE_SYSTEM
|
|
|
|
| FILE_ATTRIBUTE_REPARSE_POINT)))
|
|
|
|
{
|
|
|
|
if (attr & FILE_ATTRIBUTE_DIRECTORY)
|
|
|
|
de->d_type = DT_DIR;
|
|
|
|
else
|
|
|
|
de->d_type = DT_REG;
|
|
|
|
}
|
|
|
|
|
2007-07-26 19:30:54 +02:00
|
|
|
/* Check for directory reparse point. These are potential volume mount
|
|
|
|
points which have another inode than the underlying directory. */
|
|
|
|
if ((attr & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT))
|
|
|
|
== (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT))
|
|
|
|
{
|
|
|
|
HANDLE reph;
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
|
2008-07-16 22:20:45 +02:00
|
|
|
InitializeObjectAttributes (&attr, fname, pc.objcaseinsensitive (),
|
2007-07-26 19:30:54 +02:00
|
|
|
get_handle (), NULL);
|
2007-07-27 11:00:12 +02:00
|
|
|
if (is_volume_mountpoint (&attr)
|
|
|
|
&& (NT_SUCCESS (NtOpenFile (&reph, READ_CONTROL, &attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT))))
|
2007-07-26 19:30:54 +02:00
|
|
|
{
|
2009-03-12 23:03:28 +01:00
|
|
|
de->d_ino = get_ino_by_handle (pc, reph);
|
2007-07-27 11:00:12 +02:00
|
|
|
NtClose (reph);
|
2007-07-26 19:30:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for Windows shortcut. If it's a Cygwin or U/WIN
|
|
|
|
symlink, drop the .lnk suffix. */
|
|
|
|
if ((attr & FILE_ATTRIBUTE_READONLY) && fname->Length > 4 * sizeof (WCHAR))
|
|
|
|
{
|
|
|
|
UNICODE_STRING uname;
|
|
|
|
|
2007-07-28 18:00:35 +02:00
|
|
|
RtlInitCountedUnicodeString (&uname,
|
|
|
|
fname->Buffer
|
|
|
|
+ fname->Length / sizeof (WCHAR) - 4,
|
|
|
|
4 * sizeof (WCHAR));
|
2009-07-14 19:37:42 +02:00
|
|
|
if (RtlEqualUnicodeString (&uname, &ro_u_lnk, TRUE))
|
2007-07-26 19:30:54 +02:00
|
|
|
{
|
2008-04-13 18:47:21 +02:00
|
|
|
tmp_pathbuf tp;
|
2007-07-26 19:30:54 +02:00
|
|
|
UNICODE_STRING fbuf;
|
2008-11-26 18:21:04 +01:00
|
|
|
|
2008-04-13 18:47:21 +02:00
|
|
|
tp.u_get (&fbuf);
|
|
|
|
RtlCopyUnicodeString (&fbuf, pc.get_nt_native_path ());
|
2007-07-26 19:30:54 +02:00
|
|
|
RtlAppendUnicodeToString (&fbuf, L"\\");
|
|
|
|
RtlAppendUnicodeStringToString (&fbuf, fname);
|
2008-04-13 18:47:21 +02:00
|
|
|
fbuf.Buffer += 4; /* Skip leading \??\ */
|
|
|
|
fbuf.Length -= 4 * sizeof (WCHAR);
|
2008-04-14 11:15:35 +02:00
|
|
|
if (fbuf.Buffer[1] != L':') /* UNC path */
|
2008-04-13 18:47:21 +02:00
|
|
|
{
|
|
|
|
*(fbuf.Buffer += 2) = L'\\';
|
|
|
|
fbuf.Length -= 2 * sizeof (WCHAR);
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
path_conv fpath (&fbuf, PC_SYM_NOFOLLOW);
|
|
|
|
if (fpath.issymlink () || fpath.is_fs_special ())
|
2008-11-28 10:04:35 +01:00
|
|
|
{
|
|
|
|
fname->Length -= 4 * sizeof (WCHAR);
|
|
|
|
de->d_type = DT_UNKNOWN;
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-07-16 22:20:45 +02:00
|
|
|
sys_wcstombs (de->d_name, NAME_MAX + 1, fname->Buffer,
|
|
|
|
fname->Length / sizeof (WCHAR));
|
2008-03-12 16:04:06 +01:00
|
|
|
|
2009-08-14 15:39:07 +02:00
|
|
|
/* Don't try to optimize relative to dir->__d_position. On several
|
|
|
|
filesystems it's no safe bet that "." and ".." entries always
|
|
|
|
come first. */
|
|
|
|
if (de->d_name[0] == '.')
|
|
|
|
{
|
|
|
|
if (de->d_name[1] == '\0')
|
|
|
|
dir->__flags |= dirent_saw_dot;
|
|
|
|
else if (de->d_name[1] == '.' && de->d_name[2] == '\0')
|
|
|
|
dir->__flags |= dirent_saw_dot_dot;
|
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-01-27 22:50:42 +01:00
|
|
|
int
|
|
|
|
fhandler_disk_file::readdir (DIR *dir, dirent *de)
|
|
|
|
{
|
|
|
|
int res = 0;
|
|
|
|
NTSTATUS status = STATUS_SUCCESS;
|
2006-01-28 14:41:22 +01:00
|
|
|
PFILE_ID_BOTH_DIR_INFORMATION buf = NULL;
|
2007-07-26 19:30:54 +02:00
|
|
|
PWCHAR FileName;
|
2008-05-21 11:02:42 +02:00
|
|
|
ULONG FileNameLength;
|
2008-05-23 12:01:34 +02:00
|
|
|
ULONG FileAttributes = 0;
|
2006-01-28 14:41:22 +01:00
|
|
|
IO_STATUS_BLOCK io;
|
2007-07-26 19:30:54 +02:00
|
|
|
UNICODE_STRING fname;
|
2006-01-27 22:50:42 +01:00
|
|
|
|
2006-01-30 11:30:58 +01:00
|
|
|
/* d_cachepos always refers to the next cache entry to use. If it's 0
|
2006-01-28 14:41:22 +01:00
|
|
|
we must reload the cache. */
|
2006-01-30 11:30:58 +01:00
|
|
|
if (d_cachepos (dir) == 0)
|
2006-01-28 14:41:22 +01:00
|
|
|
{
|
|
|
|
if ((dir->__flags & dirent_get_d_ino))
|
|
|
|
{
|
2008-12-18 19:54:25 +01:00
|
|
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL, NULL, &io,
|
2006-01-28 14:41:22 +01:00
|
|
|
d_cache (dir), DIR_BUF_SIZE,
|
|
|
|
FileIdBothDirectoryInformation,
|
|
|
|
FALSE, NULL, dir->__d_position == 0);
|
|
|
|
/* FileIdBothDirectoryInformation isn't supported for remote drives
|
|
|
|
on NT4 and 2K systems, and it's also not supported on 2K at all,
|
2009-10-20 12:12:05 +02:00
|
|
|
when accessing network drives on any remote OS. There are also
|
|
|
|
hacked versions of Samba 3.0.x out there (Debian-based it seems),
|
|
|
|
which return STATUS_NOT_SUPPORTED rather than handling this info
|
|
|
|
class. We just fall back to using a standard directory query in
|
|
|
|
this case and note this case using the dirent_get_d_ino flag. */
|
2010-01-29 12:20:06 +01:00
|
|
|
if (!NT_SUCCESS (status) && status != STATUS_NO_MORE_FILES
|
|
|
|
&& (status == STATUS_INVALID_LEVEL
|
|
|
|
|| status == STATUS_NOT_SUPPORTED
|
|
|
|
|| status == STATUS_INVALID_PARAMETER
|
|
|
|
|| status == STATUS_INVALID_NETWORK_RESPONSE
|
|
|
|
|| status == STATUS_INVALID_INFO_CLASS))
|
2006-01-28 14:41:22 +01:00
|
|
|
dir->__flags &= ~dirent_get_d_ino;
|
2006-08-20 14:18:12 +02:00
|
|
|
/* Something weird happens on Samba up to version 3.0.21c, which is
|
|
|
|
fixed in 3.0.22. FileIdBothDirectoryInformation seems to work
|
|
|
|
nicely, but only up to the 128th entry in the directory. After
|
|
|
|
reaching this entry, the next call to NtQueryDirectoryFile
|
|
|
|
(FileIdBothDirectoryInformation) returns STATUS_INVALID_LEVEL.
|
2010-01-29 12:20:06 +01:00
|
|
|
Why should we care, we can just switch to
|
|
|
|
FileBothDirectoryInformation, isn't it? Nope! The next call to
|
|
|
|
NtQueryDirectoryFile(FileBothDirectoryInformation) actually
|
|
|
|
returns STATUS_NO_MORE_FILES, regardless how many files are left
|
|
|
|
unread in the directory. This does not happen when using
|
|
|
|
FileBothDirectoryInformation right from the start, but since
|
2006-08-20 14:18:12 +02:00
|
|
|
we can't decide whether the server we're talking with has this
|
|
|
|
bug or not, we end up serving Samba shares always in the slow
|
2010-01-29 12:20:06 +01:00
|
|
|
mode using FileBothDirectoryInformation. So, what we do here is
|
2006-08-20 14:18:12 +02:00
|
|
|
to implement the solution suggested by Andrew Tridgell, we just
|
|
|
|
reread all entries up to dir->d_position using
|
2010-01-29 12:20:06 +01:00
|
|
|
FileBothDirectoryInformation.
|
2006-08-20 14:18:12 +02:00
|
|
|
However, We do *not* mark this server as broken and fall back to
|
2010-01-29 12:20:06 +01:00
|
|
|
using FileBothDirectoryInformation further on. This would slow
|
2006-08-20 14:18:12 +02:00
|
|
|
down every access to such a server, even for directories under
|
|
|
|
128 entries. Also, bigger dirs only suffer from one additional
|
|
|
|
call per full directory scan, which shouldn't be too big a hit.
|
|
|
|
This can easily be changed if necessary. */
|
|
|
|
if (status == STATUS_INVALID_LEVEL && dir->__d_position)
|
|
|
|
{
|
|
|
|
d_cachepos (dir) = 0;
|
|
|
|
for (int cnt = 0; cnt < dir->__d_position; ++cnt)
|
2007-02-20 01:16:18 +01:00
|
|
|
{
|
2006-08-20 14:18:12 +02:00
|
|
|
if (d_cachepos (dir) == 0)
|
|
|
|
{
|
2007-07-09 19:02:37 +02:00
|
|
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL,
|
2008-12-18 19:54:25 +01:00
|
|
|
NULL, &io, d_cache (dir),
|
|
|
|
DIR_BUF_SIZE,
|
2010-01-29 12:20:06 +01:00
|
|
|
FileBothDirectoryInformation,
|
2006-08-20 14:18:12 +02:00
|
|
|
FALSE, NULL, cnt == 0);
|
|
|
|
if (!NT_SUCCESS (status))
|
2007-02-20 01:16:18 +01:00
|
|
|
goto go_ahead;
|
2006-08-20 14:18:12 +02:00
|
|
|
}
|
|
|
|
buf = (PFILE_ID_BOTH_DIR_INFORMATION) (d_cache (dir)
|
2007-02-20 01:16:18 +01:00
|
|
|
+ d_cachepos (dir));
|
2006-08-20 14:18:12 +02:00
|
|
|
if (buf->NextEntryOffset == 0)
|
|
|
|
d_cachepos (dir) = 0;
|
|
|
|
else
|
|
|
|
d_cachepos (dir) += buf->NextEntryOffset;
|
|
|
|
}
|
|
|
|
goto go_ahead;
|
|
|
|
}
|
2006-01-28 14:41:22 +01:00
|
|
|
}
|
|
|
|
if (!(dir->__flags & dirent_get_d_ino))
|
2008-12-18 19:54:25 +01:00
|
|
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL, NULL, &io,
|
2006-01-28 14:41:22 +01:00
|
|
|
d_cache (dir), DIR_BUF_SIZE,
|
2008-05-21 11:02:42 +02:00
|
|
|
(dir->__flags & dirent_nfs_d_ino)
|
|
|
|
? FileNamesInformation
|
2010-01-29 12:20:06 +01:00
|
|
|
: FileBothDirectoryInformation,
|
2006-01-28 14:41:22 +01:00
|
|
|
FALSE, NULL, dir->__d_position == 0);
|
|
|
|
}
|
2006-01-27 22:50:42 +01:00
|
|
|
|
2006-08-20 14:18:12 +02:00
|
|
|
go_ahead:
|
|
|
|
|
2008-12-18 19:54:25 +01:00
|
|
|
if (status == STATUS_NO_MORE_FILES)
|
|
|
|
/*nothing*/;
|
|
|
|
else if (!NT_SUCCESS (status))
|
2006-12-21 11:59:47 +01:00
|
|
|
debug_printf ("NtQueryDirectoryFile failed, status %p, win32 error %lu",
|
|
|
|
status, RtlNtStatusToDosError (status));
|
|
|
|
else
|
2006-01-28 14:41:22 +01:00
|
|
|
{
|
2006-01-30 11:30:58 +01:00
|
|
|
buf = (PFILE_ID_BOTH_DIR_INFORMATION) (d_cache (dir) + d_cachepos (dir));
|
2006-01-28 14:41:22 +01:00
|
|
|
if (buf->NextEntryOffset == 0)
|
2006-05-28 17:50:14 +02:00
|
|
|
d_cachepos (dir) = 0;
|
2006-01-28 14:41:22 +01:00
|
|
|
else
|
2006-01-30 11:30:58 +01:00
|
|
|
d_cachepos (dir) += buf->NextEntryOffset;
|
2006-01-28 14:41:22 +01:00
|
|
|
if ((dir->__flags & dirent_get_d_ino))
|
|
|
|
{
|
|
|
|
FileName = buf->FileName;
|
2008-05-21 11:02:42 +02:00
|
|
|
FileNameLength = buf->FileNameLength;
|
|
|
|
FileAttributes = buf->FileAttributes;
|
2006-01-27 22:50:42 +01:00
|
|
|
if ((dir->__flags & dirent_set_d_ino))
|
|
|
|
de->d_ino = buf->FileId.QuadPart;
|
2006-05-28 17:50:14 +02:00
|
|
|
}
|
2008-05-21 11:02:42 +02:00
|
|
|
else if ((dir->__flags & dirent_nfs_d_ino))
|
|
|
|
{
|
|
|
|
FileName = ((PFILE_NAMES_INFORMATION) buf)->FileName;
|
|
|
|
FileNameLength = ((PFILE_NAMES_INFORMATION) buf)->FileNameLength;
|
2008-11-26 18:21:04 +01:00
|
|
|
}
|
2006-01-27 22:50:42 +01:00
|
|
|
else
|
2008-05-21 11:02:42 +02:00
|
|
|
{
|
2010-01-29 12:20:06 +01:00
|
|
|
FileName = ((PFILE_BOTH_DIRECTORY_INFORMATION) buf)->FileName;
|
|
|
|
FileNameLength =
|
|
|
|
((PFILE_BOTH_DIRECTORY_INFORMATION) buf)->FileNameLength;
|
|
|
|
FileAttributes =
|
|
|
|
((PFILE_BOTH_DIRECTORY_INFORMATION) buf)->FileAttributes;
|
2008-05-21 11:02:42 +02:00
|
|
|
}
|
|
|
|
RtlInitCountedUnicodeString (&fname, FileName, FileNameLength);
|
2007-07-26 19:30:54 +02:00
|
|
|
de->d_ino = d_mounts (dir)->check_mount (&fname, de->d_ino);
|
2006-01-28 14:41:22 +01:00
|
|
|
if (de->d_ino == 0 && (dir->__flags & dirent_set_d_ino))
|
2006-01-27 22:50:42 +01:00
|
|
|
{
|
2009-08-14 15:39:07 +02:00
|
|
|
/* Don't try to optimize relative to dir->__d_position. On several
|
|
|
|
filesystems it's no safe bet that "." and ".." entries always
|
|
|
|
come first. */
|
|
|
|
if (FileNameLength == sizeof (WCHAR) && FileName[0] == '.')
|
2009-03-12 23:03:28 +01:00
|
|
|
de->d_ino = get_ino_by_handle (pc, get_handle ());
|
2009-08-14 20:27:18 +02:00
|
|
|
else if (FileNameLength == 2 * sizeof (WCHAR)
|
2007-07-26 19:30:54 +02:00
|
|
|
&& FileName[0] == L'.' && FileName[1] == L'.')
|
2009-08-14 15:39:07 +02:00
|
|
|
{
|
|
|
|
if (!(dir->__flags & dirent_isroot))
|
|
|
|
de->d_ino = readdir_get_ino (get_name (), true);
|
|
|
|
else
|
|
|
|
de->d_ino = get_ino_by_handle (pc, get_handle ());
|
|
|
|
}
|
2006-01-28 14:41:22 +01:00
|
|
|
else
|
2006-01-27 22:50:42 +01:00
|
|
|
{
|
2009-08-14 15:39:07 +02:00
|
|
|
OBJECT_ATTRIBUTES attr;
|
2006-01-28 14:41:22 +01:00
|
|
|
HANDLE hdl;
|
2009-08-14 15:39:07 +02:00
|
|
|
NTSTATUS f_status;
|
2007-07-26 19:30:54 +02:00
|
|
|
|
2008-07-16 22:20:45 +02:00
|
|
|
InitializeObjectAttributes (&attr, &fname,
|
|
|
|
pc.objcaseinsensitive (),
|
2007-07-26 19:30:54 +02:00
|
|
|
get_handle (), NULL);
|
2009-08-14 15:39:07 +02:00
|
|
|
/* FILE_OPEN_REPARSE_POINT on NFS is a no-op, so the normal
|
|
|
|
NtOpenFile here returns the inode number of the symlink target,
|
|
|
|
rather than the inode number of the symlink itself.
|
|
|
|
|
|
|
|
Worse, trying to open a symlink without setting the special
|
|
|
|
"ActOnSymlink" EA triggers a bug in Windows 7 which results
|
2009-08-14 16:10:31 +02:00
|
|
|
in a timeout of up to 20 seconds, followed by two exceptions
|
2009-08-14 15:39:07 +02:00
|
|
|
in the NT kernel.
|
|
|
|
|
|
|
|
Since both results are far from desirable, we open symlinks
|
|
|
|
on NFS so that we get the right inode and a happy W7.
|
|
|
|
And, since some filesystems choke on the EAs, we don't
|
|
|
|
use them unconditionally. */
|
|
|
|
f_status = (dir->__flags & dirent_nfs_d_ino)
|
|
|
|
? NtCreateFile (&hdl, READ_CONTROL, &attr, &io,
|
|
|
|
NULL, 0, FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN, FILE_OPEN_FOR_BACKUP_INTENT,
|
|
|
|
&nfs_aol_ffei, sizeof nfs_aol_ffei)
|
|
|
|
: NtOpenFile (&hdl, READ_CONTROL, &attr, &io,
|
|
|
|
FILE_SHARE_VALID_FLAGS,
|
|
|
|
FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_OPEN_REPARSE_POINT);
|
|
|
|
if (NT_SUCCESS (f_status))
|
2006-01-28 14:41:22 +01:00
|
|
|
{
|
2009-03-12 23:03:28 +01:00
|
|
|
de->d_ino = get_ino_by_handle (pc, hdl);
|
2007-07-26 19:30:54 +02:00
|
|
|
NtClose (hdl);
|
2006-01-28 14:41:22 +01:00
|
|
|
}
|
2006-01-27 22:50:42 +01:00
|
|
|
}
|
2009-03-12 23:03:28 +01:00
|
|
|
/* Untrusted file system. Don't try to fetch inode number again. */
|
|
|
|
if (de->d_ino == 0)
|
|
|
|
dir->__flags &= ~dirent_set_d_ino;
|
2006-01-27 22:50:42 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(res = readdir_helper (dir, de, RtlNtStatusToDosError (status),
|
2008-05-21 11:02:42 +02:00
|
|
|
buf ? FileAttributes : 0, &fname)))
|
2006-01-27 22:50:42 +01:00
|
|
|
dir->__d_position++;
|
|
|
|
else if (!(dir->__flags & dirent_saw_dot))
|
|
|
|
{
|
|
|
|
strcpy (de->d_name , ".");
|
2009-03-12 23:03:28 +01:00
|
|
|
de->d_ino = get_ino_by_handle (pc, get_handle ());
|
2006-01-27 22:50:42 +01:00
|
|
|
dir->__d_position++;
|
|
|
|
dir->__flags |= dirent_saw_dot;
|
|
|
|
res = 0;
|
|
|
|
}
|
2006-05-08 17:20:04 +02:00
|
|
|
else if (!(dir->__flags & dirent_saw_dot_dot))
|
2006-01-27 22:50:42 +01:00
|
|
|
{
|
|
|
|
strcpy (de->d_name , "..");
|
2007-07-09 19:02:37 +02:00
|
|
|
if (!(dir->__flags & dirent_isroot))
|
2007-07-26 19:30:54 +02:00
|
|
|
de->d_ino = readdir_get_ino (get_name (), true);
|
2007-07-09 19:02:37 +02:00
|
|
|
else
|
2009-03-12 23:03:28 +01:00
|
|
|
de->d_ino = get_ino_by_handle (pc, get_handle ());
|
2006-01-27 22:50:42 +01:00
|
|
|
dir->__d_position++;
|
|
|
|
dir->__flags |= dirent_saw_dot_dot;
|
|
|
|
res = 0;
|
|
|
|
}
|
|
|
|
|
2009-10-30 10:02:30 +01:00
|
|
|
syscall_printf ("%d = readdir (%p, %p) (L\"%lS\" > \"%ls\")", res, dir, &de,
|
|
|
|
res ? NULL : &fname, res ? "***" : de->d_name);
|
2006-01-27 22:50:42 +01:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2003-04-01 18:11:41 +02:00
|
|
|
_off64_t
|
2001-11-21 07:47:57 +01:00
|
|
|
fhandler_disk_file::telldir (DIR *dir)
|
|
|
|
{
|
|
|
|
return dir->__d_position;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-04-01 18:11:41 +02:00
|
|
|
fhandler_disk_file::seekdir (DIR *dir, _off64_t loc)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
2005-03-16 22:21:18 +01:00
|
|
|
rewinddir (dir);
|
|
|
|
while (loc > dir->__d_position)
|
|
|
|
if (!::readdir (dir))
|
|
|
|
break;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
fhandler_disk_file::rewinddir (DIR *dir)
|
|
|
|
{
|
2007-02-22 11:54:47 +01:00
|
|
|
d_cachepos (dir) = 0;
|
|
|
|
if (wincap.has_buggy_restart_scan () && isremote ())
|
|
|
|
{
|
|
|
|
/* This works around a W2K bug. The RestartScan parameter in calls
|
|
|
|
to NtQueryDirectoryFile on remote shares is ignored, thus
|
|
|
|
resulting in not being able to rewind on remote shares. By
|
|
|
|
reopening the directory, we get a fresh new directory pointer. */
|
|
|
|
OBJECT_ATTRIBUTES attr;
|
|
|
|
NTSTATUS status;
|
|
|
|
IO_STATUS_BLOCK io;
|
|
|
|
HANDLE new_dir;
|
|
|
|
|
2009-07-14 19:37:42 +02:00
|
|
|
InitializeObjectAttributes (&attr, &ro_u_empty, pc.objcaseinsensitive (),
|
2007-07-09 19:02:37 +02:00
|
|
|
get_handle (), NULL);
|
2007-02-22 11:54:47 +01:00
|
|
|
status = NtOpenFile (&new_dir, SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
2007-02-22 12:17:01 +01:00
|
|
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
2007-02-22 11:54:47 +01:00
|
|
|
FILE_SYNCHRONOUS_IO_NONALERT
|
|
|
|
| FILE_OPEN_FOR_BACKUP_INTENT
|
|
|
|
| FILE_DIRECTORY_FILE);
|
|
|
|
if (!NT_SUCCESS (stat))
|
2007-08-21 14:09:38 +02:00
|
|
|
debug_printf ("Unable to reopen dir %s, NT error: %p",
|
|
|
|
get_name (), status);
|
2007-02-22 11:54:47 +01:00
|
|
|
else
|
2007-02-20 01:16:18 +01:00
|
|
|
{
|
2007-07-09 19:02:37 +02:00
|
|
|
NtClose (get_handle ());
|
|
|
|
set_io_handle (new_dir);
|
2006-10-23 17:13:55 +02:00
|
|
|
}
|
|
|
|
}
|
2001-11-21 07:47:57 +01:00
|
|
|
dir->__d_position = 0;
|
2006-03-01 14:47:49 +01:00
|
|
|
d_mounts (dir)->rewind ();
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_disk_file::closedir (DIR *dir)
|
|
|
|
{
|
|
|
|
int res = 0;
|
2007-02-22 16:07:21 +01:00
|
|
|
NTSTATUS status;
|
|
|
|
|
2006-03-01 14:47:49 +01:00
|
|
|
delete d_mounts (dir);
|
2007-07-09 19:02:37 +02:00
|
|
|
if (!get_handle ())
|
2006-02-05 08:03:24 +01:00
|
|
|
/* ignore */;
|
2007-07-09 19:02:37 +02:00
|
|
|
else if (get_handle () == INVALID_HANDLE_VALUE)
|
2001-11-21 07:47:57 +01:00
|
|
|
{
|
2006-02-05 08:03:24 +01:00
|
|
|
set_errno (EBADF);
|
2001-11-21 07:47:57 +01:00
|
|
|
res = -1;
|
|
|
|
}
|
2007-07-09 19:02:37 +02:00
|
|
|
else if (!NT_SUCCESS (status = NtClose (get_handle ())))
|
2006-02-05 08:03:24 +01:00
|
|
|
{
|
2007-02-22 16:07:21 +01:00
|
|
|
__seterrno_from_nt_status (status);
|
2007-02-22 11:54:47 +01:00
|
|
|
res = -1;
|
2006-02-05 08:03:24 +01:00
|
|
|
}
|
2007-01-31 11:55:59 +01:00
|
|
|
syscall_printf ("%d = closedir (%p, %s)", res, dir, get_name ());
|
2006-02-05 08:03:24 +01:00
|
|
|
return res;
|
2001-11-21 07:47:57 +01:00
|
|
|
}
|
2001-11-22 06:59:07 +01:00
|
|
|
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_cygdrive::fhandler_cygdrive () :
|
|
|
|
fhandler_disk_file (), ndrives (0), pdrive (NULL)
|
2001-11-22 06:59:07 +01:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2006-03-01 23:37:25 +01:00
|
|
|
int
|
|
|
|
fhandler_cygdrive::open (int flags, mode_t mode)
|
|
|
|
{
|
|
|
|
if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
|
|
|
{
|
|
|
|
set_errno (EEXIST);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (flags & O_WRONLY)
|
|
|
|
{
|
|
|
|
set_errno (EISDIR);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
flags |= O_DIROPEN;
|
|
|
|
set_flags (flags);
|
|
|
|
nohandle (true);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_cygdrive::close ()
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2001-11-22 06:59:07 +01:00
|
|
|
void
|
|
|
|
fhandler_cygdrive::set_drives ()
|
|
|
|
{
|
2009-08-04 06:20:36 +02:00
|
|
|
pdrive = pdrive_buf;
|
|
|
|
ndrives = GetLogicalDriveStrings (sizeof pdrive_buf, pdrive_buf) / DRVSZ;
|
2001-11-22 06:59:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
* devices.cc: New file.
* devices.gperf: New file.
* devices.shilka: New file.
* cygwin-gperf: New file.
* cygwin-shilka: New file.
* fhandler_fifo.cc: New file.
* fhandler_nodevice.cc : New file. Reorganize headers so that path.h precedes
fhandler.h throughout. Remove device argument and unit arguments from fhandler
constructors throughout. Remove pc arguments to fhandler functions and use
internal pc element instead, throughout. Use dev element in pc throughout.
Use major/minor elements rather than units and device numbers previously in
fhandler class. Use correct methods for fhandler file names rather than
directly accessing file name variables, throughout.
* Makefile.in (DLL_OFILES): Add devices.o, fhandler_fifo.o
* dcrt0.cc (dll_crt0_1): Call device::init.
* devices.h: Renumber devices based on more Linux-like major/minor numbers.
Add more devices. Declare standard device storage.
(device): Declare struct.
* dir.cc (opendir): Use new 'build_fh_name' to construct a fhandler_* type.
* dtable.cc (dtable::get_debugger_info): Ditto.
(cygwin_attach_handle_to_fd): Ditto.
(dtable::release): Remove special FH_SOCKET case in favor of generic
"need_fixup_before" test.
(dtable::init_std_file_from_handle): Use either build_fh_dev or build_fh_name
to build standard fhandler.
(dtable::build_fh_name): Renamed from dtable::build_fhandler_from_name. Move
out of dtable class. Don't accept a path_conv argument. Just build it here
and pass it to:
(build_fh_pc): Renamed from dtable::build_fhandler. Move out of dtable class.
Use intrinsic device type in path_conv to create new fhandler.
(build_fh_dev): Renamed from dtable::build_fhandler. Move out of dtable class.
Simplify arguments to just take new 'device' type and a name. Just return
pointer to fhandler rather than trying to insert into dtable.
(dtable::dup_worker): Accommodate above build_fh name changes.
(dtable::find_fifo): New (currently broken) function.
(handle_to_fn): Use strechr for efficiency.
* dtable.h: Reflect above build_fh name changes and argument differences.
(fhandler_base *&operator []): Return self rather than copy of self.
* fhandler.cc (fhandler_base::operator =): Use pc element to set normalized
path.
(fhandler_base::set_name): Ditto.
(fhandler_base::raw_read): Use method to access name.
(fhandler_base::write): Correctly use get_output_handle rather than get_handle.
(handler_base::device_access_denied): New function.
(fhandler_base::open): Eliminate pc argument and use pc element of
fhandler_base throughout.
(fhandler_base::fstat): Detect if device is based in filesystem and use
fstat_fs to calculate stat, if so.
(fhandler_base::fhandler_base): Eliminate handling of file names and, instead,
just free appropriate component from pc.
(fhandler_base::opendir): Remove path_conv parameter.
* fhandler.h: Remove all device flags.
(fhandler_base::pc): New element.
(fhandler_base::set_name): Change argument to path_conv.
(fhandler_base::error): New function.
(fhandler_base::exists): New function.
(fhandler_base::pc_binmode): New function.
(fhandler_base::dev): New function.
(fhandler_base::open_fs): New function.
(fhandler_base::fstat_fs): New function.
(fhandler_base::fstat_by_name): New function.
(fhandler_base::fstat_by_handle): New function.
(fhandler_base::isfifo): New function.
(fhandler_base::is_slow): New function.
(fhandler_base::is_auto_device): New function.
(fhandler_base::is_fs_special): New function.
(fhandler_base::device_access_denied): New function.
(fhandler_base::operator DWORD&): New operator.
(fhandler_base::get_name): Return normalized path from pc.
(fhandler_base::get_win32_name): Return windows path from pc.
(fhandler_base::isdevice): Renamed from is_device.
(fhandler_base::get_native_name): Return device format.
(fhandler_fifo): New class.
(fhandler_nodevice): New class.
(select_stuff::device_specific): Remove array.
(select_stuff::device_specific_pipe): New class element.
(select_stuff::device_specific_socket): New class element.
(select_stuff::device_specific_serial): New class element.
(select_stuff::select_stuff): Initialize new elements.
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Move to base class
from fhandler_disk_file.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_base::fstat_by_name): Ditto.
(fhandler_disk_file::open): Move most functionality into
fhandler_base::open_fs.
(fhandler_base::open_fs): New function.
(fhandler_disk_file::close): Move most functionality into
fhandler_base::close_fs.
(fhandler_base::close_fs): New function.
* fhandler_mem.cc (fhandler_dev_mem::open): Use device name in debugging
output.
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Copy standard
urandom device into appropriate place.
(fhandler_socket::accept): Reflect change in fdsock return value.
* fhandler_tty.cc: See "throughouts" above.
* net.cc: Accommodate fdsock change throughout.
(fdsock): Return success or failure, accept fd argument and device argument.
* path.cc (symlink_info::major): New element.
(symlink_info::minor): New element.
(symlink_info::parse_device): Declare new function.
(fs_info::update): Accommodate changes in path_conv class.
(path_conv::fillin): Ditto.
(path_conv::return_and_clear_normalized_path): Eliminate.
(path_conv::set_normalized_path): New function.
(path_conv::path_conv): Set info in dev element. Use path_conv methods Check
for FH_FS rather than FH_BAD to indicate when to fill in filesystem stuff.
where appropriate rather than direct access. Use set_normalized_path to set
normalized path.
(windows_device_names): Eliminate.
(get_dev): Ditto.
(get_raw_device_number): Ditto.
(get_device_number): Ditto.
(win32_device_name): Call new device name parser to do most of the heavy
lifting.
(mount_info::conv_to_win32_path): Fill in dev field as appropriate.
(symlink_worker): Handle new device files.
(symlink_info::check): Ditto.
(symlink_info::parse_device): Define new function.
* path.h (executable_states): Move here from fhandler.h.
(fs_info): Rename variables to *_storage and create methods for accessing same.
(path_conv): Add dev element, remove devn and unit and adjust inline methods to
accommodate.
(set_normalized_path): Declare new function.
* pinfo.cc (_pinfo::commune_recv): Add broken support for handling fifos.
(_pinfo::commune_send): Ditto.
* pipe.cc (fhandler_pipe::close): check for existence of handle before closing
it.
(handler_pipe::create): Rename from make_pipe. Change arguments to accept
fhandler_pipe array. Accommodate fifos.
(pipe): Rework to deal with fhandler_pipe::create changes.
(_pipe): Ditto.
* select.cc: Use individual device_specific types throughout rather than
indexing with obsolete device number.
(set_bits): Use is_socket call rather than checking device number.
* shared_info.h (CURR_MOUNT_MAGIC): Update.
(conv_to_win32_path): Reflect addition of device argument.
* syscalls.cc (mknod_worker): New function.
(open): Use build_fh_name to build fhandler.
(chown_worker): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(chmod_device): New function.
(chmod): Detect if this is an 'auto' device rather than an on-filesystem device
and handle appropriately. Use chmod_device to set mode of in-filesystem
devices.
(stat_worker): Eliminate path_conv argument. Call build_fh_name to construct
fhandler. Use fh->error() rather than pc->error to detect errors in fhandler
construction.
(access_worker): New function pulled from access. Accommodate in-filesystem
devices.
(access): Use access_worker.
(fpathconf): Detect if this is an 'auto' device rather than an on-filesystem
device and handle appropriately.
(mknod_worker): New function.
(mknod32): New function.
(chroot): Free normalized path -- assuming it was actually cmalloced.
* tty.cc (create_tty_master): Tweak for new device class.
(tty::common_init): Ditto.
* winsup.h (stat_worker): Remove.
(symlink_worker): Declare.
* exceptions.cc (set_process_mask): Just call sig_dispatch_pending and don't
worry about pending_signals since sig_dispatch_pending should always do the
right thing now.
(sig_handle): Reorganize SIGCONT handling to more closely conform to SUSv3.
* pinfo.h: Move __SIG enum to sigproc.h.
(PICOM_FIFO): New enum element.
(_pinfo): Remove 'thread2signal' stuff throughout class.
(_pinfo::commune_send): Make varargs.
(_pinfo::sigtodo): Eliminate.
(_pinfo::thread2signal): Ditto.
* signal.cc (kill_worker): Eliminate call to setthread2signal.
* sigproc.cc (local_sigtodo): Eliminate.
(getlocal_sigtodo): Ditto.
(sigelem): New class.
(pending_signals): New class.
(sigqueue): New variable, start of sigqueue linked list.
(sigcatch_nonmain): Eliminate.
(sigcatch_main): Eliminate.
(sigcatch_nosync): Eliminate.
(sigcomplete_nonmain): Eliminate.
(pending_signals): Eliminate.
(sig_clear): Call signal thread to clear pending signals, unless already in
signal thread.
(sigpending): Call signal thread to get pending signals.
(sig_dispatch_pending): Eliminate use of pending_signals and just check
sigqueue.
(sigproc_terminate): Eliminate all of the obsolete semaphore stuff. Close
signal pipe handle.
(sig_send): Eliminate all of the obsolete semaphore stuff and use pipe to send
signals.
(getevent): Eliminate.
(pending_signals::add): New function.
(pending_signals::del): New function.
(pending_signals::next): New function.
(wait_sig): Eliminate all of the obsolete semaphore stuff. Use pipe to
communicate and maintain a linked list of signals.
* sigproc.h: Move __SIG defines here. Add __SIGPENDING.
(sig_dispatch_pending): Remove "C" specifier.
(sig_handle): Accept a mask argument.
* thread.cc: Remove signal handling considerations throughout.
2003-09-25 02:37:18 +02:00
|
|
|
fhandler_cygdrive::fstat (struct __stat64 *buf)
|
2001-11-22 06:59:07 +01:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
fhandler_base::fstat (buf);
|
2006-03-01 23:37:25 +01:00
|
|
|
buf->st_ino = 2;
|
2007-07-26 19:30:54 +02:00
|
|
|
buf->st_mode = S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
|
|
|
|
if (!ndrives)
|
|
|
|
set_drives ();
|
|
|
|
char flptst[] = "X:";
|
|
|
|
int n = ndrives;
|
|
|
|
for (const char *p = pdrive; p && *p; p = strchr (p, '\0') + 1)
|
|
|
|
if (is_floppy ((flptst[0] = *p, flptst))
|
|
|
|
|| GetFileAttributes (p) == INVALID_FILE_ATTRIBUTES)
|
2009-08-04 06:20:36 +02:00
|
|
|
n--;
|
2007-07-26 19:30:54 +02:00
|
|
|
buf->st_nlink = n + 2;
|
2001-11-22 06:59:07 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
DIR *
|
2007-06-29 17:13:01 +02:00
|
|
|
fhandler_cygdrive::opendir (int fd)
|
2001-11-22 06:59:07 +01:00
|
|
|
{
|
|
|
|
DIR *dir;
|
|
|
|
|
2007-06-29 17:13:01 +02:00
|
|
|
dir = fhandler_disk_file::opendir (fd);
|
2005-05-19 07:43:55 +02:00
|
|
|
if (dir && !ndrives)
|
2001-11-22 06:59:07 +01:00
|
|
|
set_drives ();
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
2005-08-20 08:19:55 +02:00
|
|
|
int
|
|
|
|
fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
2001-11-22 06:59:07 +01:00
|
|
|
{
|
2007-07-26 19:30:54 +02:00
|
|
|
char flptst[] = "X:";
|
|
|
|
|
2006-01-27 22:50:42 +01:00
|
|
|
while (true)
|
2002-06-01 04:45:38 +02:00
|
|
|
{
|
2006-01-27 22:50:42 +01:00
|
|
|
if (!pdrive || !*pdrive)
|
2006-05-28 17:50:14 +02:00
|
|
|
{
|
2006-03-01 23:37:25 +01:00
|
|
|
if (!(dir->__flags & dirent_saw_dot))
|
|
|
|
{
|
|
|
|
de->d_name[0] = '.';
|
|
|
|
de->d_name[1] = '\0';
|
|
|
|
de->d_ino = 2;
|
|
|
|
}
|
|
|
|
return ENMFILE;
|
2006-05-28 17:50:14 +02:00
|
|
|
}
|
2007-07-26 19:30:54 +02:00
|
|
|
if (!is_floppy ((flptst[0] = *pdrive, flptst))
|
|
|
|
&& GetFileAttributes (pdrive) != INVALID_FILE_ATTRIBUTES)
|
2006-05-28 17:50:14 +02:00
|
|
|
break;
|
2002-07-30 16:17:17 +02:00
|
|
|
pdrive = strchr (pdrive, '\0') + 1;
|
2001-11-25 04:28:16 +01:00
|
|
|
}
|
2005-08-20 08:19:55 +02:00
|
|
|
*de->d_name = cyg_tolower (*pdrive);
|
|
|
|
de->d_name[1] = '\0';
|
2007-07-26 19:30:54 +02:00
|
|
|
user_shared->warned_msdos = true;
|
|
|
|
de->d_ino = readdir_get_ino (pdrive, false);
|
2001-11-22 06:59:07 +01:00
|
|
|
dir->__d_position++;
|
2002-07-30 16:17:17 +02:00
|
|
|
pdrive = strchr (pdrive, '\0') + 1;
|
2005-08-20 08:19:55 +02:00
|
|
|
syscall_printf ("%p = readdir (%p) (%s)", &de, dir, de->d_name);
|
|
|
|
return 0;
|
2001-11-22 06:59:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
fhandler_cygdrive::rewinddir (DIR *dir)
|
|
|
|
{
|
2009-08-04 06:20:36 +02:00
|
|
|
pdrive = pdrive_buf;
|
2001-11-22 06:59:07 +01:00
|
|
|
dir->__d_position = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fhandler_cygdrive::closedir (DIR *dir)
|
|
|
|
{
|
2009-08-04 06:20:36 +02:00
|
|
|
pdrive = pdrive_buf;
|
2005-02-23 03:00:48 +01:00
|
|
|
return 0;
|
2001-11-22 06:59:07 +01:00
|
|
|
}
|