diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 8bd756453..575e0f69f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,18 @@ +Sat Oct 21 00:46:36 2000 Christopher Faylor + + * fhandler.h (fhandler_console): Remove tcsetpgrp. + * fhandler_console.cc (fhandler_console::tcsetpgrp): Eliminate. + * fork.cc (fork_parent): Avoid returning same pid twice in a row + regardless of OS. + * pinfo.cc (pinfo::init): Rename create argument to flags and treat it + as such. + * signal.cc (set_sigcatchers): New function. + (signal): Use set_sigcatchers to increment or decrement sigcatcher + tracker. + (sigaction): Ditto. Add debugging output. + * spawn.cc (spawn_guts): Always quote first argv[0] argument when it's + a COMSPEC shell. + 2000-10-20 DJ Delorie * times.cc (to_time_t): pass zero time as epoch diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index d9219f6b9..3b984572c 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -607,8 +607,6 @@ public: int tcsetattr (int a, const struct termios *t); int tcgetattr (struct termios *t); - int tcsetpgrp (const pid_t pid); - /* Special dup as we must dup two handles */ int dup (fhandler_base *child); diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 4da619b4b..8a3343d86 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -188,8 +188,8 @@ fhandler_console::read (void *pv, size_t buflen) if (!ReadConsoleInput (h, &input_rec, 1, &nread)) { - syscall_printf ("ReadConsoleInput failed, %E"); __seterrno (); + syscall_printf ("ReadConsoleInput failed, %E"); return -1; /* seems to be failure */ } @@ -252,13 +252,6 @@ fhandler_console::read (void *pv, size_t buflen) return copied_chars; } -int -fhandler_console::tcsetpgrp (pid_t pid) -{ - tc->pgid = pid; - return 0; -} - void fhandler_console::set_input_state () { diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc index 9a91cb915..014e7d104 100644 --- a/winsup/cygwin/fhandler_termios.cc +++ b/winsup/cygwin/fhandler_termios.cc @@ -293,9 +293,6 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) if (!iscanon || always_accept) set_input_done (ralen > 0); - /* FIXME: It's not clear that this code will ever do anything. - Currently, it doesn't look like accept_input will ever return - a negative number. */ if (input_done) (void) accept_input (); diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index a883ed553..0c8df30cd 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -443,14 +443,17 @@ fork_parent (void *stack_here, HANDLE& hParent, dll *&first_dll, bool& load_dlls /* Protect the handle but name it similarly to the way it will be called in subproc handling. */ ProtectHandle1 (pi.hProcess, childhProc); - if (os_being_run != winNT) - { - if (last_fork_proc) - CloseHandle (last_fork_proc); - if (!DuplicateHandle (hMainProc, pi.hProcess, hMainProc, &last_fork_proc, - 0, FALSE, DUPLICATE_SAME_ACCESS)) - system_printf ("couldn't create last_fork_proc, %E"); - } + + /* Keep a handle to the current forked process sitting around to prevent + Windows from reusing the same pid twice in a row. Having the same pid + twice in a row confuses bash. So, after every CreateProcess, we can safely + remove the old pid and save a handle to the newly created process. Keeping + a handle open will stop windows from reusing the same pid. */ + if (last_fork_proc) + CloseHandle (last_fork_proc); + if (!DuplicateHandle (hMainProc, pi.hProcess, hMainProc, &last_fork_proc, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + system_printf ("couldn't create last_fork_proc, %E"); /* Fill in fields in the child's process table entry. */ forked->ppid = myself->pid; diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index e1a195c7b..099e961e1 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -134,7 +134,7 @@ _pinfo::exit (UINT n, bool norecord) } void -pinfo::init (pid_t n, DWORD create, HANDLE in_h) +pinfo::init (pid_t n, DWORD flag, HANDLE in_h) { if (n == myself->pid) { @@ -144,6 +144,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) return; } + int createit = flag & PID_IN_USE; for (int i = 0; i < 10; i++) { int created; @@ -151,7 +152,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) __small_sprintf (mapname, "cygpid.%x", n); int mapsize; - if (create & PID_EXECED) + if (flag & PID_EXECED) mapsize = PINFO_REDIR_SIZE; else mapsize = sizeof (_pinfo); @@ -161,7 +162,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) h = in_h; created = 0; } - else if (!create) + else if (!createit) { h = OpenFileMappingA (FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapname); created = 0; @@ -175,7 +176,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) if (!h) { - if (create) + if (createit) __seterrno (); procinfo = NULL; return; @@ -184,7 +185,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) procinfo = (_pinfo *) MapViewOfFile (h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); ProtectHandle1 (h, pinfo_shared_handle); - if ((procinfo->process_state & PID_INITIALIZING) && (create & PID_NOREDIR)) + if ((procinfo->process_state & PID_INITIALIZING) && (flag & PID_NOREDIR)) { release (); set_errno (ENOENT); @@ -208,7 +209,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) should only be a brief occurrence, so rather than introduce some kind of locking mechanism, just loop. FIXME: I'm sure I'll regret doing it this way at some point. */ - if (i < 9 && !created && create && (procinfo->process_state & PID_EXITED)) + if (i < 9 && !created && createit && (procinfo->process_state & PID_EXITED)) { Sleep (5); release (); @@ -217,7 +218,7 @@ pinfo::init (pid_t n, DWORD create, HANDLE in_h) if (!created) /* nothing */; - else if (!(create & PID_EXECED)) + else if (!(flag & PID_EXECED)) procinfo->pid = n; else { diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc index 7ed6e4df2..11d0921b0 100644 --- a/winsup/cygwin/signal.cc +++ b/winsup/cygwin/signal.cc @@ -23,6 +23,23 @@ int sigcatchers; /* FIXME: Not thread safe. */ #define sigtrapped(func) ((func) != SIG_IGN && (func) != SIG_DFL) +static inline void +set_sigcatchers (void (*oldsig) (int), void (*cursig) (int)) +{ +#ifdef DEBUGGING + int last_sigcatchers = sigcatchers; +#endif + if (!sigtrapped (oldsig) && sigtrapped (cursig)) + sigcatchers++; + else if (sigtrapped (oldsig) && !sigtrapped (cursig)) + sigcatchers--; +#ifdef DEBUGGING + if (last_sigcatchers != sigcatchers) + sigproc_printf ("last %d, old %d, cur %p, cur %p", last_sigcatchers, + sigcatchers, oldsig, cursig); +#endif +} + extern "C" _sig_func_ptr signal (int sig, _sig_func_ptr func) { @@ -39,10 +56,7 @@ signal (int sig, _sig_func_ptr func) prev = myself->getsig (sig).sa_handler; myself->getsig (sig).sa_handler = func; myself->getsig (sig).sa_mask = 0; - if (!sigtrapped (prev) && sigtrapped (func)) - sigcatchers++; - else if (sigtrapped (prev) && !sigtrapped (func)) - sigcatchers--; + set_sigcatchers (prev, func); syscall_printf ("%p = signal (%d, %p)", prev, sig, func); return prev; @@ -235,6 +249,7 @@ killpg (int pgrp, int sig) extern "C" int sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact) { + sigproc_printf ("sig %d, newact %p, oldact %p", sig, newact, oldact); /* check that sig is in right range */ if (sig < 0 || sig >= NSIG) { @@ -257,10 +272,7 @@ sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact) sig_clear (sig); if (newact->sa_handler == SIG_DFL && sig == SIGCHLD) sig_clear (sig); - if (!sigtrapped (oa.sa_handler) && sigtrapped (newact->sa_handler)) - sigcatchers++; - else if (sigtrapped (oa.sa_handler) && !sigtrapped (newact->sa_handler)) - sigcatchers--; + set_sigcatchers (oa.sa_handler, newact->sa_handler); } if (oldact) diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index fcd21b7a9..f6aafd7cf 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -352,10 +352,12 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv, (iscmd (argv[0], "command.com") || iscmd (argv[0], "cmd.exe"))) { real_path.check (prog_arg); + one_line.add ("\""); if (!real_path.error) one_line.add (real_path); else one_line.add (argv[0]); + one_line.add ("\""); one_line.add (" "); one_line.add (argv[1]); one_line.add (" ");