* dtable.cc (dtable::release): Check for socket. Change
cnt_need_fixup_before accordingly. (dtable::dup2): Ditto. (dtable::fixup_before_fork): New method. (dtable::fixup_before_exec): Ditto. * dtable.h (class dtable): Add member `cnt_need_fixup_before'. Add definition for methods `dec_need_fixup_before', `inc_need_fixup_before', `need_fixup_before', `fixup_before_exec' and `fixup_before_fork'. * fhandler.h (class fhandler_base): Slight rearrangements. Add definitions for methods `fixup_before_fork_exec'. (class fhandler_socket): Eliminate superfluous constructor. Add member `prot_info_ptr'. Add destructor. Add definitions for methods `dup', `fixup_before_fork_exec', `fixup_after_fork' and `fixup_after_exec'. * fork.cc (fork_parent): Care for file types which need a fixup before fork. Start child in suspended state then. * net.cc: New global variable `ws2_32_handle' and `wsadata'. (fdsock): Check for Winsock version. Call `set_socket_inheritance' only if Winsock version < 2.0. Care for `need_fixup' count in fdtab. (cygwin_socket): Eliminate call to `set_socket_inheritance'. (cygwin_accept): Ditto. (cygwin_rcmd): Ditto. (cygwin_rresvport): Ditto. (cygwin_rexec): Ditto. (socketpair): Ditto. (fhandler_socket::fhandler_socket): Set `need_fork_fixup'. Allocate space for the WSAPROTOCOL_INFOA struct used in fixup. (fhandler_socket::~fhandler_socket): New destructor. (fhandler_socket::fixup_before_fork_exec): New method. (fhandler_socket::fixup_after_fork): Ditto. (fhandler_socket::dup): Ditto. (wsock_init): New static function. (LoadDLLinitfunc (wsock32)): Rearranged. (LoadDLLinitfunc (ws2_32)): New function. (dummy_autoload): Add autoload statemants for `WSADuplicateSocketA' and `WSASocketA'. * spawn.cc (spawn_guts): Care for file types which need a fixup before exec. Start child in suspended state then.
This commit is contained in:
@@ -197,7 +197,10 @@ public:
|
||||
void set_need_fork_fixup () { FHSETF (FFIXUP); }
|
||||
|
||||
virtual void set_close_on_exec (int val);
|
||||
virtual void fixup_after_fork (HANDLE parent);
|
||||
|
||||
virtual void fixup_before_fork_exec (DWORD) {}
|
||||
virtual void fixup_after_fork (HANDLE);
|
||||
virtual void fixup_after_exec (HANDLE) {}
|
||||
|
||||
int get_symlink_p () { return FHISSETF (SYMLINK); }
|
||||
void set_symlink_p (int val) { FHCONDSETF (val, SYMLINK); }
|
||||
@@ -291,8 +294,6 @@ public:
|
||||
virtual int raw_read (void *ptr, size_t ulen);
|
||||
virtual int raw_write (const void *ptr, size_t ulen);
|
||||
|
||||
virtual void fixup_after_exec (HANDLE) {}
|
||||
|
||||
/* Virtual accessor functions to hide the fact
|
||||
that some fd's have two handles. */
|
||||
virtual HANDLE get_handle () const { return io_handle; }
|
||||
@@ -320,9 +321,11 @@ class fhandler_socket: public fhandler_base
|
||||
{
|
||||
private:
|
||||
int addr_family;
|
||||
struct _WSAPROTOCOL_INFOA *prot_info_ptr;
|
||||
|
||||
public:
|
||||
fhandler_socket (const char *name = 0);
|
||||
fhandler_socket (unsigned int, const char *name = 0);
|
||||
~fhandler_socket ();
|
||||
int get_socket () const { return (int) get_handle(); }
|
||||
fhandler_socket * is_socket () { return this; }
|
||||
int write (const void *ptr, size_t len);
|
||||
@@ -332,6 +335,11 @@ public:
|
||||
off_t lseek (off_t, int) { return 0; }
|
||||
int close ();
|
||||
void hclose (HANDLE) {close ();}
|
||||
int dup (fhandler_base *child);
|
||||
|
||||
virtual void fixup_before_fork_exec (DWORD);
|
||||
void fixup_after_fork (HANDLE);
|
||||
void fixup_after_exec (HANDLE parent) { fixup_after_fork (parent); }
|
||||
|
||||
select_record *select_read (select_record *s);
|
||||
select_record *select_write (select_record *s);
|
||||
|
Reference in New Issue
Block a user