#include <u.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <sys/termios.h>
#include <util.h>
#include <libc.h>
#include "term.h"

int
getpts(int fd[], char *slave)
{
	return openpty(&fd[1], &fd[0], slave, 0, 0);
}

int
childpty(int fd[], char *slave)
{
	int sfd;

	close(fd[1]);
	setsid();
	sfd = open(slave, ORDWR);
	if(sfd < 0)
		sysfatal("open %s: %r\n", slave);
	if(ioctl(sfd, TIOCSCTTY, 0) < 0)
		fprint(2, "ioctl TIOCSCTTY: %r\n");
	return sfd;
}

struct winsize ows;

void
updatewinsize(int row, int col, int dx, int dy)
{
	struct winsize ws;

	ws.ws_row = row;
	ws.ws_col = col;
	ws.ws_xpixel = dx;
	ws.ws_ypixel = dy;
	if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col)
	if(ioctl(rcfd[0], TIOCSWINSZ, &ws) < 0)
		fprint(2, "ioctl: %r\n");
	ows = ws;
}

int
israw(int fd)
{
	return 0;
}

int
setecho(int fd, int on)
{
	return 0;
}

