* spawn.cc (av::dup_maybe): Make function void rather than void *.
* environ.cc (environ_init): Remember to reparse CYGWIN if envp is supplied. * heap.cc (_sbrk): Remember frame for signal handling. * syscalls.cc (read_handler): Eliminate. (_read): Move read_handler code here. Reorganize for one path through 'ready_for_read'.
This commit is contained in:
parent
eb69b80812
commit
fb5956da13
|
@ -1,3 +1,13 @@
|
|||
2000-09-25 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* spawn.cc (av::dup_maybe): Make function void rather than void *.
|
||||
* environ.cc (environ_init): Remember to reparse CYGWIN if envp is
|
||||
supplied.
|
||||
* heap.cc (_sbrk): Remember frame for signal handling.
|
||||
* syscalls.cc (read_handler): Eliminate.
|
||||
(_read): Move read_handler code here. Reorganize for one path through
|
||||
'ready_for_read'.
|
||||
|
||||
Tue Sep 19 09:46:36 2000 Christopher Faylor <cgf@cygnus.com>
|
||||
|
||||
* spawn.cc (spawn_guts): Use actual program argument passed in for
|
||||
|
|
|
@ -524,6 +524,7 @@ environ_init (char **envp)
|
|||
char *p;
|
||||
char *newp;
|
||||
int sawTERM = 0;
|
||||
bool envp_passed_in;
|
||||
static char cygterm[] = "TERM=cygwin";
|
||||
|
||||
regopt ("default");
|
||||
|
@ -536,13 +537,16 @@ environ_init (char **envp)
|
|||
allow_ntsec = TRUE;
|
||||
#endif
|
||||
|
||||
if (envp)
|
||||
if (!envp)
|
||||
envp_passed_in = 0;
|
||||
else
|
||||
{
|
||||
sz = envsize (envp, 1);
|
||||
char **newenv = (char **) malloc (sz);
|
||||
memcpy (newenv, envp, sz);
|
||||
cfree (envp);
|
||||
envp = newenv;
|
||||
envp_passed_in = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -585,6 +589,12 @@ environ_init (char **envp)
|
|||
out:
|
||||
__cygwin_environ = envp;
|
||||
update_envptrs ();
|
||||
if (envp_passed_in)
|
||||
{
|
||||
p = getenv ("CYGWIN");
|
||||
if (p)
|
||||
parse_options (p);
|
||||
}
|
||||
parse_options (NULL);
|
||||
MALLOC_CHECK;
|
||||
}
|
||||
|
|
|
@ -86,6 +86,7 @@ heap_init ()
|
|||
extern "C" void *
|
||||
_sbrk(int n)
|
||||
{
|
||||
sigframe thisframe (mainthread);
|
||||
char *newtop, *newbrk;
|
||||
unsigned commitbytes, newbrksize;
|
||||
|
||||
|
|
|
@ -273,7 +273,7 @@ public:
|
|||
calloced = 1;
|
||||
}
|
||||
}
|
||||
void *dup_maybe (int i)
|
||||
void dup_maybe (int i)
|
||||
{
|
||||
if (i >= calloced)
|
||||
argv[i] = cstrdup (argv[i]);
|
||||
|
|
|
@ -194,24 +194,34 @@ setsid (void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
read_handler (int fd, void *ptr, size_t len)
|
||||
extern "C" int
|
||||
_read (int fd, void *ptr, size_t len)
|
||||
{
|
||||
int res;
|
||||
sigframe thisframe (mainthread);
|
||||
fhandler_base *fh = fdtab[fd];
|
||||
|
||||
if (fdtab.not_open (fd))
|
||||
{
|
||||
set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((fh->get_flags() & (O_NONBLOCK | O_NDELAY)) && !fh->ready_for_read (fd, 0, 0))
|
||||
set_sig_errno (0);
|
||||
fhandler_base *fh = fdtab[fd];
|
||||
DWORD wait = fh->get_flags () & (O_NONBLOCK | O_NDELAY) ? 0 : INFINITE;
|
||||
|
||||
/* Could block, so let user know we at least got here. */
|
||||
syscall_printf ("read (%d, %p, %d)", fd, ptr, len);
|
||||
|
||||
int res;
|
||||
if (wait && (!fh->is_slow () || fh->get_r_no_interrupt ()))
|
||||
debug_printf ("non-interruptible read\n");
|
||||
else if (!fh->ready_for_read (fd, wait, 0))
|
||||
{
|
||||
syscall_printf ("nothing to read");
|
||||
set_errno (EAGAIN);
|
||||
return -1;
|
||||
if (!wait)
|
||||
set_sig_errno (EAGAIN);
|
||||
else
|
||||
set_sig_errno (EINTR);
|
||||
res = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check to see if this is a background read from a "tty",
|
||||
|
@ -223,40 +233,13 @@ read_handler (int fd, void *ptr, size_t len)
|
|||
res = fh->read (ptr, len);
|
||||
myself->process_state &= ~PID_TTYIN;
|
||||
}
|
||||
syscall_printf ("%d = read (%d<%s>, %p, %d)", res, fd, fh->get_name (), ptr, len);
|
||||
return res;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
_read (int fd, void *ptr, size_t len)
|
||||
{
|
||||
if (fdtab.not_open (fd))
|
||||
{
|
||||
set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
set_sig_errno (0);
|
||||
fhandler_base *fh = fdtab[fd];
|
||||
|
||||
/* Could block, so let user know we at least got here. */
|
||||
syscall_printf ("read (%d, %p, %d)", fd, ptr, len);
|
||||
|
||||
if (!fh->is_slow () || (fh->get_flags () & (O_NONBLOCK | O_NDELAY)) ||
|
||||
fh->get_r_no_interrupt ())
|
||||
{
|
||||
debug_printf ("non-interruptible read\n");
|
||||
return read_handler (fd, ptr, len);
|
||||
}
|
||||
|
||||
if (fh->ready_for_read (fd, INFINITE, 0))
|
||||
return read_handler (fd, ptr, len);
|
||||
|
||||
set_sig_errno (EINTR);
|
||||
out:
|
||||
syscall_printf ("%d = read (%d<%s>, %p, %d), errno %d", -1, fd, fh->get_name (),
|
||||
ptr, len, get_errno ());
|
||||
MALLOC_CHECK;
|
||||
return -1;
|
||||
return res;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
|
|
|
@ -151,9 +151,9 @@ HANDLE win32_obj_id;
|
|||
UINT return_value;
|
||||
bool used;
|
||||
char joinable; // for thread only
|
||||
bool HandleOke () {return win32_obj_id;};
|
||||
bool HandleOke () {return win32_obj_id;}
|
||||
virtual void Destroy ();
|
||||
virtual int Id () {return (int) win32_obj_id;};
|
||||
virtual int Id () {return (int) win32_obj_id;}
|
||||
};
|
||||
|
||||
class ThreadItem:public MTitem
|
||||
|
@ -165,7 +165,7 @@ void *arg;
|
|||
void *return_ptr;
|
||||
bool suspended;
|
||||
DWORD thread_id;
|
||||
DWORD GetThreadId () {return thread_id;};
|
||||
DWORD GetThreadId () {return thread_id;}
|
||||
|
||||
/* signal handling */
|
||||
struct sigaction *sigs;
|
||||
|
|
Loading…
Reference in New Issue