aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog50
-rw-r--r--winsup/cygwin/dcrt0.cc3
-rw-r--r--winsup/cygwin/fhandler.cc65
-rw-r--r--winsup/cygwin/fhandler.h37
-rw-r--r--winsup/cygwin/fhandler_clipboard.cc4
-rw-r--r--winsup/cygwin/fhandler_console.cc10
-rw-r--r--winsup/cygwin/fhandler_dsp.cc13
-rw-r--r--winsup/cygwin/fhandler_floppy.cc4
-rw-r--r--winsup/cygwin/fhandler_mem.cc2
-rw-r--r--winsup/cygwin/fhandler_random.cc2
-rw-r--r--winsup/cygwin/fhandler_raw.cc7
-rw-r--r--winsup/cygwin/fhandler_serial.cc4
-rw-r--r--winsup/cygwin/fhandler_socket.cc2
-rw-r--r--winsup/cygwin/fhandler_tape.cc15
-rw-r--r--winsup/cygwin/fhandler_tty.cc4
-rw-r--r--winsup/cygwin/fhandler_windows.cc2
-rw-r--r--winsup/cygwin/fhandler_zero.cc2
-rw-r--r--winsup/cygwin/fork.cc2
-rw-r--r--winsup/cygwin/path.cc183
-rw-r--r--winsup/cygwin/path.h2
-rw-r--r--winsup/cygwin/spawn.cc16
-rw-r--r--winsup/cygwin/syscalls.cc8
22 files changed, 229 insertions, 208 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f05a465..76c6f5d 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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>
* cygheap.cc (cfree): Remove malloc debugging probe.
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 656b3ce..58f40ce 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -598,7 +598,8 @@ dll_crt0_1 ()
ProtectHandle (child_proc_info->forker_finished);
break;
case PROC_SPAWN:
- CloseHandle (spawn_info->hexec_proc);
+ if (spawn_info->hexec_proc)
+ CloseHandle (spawn_info->hexec_proc);
goto around;
case PROC_EXEC:
hexec_proc = spawn_info->hexec_proc;
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 54adc8d..0bad75c 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -305,16 +305,9 @@ fhandler_base::get_default_fmode (int flags)
return __fmode;
}
+/* Open system call handler function. */
int
-fhandler_base::open (path_conv& real_path, 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)
+fhandler_base::open (path_conv *, int flags, mode_t mode)
{
int res = 0;
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 ())
set_security_attribute (mode, &sa, alloca (4096), 4096);
- x = CreateFileA (get_win32_name (), access, shared,
- &sa, creation_distribution,
- file_attributes,
- 0);
+ x = CreateFile (get_win32_name (), access, shared, &sa, creation_distribution,
+ file_attributes, 0);
syscall_printf ("%p = CreateFileA (%s, %p, %p, %p, %p, %p, 0)",
- x, get_win32_name (), access, shared,
- &sa, creation_distribution,
- file_attributes);
+ x, get_win32_name (), access, shared, &sa,
+ creation_distribution, file_attributes);
if (x == INVALID_HANDLE_VALUE)
{
@@ -1231,44 +1221,21 @@ fhandler_disk_file::fhandler_disk_file (const char *name) :
}
int
-fhandler_disk_file::open (const char *path, int flags, mode_t mode)
-{
- syscall_printf ("(%s, %p)", path, flags);
-
- /* 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)
+fhandler_disk_file::open (path_conv *real_path, int flags, mode_t mode)
{
- if (real_path.isbinary ())
+ if (real_path->isbinary ())
{
set_r_binary (1);
set_w_binary (1);
}
- set_has_acls (real_path.has_acls ());
- set_isremote (real_path.isremote ());
+ set_has_acls (real_path->has_acls ());
+ set_isremote (real_path->isremote ());
- if (real_path.isdir ())
+ if (real_path->isdir ())
flags |= O_DIROPEN;
- int res = this->fhandler_base::open (flags, mode);
+ int res = this->fhandler_base::open (real_path, flags, mode);
if (!res)
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
which returns a valid handle when trying to open a file in a nonexistent
directory. */
- if (real_path.has_buggy_open ()
+ if (real_path->has_buggy_open ()
&& GetFileAttributes (win32_path_name) == (DWORD) -1)
{
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)
SetFilePointer (get_handle(), 0, 0, FILE_END);
- set_symlink_p (real_path.issymlink ());
- set_execable_p (real_path.exec_state ());
- set_socket_p (real_path.issocket ());
+ set_symlink_p (real_path->issymlink ());
+ set_execable_p (real_path->exec_state ());
+ set_socket_p (real_path->issocket ());
out:
syscall_printf ("%d = fhandler_disk_file::open (%s, %p)", res,
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 59cf14f..6f80b61 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -311,13 +311,7 @@ public:
/* fixup fd possibly non-inherited handles after fork */
void fork_fixup (HANDLE parent, HANDLE &h, const char *name);
- /* Potentially overridden virtual functions. */
- 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 open (path_conv * real_path, int flags, mode_t mode = 0);
virtual int close ();
virtual int fstat (struct stat *buf) { return stat_dev (get_device (), get_unit (), get_namehash (), buf); }
virtual int ioctl (unsigned int cmd, void *);
@@ -481,7 +475,7 @@ protected:
public:
~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 raw_read (void *ptr, size_t ulen);
@@ -506,7 +500,7 @@ protected:
public:
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 off_t lseek (off_t offset, int whence);
@@ -528,7 +522,7 @@ protected:
public:
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 off_t lseek (off_t offset, int whence);
@@ -559,8 +553,7 @@ class fhandler_disk_file: public fhandler_base
public:
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 lock (int, struct flock *);
BOOL is_device () { return FALSE; }
@@ -587,7 +580,7 @@ public:
/* Constructor */
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 ();
void init (HANDLE h, DWORD a, mode_t flags);
void overlapped_setup ();
@@ -750,7 +743,7 @@ public:
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);
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 (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 read (void *ptr, size_t len);
void init (HANDLE, DWORD, mode_t);
@@ -850,7 +843,7 @@ public:
int process_slave_output (char *buf, size_t len, int pktmode_on);
void doecho (const void *str, DWORD len);
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 read (void *ptr, size_t len);
int close ();
@@ -896,7 +889,7 @@ class fhandler_dev_zero: public fhandler_base
{
public:
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 read (void *ptr, size_t len);
off_t lseek (off_t offset, int whence);
@@ -919,7 +912,7 @@ protected:
public:
fhandler_dev_random (const char *name, int 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 read (void *ptr, size_t len);
off_t lseek (off_t offset, int whence);
@@ -940,7 +933,7 @@ public:
fhandler_dev_mem (const char *name, int unit);
~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 read (void *ptr, size_t ulen);
off_t lseek (off_t offset, int whence);
@@ -962,7 +955,7 @@ class fhandler_dev_clipboard: public fhandler_base
public:
fhandler_dev_clipboard (const char *name);
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 read (void *ptr, size_t len);
off_t lseek (off_t offset, int whence);
@@ -987,7 +980,7 @@ private:
public:
fhandler_windows (const char *name = 0);
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 read (void *ptr, size_t len);
int ioctl (unsigned int cmd, void *);
@@ -1014,7 +1007,7 @@ public:
fhandler_dev_dsp (const char *name = 0);
~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 read (void *ptr, size_t len);
int ioctl (unsigned int cmd, void *);
diff --git a/winsup/cygwin/fhandler_clipboard.cc b/winsup/cygwin/fhandler_clipboard.cc
index 6a22855..489dd7f 100644
--- a/winsup/cygwin/fhandler_clipboard.cc
+++ b/winsup/cygwin/fhandler_clipboard.cc
@@ -56,7 +56,7 @@ fhandler_dev_clipboard::dup (fhandler_base * 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");
fhc->membuffer = membuffer;
@@ -67,7 +67,7 @@ fhandler_dev_clipboard::dup (fhandler_base * child)
}
int
-fhandler_dev_clipboard::open (const char *, int flags, mode_t)
+fhandler_dev_clipboard::open (path_conv *, int flags, mode_t)
{
set_flags (flags);
eof = false;
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 9dd98e7..3756ad2 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -542,7 +542,7 @@ fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn)
}
int
-fhandler_console::open (const char *, int flags, mode_t)
+fhandler_console::open (path_conv *, int flags, mode_t)
{
HANDLE h;
@@ -617,7 +617,7 @@ fhandler_console::dup (fhandler_base *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");
fhc->default_color = default_color;
@@ -1723,7 +1723,7 @@ fhandler_console::init (HANDLE f, DWORD a, mode_t bin)
mode = O_WRONLY;
if (a == (GENERIC_READ | GENERIC_WRITE))
mode = O_RDWR;
- open (0, mode);
+ open ((path_conv *) NULL, mode);
if (f != INVALID_HANDLE_VALUE)
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
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");
if (!get_close_on_exec ())
@@ -1782,7 +1782,7 @@ fhandler_console::fixup_after_exec (HANDLE)
HANDLE h = get_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;
if (!get_io_handle ())
diff --git a/winsup/cygwin/fhandler_dsp.cc b/winsup/cygwin/fhandler_dsp.cc
index 914caee..601bcbe 100644
--- a/winsup/cygwin/fhandler_dsp.cc
+++ b/winsup/cygwin/fhandler_dsp.cc
@@ -431,7 +431,7 @@ fhandler_dev_dsp::~fhandler_dev_dsp ()
}
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
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;
// Work out initial sample format & frequency
- if (strcmp (path, "/dev/dsp") == 0L)
- {
// dev/dsp defaults
- audioformat_ = AFMT_S8;
- audiofreq_ = 8000;
- audiobits_ = 8;
- audiochannels_ = 1;
- }
+ audioformat_ = AFMT_S8;
+ audiofreq_ = 8000;
+ audiobits_ = 8;
+ audiochannels_ = 1;
if (!s_audio->open (audiofreq_, audiobits_, audiochannels_))
debug_printf ("/dev/dsp: failed to open\n");
diff --git a/winsup/cygwin/fhandler_floppy.cc b/winsup/cygwin/fhandler_floppy.cc
index 994bba9..3c351db 100644
--- a/winsup/cygwin/fhandler_floppy.cc
+++ b/winsup/cygwin/fhandler_floppy.cc
@@ -46,7 +46,7 @@ fhandler_dev_floppy::fhandler_dev_floppy (const char *name, int unit) : fhandler
}
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,
* 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!
*/
devbufsiz = 61440L; /* 512L; */
- return fhandler_dev_raw::open (path, flags);
+ return fhandler_dev_raw::open (real_path, flags);
}
int
diff --git a/winsup/cygwin/fhandler_mem.cc b/winsup/cygwin/fhandler_mem.cc
index b6b461a..d99ab1c 100644
--- a/winsup/cygwin/fhandler_mem.cc
+++ b/winsup/cygwin/fhandler_mem.cc
@@ -72,7 +72,7 @@ fhandler_dev_mem::~fhandler_dev_mem (void)
}
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 ())
{
diff --git a/winsup/cygwin/fhandler_random.cc b/winsup/cygwin/fhandler_random.cc
index 71e9d5822..b6c9e1a 100644
--- a/winsup/cygwin/fhandler_random.cc
+++ b/winsup/cygwin/fhandler_random.cc
@@ -32,7 +32,7 @@ fhandler_dev_random::fhandler_dev_random (const char *name, int nunit)
}
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_open_status ();
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index 20f2de5..53d5906 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -131,17 +131,14 @@ fhandler_dev_raw::~fhandler_dev_raw (void)
}
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;
- set_name (path, real_path.get_win32 ());
-
/* Always open a raw device existing and binary. */
flags &= ~(O_CREAT | O_TRUNC);
flags |= O_BINARY;
- ret = fhandler_base::open (path, flags);
+ ret = fhandler_base::open (NULL, flags);
if (ret)
{
if (devbufsiz > 1L)
diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc
index 20ad4d8..c60ef99 100644
--- a/winsup/cygwin/fhandler_serial.cc
+++ b/winsup/cygwin/fhandler_serial.cc
@@ -212,7 +212,7 @@ fhandler_serial::init (HANDLE f, DWORD flags, mode_t bin)
}
int
-fhandler_serial::open (const char *name, int flags, mode_t mode)
+fhandler_serial::open (path_conv *, int flags, mode_t mode)
{
int res;
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)",
get_name (), flags, mode);
- if (name && !(res = this->fhandler_base::open (flags, mode)))
+ if (!(res = this->fhandler_base::open (NULL, flags, mode)))
return 0;
else
res = 1;
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index a34272f..01feff3 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -66,7 +66,7 @@ fhandler_socket::set_connect_secret ()
ENTROPY_SOURCE_DEV_UNIT);
}
if (entropy_source &&
- !entropy_source->open (ENTROPY_SOURCE_NAME, O_RDONLY))
+ !entropy_source->open (NULL, O_RDONLY))
{
delete entropy_source;
entropy_source = NULL;
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc
index 4856135..8b65892 100644
--- a/winsup/cygwin/fhandler_tape.cc
+++ b/winsup/cygwin/fhandler_tape.cc
@@ -61,28 +61,21 @@ fhandler_dev_tape::fhandler_dev_tape (const char *name, int unit) : fhandler_dev
}
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 minor;
- if (get_device_number (path, minor) != FH_TAPE)
- {
- set_errno (EINVAL);
- return -1;
- }
-
- norewind = (minor >= 128);
+ norewind = (real_path->get_unitn () >= 128);
devbufsiz = 1L;
- ret = fhandler_dev_raw::open (path, flags);
+ ret = fhandler_dev_raw::open (real_path, flags);
if (ret)
{
struct mtget get;
struct mtop op;
struct mtpos pos;
- if (! ioctl (MTIOCGET, &get))
+ if (!ioctl (MTIOCGET, &get))
/* Tape drive supports and is set to variable block size. */
if (get.mt_dsreg == 0)
devbufsiz = get.mt_maxblksize;
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 03f7d81..a279180 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -456,7 +456,7 @@ fhandler_tty_slave::fhandler_tty_slave (const char *name) :
/* FIXME: This function needs to close handles when it has
a failing condition. */
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]);
@@ -961,7 +961,7 @@ fhandler_pty_master::fhandler_pty_master (const char *name, DWORD devtype, int u
}
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);
if (ttynum < 0)
diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc
index 7a5870f..61499b6 100644
--- a/winsup/cygwin/fhandler_windows.cc
+++ b/winsup/cygwin/fhandler_windows.cc
@@ -55,7 +55,7 @@ fhandler_windows::fhandler_windows (const char *name) :
}
int
-fhandler_windows::open (const char *, int flags, mode_t)
+fhandler_windows::open (path_conv *, int flags, mode_t)
{
set_flags (flags);
set_close_on_exec_flag (1);
diff --git a/winsup/cygwin/fhandler_zero.cc b/winsup/cygwin/fhandler_zero.cc
index df86479..874dde0 100644
--- a/winsup/cygwin/fhandler_zero.cc
+++ b/winsup/cygwin/fhandler_zero.cc
@@ -22,7 +22,7 @@ fhandler_dev_zero::fhandler_dev_zero (const char *name)
}
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_open_status ();
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
index 640ae27..78d1abe 100644
--- a/winsup/cygwin/fork.cc
+++ b/winsup/cygwin/fork.cc
@@ -721,6 +721,7 @@ vfork ()
*pp = *esp;
int res = cygheap->fdtab.vfork_child_dup () ? 0 : -1;
debug_printf ("%d = vfork()", res);
+ debug_printf ("exiting vfork, res %d", res);
return res;
}
@@ -743,6 +744,7 @@ vfork ()
int pid = vf->pid;
vf->pid = 0;
+ debug_printf ("exiting vfork, pid %d", pid);
sig_dispatch_pending ();
return pid;
#endif
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 2aa19e1..07f890f 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -728,9 +728,6 @@ out:
#endif
}
-#define deveq(s) (strcasematch (name, (s)))
-#define deveqn(s, n) (strncasematch (name, (s), (n)))
-
static __inline int
digits (const char *name)
{
@@ -769,106 +766,122 @@ const char *windows_device_names[] NO_COPY =
"\\dev\\dsp"
};
-static int
-get_raw_device_number (const char *uxname, const char *w32path, int &unit)
+#define deveq(s) (strcasematch (name, (s)))
+#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 (deveq ("tty"))
+ {
+ 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;
- if (strncasematch (w32path, "\\\\.\\tape", 8))
+ 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))
{
- devn = FH_TAPE;
- unit = digits (w32path + 8);
+ unit = digits (w32_path + 4);
// norewind tape devices have leading n in name
- if (strncasematch (uxname, "/dev/n", 6))
+ if (udeveqn ("/dev/n", 6))
unit += 128;
+ devn = FH_TAPE;
}
- else if (isdrive (w32path + 4))
+ else if (isdrive (w32_path))
{
+ unit = cyg_tolower (w32_path[0]) - 'a';
devn = FH_FLOPPY;
- unit = cyg_tolower (w32path[4]) - 'a';
}
- else if (strncasematch (w32path, "\\\\.\\physicaldrive", 17))
+ else if (wdeveqn ("physicaldrive", 17))
{
+ unit = digits (w32_path + 13) + 128;
devn = FH_FLOPPY;
- unit = digits (w32path + 17) + 128;
}
+ else
+ devn = FH_BAD;
return devn;
}
-int __stdcall
-get_device_number (const char *name, int &unit, BOOL from_conv)
+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 ((*name == '/' && deveqn ("/dev/", 5)) ||
- (*name == '\\' && deveqn ("\\dev\\", 5)))
- {
- name += 5;
- if (deveq ("tty"))
- {
- 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)
- devn = FH_SERIAL;
- else if (deveqn ("ttyS", 4) && (unit = digits (name + 4)) >= 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;
}
@@ -882,7 +895,7 @@ win32_device_name (const char *src_path, char *win32_path,
{
const char *devfmt;
- devn = get_device_number (src_path, unit, TRUE);
+ devn = get_device_number (src_path, "", unit);
if (devn == FH_BAD)
return FALSE;
@@ -1298,6 +1311,8 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
*flags = mi->flags;
}
+ devn = get_device_number (src_path, dst, unit);
+
out:
MALLOC_CHECK;
if (chroot_ok || cygheap->root.ischroot_native (dst))
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index 1052deb..6778e27 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -148,8 +148,6 @@ class path_conv
/* Maximum depth of symlinks (after which ELOOP is issued). */
#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)));
const char * __stdcall find_exec (const char *name, path_conv& buf, const char *winenv = "PATH=",
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 0a0a84d..57f197e 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -322,13 +322,13 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
si.cbReserved2 = sizeof (ciresrv);
DWORD chtype;
- if (mode != _P_OVERLAY && mode != _P_VFORK)
+ if (mode != _P_OVERLAY)
chtype = PROC_SPAWN;
else
chtype = PROC_EXEC;
HANDLE spr;
- if (mode != _P_OVERLAY)
+ if (chtype != PROC_EXEC)
spr = NULL;
else
{
@@ -336,7 +336,8 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
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,
DUPLICATE_SAME_ACCESS))
{
@@ -674,7 +675,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
&pi);
/* Restore impersonation. In case of _P_OVERLAY this isn't
allowed since it would overwrite child data. */
- if (mode != _P_OVERLAY && mode != _P_VFORK
+ if (mode != _P_OVERLAY
&& cygheap->user.impersonated
&& cygheap->user.token != INVALID_HANDLE_VALUE)
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.remember ();
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 */
ResumeThread (pi.hThread);
}
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 2459f10..77681ca 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -501,7 +501,7 @@ _open (const char *unix_path, int flags, ...)
if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path,
NULL, pc)))
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);
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,
(char *) real_path);
- if ((oret = fh->open (real_path, open_flags, 0)))
+ if ((oret = fh->open (&real_path, open_flags, 0)))
/* ok */;
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.
This will allow us to determine *some* things about the file, at least. */
fh->set_query_open (TRUE);
- if ((oret = fh->open (real_path, open_flags, 0)))
+ if ((oret = fh->open (&real_path, open_flags, 0)))
/* ok */;
else if (allow_ntsec && real_path.has_acls () && get_errno () == EACCES
&& !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
case. */
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);
}
}