diff options
author | Christopher Faylor <me@cgf.cx> | 2001-10-04 02:34:20 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2001-10-04 02:34:20 +0000 |
commit | 8af0f81d522b3143ad6fcd5504e4b2ccc7c5b856 (patch) | |
tree | c0bd0012ea7fe135f321aea6b48fed3601ec6517 /winsup/cygwin/path.cc | |
parent | 34d2d0397582c6ce0d5a4df984a83766cd752c33 (diff) | |
download | cygnal-8af0f81d522b3143ad6fcd5504e4b2ccc7c5b856.tar.gz cygnal-8af0f81d522b3143ad6fcd5504e4b2ccc7c5b856.tar.bz2 cygnal-8af0f81d522b3143ad6fcd5504e4b2ccc7c5b856.zip |
* 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.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 183 |
1 files changed, 99 insertions, 84 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 2aa19e1aa..07f890f12 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)) |