Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-10-21 08:53:49 +0400
committerChristopher Faylor <me@cgf.cx>2000-10-21 08:53:49 +0400
commitb0de2aa284ccb58f1c8f8e0a598701b51ab5b742 (patch)
treee9de21c89264e0f9987ab88dab845446c1b4bc45 /winsup/cygwin
parente9921bcbaa37b9c3df39ef1d8182d56a9db3cb11 (diff)
* 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.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog15
-rw-r--r--winsup/cygwin/fhandler.h2
-rw-r--r--winsup/cygwin/fhandler_console.cc9
-rw-r--r--winsup/cygwin/fhandler_termios.cc3
-rw-r--r--winsup/cygwin/fork.cc19
-rw-r--r--winsup/cygwin/pinfo.cc15
-rw-r--r--winsup/cygwin/signal.cc28
-rw-r--r--winsup/cygwin/spawn.cc2
8 files changed, 57 insertions, 36 deletions
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 <cgf@cygnus.com>
+
+ * 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 <dj@redhat.com>
* 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 (" ");