* dcrt0.cc (dll_crt0_1): Don't close hexec_proc if it is NULL.
* fork.cc (vfork): Add debugging statements. * path.cc (get_device_number): Make static. Rewrite to inspect both unix and windows paths. (get_raw_device_number): Just check for parts of raw device that we care about. (get_devn): New function, pulled from get_device_number. (win32_device_name): Accomodate arg changes to get_device_number. (mount_info::get_device_number): Call get_device_number on translated Windows path. * spawn.cc (spawn_guts): Don't treat P_VFORK differently from P_NOWAIT. Add handle to child's shared region to child so that it will be preserved if the parent goes away. * fhandler.h: Throughout, simplify to one open method for all fhandler classes, requiring a path_conv first element. * fhandler.cc (fhandler_base::open): Remove obsolete method. Generalize to require path_conv * as first argument. (fhandler_disk_file::open): Remove obsolete method. (fhandler_disk_file::open): Use path_conv pointer rather than reference. * fhandler_clipboard.cc (fhandler_dev_clipboard::dup): Use new open method. (fhandler_dev_clipboard::open): Accomodate new argument for open methods. * fhandler_console.cc (fhandler_console::open): Ditto. (fhandler_console::dup): Use new open method. (fhandler_console::fixup_after_fork): Ditto. (fhandler_console::fixup_after_exec): Ditto. * fhandler_dsp.cc (fhandler_dev_dsp::open): Accomodate new argument for open methods. * fhandler_floppy.cc (fhandler_dev_floppy::open): Ditto. * fhandler_mem.cc (fhandler_dev_mem::open): Ditto. * fhandler_random (fhandler_dev_random::open): Ditto. * fhandler_raw.cc (fhandler_dev_raw::open): Ditto. * fhandler_serial.cc (fhandler_serial::open): Ditto. * fhandler_tape.cc (fhandler_dev_tape::open): Ditto. * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. (fhandler_pty_master::open): Ditto. * fhandler_windows.cc (fhandler_windows::open): Ditto. * fhandler_zero.cc (fhandler_dev_zero::open): Ditto. * fhandler_socket.cc (fhandler_socket::set_connect_secret): Accomodate new argument for open methods. * syscalls.cc (_open): Ditto. (stat_worker): Ditto.
This commit is contained in:
parent
34d2d03975
commit
8af0f81d52
|
@ -1,3 +1,53 @@
|
||||||
|
Wed Oct 3 19:40:36 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* dcrt0.cc (dll_crt0_1): Don't close hexec_proc if it is NULL.
|
||||||
|
|
||||||
|
* fork.cc (vfork): Add debugging statements.
|
||||||
|
|
||||||
|
* path.cc (get_device_number): Make static. Rewrite to inspect both unix
|
||||||
|
and windows paths.
|
||||||
|
(get_raw_device_number): Just check for parts of raw device that we
|
||||||
|
care about.
|
||||||
|
(get_devn): New function, pulled from get_device_number.
|
||||||
|
(win32_device_name): Accomodate arg changes to get_device_number.
|
||||||
|
(mount_info::get_device_number): Call get_device_number on translated
|
||||||
|
Windows path.
|
||||||
|
|
||||||
|
* spawn.cc (spawn_guts): Don't treat P_VFORK differently from P_NOWAIT.
|
||||||
|
Add handle to child's shared region to child so that it will be
|
||||||
|
preserved if the parent goes away.
|
||||||
|
* fhandler.h: Throughout, simplify to one open method for all fhandler
|
||||||
|
classes, requiring a path_conv first element.
|
||||||
|
* fhandler.cc (fhandler_base::open): Remove obsolete method.
|
||||||
|
Generalize to require path_conv * as first argument.
|
||||||
|
(fhandler_disk_file::open): Remove obsolete method.
|
||||||
|
(fhandler_disk_file::open): Use path_conv pointer rather than
|
||||||
|
reference.
|
||||||
|
* fhandler_clipboard.cc (fhandler_dev_clipboard::dup): Use new open
|
||||||
|
method.
|
||||||
|
(fhandler_dev_clipboard::open): Accomodate new argument for open
|
||||||
|
methods.
|
||||||
|
* fhandler_console.cc (fhandler_console::open): Ditto.
|
||||||
|
(fhandler_console::dup): Use new open method.
|
||||||
|
(fhandler_console::fixup_after_fork): Ditto.
|
||||||
|
(fhandler_console::fixup_after_exec): Ditto.
|
||||||
|
* fhandler_dsp.cc (fhandler_dev_dsp::open): Accomodate new argument for
|
||||||
|
open methods.
|
||||||
|
* fhandler_floppy.cc (fhandler_dev_floppy::open): Ditto.
|
||||||
|
* fhandler_mem.cc (fhandler_dev_mem::open): Ditto.
|
||||||
|
* fhandler_random (fhandler_dev_random::open): Ditto.
|
||||||
|
* fhandler_raw.cc (fhandler_dev_raw::open): Ditto.
|
||||||
|
* fhandler_serial.cc (fhandler_serial::open): Ditto.
|
||||||
|
* fhandler_tape.cc (fhandler_dev_tape::open): Ditto.
|
||||||
|
* fhandler_tty.cc (fhandler_tty_slave::open): Ditto.
|
||||||
|
(fhandler_pty_master::open): Ditto.
|
||||||
|
* fhandler_windows.cc (fhandler_windows::open): Ditto.
|
||||||
|
* fhandler_zero.cc (fhandler_dev_zero::open): Ditto.
|
||||||
|
* fhandler_socket.cc (fhandler_socket::set_connect_secret): Accomodate
|
||||||
|
new argument for open methods.
|
||||||
|
* syscalls.cc (_open): Ditto.
|
||||||
|
(stat_worker): Ditto.
|
||||||
|
|
||||||
Tue Oct 2 23:49:18 2001 Christopher Faylor <cgf@cygnus.com>
|
Tue Oct 2 23:49:18 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* cygheap.cc (cfree): Remove malloc debugging probe.
|
* cygheap.cc (cfree): Remove malloc debugging probe.
|
||||||
|
|
|
@ -598,7 +598,8 @@ dll_crt0_1 ()
|
||||||
ProtectHandle (child_proc_info->forker_finished);
|
ProtectHandle (child_proc_info->forker_finished);
|
||||||
break;
|
break;
|
||||||
case PROC_SPAWN:
|
case PROC_SPAWN:
|
||||||
CloseHandle (spawn_info->hexec_proc);
|
if (spawn_info->hexec_proc)
|
||||||
|
CloseHandle (spawn_info->hexec_proc);
|
||||||
goto around;
|
goto around;
|
||||||
case PROC_EXEC:
|
case PROC_EXEC:
|
||||||
hexec_proc = spawn_info->hexec_proc;
|
hexec_proc = spawn_info->hexec_proc;
|
||||||
|
|
|
@ -305,16 +305,9 @@ fhandler_base::get_default_fmode (int flags)
|
||||||
return __fmode;
|
return __fmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Open system call handler function. */
|
||||||
int
|
int
|
||||||
fhandler_base::open (path_conv& real_path, int flags, mode_t mode)
|
fhandler_base::open (path_conv *, int flags, mode_t mode)
|
||||||
{
|
|
||||||
return open ((char *) real_path, flags, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open system call handler function.
|
|
||||||
Path is now already checked for symlinks */
|
|
||||||
int
|
|
||||||
fhandler_base::open (int flags, mode_t mode)
|
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
HANDLE x;
|
HANDLE x;
|
||||||
|
@ -392,15 +385,12 @@ fhandler_base::open (int flags, mode_t mode)
|
||||||
if (flags & O_CREAT && get_device () == FH_DISK && allow_ntsec && has_acls ())
|
if (flags & O_CREAT && get_device () == FH_DISK && allow_ntsec && has_acls ())
|
||||||
set_security_attribute (mode, &sa, alloca (4096), 4096);
|
set_security_attribute (mode, &sa, alloca (4096), 4096);
|
||||||
|
|
||||||
x = CreateFileA (get_win32_name (), access, shared,
|
x = CreateFile (get_win32_name (), access, shared, &sa, creation_distribution,
|
||||||
&sa, creation_distribution,
|
file_attributes, 0);
|
||||||
file_attributes,
|
|
||||||
0);
|
|
||||||
|
|
||||||
syscall_printf ("%p = CreateFileA (%s, %p, %p, %p, %p, %p, 0)",
|
syscall_printf ("%p = CreateFileA (%s, %p, %p, %p, %p, %p, 0)",
|
||||||
x, get_win32_name (), access, shared,
|
x, get_win32_name (), access, shared, &sa,
|
||||||
&sa, creation_distribution,
|
creation_distribution, file_attributes);
|
||||||
file_attributes);
|
|
||||||
|
|
||||||
if (x == INVALID_HANDLE_VALUE)
|
if (x == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -1231,44 +1221,21 @@ fhandler_disk_file::fhandler_disk_file (const char *name) :
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_disk_file::open (const char *path, int flags, mode_t mode)
|
fhandler_disk_file::open (path_conv *real_path, int flags, mode_t mode)
|
||||||
{
|
{
|
||||||
syscall_printf ("(%s, %p)", path, flags);
|
if (real_path->isbinary ())
|
||||||
|
|
||||||
/* O_NOSYMLINK is an internal flag for implementing lstat, nothing more. */
|
|
||||||
path_conv real_path (path, (flags & O_NOSYMLINK) ?
|
|
||||||
PC_SYM_NOFOLLOW : PC_SYM_FOLLOW);
|
|
||||||
|
|
||||||
if (real_path.error &&
|
|
||||||
(flags & O_NOSYMLINK || real_path.error != ENOENT
|
|
||||||
|| !(flags & O_CREAT) || real_path.case_clash))
|
|
||||||
{
|
|
||||||
set_errno (flags & O_CREAT && real_path.case_clash ? ECASECLASH
|
|
||||||
: real_path.error);
|
|
||||||
syscall_printf ("0 = fhandler_disk_file::open (%s, %p)", path, flags);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_name (path, real_path.get_win32 ());
|
|
||||||
return open (real_path, flags, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
fhandler_disk_file::open (path_conv& real_path, int flags, mode_t mode)
|
|
||||||
{
|
|
||||||
if (real_path.isbinary ())
|
|
||||||
{
|
{
|
||||||
set_r_binary (1);
|
set_r_binary (1);
|
||||||
set_w_binary (1);
|
set_w_binary (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
set_has_acls (real_path.has_acls ());
|
set_has_acls (real_path->has_acls ());
|
||||||
set_isremote (real_path.isremote ());
|
set_isremote (real_path->isremote ());
|
||||||
|
|
||||||
if (real_path.isdir ())
|
if (real_path->isdir ())
|
||||||
flags |= O_DIROPEN;
|
flags |= O_DIROPEN;
|
||||||
|
|
||||||
int res = this->fhandler_base::open (flags, mode);
|
int res = this->fhandler_base::open (real_path, flags, mode);
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1279,7 +1246,7 @@ fhandler_disk_file::open (path_conv& real_path, int flags, mode_t mode)
|
||||||
The only known file system to date is the SUN NFS Solstice Client 3.1
|
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
|
which returns a valid handle when trying to open a file in a nonexistent
|
||||||
directory. */
|
directory. */
|
||||||
if (real_path.has_buggy_open ()
|
if (real_path->has_buggy_open ()
|
||||||
&& GetFileAttributes (win32_path_name) == (DWORD) -1)
|
&& GetFileAttributes (win32_path_name) == (DWORD) -1)
|
||||||
{
|
{
|
||||||
debug_printf ("Buggy open detected.");
|
debug_printf ("Buggy open detected.");
|
||||||
|
@ -1291,9 +1258,9 @@ fhandler_disk_file::open (path_conv& real_path, int flags, mode_t mode)
|
||||||
if (flags & O_APPEND)
|
if (flags & O_APPEND)
|
||||||
SetFilePointer (get_handle(), 0, 0, FILE_END);
|
SetFilePointer (get_handle(), 0, 0, FILE_END);
|
||||||
|
|
||||||
set_symlink_p (real_path.issymlink ());
|
set_symlink_p (real_path->issymlink ());
|
||||||
set_execable_p (real_path.exec_state ());
|
set_execable_p (real_path->exec_state ());
|
||||||
set_socket_p (real_path.issocket ());
|
set_socket_p (real_path->issocket ());
|
||||||
|
|
||||||
out:
|
out:
|
||||||
syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res,
|
syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res,
|
||||||
|
|
|
@ -311,13 +311,7 @@ public:
|
||||||
/* fixup fd possibly non-inherited handles after fork */
|
/* fixup fd possibly non-inherited handles after fork */
|
||||||
void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
|
void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
|
||||||
|
|
||||||
/* Potentially overridden virtual functions. */
|
virtual int open (path_conv * real_path, int flags, mode_t mode = 0);
|
||||||
virtual int open (const char *, int flags, mode_t mode = 0)
|
|
||||||
{
|
|
||||||
return open (flags, mode);
|
|
||||||
}
|
|
||||||
virtual int open (path_conv& real_path, int flags, mode_t mode);
|
|
||||||
virtual int open (int flags, mode_t mode = 0);
|
|
||||||
virtual int close ();
|
virtual int close ();
|
||||||
virtual int fstat (struct stat *buf) { return stat_dev (get_device (), get_unit (), get_namehash (), buf); }
|
virtual int fstat (struct stat *buf) { return stat_dev (get_device (), get_unit (), get_namehash (), buf); }
|
||||||
virtual int ioctl (unsigned int cmd, void *);
|
virtual int ioctl (unsigned int cmd, void *);
|
||||||
|
@ -481,7 +475,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
~fhandler_dev_raw (void);
|
~fhandler_dev_raw (void);
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int close (void);
|
int close (void);
|
||||||
|
|
||||||
int raw_read (void *ptr, size_t ulen);
|
int raw_read (void *ptr, size_t ulen);
|
||||||
|
@ -506,7 +500,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
fhandler_dev_floppy (const char *name, int unit);
|
fhandler_dev_floppy (const char *name, int unit);
|
||||||
|
|
||||||
virtual int open (const char *path, int flags, mode_t mode = 0);
|
virtual int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
virtual int close (void);
|
virtual int close (void);
|
||||||
|
|
||||||
virtual off_t lseek (off_t offset, int whence);
|
virtual off_t lseek (off_t offset, int whence);
|
||||||
|
@ -528,7 +522,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
fhandler_dev_tape (const char *name, int unit);
|
fhandler_dev_tape (const char *name, int unit);
|
||||||
|
|
||||||
virtual int open (const char *path, int flags, mode_t mode = 0);
|
virtual int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
virtual int close (void);
|
virtual int close (void);
|
||||||
|
|
||||||
virtual off_t lseek (off_t offset, int whence);
|
virtual off_t lseek (off_t offset, int whence);
|
||||||
|
@ -559,8 +553,7 @@ class fhandler_disk_file: public fhandler_base
|
||||||
public:
|
public:
|
||||||
fhandler_disk_file (const char *name);
|
fhandler_disk_file (const char *name);
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv * real_path, int flags, mode_t mode);
|
||||||
int open (path_conv& real_path, int flags, mode_t mode);
|
|
||||||
int close ();
|
int close ();
|
||||||
int lock (int, struct flock *);
|
int lock (int, struct flock *);
|
||||||
BOOL is_device () { return FALSE; }
|
BOOL is_device () { return FALSE; }
|
||||||
|
@ -587,7 +580,7 @@ public:
|
||||||
/* Constructor */
|
/* Constructor */
|
||||||
fhandler_serial (const char *name, DWORD devtype = FH_SERIAL, int unit = 0);
|
fhandler_serial (const char *name, DWORD devtype = FH_SERIAL, int unit = 0);
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode);
|
int open (path_conv *, int flags, mode_t mode);
|
||||||
int close ();
|
int close ();
|
||||||
void init (HANDLE h, DWORD a, mode_t flags);
|
void init (HANDLE h, DWORD a, mode_t flags);
|
||||||
void overlapped_setup ();
|
void overlapped_setup ();
|
||||||
|
@ -750,7 +743,7 @@ public:
|
||||||
|
|
||||||
fhandler_console* is_console () { return this; }
|
fhandler_console* is_console () { return this; }
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
|
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
void doecho (const void *str, DWORD len) { (void) write (str, len); }
|
void doecho (const void *str, DWORD len) { (void) write (str, len); }
|
||||||
|
@ -823,7 +816,7 @@ public:
|
||||||
fhandler_tty_slave (const char *name);
|
fhandler_tty_slave (const char *name);
|
||||||
fhandler_tty_slave (int, const char *name);
|
fhandler_tty_slave (int, const char *name);
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
void init (HANDLE, DWORD, mode_t);
|
void init (HANDLE, DWORD, mode_t);
|
||||||
|
@ -850,7 +843,7 @@ public:
|
||||||
int process_slave_output (char *buf, size_t len, int pktmode_on);
|
int process_slave_output (char *buf, size_t len, int pktmode_on);
|
||||||
void doecho (const void *str, DWORD len);
|
void doecho (const void *str, DWORD len);
|
||||||
int accept_input ();
|
int accept_input ();
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
int close ();
|
int close ();
|
||||||
|
@ -896,7 +889,7 @@ class fhandler_dev_zero: public fhandler_base
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
fhandler_dev_zero (const char *name);
|
fhandler_dev_zero (const char *name);
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
off_t lseek (off_t offset, int whence);
|
off_t lseek (off_t offset, int whence);
|
||||||
|
@ -919,7 +912,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
fhandler_dev_random (const char *name, int unit);
|
fhandler_dev_random (const char *name, int unit);
|
||||||
int get_unit () { return unit; }
|
int get_unit () { return unit; }
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
off_t lseek (off_t offset, int whence);
|
off_t lseek (off_t offset, int whence);
|
||||||
|
@ -940,7 +933,7 @@ public:
|
||||||
fhandler_dev_mem (const char *name, int unit);
|
fhandler_dev_mem (const char *name, int unit);
|
||||||
~fhandler_dev_mem (void);
|
~fhandler_dev_mem (void);
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t ulen);
|
int write (const void *ptr, size_t ulen);
|
||||||
int read (void *ptr, size_t ulen);
|
int read (void *ptr, size_t ulen);
|
||||||
off_t lseek (off_t offset, int whence);
|
off_t lseek (off_t offset, int whence);
|
||||||
|
@ -962,7 +955,7 @@ class fhandler_dev_clipboard: public fhandler_base
|
||||||
public:
|
public:
|
||||||
fhandler_dev_clipboard (const char *name);
|
fhandler_dev_clipboard (const char *name);
|
||||||
int is_windows (void) { return 1; }
|
int is_windows (void) { return 1; }
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
off_t lseek (off_t offset, int whence);
|
off_t lseek (off_t offset, int whence);
|
||||||
|
@ -987,7 +980,7 @@ private:
|
||||||
public:
|
public:
|
||||||
fhandler_windows (const char *name = 0);
|
fhandler_windows (const char *name = 0);
|
||||||
int is_windows (void) { return 1; }
|
int is_windows (void) { return 1; }
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
int ioctl (unsigned int cmd, void *);
|
int ioctl (unsigned int cmd, void *);
|
||||||
|
@ -1014,7 +1007,7 @@ public:
|
||||||
fhandler_dev_dsp (const char *name = 0);
|
fhandler_dev_dsp (const char *name = 0);
|
||||||
~fhandler_dev_dsp();
|
~fhandler_dev_dsp();
|
||||||
|
|
||||||
int open (const char *path, int flags, mode_t mode = 0);
|
int open (path_conv *, int flags, mode_t mode = 0);
|
||||||
int write (const void *ptr, size_t len);
|
int write (const void *ptr, size_t len);
|
||||||
int read (void *ptr, size_t len);
|
int read (void *ptr, size_t len);
|
||||||
int ioctl (unsigned int cmd, void *);
|
int ioctl (unsigned int cmd, void *);
|
||||||
|
|
|
@ -56,7 +56,7 @@ fhandler_dev_clipboard::dup (fhandler_base * child)
|
||||||
{
|
{
|
||||||
fhandler_dev_clipboard *fhc = (fhandler_dev_clipboard *) child;
|
fhandler_dev_clipboard *fhc = (fhandler_dev_clipboard *) child;
|
||||||
|
|
||||||
if (!fhc->open (get_name (), get_flags (), 0))
|
if (!fhc->open (NULL, get_flags (), 0))
|
||||||
system_printf ("error opening clipboard, %E");
|
system_printf ("error opening clipboard, %E");
|
||||||
|
|
||||||
fhc->membuffer = membuffer;
|
fhc->membuffer = membuffer;
|
||||||
|
@ -67,7 +67,7 @@ fhandler_dev_clipboard::dup (fhandler_base * child)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_clipboard::open (const char *, int flags, mode_t)
|
fhandler_dev_clipboard::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
set_flags (flags);
|
set_flags (flags);
|
||||||
eof = false;
|
eof = false;
|
||||||
|
|
|
@ -542,7 +542,7 @@ fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_console::open (const char *, int flags, mode_t)
|
fhandler_console::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
|
|
||||||
|
@ -617,7 +617,7 @@ fhandler_console::dup (fhandler_base *child)
|
||||||
{
|
{
|
||||||
fhandler_console *fhc = (fhandler_console *) child;
|
fhandler_console *fhc = (fhandler_console *) child;
|
||||||
|
|
||||||
if (!fhc->open (get_name (), get_flags () & ~O_NOCTTY, 0))
|
if (!fhc->open (NULL, get_flags () & ~O_NOCTTY, 0))
|
||||||
system_printf ("error opening console, %E");
|
system_printf ("error opening console, %E");
|
||||||
|
|
||||||
fhc->default_color = default_color;
|
fhc->default_color = default_color;
|
||||||
|
@ -1723,7 +1723,7 @@ fhandler_console::init (HANDLE f, DWORD a, mode_t bin)
|
||||||
mode = O_WRONLY;
|
mode = O_WRONLY;
|
||||||
if (a == (GENERIC_READ | GENERIC_WRITE))
|
if (a == (GENERIC_READ | GENERIC_WRITE))
|
||||||
mode = O_RDWR;
|
mode = O_RDWR;
|
||||||
open (0, mode);
|
open ((path_conv *) NULL, mode);
|
||||||
if (f != INVALID_HANDLE_VALUE)
|
if (f != INVALID_HANDLE_VALUE)
|
||||||
CloseHandle (f); /* Reopened by open */
|
CloseHandle (f); /* Reopened by open */
|
||||||
|
|
||||||
|
@ -1752,7 +1752,7 @@ fhandler_console::fixup_after_fork (HANDLE)
|
||||||
/* Windows does not allow duplication of console handles between processes
|
/* Windows does not allow duplication of console handles between processes
|
||||||
so open the console explicitly. */
|
so open the console explicitly. */
|
||||||
|
|
||||||
if (!open (get_name (), O_NOCTTY | get_flags (), 0))
|
if (!open (NULL, O_NOCTTY | get_flags (), 0))
|
||||||
system_printf ("error opening console after fork, %E");
|
system_printf ("error opening console after fork, %E");
|
||||||
|
|
||||||
if (!get_close_on_exec ())
|
if (!get_close_on_exec ())
|
||||||
|
@ -1782,7 +1782,7 @@ fhandler_console::fixup_after_exec (HANDLE)
|
||||||
HANDLE h = get_handle ();
|
HANDLE h = get_handle ();
|
||||||
HANDLE oh = get_output_handle ();
|
HANDLE oh = get_output_handle ();
|
||||||
|
|
||||||
if (!open (get_name (), O_NOCTTY | get_flags (), 0))
|
if (!open (NULL, O_NOCTTY | get_flags (), 0))
|
||||||
{
|
{
|
||||||
int sawerr = 0;
|
int sawerr = 0;
|
||||||
if (!get_io_handle ())
|
if (!get_io_handle ())
|
||||||
|
|
|
@ -431,7 +431,7 @@ fhandler_dev_dsp::~fhandler_dev_dsp ()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_dsp::open (const char *path, int flags, mode_t mode = 0)
|
fhandler_dev_dsp::open (path_conv *, int flags, mode_t mode = 0)
|
||||||
{
|
{
|
||||||
// currently we only support writing
|
// currently we only support writing
|
||||||
if ((flags & (O_WRONLY | O_RDONLY | O_RDWR)) != O_WRONLY)
|
if ((flags & (O_WRONLY | O_RDONLY | O_RDWR)) != O_WRONLY)
|
||||||
|
@ -443,14 +443,11 @@ fhandler_dev_dsp::open (const char *path, int flags, mode_t mode = 0)
|
||||||
s_audio = new (audio_buf) Audio;
|
s_audio = new (audio_buf) Audio;
|
||||||
|
|
||||||
// Work out initial sample format & frequency
|
// Work out initial sample format & frequency
|
||||||
if (strcmp (path, "/dev/dsp") == 0L)
|
|
||||||
{
|
|
||||||
// dev/dsp defaults
|
// dev/dsp defaults
|
||||||
audioformat_ = AFMT_S8;
|
audioformat_ = AFMT_S8;
|
||||||
audiofreq_ = 8000;
|
audiofreq_ = 8000;
|
||||||
audiobits_ = 8;
|
audiobits_ = 8;
|
||||||
audiochannels_ = 1;
|
audiochannels_ = 1;
|
||||||
}
|
|
||||||
|
|
||||||
if (!s_audio->open (audiofreq_, audiobits_, audiochannels_))
|
if (!s_audio->open (audiofreq_, audiobits_, audiochannels_))
|
||||||
debug_printf ("/dev/dsp: failed to open\n");
|
debug_printf ("/dev/dsp: failed to open\n");
|
||||||
|
|
|
@ -46,7 +46,7 @@ fhandler_dev_floppy::fhandler_dev_floppy (const char *name, int unit) : fhandler
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_floppy::open (const char *path, int flags, mode_t)
|
fhandler_dev_floppy::open (path_conv *real_path, int flags, mode_t)
|
||||||
{
|
{
|
||||||
/* The correct size of the buffer would be 512 bytes,
|
/* The correct size of the buffer would be 512 bytes,
|
||||||
* which is the atomic size, supported by WinNT.
|
* which is the atomic size, supported by WinNT.
|
||||||
|
@ -61,7 +61,7 @@ fhandler_dev_floppy::open (const char *path, int flags, mode_t)
|
||||||
* and cpio buffer sizes by default!
|
* and cpio buffer sizes by default!
|
||||||
*/
|
*/
|
||||||
devbufsiz = 61440L; /* 512L; */
|
devbufsiz = 61440L; /* 512L; */
|
||||||
return fhandler_dev_raw::open (path, flags);
|
return fhandler_dev_raw::open (real_path, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -72,7 +72,7 @@ fhandler_dev_mem::~fhandler_dev_mem (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_mem::open (const char *, int flags, mode_t)
|
fhandler_dev_mem::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
if (!wincap.has_physical_mem_access ())
|
if (!wincap.has_physical_mem_access ())
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,7 +32,7 @@ fhandler_dev_random::fhandler_dev_random (const char *name, int nunit)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_random::open (const char *, int flags, mode_t)
|
fhandler_dev_random::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
set_flags (flags);
|
set_flags (flags);
|
||||||
set_open_status ();
|
set_open_status ();
|
||||||
|
|
|
@ -131,17 +131,14 @@ fhandler_dev_raw::~fhandler_dev_raw (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_raw::open (const char *path, int flags, mode_t)
|
fhandler_dev_raw::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
path_conv real_path (path, PC_SYM_IGNORE);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
set_name (path, real_path.get_win32 ());
|
|
||||||
|
|
||||||
/* Always open a raw device existing and binary. */
|
/* Always open a raw device existing and binary. */
|
||||||
flags &= ~(O_CREAT | O_TRUNC);
|
flags &= ~(O_CREAT | O_TRUNC);
|
||||||
flags |= O_BINARY;
|
flags |= O_BINARY;
|
||||||
ret = fhandler_base::open (path, flags);
|
ret = fhandler_base::open (NULL, flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
if (devbufsiz > 1L)
|
if (devbufsiz > 1L)
|
||||||
|
|
|
@ -212,7 +212,7 @@ fhandler_serial::init (HANDLE f, DWORD flags, mode_t bin)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_serial::open (const char *name, int flags, mode_t mode)
|
fhandler_serial::open (path_conv *, int flags, mode_t mode)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
COMMTIMEOUTS to;
|
COMMTIMEOUTS to;
|
||||||
|
@ -221,7 +221,7 @@ fhandler_serial::open (const char *name, int flags, mode_t mode)
|
||||||
syscall_printf ("fhandler_serial::open (%s, %p, %p)",
|
syscall_printf ("fhandler_serial::open (%s, %p, %p)",
|
||||||
get_name (), flags, mode);
|
get_name (), flags, mode);
|
||||||
|
|
||||||
if (name && !(res = this->fhandler_base::open (flags, mode)))
|
if (!(res = this->fhandler_base::open (NULL, flags, mode)))
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
res = 1;
|
res = 1;
|
||||||
|
|
|
@ -66,7 +66,7 @@ fhandler_socket::set_connect_secret ()
|
||||||
ENTROPY_SOURCE_DEV_UNIT);
|
ENTROPY_SOURCE_DEV_UNIT);
|
||||||
}
|
}
|
||||||
if (entropy_source &&
|
if (entropy_source &&
|
||||||
!entropy_source->open (ENTROPY_SOURCE_NAME, O_RDONLY))
|
!entropy_source->open (NULL, O_RDONLY))
|
||||||
{
|
{
|
||||||
delete entropy_source;
|
delete entropy_source;
|
||||||
entropy_source = NULL;
|
entropy_source = NULL;
|
||||||
|
|
|
@ -61,28 +61,21 @@ fhandler_dev_tape::fhandler_dev_tape (const char *name, int unit) : fhandler_dev
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_tape::open (const char *path, int flags, mode_t)
|
fhandler_dev_tape::open (path_conv *real_path, int flags, mode_t)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int minor;
|
|
||||||
|
|
||||||
if (get_device_number (path, minor) != FH_TAPE)
|
norewind = (real_path->get_unitn () >= 128);
|
||||||
{
|
|
||||||
set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
norewind = (minor >= 128);
|
|
||||||
devbufsiz = 1L;
|
devbufsiz = 1L;
|
||||||
|
|
||||||
ret = fhandler_dev_raw::open (path, flags);
|
ret = fhandler_dev_raw::open (real_path, flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
struct mtget get;
|
struct mtget get;
|
||||||
struct mtop op;
|
struct mtop op;
|
||||||
struct mtpos pos;
|
struct mtpos pos;
|
||||||
|
|
||||||
if (! ioctl (MTIOCGET, &get))
|
if (!ioctl (MTIOCGET, &get))
|
||||||
/* Tape drive supports and is set to variable block size. */
|
/* Tape drive supports and is set to variable block size. */
|
||||||
if (get.mt_dsreg == 0)
|
if (get.mt_dsreg == 0)
|
||||||
devbufsiz = get.mt_maxblksize;
|
devbufsiz = get.mt_maxblksize;
|
||||||
|
|
|
@ -456,7 +456,7 @@ fhandler_tty_slave::fhandler_tty_slave (const char *name) :
|
||||||
/* FIXME: This function needs to close handles when it has
|
/* FIXME: This function needs to close handles when it has
|
||||||
a failing condition. */
|
a failing condition. */
|
||||||
int
|
int
|
||||||
fhandler_tty_slave::open (const char *, int flags, mode_t)
|
fhandler_tty_slave::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
tcinit (cygwin_shared->tty[ttynum]);
|
tcinit (cygwin_shared->tty[ttynum]);
|
||||||
|
|
||||||
|
@ -961,7 +961,7 @@ fhandler_pty_master::fhandler_pty_master (const char *name, DWORD devtype, int u
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_pty_master::open (const char *, int flags, mode_t)
|
fhandler_pty_master::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
ttynum = cygwin_shared->tty.allocate_tty (0);
|
ttynum = cygwin_shared->tty.allocate_tty (0);
|
||||||
if (ttynum < 0)
|
if (ttynum < 0)
|
||||||
|
|
|
@ -55,7 +55,7 @@ fhandler_windows::fhandler_windows (const char *name) :
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_windows::open (const char *, int flags, mode_t)
|
fhandler_windows::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
set_flags (flags);
|
set_flags (flags);
|
||||||
set_close_on_exec_flag (1);
|
set_close_on_exec_flag (1);
|
||||||
|
|
|
@ -22,7 +22,7 @@ fhandler_dev_zero::fhandler_dev_zero (const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_dev_zero::open (const char *, int flags, mode_t)
|
fhandler_dev_zero::open (path_conv *, int flags, mode_t)
|
||||||
{
|
{
|
||||||
set_flags (flags);
|
set_flags (flags);
|
||||||
set_open_status ();
|
set_open_status ();
|
||||||
|
|
|
@ -721,6 +721,7 @@ vfork ()
|
||||||
*pp = *esp;
|
*pp = *esp;
|
||||||
int res = cygheap->fdtab.vfork_child_dup () ? 0 : -1;
|
int res = cygheap->fdtab.vfork_child_dup () ? 0 : -1;
|
||||||
debug_printf ("%d = vfork()", res);
|
debug_printf ("%d = vfork()", res);
|
||||||
|
debug_printf ("exiting vfork, res %d", res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,6 +744,7 @@ vfork ()
|
||||||
|
|
||||||
int pid = vf->pid;
|
int pid = vf->pid;
|
||||||
vf->pid = 0;
|
vf->pid = 0;
|
||||||
|
debug_printf ("exiting vfork, pid %d", pid);
|
||||||
sig_dispatch_pending ();
|
sig_dispatch_pending ();
|
||||||
return pid;
|
return pid;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -728,9 +728,6 @@ out:
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define deveq(s) (strcasematch (name, (s)))
|
|
||||||
#define deveqn(s, n) (strncasematch (name, (s), (n)))
|
|
||||||
|
|
||||||
static __inline int
|
static __inline int
|
||||||
digits (const char *name)
|
digits (const char *name)
|
||||||
{
|
{
|
||||||
|
@ -769,106 +766,122 @@ const char *windows_device_names[] NO_COPY =
|
||||||
"\\dev\\dsp"
|
"\\dev\\dsp"
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
#define deveq(s) (strcasematch (name, (s)))
|
||||||
get_raw_device_number (const char *uxname, const char *w32path, int &unit)
|
#define deveqn(s, n) (strncasematch (name, (s), (n)))
|
||||||
|
#define wdeveq(s) (strcasematch (w32_path, (s)))
|
||||||
|
#define wdeveqn(s, n) (strncasematch (w32_path, (s), (n)))
|
||||||
|
#define udeveq(s) (strcasematch (unix_path, (s)))
|
||||||
|
#define udeveqn(s, n) (strncasematch (unix_path, (s), (n)))
|
||||||
|
|
||||||
|
static int __stdcall
|
||||||
|
get_devn (const char *name, int &unit)
|
||||||
{
|
{
|
||||||
DWORD devn = FH_BAD;
|
int devn = FH_BAD;
|
||||||
|
name += 5;
|
||||||
if (strncasematch (w32path, "\\\\.\\tape", 8))
|
if (deveq ("tty"))
|
||||||
{
|
{
|
||||||
devn = FH_TAPE;
|
if (real_tty_attached (myself))
|
||||||
unit = digits (w32path + 8);
|
{
|
||||||
// norewind tape devices have leading n in name
|
unit = myself->ctty;
|
||||||
if (strncasematch (uxname, "/dev/n", 6))
|
devn = FH_TTYS;
|
||||||
unit += 128;
|
}
|
||||||
|
else if (myself->ctty > 0)
|
||||||
|
devn = FH_CONSOLE;
|
||||||
}
|
}
|
||||||
else if (isdrive (w32path + 4))
|
else if (deveqn ("tty", 3) && (unit = digits (name + 3)) >= 0)
|
||||||
|
devn = FH_TTYS;
|
||||||
|
else if (deveq ("ttym"))
|
||||||
|
devn = FH_TTYM;
|
||||||
|
else if (deveq ("ptmx"))
|
||||||
|
devn = FH_PTYM;
|
||||||
|
else if (deveq ("windows"))
|
||||||
|
devn = FH_WINDOWS;
|
||||||
|
else if (deveq ("dsp"))
|
||||||
|
devn = FH_OSS_DSP;
|
||||||
|
else if (deveq ("conin"))
|
||||||
|
devn = FH_CONIN;
|
||||||
|
else if (deveq ("conout"))
|
||||||
|
devn = FH_CONOUT;
|
||||||
|
else if (deveq ("null"))
|
||||||
|
devn = FH_NULL;
|
||||||
|
else if (deveq ("zero"))
|
||||||
|
devn = FH_ZERO;
|
||||||
|
else if (deveq ("random") || deveq ("urandom"))
|
||||||
{
|
{
|
||||||
devn = FH_FLOPPY;
|
devn = FH_RANDOM;
|
||||||
unit = cyg_tolower (w32path[4]) - 'a';
|
unit = 8 + (deveqn ("u", 1) ? 1 : 0); /* Keep unit Linux conformant */
|
||||||
}
|
}
|
||||||
else if (strncasematch (w32path, "\\\\.\\physicaldrive", 17))
|
else if (deveq ("mem"))
|
||||||
{
|
{
|
||||||
devn = FH_FLOPPY;
|
devn = FH_MEM;
|
||||||
unit = digits (w32path + 17) + 128;
|
unit = 1;
|
||||||
}
|
}
|
||||||
return devn;
|
else if (deveq ("clipboard"))
|
||||||
}
|
devn = FH_CLIPBOARD;
|
||||||
|
else if (deveq ("port"))
|
||||||
int __stdcall
|
|
||||||
get_device_number (const char *name, int &unit, BOOL from_conv)
|
|
||||||
{
|
|
||||||
DWORD devn = FH_BAD;
|
|
||||||
unit = 0;
|
|
||||||
|
|
||||||
if ((*name == '/' && deveqn ("/dev/", 5)) ||
|
|
||||||
(*name == '\\' && deveqn ("\\dev\\", 5)))
|
|
||||||
{
|
{
|
||||||
name += 5;
|
devn = FH_MEM;
|
||||||
if (deveq ("tty"))
|
unit = 4;
|
||||||
{
|
|
||||||
if (real_tty_attached (myself))
|
|
||||||
{
|
|
||||||
unit = myself->ctty;
|
|
||||||
devn = FH_TTYS;
|
|
||||||
}
|
|
||||||
else if (myself->ctty > 0)
|
|
||||||
devn = FH_CONSOLE;
|
|
||||||
}
|
|
||||||
else if (deveqn ("tty", 3) && (unit = digits (name + 3)) >= 0)
|
|
||||||
devn = FH_TTYS;
|
|
||||||
else if (deveq ("ttym"))
|
|
||||||
devn = FH_TTYM;
|
|
||||||
else if (deveq ("ptmx"))
|
|
||||||
devn = FH_PTYM;
|
|
||||||
else if (deveq ("windows"))
|
|
||||||
devn = FH_WINDOWS;
|
|
||||||
else if (deveq ("dsp"))
|
|
||||||
devn = FH_OSS_DSP;
|
|
||||||
else if (deveq ("conin"))
|
|
||||||
devn = FH_CONIN;
|
|
||||||
else if (deveq ("conout"))
|
|
||||||
devn = FH_CONOUT;
|
|
||||||
else if (deveq ("null"))
|
|
||||||
devn = FH_NULL;
|
|
||||||
else if (deveq ("zero"))
|
|
||||||
devn = FH_ZERO;
|
|
||||||
else if (deveq ("random") || deveq ("urandom"))
|
|
||||||
{
|
|
||||||
devn = FH_RANDOM;
|
|
||||||
unit = 8 + (deveqn ("u", 1) ? 1 : 0); /* Keep unit Linux conformant */
|
|
||||||
}
|
|
||||||
else if (deveq ("mem"))
|
|
||||||
{
|
|
||||||
devn = FH_MEM;
|
|
||||||
unit = 1;
|
|
||||||
}
|
|
||||||
else if (deveq ("clipboard"))
|
|
||||||
devn = FH_CLIPBOARD;
|
|
||||||
else if (deveq ("port"))
|
|
||||||
{
|
|
||||||
devn = FH_MEM;
|
|
||||||
unit = 4;
|
|
||||||
}
|
|
||||||
else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0)
|
|
||||||
devn = FH_SERIAL;
|
|
||||||
else if (deveqn ("ttyS", 4) && (unit = digits (name + 4)) >= 0)
|
|
||||||
devn = FH_SERIAL;
|
|
||||||
else if (deveq ("pipe") || deveq ("piper") || deveq ("pipew"))
|
|
||||||
devn = FH_PIPE;
|
|
||||||
else if (deveq ("tcp") || deveq ("udp") || deveq ("streamsocket")
|
|
||||||
|| deveq ("dgsocket"))
|
|
||||||
devn = FH_SOCKET;
|
|
||||||
else if (!from_conv)
|
|
||||||
devn = get_raw_device_number (name - 5,
|
|
||||||
path_conv (name - 5,
|
|
||||||
PC_SYM_IGNORE).get_win32 (),
|
|
||||||
unit);
|
|
||||||
}
|
}
|
||||||
else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0)
|
else if (deveqn ("com", 3) && (unit = digits (name + 3)) >= 0)
|
||||||
devn = FH_SERIAL;
|
devn = FH_SERIAL;
|
||||||
else if (deveqn ("ttyS", 4) && (unit = digits (name + 4)) >= 0)
|
else if (deveqn ("ttyS", 4) && (unit = digits (name + 4)) >= 0)
|
||||||
devn = FH_SERIAL;
|
devn = FH_SERIAL;
|
||||||
|
else if (deveq ("pipe") || deveq ("piper") || deveq ("pipew"))
|
||||||
|
devn = FH_PIPE;
|
||||||
|
else if (deveq ("tcp") || deveq ("udp") || deveq ("streamsocket")
|
||||||
|
|| deveq ("dgsocket"))
|
||||||
|
devn = FH_SOCKET;
|
||||||
|
|
||||||
|
return devn;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_raw_device_number (const char *unix_path, const char *w32_path, int &unit)
|
||||||
|
{
|
||||||
|
int devn;
|
||||||
|
w32_path += 4;
|
||||||
|
if (wdeveqn ("tape", 8))
|
||||||
|
{
|
||||||
|
unit = digits (w32_path + 4);
|
||||||
|
// norewind tape devices have leading n in name
|
||||||
|
if (udeveqn ("/dev/n", 6))
|
||||||
|
unit += 128;
|
||||||
|
devn = FH_TAPE;
|
||||||
|
}
|
||||||
|
else if (isdrive (w32_path))
|
||||||
|
{
|
||||||
|
unit = cyg_tolower (w32_path[0]) - 'a';
|
||||||
|
devn = FH_FLOPPY;
|
||||||
|
}
|
||||||
|
else if (wdeveqn ("physicaldrive", 17))
|
||||||
|
{
|
||||||
|
unit = digits (w32_path + 13) + 128;
|
||||||
|
devn = FH_FLOPPY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
devn = FH_BAD;
|
||||||
|
return devn;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __stdcall get_device_number (const char *unix_path,
|
||||||
|
const char *w32_path, int &unit)
|
||||||
|
__attribute__ ((regparm(3)));
|
||||||
|
static int __stdcall
|
||||||
|
get_device_number (const char *unix_path, const char *w32_path, int &unit)
|
||||||
|
{
|
||||||
|
DWORD devn = FH_BAD;
|
||||||
|
unit = 0;
|
||||||
|
|
||||||
|
if (*unix_path == '/' && udeveqn ("/dev/", 5))
|
||||||
|
devn = get_devn (unix_path, unit);
|
||||||
|
if (devn == FH_BAD && *w32_path == '\\' && wdeveqn ("\\dev\\", 5))
|
||||||
|
devn = get_devn (w32_path, unit);
|
||||||
|
if (devn == FH_BAD && udeveqn ("com", 3)
|
||||||
|
&& (unit = digits (unix_path + 3)) >= 0)
|
||||||
|
devn = FH_SERIAL;
|
||||||
|
else if (strncmp (w32_path, "\\\\.\\", 4) == 0)
|
||||||
|
devn = get_raw_device_number (unix_path, w32_path, unit);
|
||||||
|
|
||||||
return devn;
|
return devn;
|
||||||
}
|
}
|
||||||
|
@ -882,7 +895,7 @@ win32_device_name (const char *src_path, char *win32_path,
|
||||||
{
|
{
|
||||||
const char *devfmt;
|
const char *devfmt;
|
||||||
|
|
||||||
devn = get_device_number (src_path, unit, TRUE);
|
devn = get_device_number (src_path, "", unit);
|
||||||
|
|
||||||
if (devn == FH_BAD)
|
if (devn == FH_BAD)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1298,6 +1311,8 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
|
||||||
*flags = mi->flags;
|
*flags = mi->flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
devn = get_device_number (src_path, dst, unit);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
if (chroot_ok || cygheap->root.ischroot_native (dst))
|
if (chroot_ok || cygheap->root.ischroot_native (dst))
|
||||||
|
|
|
@ -148,8 +148,6 @@ class path_conv
|
||||||
|
|
||||||
/* Maximum depth of symlinks (after which ELOOP is issued). */
|
/* Maximum depth of symlinks (after which ELOOP is issued). */
|
||||||
#define MAX_LINK_DEPTH 10
|
#define MAX_LINK_DEPTH 10
|
||||||
|
|
||||||
int __stdcall get_device_number (const char *name, int &unit, BOOL from_conv = FALSE) __attribute__ ((regparm(3)));
|
|
||||||
int __stdcall slash_unc_prefix_p (const char *path) __attribute__ ((regparm(1)));
|
int __stdcall slash_unc_prefix_p (const char *path) __attribute__ ((regparm(1)));
|
||||||
|
|
||||||
const char * __stdcall find_exec (const char *name, path_conv& buf, const char *winenv = "PATH=",
|
const char * __stdcall find_exec (const char *name, path_conv& buf, const char *winenv = "PATH=",
|
||||||
|
|
|
@ -322,13 +322,13 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
||||||
si.cbReserved2 = sizeof (ciresrv);
|
si.cbReserved2 = sizeof (ciresrv);
|
||||||
|
|
||||||
DWORD chtype;
|
DWORD chtype;
|
||||||
if (mode != _P_OVERLAY && mode != _P_VFORK)
|
if (mode != _P_OVERLAY)
|
||||||
chtype = PROC_SPAWN;
|
chtype = PROC_SPAWN;
|
||||||
else
|
else
|
||||||
chtype = PROC_EXEC;
|
chtype = PROC_EXEC;
|
||||||
|
|
||||||
HANDLE spr;
|
HANDLE spr;
|
||||||
if (mode != _P_OVERLAY)
|
if (chtype != PROC_EXEC)
|
||||||
spr = NULL;
|
spr = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -336,7 +336,8 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
||||||
ProtectHandle (spr);
|
ProtectHandle (spr);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_child_info (chtype, &ciresrv, (mode == _P_OVERLAY) ? myself->pid : 1, spr);
|
init_child_info (chtype, &ciresrv, (mode == _P_OVERLAY) ? myself->pid : 1,
|
||||||
|
spr);
|
||||||
if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &ciresrv.parent, 0, 1,
|
if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &ciresrv.parent, 0, 1,
|
||||||
DUPLICATE_SAME_ACCESS))
|
DUPLICATE_SAME_ACCESS))
|
||||||
{
|
{
|
||||||
|
@ -674,7 +675,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
||||||
&pi);
|
&pi);
|
||||||
/* Restore impersonation. In case of _P_OVERLAY this isn't
|
/* Restore impersonation. In case of _P_OVERLAY this isn't
|
||||||
allowed since it would overwrite child data. */
|
allowed since it would overwrite child data. */
|
||||||
if (mode != _P_OVERLAY && mode != _P_VFORK
|
if (mode != _P_OVERLAY
|
||||||
&& cygheap->user.impersonated
|
&& cygheap->user.impersonated
|
||||||
&& cygheap->user.token != INVALID_HANDLE_VALUE)
|
&& cygheap->user.token != INVALID_HANDLE_VALUE)
|
||||||
ImpersonateLoggedOnUser (cygheap->user.token);
|
ImpersonateLoggedOnUser (cygheap->user.token);
|
||||||
|
@ -746,6 +747,13 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
|
||||||
child->hProcess = pi.hProcess;
|
child->hProcess = pi.hProcess;
|
||||||
child.remember ();
|
child.remember ();
|
||||||
strcpy (child->progname, real_path);
|
strcpy (child->progname, real_path);
|
||||||
|
/* FIXME: This introduces an unreferenced, open handle into the child.
|
||||||
|
The purpose is to keep the pid shared memory open so that all of
|
||||||
|
the fields filled out by child.remember do not disappear and so there
|
||||||
|
is not a brief period during which the pid is not available.
|
||||||
|
However, we should try to find another way to do this eventually. */
|
||||||
|
(void) DuplicateHandle (hMainProc, child.shared_handle (), pi.hProcess,
|
||||||
|
NULL, 0, 0, DUPLICATE_SAME_ACCESS);
|
||||||
/* Start the child running */
|
/* Start the child running */
|
||||||
ResumeThread (pi.hThread);
|
ResumeThread (pi.hThread);
|
||||||
}
|
}
|
||||||
|
|
|
@ -501,7 +501,7 @@ _open (const char *unix_path, int flags, ...)
|
||||||
if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path,
|
if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path,
|
||||||
NULL, pc)))
|
NULL, pc)))
|
||||||
res = -1; // errno already set
|
res = -1; // errno already set
|
||||||
else if (!fh->open (pc, flags, (mode & 07777) & ~cygheap->umask))
|
else if (!fh->open (&pc, flags, (mode & 07777) & ~cygheap->umask))
|
||||||
{
|
{
|
||||||
cygheap->fdtab.release (fd);
|
cygheap->fdtab.release (fd);
|
||||||
res = -1;
|
res = -1;
|
||||||
|
@ -1107,7 +1107,7 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
debug_printf ("%d = file_attributes for '%s'", (DWORD) real_path,
|
debug_printf ("%d = file_attributes for '%s'", (DWORD) real_path,
|
||||||
(char *) real_path);
|
(char *) real_path);
|
||||||
|
|
||||||
if ((oret = fh->open (real_path, open_flags, 0)))
|
if ((oret = fh->open (&real_path, open_flags, 0)))
|
||||||
/* ok */;
|
/* ok */;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1115,7 +1115,7 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
/* If we couldn't open the file, try a "query open" with no permissions.
|
/* If we couldn't open the file, try a "query open" with no permissions.
|
||||||
This will allow us to determine *some* things about the file, at least. */
|
This will allow us to determine *some* things about the file, at least. */
|
||||||
fh->set_query_open (TRUE);
|
fh->set_query_open (TRUE);
|
||||||
if ((oret = fh->open (real_path, open_flags, 0)))
|
if ((oret = fh->open (&real_path, open_flags, 0)))
|
||||||
/* ok */;
|
/* ok */;
|
||||||
else if (allow_ntsec && real_path.has_acls () && get_errno () == EACCES
|
else if (allow_ntsec && real_path.has_acls () && get_errno () == EACCES
|
||||||
&& !get_file_attribute (TRUE, real_path, &ntsec_atts, &uid, &gid)
|
&& !get_file_attribute (TRUE, real_path, &ntsec_atts, &uid, &gid)
|
||||||
|
@ -1127,7 +1127,7 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
||||||
in a failing open call in the same process. Check that
|
in a failing open call in the same process. Check that
|
||||||
case. */
|
case. */
|
||||||
set_file_attribute (TRUE, real_path, 0400);
|
set_file_attribute (TRUE, real_path, 0400);
|
||||||
oret = fh->open (real_path, open_flags, 0);
|
oret = fh->open (&real_path, open_flags, 0);
|
||||||
set_file_attribute (TRUE, real_path, ntsec_atts);
|
set_file_attribute (TRUE, real_path, ntsec_atts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue