diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-09-09 12:10:17 +0000 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-09-09 12:10:17 +0000 |
commit | 20023071f6543e8f027a1c5b17f86361dd7f6fff (patch) | |
tree | 99531c5ab6b447968115ad6235a3d86599f09df1 /libc/termios | |
parent | 54365d35cb77a69382a8d1bbeb9d3008077e572b (diff) |
Fill in termios_p data structure only if ioctl syscall
doesn't fail (as glibc indeed does).
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Diffstat (limited to 'libc/termios')
-rw-r--r-- | libc/termios/tcgetattr.c | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/libc/termios/tcgetattr.c b/libc/termios/tcgetattr.c index 26554b6e5..541beb4f6 100644 --- a/libc/termios/tcgetattr.c +++ b/libc/termios/tcgetattr.c @@ -41,40 +41,41 @@ int tcgetattr (int fd, struct termios *termios_p) int retval; retval = ioctl (fd, TCGETS, &k_termios); - - termios_p->c_iflag = k_termios.c_iflag; - termios_p->c_oflag = k_termios.c_oflag; - termios_p->c_cflag = k_termios.c_cflag; - termios_p->c_lflag = k_termios.c_lflag; - termios_p->c_line = k_termios.c_line; + if(likely(retval == 0)) { + termios_p->c_iflag = k_termios.c_iflag; + termios_p->c_oflag = k_termios.c_oflag; + termios_p->c_cflag = k_termios.c_cflag; + termios_p->c_lflag = k_termios.c_lflag; + termios_p->c_line = k_termios.c_line; #ifdef _HAVE_C_ISPEED - termios_p->c_ispeed = k_termios.c_ispeed; + termios_p->c_ispeed = k_termios.c_ispeed; #endif #ifdef _HAVE_C_OSPEED - termios_p->c_ospeed = k_termios.c_ospeed; + termios_p->c_ospeed = k_termios.c_ospeed; #endif - if (sizeof (cc_t) == 1 || _POSIX_VDISABLE == 0 - || (unsigned char) _POSIX_VDISABLE == (unsigned char) -1) - { - memset (mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], - __KERNEL_NCCS * sizeof (cc_t)), - _POSIX_VDISABLE, (NCCS - __KERNEL_NCCS) * sizeof (cc_t)); + if (sizeof (cc_t) == 1 || _POSIX_VDISABLE == 0 + || (unsigned char) _POSIX_VDISABLE == (unsigned char) -1) + { + memset (mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], + __KERNEL_NCCS * sizeof (cc_t)), + _POSIX_VDISABLE, (NCCS - __KERNEL_NCCS) * sizeof (cc_t)); #if 0 - memset ( (memcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], - __KERNEL_NCCS * sizeof (cc_t)) + (__KERNEL_NCCS * sizeof (cc_t))) , - _POSIX_VDISABLE, (NCCS - __KERNEL_NCCS) * sizeof (cc_t)); + memset ( (memcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], + __KERNEL_NCCS * sizeof (cc_t)) + (__KERNEL_NCCS * sizeof (cc_t))) , + _POSIX_VDISABLE, (NCCS - __KERNEL_NCCS) * sizeof (cc_t)); #endif - } else { - size_t cnt; + } else { + size_t cnt; - memcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], - __KERNEL_NCCS * sizeof (cc_t)); + memcpy (&termios_p->c_cc[0], &k_termios.c_cc[0], + __KERNEL_NCCS * sizeof (cc_t)); - for (cnt = __KERNEL_NCCS; cnt < NCCS; ++cnt) - termios_p->c_cc[cnt] = _POSIX_VDISABLE; - } + for (cnt = __KERNEL_NCCS; cnt < NCCS; ++cnt) + termios_p->c_cc[cnt] = _POSIX_VDISABLE; + } + } return retval; } |