* cygwin.din (ptsname_r): Export.
* fhandler.cc (fhandler_base::ptsname_r): Define. * fhandler.h (fhandler_base::ptsname): Delete. (fhandler_base::ptsname_r): Declare. (fhandler_pty_master::ptsname_r): Declare. * fhandler_tty.cc (fhandler_pty_master::ptsname): Delete. (fhandler_pty_master::ptsname_r): New reentrant function derived from previous ptsname. * syscalls.cc (ptsname_r): Implement new function with functionality similar to Linux. (ptsname): Use ptsname_r () to fill out buf. * include/cygwin/stdlib.h (ptsname_r): Declare. * include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 255 to reflect export of ptsname_r. * pinfo.cc (pinfo::wait): Return bool rather than int. * pinfo.h (info::wait): Ditto. (pinfo::reattach): Define !defined(_SIGPROC_H) case for consistency. * sigproc.cc (child_info_spawn::reattach_children): Use correct dwProcessId rather than pid when duplicating handle.
This commit is contained in:
parent
78942629ac
commit
65a6152f18
|
@ -1,3 +1,26 @@
|
|||
2011-11-07 Christopher Faylor <me.cygwin2011@cgf.cx>
|
||||
|
||||
* cygwin.din (ptsname_r): Export.
|
||||
* fhandler.cc (fhandler_base::ptsname_r): Define.
|
||||
* fhandler.h (fhandler_base::ptsname): Delete.
|
||||
(fhandler_base::ptsname_r): Declare.
|
||||
(fhandler_pty_master::ptsname_r): Declare.
|
||||
* fhandler_tty.cc (fhandler_pty_master::ptsname): Delete.
|
||||
(fhandler_pty_master::ptsname_r): New reentrant function derived from
|
||||
previous ptsname.
|
||||
* syscalls.cc (ptsname_r): Implement new function with functionality
|
||||
similar to Linux.
|
||||
(ptsname): Use ptsname_r () to fill out buf.
|
||||
* include/cygwin/stdlib.h (ptsname_r): Declare.
|
||||
* include/cygwin/version.h: Bump CYGWIN_VERSION_API_MINOR to 255 to
|
||||
reflect export of ptsname_r.
|
||||
|
||||
* pinfo.cc (pinfo::wait): Return bool rather than int.
|
||||
* pinfo.h (info::wait): Ditto.
|
||||
(pinfo::reattach): Define !defined(_SIGPROC_H) case for consistency.
|
||||
* sigproc.cc (child_info_spawn::reattach_children): Use correct
|
||||
dwProcessId rather than pid when duplicating handle.
|
||||
|
||||
2011-11-07 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler.cc (CHUNK_SIZE): Drop NO_COPY.
|
||||
|
|
|
@ -1277,6 +1277,7 @@ pthread_spin_unlock SIGFE
|
|||
pthread_testcancel SIGFE
|
||||
pthread_yield = sched_yield SIGFE
|
||||
ptsname SIGFE
|
||||
ptsname_r SIGFE
|
||||
putc SIGFE
|
||||
_putc = putc SIGFE
|
||||
putc_unlocked SIGFE
|
||||
|
|
|
@ -1407,6 +1407,13 @@ fhandler_base::tcgetsid ()
|
|||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
fhandler_base::ptsname_r (char *, size_t)
|
||||
{
|
||||
set_errno (ENOTTY);
|
||||
return ENOTTY;
|
||||
}
|
||||
|
||||
void
|
||||
fhandler_base::operator delete (void *p)
|
||||
{
|
||||
|
|
|
@ -381,7 +381,7 @@ public:
|
|||
virtual pid_t get_popen_pid () const {return 0;}
|
||||
virtual bool isdevice () const { return true; }
|
||||
virtual bool isfifo () const { return false; }
|
||||
virtual char *ptsname () { return NULL;}
|
||||
virtual int ptsname_r (char *, size_t);
|
||||
virtual class fhandler_socket *is_socket () { return NULL; }
|
||||
virtual class fhandler_console *is_console () { return 0; }
|
||||
virtual int is_windows () {return 0; }
|
||||
|
@ -1486,7 +1486,7 @@ public:
|
|||
int tcflush (int);
|
||||
int ioctl (unsigned int cmd, void *);
|
||||
|
||||
char *ptsname ();
|
||||
int ptsname_r (char *, size_t);
|
||||
|
||||
bool hit_eof ();
|
||||
bool setup ();
|
||||
|
|
|
@ -1419,13 +1419,19 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
fhandler_pty_master::ptsname ()
|
||||
int
|
||||
fhandler_pty_master::ptsname_r (char *buf, size_t buflen)
|
||||
{
|
||||
static char buf[TTY_NAME_MAX];
|
||||
char tmpbuf[TTY_NAME_MAX];
|
||||
|
||||
__small_sprintf (buf, "/dev/pty%d", get_unit ());
|
||||
return buf;
|
||||
__small_sprintf (tmpbuf, "/dev/pty%d", get_unit ());
|
||||
if (buflen <= strlen (tmpbuf))
|
||||
{
|
||||
set_errno (ERANGE);
|
||||
return ERANGE;
|
||||
}
|
||||
strcpy (buf, tmpbuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -30,6 +30,7 @@ long random (void);
|
|||
char *setstate (const char *state);
|
||||
void srandom (unsigned);
|
||||
char *ptsname (int);
|
||||
int ptsname_r(int, char *, size_t);
|
||||
int grantpt (int);
|
||||
int unlockpt (int);
|
||||
#endif /*__STRICT_ANSI__*/
|
||||
|
|
|
@ -423,12 +423,13 @@ details. */
|
|||
252: CW_CVT_ENV_TO_WINENV added.
|
||||
253: Export TIOCSCTTY, tcgetsid.
|
||||
254: Export getgrouplist.
|
||||
255: Export ptsname_r.
|
||||
*/
|
||||
|
||||
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
|
||||
|
||||
#define CYGWIN_VERSION_API_MAJOR 0
|
||||
#define CYGWIN_VERSION_API_MINOR 254
|
||||
#define CYGWIN_VERSION_API_MINOR 255
|
||||
|
||||
/* There is also a compatibity version number associated with the
|
||||
shared memory regions. It is incremented when incompatible
|
||||
|
|
|
@ -975,10 +975,10 @@ _pinfo::dup_proc_pipe (HANDLE hProcess)
|
|||
}
|
||||
|
||||
/* function to set up the process pipe and kick off proc_waiter */
|
||||
int
|
||||
bool
|
||||
pinfo::wait ()
|
||||
{
|
||||
/* If rd_proc_pipe that means we're in an execed process which already has
|
||||
/* If rd_proc_pipe != NULL we're in an execed process which already has
|
||||
grabbed the read end of the pipe from the previous cygwin process running
|
||||
with this pid. */
|
||||
if (!rd_proc_pipe)
|
||||
|
@ -989,13 +989,13 @@ pinfo::wait ()
|
|||
{
|
||||
system_printf ("Couldn't create pipe tracker for pid %d, %E",
|
||||
(*this)->pid);
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(*this)->dup_proc_pipe (hProcess))
|
||||
{
|
||||
system_printf ("Couldn't duplicate pipe topid %d(%p), %E", (*this)->pid, hProcess);
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1013,7 +1013,7 @@ pinfo::wait ()
|
|||
(*this)->pid, (*this)->dwProcessId, rd_proc_pipe);
|
||||
}
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -153,7 +153,7 @@ public:
|
|||
pinfo (pid_t n, DWORD flag) : rd_proc_pipe (NULL), hProcess (NULL), waiter_ready (0), wait_thread (NULL) {init (n, flag, NULL);}
|
||||
void thisproc (HANDLE) __attribute__ ((regparm (2)));
|
||||
void release ();
|
||||
int wait () __attribute__ ((regparm (1)));
|
||||
bool wait () __attribute__ ((regparm (1)));
|
||||
~pinfo ()
|
||||
{
|
||||
if (destroy && procinfo)
|
||||
|
@ -173,6 +173,7 @@ public:
|
|||
operator _pinfo * () const {return procinfo;}
|
||||
void preserve () { destroy = false; }
|
||||
#ifndef _SIGPROC_H
|
||||
int reattach () {system_printf ("reattach is not here"); return 0;}
|
||||
int remember () {system_printf ("remember is not here"); return 0;}
|
||||
#else
|
||||
int reattach ()
|
||||
|
|
|
@ -866,7 +866,7 @@ child_info_spawn::reattach_children ()
|
|||
false, DUPLICATE_SAME_ACCESS))
|
||||
debug_printf ("couldn't duplicate parent %p handles for forked children after exec, %E",
|
||||
children[i].rd_proc_pipe);
|
||||
else if (!(p.hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, p->pid)))
|
||||
else if (!(p.hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, p->dwProcessId)))
|
||||
CloseHandle (p.rd_proc_pipe);
|
||||
else if (!p.reattach ())
|
||||
{
|
||||
|
|
|
@ -2906,10 +2906,23 @@ getpgrp (void)
|
|||
extern "C" char *
|
||||
ptsname (int fd)
|
||||
{
|
||||
static char buf[TTY_NAME_MAX];
|
||||
return ptsname_r (fd, buf, sizeof (buf)) == 0 ? buf : NULL;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
ptsname_r (int fd, char *buf, size_t buflen)
|
||||
{
|
||||
if (!buf)
|
||||
{
|
||||
set_errno (EINVAL);
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
cygheap_fdget cfd (fd);
|
||||
if (cfd < 0)
|
||||
return 0;
|
||||
return (char *) (cfd->ptsname ());
|
||||
return cfd->ptsname_r (buf, buflen);
|
||||
}
|
||||
|
||||
static int __stdcall
|
||||
|
|
Loading…
Reference in New Issue