/* You may distribute under the terms of either the GNU General Public License * or the Artistic License (the same terms as Perl itself) * * (C) Paul Evans, 2016 -- leonerd@leonerd.org.uk */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* Until GNU libc supports termios2, we'll have to go the direct approach * * Because of this there's some extra mess we have to account for. Namely, * that wants to provide two structs already known by this * point (because "perl.h" brought them in). gcc will complain. But since we * don't care about the new definitions of these new structs, we'll just throw * them away. */ #define winsize ASM_TERMIOS_winsize #define termio ASM_TERMIOS_termio # include # include #undef winsize #undef termio typedef struct termios2 *Linux__Termios2; MODULE = Linux::Termios2 PACKAGE = Linux::Termios2 Linux::Termios2 new(package) char *package CODE: Newx(RETVAL, 1, struct termios2); OUTPUT: RETVAL void DESTROY(self) Linux::Termios2 self CODE: Safefree(self); void getattr(self, fd) Linux::Termios2 self int fd PPCODE: if(ioctl(fd, TCGETS2, self)) XSRETURN_UNDEF; ST(0) = &PL_sv_yes; XSRETURN(1); void setattr(self, fd, act) Linux::Termios2 self int fd int act PPCODE: { int ctl; switch(act) { case TCSANOW: ctl = TCSETS2; break; case TCSADRAIN: ctl = TCSETSW2; break; case TCSAFLUSH: ctl = TCSETSF2; break; default: SETERRNO(EINVAL, LIB_INVARG); XSRETURN_UNDEF; } if(ioctl(fd, ctl, self)) XSRETURN_UNDEF; ST(0) = &PL_sv_yes; XSRETURN(1); } int getcflag(self) Linux::Termios2 self ALIAS: getcflag = 0 getiflag = 1 getlflag = 2 getoflag = 3 getispeed = 4 getospeed = 5 CODE: switch(ix) { case 0: RETVAL = self->c_cflag; break; case 1: RETVAL = self->c_iflag; break; case 2: RETVAL = self->c_lflag; break; case 3: RETVAL = self->c_oflag; break; case 4: RETVAL = self->c_ispeed; break; case 5: RETVAL = self->c_ospeed; break; } OUTPUT: RETVAL void setcflag(self, val) Linux::Termios2 self int val ALIAS: setcflag = 0 setiflag = 1 setlflag = 2 setoflag = 3 CODE: switch(ix) { case 0: self->c_cflag = val; break; case 1: self->c_iflag = val; break; case 2: self->c_lflag = val; break; case 3: self->c_oflag = val; break; } void setispeed(self, val) Linux::Termios2 self int val ALIAS: setispeed = 0 setospeed = 1 CODE: switch(ix) { case 0: self->c_ispeed = val; break; case 1: self->c_ospeed = val; break; } self->c_cflag &= ~CBAUD; self->c_cflag |= BOTHER;