From: cgf AT cygnus DOT com (Christopher Faylor) Subject: Re: Problems with winsup-981223 24 Dec 1998 13:40:24 -0800 Message-ID: <19981224162318.A494.cygnus.cygwin32.developers@cygnus.com> References: <36820E45 DOT F08619FA AT cityweb DOT de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Corinna Vinschen , cygwin32-developers AT cygnus DOT com On Thu, Dec 24, 1998 at 10:49:57AM +0100, Corinna Vinschen wrote: >if compiling with -D_MT_SAFE=1: >----------- >In file included from winsup.h:37, > from assert.cc:11: >thread.h:99: field `_localtime_buf' has incomplete type >make: *** [assert.o] Error 1 >----------- >This is corrected by additional #include Hmm. I don't see this and neither does DJ. Maybe something has changed in newlib. >While linking: >----------- >undefined symbol from libc.a(execvp.o): posix_path_list_p >----------- >The function now is named 'cygwin_posix_path_list_p', >which I have corrected by changing the call in libc::execvp.c Yes. You've probably seen my other email on this. >Now it's compilable and linkable, but >- if it's compiled with -D_MT_SAFE=1, starting e.g. tcsh from > cmd results in immediate exit of tcsh without any error output. >- if it's compiled without thread safeness, it doesn't run correct > in tty mode. The telnet session suddenly outputs `ogin:' instead > of `login:' and the first key press results in lost connection > to telnetd. This should fix the non-threadsafe case. I haven't checked the threadsafe version yet. cgf Index: ioctl.cc =================================================================== RCS file: /cvs/cvsfiles/devo/winsup/ioctl.cc,v retrieving revision 1.11 diff -u -p -r1.11 ioctl.cc --- ioctl.cc 1998/12/18 21:47:55 1.11 +++ ioctl.cc 1998/12/24 21:14:45 @@ -26,7 +26,7 @@ ioctl (int fd, int cmd, void *buf) } fhandler_base *fh = dtable[fd]; - if (fh->is_tty ()) + if (fh->is_tty () && fh->get_device () != FH_PTYM) switch (cmd) { case TCGETA: Index: passwd.cc =================================================================== RCS file: /cvs/cvsfiles/devo/winsup/passwd.cc,v retrieving revision 1.29 diff -u -p -r1.29 passwd.cc --- passwd.cc 1998/12/17 04:29:13 1.29 +++ passwd.cc 1998/12/24 21:14:45 @@ -234,16 +234,25 @@ getpass (const char * prompt) if (!passwd_in_memory_p) read_etc_passwd(); - tcgetattr (0, &ti); - newti = ti; - newti.c_lflag &= ~ECHO; - tcsetattr (0, TCSANOW, &newti); - fprintf (stderr, prompt); - fgets (pass, _PASSWORD_LEN, stdin); - fprintf (stderr, "\n"); - for (int i=0; pass[i]; i++) - if (pass[i] == '\r' || pass[i] == '\n') - pass[i] = '\0'; - tcsetattr (0, TCSANOW, &ti); + if (dtable.not_open (0)) + { + set_errno (EBADF); + pass[0] = '\0'; + } + else + { + fhandler_base *fhstdin = dtable[0]; + fhstdin->tcgetattr (&ti); + newti = ti; + newti.c_lflag &= ~ECHO; + fhstdin->tcsetattr (TCSANOW, &newti); + fprintf (stderr, prompt); + fgets (pass, _PASSWORD_LEN, stdin); + fprintf (stderr, "\n"); + for (int i=0; pass[i]; i++) + if (pass[i] == '\r' || pass[i] == '\n') + pass[i] = '\0'; + fhstdin->tcsetattr (TCSANOW, &ti); + } return pass; } Index: termios.cc =================================================================== RCS file: /cvs/cvsfiles/devo/winsup/termios.cc,v retrieving revision 1.26 diff -u -p -r1.26 termios.cc --- termios.cc 1998/12/18 21:47:58 1.26 +++ termios.cc 1998/12/24 21:14:45 @@ -99,6 +99,7 @@ tcsetattr (int fd, int a, const struct t { int res = -1; + t = __tonew_termios (t); if (dtable.not_open (fd)) set_errno (EBADF); else if (!dtable[fd]->is_tty ()) @@ -106,11 +107,12 @@ tcsetattr (int fd, int a, const struct t else { sig_protect (here, 1); - res = dtable[fd]->tcsetattr (a, __tonew_termios (t)); + res = dtable[fd]->tcsetattr (a, t); } - termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x", - t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag); + termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d", + t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], + t->c_cc[VTIME]); termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t); return res; } @@ -121,6 +123,7 @@ int tcgetattr (int fd, struct termios *in_t) { int res = -1; + struct termios *t = __makenew_termios (in_t); if (dtable.not_open (fd)) set_errno (EBADF); @@ -129,12 +132,17 @@ tcgetattr (int fd, struct termios *in_t) else { sig_protect (here, 1); - struct termios *t = __makenew_termios (in_t); if ((res = dtable[fd]->tcgetattr (t)) == 0) __toapp_termios (in_t, t); } - termios_printf ("%d = tcgetattr (%d, %x)", res, fd, in_t); + if (res) + termios_printf ("%d = tcgetattr (%d, %x)", res, fd, in_t); + else + termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d", + t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], + t->c_cc[VTIME]); + return res; }