Add support for the old-style Linux termio (not termios) TCGETA etc.

Also, LINUX_POSIX_VDISABLE is \0, FreeBSD's is 0xff. Convert between them.

This enables some more programs to run, including the Livingston Portmaster
utilities (PMtools).

Submitted by: Robert Sanders <rsanders@mindspring.com>
This commit is contained in:
Peter Wemm 1996-03-03 19:07:50 +00:00
parent 5e004bea6f
commit 4f735d8edb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=14361
4 changed files with 152 additions and 8 deletions

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: linux.h,v 1.4 1996/01/30 22:56:29 mpp Exp $
* $Id: linux.h,v 1.5 1996/03/02 19:37:47 peter Exp $
*/
#ifndef _I386_LINUX_LINUX_H_
@ -234,7 +234,9 @@ int linux_fixup __P((int **stack_base, struct image_params *iparams));
#define LINUX_VWERASE 14
#define LINUX_VLNEXT 15
#define LINUX_VEOL2 16
#define LINUX_NCCS 17
#define LINUX_NCCS 19
#define LINUX_POSIX_VDISABLE '\0'
/* Linux c_iflag masks */
#define LINUX_IGNBRK 0x0000001

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: linux_ioctl.c,v 1.5 1995/12/30 00:42:25 sos Exp $
* $Id: linux_ioctl.c,v 1.6 1996/03/02 19:37:55 peter Exp $
*/
#include <sys/param.h>
@ -49,6 +49,16 @@
#include <i386/linux/linux.h>
#include <i386/linux/linux_proto.h>
struct linux_termio {
unsigned short c_iflag;
unsigned short c_oflag;
unsigned short c_cflag;
unsigned short c_lflag;
unsigned char c_line;
unsigned char c_cc[LINUX_NCC];
};
struct linux_termios {
unsigned long c_iflag;
unsigned long c_oflag;
@ -192,7 +202,7 @@ bsd_to_linux_termios(struct termios *bsd_termios,
linux_termios->c_lflag |= LINUX_IEXTEN;
for (i=0; i<LINUX_NCCS; i++)
linux_termios->c_cc[i] = _POSIX_VDISABLE;
linux_termios->c_cc[i] = LINUX_POSIX_VDISABLE;
linux_termios->c_cc[LINUX_VINTR] = bsd_termios->c_cc[VINTR];
linux_termios->c_cc[LINUX_VQUIT] = bsd_termios->c_cc[VQUIT];
linux_termios->c_cc[LINUX_VERASE] = bsd_termios->c_cc[VERASE];
@ -211,6 +221,11 @@ bsd_to_linux_termios(struct termios *bsd_termios,
linux_termios->c_cc[LINUX_VWERASE] = bsd_termios->c_cc[VWERASE];
linux_termios->c_cc[LINUX_VLNEXT] = bsd_termios->c_cc[VLNEXT];
for (i=0; i<LINUX_NCCS; i++) {
if (linux_termios->c_cc[i] == _POSIX_VDISABLE)
linux_termios->c_cc[i] = LINUX_POSIX_VDISABLE;
}
linux_termios->c_line = 0;
#ifdef DEBUG
printf("LINUX: LINUX termios structure (output):\n");
@ -225,6 +240,7 @@ bsd_to_linux_termios(struct termios *bsd_termios,
#endif
}
static void
linux_to_bsd_termios(struct linux_termios *linux_termios,
struct termios *bsd_termios)
@ -340,6 +356,11 @@ linux_to_bsd_termios(struct linux_termios *linux_termios,
bsd_termios->c_cc[VWERASE] = linux_termios->c_cc[LINUX_VWERASE];
bsd_termios->c_cc[VLNEXT] = linux_termios->c_cc[LINUX_VLNEXT];
for (i=0; i<NCCS; i++) {
if (bsd_termios->c_cc[i] == LINUX_POSIX_VDISABLE)
bsd_termios->c_cc[i] = _POSIX_VDISABLE;
}
bsd_termios->c_ispeed = bsd_termios->c_ospeed =
linux_to_bsd_speed(linux_termios->c_cflag & LINUX_CBAUD, sptab);
#ifdef DEBUG
@ -355,12 +376,49 @@ linux_to_bsd_termios(struct linux_termios *linux_termios,
#endif
}
static void
bsd_to_linux_termio(struct termios *bsd_termios,
struct linux_termio *linux_termio)
{
struct linux_termios tmios;
bsd_to_linux_termios(bsd_termios, &tmios);
linux_termio->c_iflag = tmios.c_iflag;
linux_termio->c_oflag = tmios.c_oflag;
linux_termio->c_cflag = tmios.c_cflag;
linux_termio->c_lflag = tmios.c_lflag;
linux_termio->c_line = tmios.c_line;
memcpy(linux_termio->c_cc, tmios.c_cc, LINUX_NCC);
}
static void
linux_to_bsd_termio(struct linux_termio *linux_termio,
struct termios *bsd_termios)
{
struct linux_termios tmios;
int i;
tmios.c_iflag = linux_termio->c_iflag;
tmios.c_oflag = linux_termio->c_oflag;
tmios.c_cflag = linux_termio->c_cflag;
tmios.c_lflag = linux_termio->c_lflag;
for (i=0; i<LINUX_NCCS; i++)
tmios.c_cc[i] = LINUX_POSIX_VDISABLE;
memcpy(tmios.c_cc, linux_termio->c_cc, LINUX_NCC);
linux_to_bsd_termios(&tmios, bsd_termios);
}
int
linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
{
struct termios bsd_termios;
struct winsize bsd_winsize;
struct linux_termios linux_termios;
struct linux_termio linux_termio;
struct linux_winsize linux_winsize;
struct filedesc *fdp = p->p_fd;
struct file *fp;
@ -382,6 +440,18 @@ linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
func = fp->f_ops->fo_ioctl;
switch (args->cmd & 0xffff) {
case LINUX_TCGETA:
if ((error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p)) != 0)
return error;
bsd_to_linux_termio(&bsd_termios, &linux_termio);
return copyout((caddr_t)&linux_termio, (caddr_t)args->arg,
sizeof(linux_termio));
case LINUX_TCSETA:
linux_to_bsd_termio((struct linux_termio *)args->arg, &bsd_termios);
return (*func)(fp, TIOCSETA, (caddr_t)&bsd_termios, p);
case LINUX_TCGETS:
if ((error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p)) != 0)
return error;

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: linux.h,v 1.4 1996/01/30 22:56:29 mpp Exp $
* $Id: linux.h,v 1.5 1996/03/02 19:37:47 peter Exp $
*/
#ifndef _I386_LINUX_LINUX_H_
@ -234,7 +234,9 @@ int linux_fixup __P((int **stack_base, struct image_params *iparams));
#define LINUX_VWERASE 14
#define LINUX_VLNEXT 15
#define LINUX_VEOL2 16
#define LINUX_NCCS 17
#define LINUX_NCCS 19
#define LINUX_POSIX_VDISABLE '\0'
/* Linux c_iflag masks */
#define LINUX_IGNBRK 0x0000001

View File

@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: linux_ioctl.c,v 1.5 1995/12/30 00:42:25 sos Exp $
* $Id: linux_ioctl.c,v 1.6 1996/03/02 19:37:55 peter Exp $
*/
#include <sys/param.h>
@ -49,6 +49,16 @@
#include <i386/linux/linux.h>
#include <i386/linux/linux_proto.h>
struct linux_termio {
unsigned short c_iflag;
unsigned short c_oflag;
unsigned short c_cflag;
unsigned short c_lflag;
unsigned char c_line;
unsigned char c_cc[LINUX_NCC];
};
struct linux_termios {
unsigned long c_iflag;
unsigned long c_oflag;
@ -192,7 +202,7 @@ bsd_to_linux_termios(struct termios *bsd_termios,
linux_termios->c_lflag |= LINUX_IEXTEN;
for (i=0; i<LINUX_NCCS; i++)
linux_termios->c_cc[i] = _POSIX_VDISABLE;
linux_termios->c_cc[i] = LINUX_POSIX_VDISABLE;
linux_termios->c_cc[LINUX_VINTR] = bsd_termios->c_cc[VINTR];
linux_termios->c_cc[LINUX_VQUIT] = bsd_termios->c_cc[VQUIT];
linux_termios->c_cc[LINUX_VERASE] = bsd_termios->c_cc[VERASE];
@ -211,6 +221,11 @@ bsd_to_linux_termios(struct termios *bsd_termios,
linux_termios->c_cc[LINUX_VWERASE] = bsd_termios->c_cc[VWERASE];
linux_termios->c_cc[LINUX_VLNEXT] = bsd_termios->c_cc[VLNEXT];
for (i=0; i<LINUX_NCCS; i++) {
if (linux_termios->c_cc[i] == _POSIX_VDISABLE)
linux_termios->c_cc[i] = LINUX_POSIX_VDISABLE;
}
linux_termios->c_line = 0;
#ifdef DEBUG
printf("LINUX: LINUX termios structure (output):\n");
@ -225,6 +240,7 @@ bsd_to_linux_termios(struct termios *bsd_termios,
#endif
}
static void
linux_to_bsd_termios(struct linux_termios *linux_termios,
struct termios *bsd_termios)
@ -340,6 +356,11 @@ linux_to_bsd_termios(struct linux_termios *linux_termios,
bsd_termios->c_cc[VWERASE] = linux_termios->c_cc[LINUX_VWERASE];
bsd_termios->c_cc[VLNEXT] = linux_termios->c_cc[LINUX_VLNEXT];
for (i=0; i<NCCS; i++) {
if (bsd_termios->c_cc[i] == LINUX_POSIX_VDISABLE)
bsd_termios->c_cc[i] = _POSIX_VDISABLE;
}
bsd_termios->c_ispeed = bsd_termios->c_ospeed =
linux_to_bsd_speed(linux_termios->c_cflag & LINUX_CBAUD, sptab);
#ifdef DEBUG
@ -355,12 +376,49 @@ linux_to_bsd_termios(struct linux_termios *linux_termios,
#endif
}
static void
bsd_to_linux_termio(struct termios *bsd_termios,
struct linux_termio *linux_termio)
{
struct linux_termios tmios;
bsd_to_linux_termios(bsd_termios, &tmios);
linux_termio->c_iflag = tmios.c_iflag;
linux_termio->c_oflag = tmios.c_oflag;
linux_termio->c_cflag = tmios.c_cflag;
linux_termio->c_lflag = tmios.c_lflag;
linux_termio->c_line = tmios.c_line;
memcpy(linux_termio->c_cc, tmios.c_cc, LINUX_NCC);
}
static void
linux_to_bsd_termio(struct linux_termio *linux_termio,
struct termios *bsd_termios)
{
struct linux_termios tmios;
int i;
tmios.c_iflag = linux_termio->c_iflag;
tmios.c_oflag = linux_termio->c_oflag;
tmios.c_cflag = linux_termio->c_cflag;
tmios.c_lflag = linux_termio->c_lflag;
for (i=0; i<LINUX_NCCS; i++)
tmios.c_cc[i] = LINUX_POSIX_VDISABLE;
memcpy(tmios.c_cc, linux_termio->c_cc, LINUX_NCC);
linux_to_bsd_termios(&tmios, bsd_termios);
}
int
linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
{
struct termios bsd_termios;
struct winsize bsd_winsize;
struct linux_termios linux_termios;
struct linux_termio linux_termio;
struct linux_winsize linux_winsize;
struct filedesc *fdp = p->p_fd;
struct file *fp;
@ -382,6 +440,18 @@ linux_ioctl(struct proc *p, struct linux_ioctl_args *args, int *retval)
func = fp->f_ops->fo_ioctl;
switch (args->cmd & 0xffff) {
case LINUX_TCGETA:
if ((error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p)) != 0)
return error;
bsd_to_linux_termio(&bsd_termios, &linux_termio);
return copyout((caddr_t)&linux_termio, (caddr_t)args->arg,
sizeof(linux_termio));
case LINUX_TCSETA:
linux_to_bsd_termio((struct linux_termio *)args->arg, &bsd_termios);
return (*func)(fp, TIOCSETA, (caddr_t)&bsd_termios, p);
case LINUX_TCGETS:
if ((error = (*func)(fp, TIOCGETA, (caddr_t)&bsd_termios, p)) != 0)
return error;