Xref: utzoo unix-pc.sources:365 comp.sys.att:7293 Path: utzoo!attcan!uunet!tut.cis.ohio-state.edu!mailrus!rutgers!mit-eddie!bu-cs!att!dptg!holin!bes From: bes@holin.ATT.COM (Bradley Smith) Newsgroups: unix-pc.sources,comp.sys.att Subject: uipc.p5 Message-ID: <652@holin.ATT.COM> Date: 12 Aug 89 16:39:51 GMT Distribution: unix-pc Organization: AT&T Bell Labs, OIL, Holmdel, NJ Lines: 1672 : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. echo 'Extracting src/Makefile' sed 's/^X//' > src/Makefile << '+ END-OF-FILE src/Makefile' X# Merged Makefile from pty drive below X# X# Eric H. Herrin II X# University of Kentucky Mathematical Sciences Laboratories X# 915 Patterson Office Tower X# University of Kentucky X# Lexington, KY 40506 X# eric@ms.uky.edu, ..!cbosgd!ukma!eric X# X# X# and Makefile from socket stuff X# X# @(#)Makefile 1.1 (Alex Crain) 6/20/89 X# X# Makefile for UnixPc uipc driver. X# Written By Alex Crain X# X X# X# All this done by Bradley Smith X# XSHELL=/bin/sh XMV=/bin/mv XRM=/bin/rm X X# on my gcc I need to add -v flag to CFLAGS or else X# gcc will die on me periodically - bes X# X# CC=gcc X# CC=cc XIFLAGS=-I../ XOFLAG=-O X# define DEBUG for debuggin messages XDEFS= -UDEBUG -DSYSV -DUNIXPC XCFLAGS=$(OFLAG) $(IFLAGS) -DKERNEL=1 $(DEFS) $(VFLAG) XLD=/bin/ld X#LIBS=-lgcc XLIBS=/usr/local/lib/gcc-gnulib XLINT=lint X XSOURCES=mbuf.c domain.c socket1.c socket2.c syscalls.c proto.c usrreq.c \ X interface.c debug.c sysent.m4 pty.c linesw.c X XOBJS=mbuf.o domain.o socket1.o socket2.o syscalls.o proto.o usrreq.o \ X interface.o debug.o pty.o linesw.o X Xall: ../pty.o X X Xremove: X (cd ..;${SHELL} Remove) X X../support/socket_init: X (cd ../support;make) X X X$(SOURCES): X $(GET) $(GFLAGS) -p ../sccs/src/s.$@ > $@ X X.c.o: X $(CC) $(CFLAGS) -c $*.c X Xsysent.h: ../sysconfig.m4 sysent.m4 X m4 sysent.m4 > sysent.h X X../pty.o: $(OBJS) X ld -r -n -o ../pty.o $(OBJS) $(LIBS) X Xdepend: sysent.h X cat Makefile | sed -e "/^### DEPEND LINE/q" > Make.tmp X $(CC) $(IFLAGS) -M $(SOURCES) >> Make.tmp X $(MV) Make.tmp Makefile X Xclean: X $(RM) -f *.o ../pty.o core sysent.h X Xlint: X $(LINT) $(IFLAGS) $(SOURCES) > lint.out X X### DEPEND LINE --- do not delete! Xmbuf.o : mbuf.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h ..//uipc/socketvar.h ..//uipc/conf.h \ X ..//uipc/protosw.h ..//uipc/conf.h ..//uipc/domain.h \ X ..//uipc/conf.h ..//uipc/mbuf.h ..//uipc/conf.h ..//uipc/fproto.h Xdomain.o : domain.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h ..//uipc/socketvar.h ..//uipc/conf.h \ X ..//uipc/socket.h ..//uipc/conf.h ..//uipc/protosw.h \ X ..//uipc/conf.h ..//uipc/domain.h ..//uipc/conf.h ..//uipc/mbuf.h \ X ..//uipc/conf.h ..//uipc/fproto.h Xsocket1.o : socket1.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/user.h /usr/include/sys/types.h \ X /usr/include/sys/param.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/file.h /usr/include/sys/dmap.h /usr/include/sys/types.h \ X /usr/include/sys/signal.h /usr/include/sys/vlimit.h \ X /usr/include/sys/dir.h /usr/include/sys/types.h /usr/include/sys/proc.h \ X /usr/include/sys/file.h /usr/include/sys/var.h /usr/include/sys/errno.h \ X ..//uipc/mbuf.h ..//uipc/conf.h ..//uipc/socket.h ..//uipc/conf.h \ X ..//uipc/socketvar.h ..//uipc/conf.h ..//uipc/domain.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/fproto.h Xsocket2.o : socket2.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/errno.h /usr/include/sys/proc.h \ X /usr/include/sys/var.h ..//uipc/mbuf.h ..//uipc/conf.h \ X ..//uipc/socket.h ..//uipc/conf.h ..//uipc/socketvar.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/domain.h ..//uipc/conf.h ..//uipc/fproto.h Xsyscalls.o : syscalls.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/user.h /usr/include/sys/types.h \ X /usr/include/sys/param.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/file.h /usr/include/sys/dmap.h /usr/include/sys/types.h \ X /usr/include/sys/signal.h /usr/include/sys/vlimit.h \ X /usr/include/sys/dir.h /usr/include/sys/types.h /usr/include/sys/file.h \ X /usr/include/sys/buf.h /usr/include/sys/errno.h /usr/include/sys/systm.h \ X ..//uipc/mbuf.h ..//uipc/conf.h ..//uipc/socket.h ..//uipc/conf.h \ X ..//uipc/socketvar.h ..//uipc/conf.h ..//uipc/domain.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/un.h ..//uipc/conf.h ..//uipc/fproto.h ..//uipc/pty.h \ X ..//uipc/number-ptys.h Xproto.o : proto.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h ..//uipc/mbuf.h ..//uipc/conf.h \ X ..//uipc/socket.h ..//uipc/conf.h ..//uipc/socketvar.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/domain.h ..//uipc/conf.h ..//uipc/fproto.h Xusrreq.o : usrreq.c /usr/include/sys/types.h ..//uipc/conf.h \ X /usr/include/sys/param.h /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/user.h /usr/include/sys/types.h \ X /usr/include/sys/param.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/file.h /usr/include/sys/dmap.h /usr/include/sys/types.h \ X /usr/include/sys/signal.h /usr/include/sys/vlimit.h \ X /usr/include/sys/dir.h /usr/include/sys/types.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/stat.h /usr/include/sys/types.h \ X /usr/include/sys/var.h /usr/include/sys/tune.h /usr/include/sys/types.h \ X /usr/include/sys/errno.h ..//uipc/mbuf.h ..//uipc/conf.h \ X ..//uipc/socket.h ..//uipc/conf.h ..//uipc/socketvar.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/domain.h ..//uipc/conf.h ..//uipc/unpcb.h \ X ..//uipc/conf.h ..//uipc/un.h ..//uipc/conf.h ..//uipc/fproto.h Xinterface.o : interface.c /usr/include/sys/types.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/types.h \ X /usr/include/sys/sysmacros.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/errno.h /usr/include/sys/user.h \ X /usr/include/sys/types.h /usr/include/sys/param.h /usr/include/sys/proc.h \ X /usr/include/sys/inode.h /usr/include/sys/file.h /usr/include/sys/dmap.h \ X /usr/include/sys/types.h /usr/include/sys/signal.h \ X /usr/include/sys/vlimit.h /usr/include/sys/dir.h /usr/include/sys/types.h \ X ..//uipc/socketvar.h ..//uipc/conf.h ..//uipc/mbuf.h \ X ..//uipc/conf.h ..//uipc/protosw.h ..//uipc/conf.h \ X ..//uipc/domain.h ..//uipc/conf.h ..//uipc/fproto.h \ X sysent.h Xdebug.o : debug.c /usr/include/sys/types.h /usr/include/sys/param.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/errno.h /usr/include/sys/proc.h \ X ..//uipc/mbuf.h ..//uipc/conf.h ..//uipc/socket.h ..//uipc/conf.h \ X ..//uipc/socketvar.h ..//uipc/conf.h ..//uipc/protosw.h \ X ..//uipc/conf.h ..//uipc/domain.h ..//uipc/conf.h Xpty.o : pty.c ..//uipc/pty.h ..//uipc/number-ptys.h \ X /usr/include/sys/param.h /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/types.h /usr/include/sys/sysmacros.h \ X /usr/include/sys/systm.h /usr/include/sys/param.h /usr/include/sys/inode.h \ X /usr/include/sys/proc.h /usr/include/sys/types.h /usr/include/sys/text.h \ X /usr/include/sys/types.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/param.h /usr/include/sys/shm.h /usr/include/sys/ipc.h \ X /usr/include/sys/types.h /usr/include/sys/pte.h /usr/include/sys/param.h \ X /usr/include/sys/pte.h /usr/include/sys/buf.h /usr/include/sys/param.h \ X /usr/include/sys/inode.h /usr/include/sys/proc.h /usr/include/sys/filsys.h \ X /usr/include/sys/param.h /usr/include/sys/ino.h /usr/include/sys/file.h \ X /usr/include/sys/types.h /usr/include/sys/inode.h /usr/include/sys/filsys.h \ X /usr/include/sys/cmap.h /usr/include/sys/file.h /usr/include/sys/conf.h \ X /usr/include/sys/types.h /usr/include/sys/iobuf.h /usr/include/sys/param.h \ X /usr/include/sys/buf.h /usr/include/sys/proc.h /usr/include/sys/dir.h \ X /usr/include/sys/types.h /usr/include/sys/tty.h /usr/include/sys/types.h \ X /usr/include/sys/signal.h /usr/include/sys/user.h /usr/include/sys/types.h \ X /usr/include/sys/param.h /usr/include/sys/proc.h /usr/include/sys/inode.h \ X /usr/include/sys/file.h /usr/include/sys/dmap.h /usr/include/sys/types.h \ X /usr/include/sys/signal.h /usr/include/sys/vlimit.h \ X /usr/include/sys/dir.h /usr/include/sys/errno.h /usr/include/sys/termio.h \ X /usr/include/sys/ttold.h + END-OF-FILE src/Makefile chmod 'u=rw,g=r,o=r' 'src/Makefile' echo ' -rw-r--r-- 1 bes HSJ 14549 Aug 12 12:26 src/Makefile (as sent)' echo ' \c' /bin/ls -l src/Makefile echo 'Extracting src/debug.c' sed 's/^X//' > src/debug.c << '+ END-OF-FILE src/debug.c' X X#ifndef LINT Xstatic char * sccsdef = "@(#)debug.c 1.1 (Alex Crain) 6/20/89"; X#endif X X#include <sys/types.h> X#include <sys/param.h> X#include <sys/systm.h> X#include <sys/errno.h> X#include <sys/proc.h> X#include <uipc/mbuf.h> X#include <uipc/socket.h> X#include <uipc/socketvar.h> X#include <uipc/protosw.h> X#include <uipc/domain.h> X X#define PRINTF eprintf /* */ X/* #define PRINTF printf /* */ X Xvoid Xdump_mbuf (m, func) X struct mbuf * m; X char *func; X{ X#ifdef OLDWAY X (void) PRINTF ("MBUF DUMP [%x]\n", m); X (void) PRINTF ("[m_next : %x] [m_off : %x] [m_len : %x] [m_type : %x]\n", X m->m_next, m->m_off, m->m_len, m->m_type); X if (m->m_type == MT_SOCKET) X { X struct socket * so = mtod (m, struct socket *); X (void) PRINTF ("[so_type %x] [so_state %x]\n", so->so_type, so->so_state); X } X (void) PRINTF ("MBUF DUMP [done]\n"); X#else X if (m->m_type == MT_SOCKET) X { X struct socket * so = mtod (m, struct socket *); X PRINTF ("FUNCTION %s: MBUF DUMP [%x]\n[m_next : %x] [m_off : %x] \ X[m_len : %x] [m_type : %x]\n[so_type %x] [so_state %x]\n", X func, m, m->m_next, m->m_off, m->m_len, m->m_type, X so->so_type, so->so_state); X } else { X PRINTF ("FUNCTION %s: MBUF DUMP [%x]\n[m_next : %x] [m_off : %x] \ X[m_len : %x] [m_type : %x]\n", X func, m, m->m_next, m->m_off, m->m_len, m->m_type); X } X#endif X} X + END-OF-FILE src/debug.c chmod 'u=rw,g=rw,o=rw' 'src/debug.c' echo ' -rw-rw-rw- 1 bes HSJ 1343 Aug 12 12:26 src/debug.c (as sent)' echo ' \c' /bin/ls -l src/debug.c echo 'Extracting src/domain.c' sed 's/^X//' > src/domain.c << '+ END-OF-FILE src/domain.c' X#ifndef LINT Xstatic char * sccsdef = "@(#)domain.c 1.1 (Alex Crain) 6/20/89"; X#endif X X/* X * domain.c - routines for handling domains X * X * Written by Alex Crain. X * X * This file is loosly based in the Berkeley file uipc_domain.c, X * but is *not* guarenteed to be in any way compatable. It is X * close enough to the Berkeley code that the following applies... X * X * Copyright (c) 1982, 1986, 1988 Regents of the University of California. X * All rights reserved. X * X * Redistribution and use in source and binary forms are permitted X * provided that this notice is preserved and that due credit is given X * to the University of California at Berkeley. The name of the University X * may not be used to endorse or promote products derived from this X * software without specific prior written permission. This software X * is provided "as is" without express or implied warranty. X * X */ X X#include <sys/types.h> X#include <sys/param.h> X#include <sys/systm.h> X#include <uipc/socketvar.h> X#include <uipc/socket.h> X#include <uipc/protosw.h> X#include <uipc/domain.h> X#include <uipc/mbuf.h> X#include <uipc/fproto.h> X X#ifndef __STDC__ X#define ADDDOMAIN(x) \ X { extern struct domain x/**/domain; \ X x/**/domain.dom_next = domains; \ X domains = &x/**/domain; } X#else X#define ADDDOMAIN(x) \ X { extern struct domain x ## domain; \ X x ## domain.dom_next = domains; \ X domains = &x ## domain; } X#endif X Xvoid Xdomaininit () X{ X register struct domain * dp; X register struct protosw * pr; X X ADDDOMAIN (unix); X X#ifdef INET X ADDDOMAIN (inet); X#endif X X for (dp = domains; dp; dp = dp->dom_next) X { X if (dp->dom_init) X (* dp->dom_init) (); X for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) X if (pr->pr_init) X (* pr->pr_init) (); X } X} X Xstruct protosw * Xpffindtype (family, type) X int family, type; X{ X register struct domain * dp; X register struct protosw * pr; X X for (dp = domains; dp; dp = dp->dom_next) X if (dp->dom_family == family) X goto found; X return 0; X found: X for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) X if (pr->pr_type && pr->pr_type == type) X return pr; X return 0; X} X Xstruct protosw * Xpffindproto (family, protocol, type) X int family, protocol, type; X{ X register struct domain * dp; X register struct protosw * pr; X struct protosw * maybe = 0; X X for (dp = domains; dp; dp = dp->dom_next) X if (dp->dom_family == family) X goto found; X return 0; X found: X for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) X { X if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) X return pr; X X#ifdef SOCK_RAW X if ((type == SOCK_RAW && pr->pr_type == SOCK_RAW && X pr->pr_protocol == 0 && maybe = (struct protosw *) 0)) X maybe = pr; X#endif X } X return maybe; X} + END-OF-FILE src/domain.c chmod 'u=rw,g=rw,o=rw' 'src/domain.c' echo ' -rw-rw-rw- 1 bes HSJ 2835 Aug 12 12:26 src/domain.c (as sent)' echo ' \c' /bin/ls -l src/domain.c echo 'Extracting src/interface.c' sed 's/^X//' > src/interface.c << '+ END-OF-FILE src/interface.c' X#ifndef LINT Xstatic char * sccsdef = "@(#)interface.c 1.1 (Alex Crain) 6/20/89"; X#endif X X/* X * interface.c - loadable driver interface. X * X * Written By Alex Crain. X * X * This file contains the driver interface routines for the uipc driver, as X * discribed in drivers(7). These interface routines are: X * uipcinit (); X * X */ X X#include <sys/types.h> X#include <sys/systm.h> X#include <sys/errno.h> X#include <sys/user.h> X#include <sys/conf.h> X#include <uipc/socketvar.h> X#include <uipc/mbuf.h> X#include <uipc/protosw.h> X#include <uipc/domain.h> X#include <uipc/fproto.h> X#include <uipc/pty.h> X X#include "sysent.h" X Xextern void (* sock_read)(); Xextern void (* sock_write)(); Xextern void (* sock_close)(); X X Xvoid Xptyinit () X{ X int i; X X /* X * add our own system call processor. X */ X X sysent[SYSL_LOCSYS].sy_call = (int (*)()) dosyscall; X sysent[SYSL_LOCSYS].sy_narg = 3; X X /* X * link to the existing hooks in the kernal. X */ X X sock_read = uipc_read; X sock_write = uipc_write; X sock_close = uipc_close; X X /* X * Initialize the system. X */ X X mbinit (); X domaininit (); X X /* X * find out where the pty major device is X */ X for(i=0;i<cdevcnt;i++) { X if(cdevsw[i].d_open == ptyopen) X pty_major = i; /* got it */ X } X so_linesw_setup(); X} X Xvoid Xdosyscall() X{ X int index = u.u_ap[0] - SYSL_FIRST; X /* X * Intercept our calls X */ X X if (index >= 0 && index <= (SYSL_LAST - SYSL_FIRST)) X { X /* X * syscall arguments are available via the users %sp, at u.u_ar0[15]. X * These arguments must be copied to the argument vector u.u_arg[] X * for access by the kernal. Noting that the stack looks like: X * %sp -> [ frame link, &67, arg1, arg2 ... ] X */ X int arg = 0; X int * ap = (int *) (u.u_ar0[15]) + 2; X while (arg < sysentries[index].sy_narg) X u.u_arg[arg++] = fuword(ap++); X X /* X * Perform the call. X */ X (* sysentries[index].sy_call) (); X } X else X locsys (); X} X Xint Xuipcrelease () X{ X int mbmem_ref; X int s = spl5(); X struct mbuf * m; X X for (m = mbmem; m < &mbmem[NMBUF+1]; m++) X if (m->m_type == MT_SOCKET) X if (soclose (mtod (m, struct socket *))) X return EBUSY; X for (mbmem_ref =0, m = mbmem; m < &mbmem[NMBUF+1]; m++, mbmem_ref++) X if (m->m_type != MT_FREE) X { X int * i; X (void) printf ("\n\n\nUIPC: Illegal mbuf type %d.\n", m->m_type); X (void) printf ("m = ([*|%x] [m_next|%x] [m_len|%x] [m_type|%x])\n", X m, m->m_next, m->m_len, m->m_type); X (void) printf ("mbmem_ref=%d, NMBUF=%d\n", mbmem_ref, NMBUF); X for (i = mtod (m, int *); X i < ((int *) ((caddr_t) m + MSIZE - MTAIL)); X i+=4) X (void) printf ("%x %x %x %x\n", *i, *(i+1), *(i+2), *(i+3)); X panic ("uipc_release"); X } X X splx (s); X so_linesw_release(); X return 0; X} X X/* X * rdwr() uses this for reading sockets. X * X * There are no arguments, pertinant info is available as: X * u.u_ap[0] - The file descriptor number X * u.u_base - IO buffer address X * u.u_count - size of buffer. X * u.u_segflg - IO buffer location X * X * Errors do not return, rather an error condition is handled with a longjmp X * to u.u_qsav, with some non-zero argument. the call will return -1 to the X * user, passing the error in errno (u.u_error). Since the jump returns X * directly to trap(), we need to do any houskeeping here. X */ X Xvoid Xuipc_write () X{ X struct file * fp = getf (u.u_ap[0]); X X u.u_error = sosend (filesock (fp), (struct mbuf *) 0, 0, (struct mbuf *) 0); X X /* X * process errors X */ X X if (u.u_error) X longjmp (u.u_qsav, 1); X} X Xvoid Xuipc_read () X{ X struct file * fp = getf (u.u_ap[0]); X X u.u_error = X soreceive (filesock (fp), (struct mbuf **) 0, 0, (struct mbuf **) 0); X X X X /* X * process errors X */ X X if (u.u_error) X longjmp (u.u_qsav, 1); X} X Xvoid Xuipc_close (sp) X off_t sp; X{ X u.u_error = soclose (mtod (ptom (sp), struct socket *)); X X /* X * process errors X */ X X if (u.u_error) X longjmp (u.u_qsav, 1); X} X X X/* X * General utilities for the BSD<->sysV mix. X */ X X#ifdef unixpc X Xasm(" global bzero "); Xasm("bzero: "); Xasm(" mov.l 4(%sp),%a0"); Xasm(" mov.w 10(%sp),%d0"); Xasm(" sub.w &1,%d0 "); Xasm(" bmi end "); Xasm("loop: "); Xasm(" mov.b &0,(%a0)+"); Xasm(" dbf %d0,loop"); Xasm("end: "); Xasm(" rts "); X X#else X Xvoid Xbzero (s, n) X char * s; X int n; X{ X while (n--) X *s++ = '\0'; X} X X#endif X Xint Xufavail () X{ X int avail = 0, fd = 0; X X for (fd = 0; fd < 80; fd++) X if (u.u_ofile[fd] == 0) X avail++; X X return avail; X} + END-OF-FILE src/interface.c chmod 'u=rw,g=rw,o=rw' 'src/interface.c' echo ' -rw-rw-rw- 1 bes HSJ 4561 Aug 12 12:26 src/interface.c (as sent)' echo ' \c' /bin/ls -l src/interface.c echo 'Extracting src/linesw.c' sed 's/^X//' > src/linesw.c << '+ END-OF-FILE src/linesw.c' X#include <sys/types.h> X#include <sys/sysmacros.h> X#include <sys/conf.h> X#include <sys/tty.h> X Xint (*real_linesw_read)(), (*real_linesw_write)(); Xint (*real_linesw_l_input)(); Xint so_linesw_read(), so_linesw_write(); Xint so_linesw_l_input(); X X/* stuff to wake up on */ Xextern int select_sleep, select_sleep_addr; X X/* unsigned addr_win_tty = 384636; /* */ X Xso_linesw_read(tp) Xstruct tty *tp; X{ X extern int (*real_linesw_read) (); X X /* next check us for wakeup maybe? */ X if(select_sleep) { X select_sleep = 0; X wakeup((caddr_t) &select_sleep_addr); X } X (*real_linesw_read)(tp); X} Xso_linesw_write(tp) Xstruct tty *tp; X{ X extern int (*real_linesw_write) (); X X /* next check us for wakeup maybe? */ X if(select_sleep) { X select_sleep = 0; X wakeup((caddr_t) &select_sleep_addr); X } X (*real_linesw_write)(tp); X} Xso_linesw_l_input(tp) Xstruct tty *tp; X{ X X /* next check us for wakeup maybe? */ X if(select_sleep) { X select_sleep = 0; X wakeup((caddr_t) &select_sleep_addr); X } X /* first call real input routine */ X (*real_linesw_l_input)(tp); X} Xso_linesw_setup() X{ X extern int (*real_linesw_write) (); X extern int (*real_linesw_read) (); X extern int (*real_linesw_l_input) (); X X /* setup to route tty ouput to here */ X real_linesw_read = linesw[0].l_read; X linesw[0].l_read = so_linesw_read; X real_linesw_write = linesw[0].l_write; X linesw[0].l_write = so_linesw_write; X real_linesw_l_input = linesw[0].l_input; X linesw[0].l_input = so_linesw_l_input; X X} Xso_linesw_release() X{ X extern int (*real_linesw_write) (); X extern int (*real_linesw_read) (); X X /* setup to route tty ouput to here */ X linesw[0].l_read = real_linesw_read; X linesw[0].l_write = real_linesw_write; X linesw[0].l_input = real_linesw_l_input; X X} + END-OF-FILE src/linesw.c chmod 'u=rw,g=r,o=r' 'src/linesw.c' echo ' -rw-r--r-- 1 bes HSJ 1706 Aug 12 12:26 src/linesw.c (as sent)' echo ' \c' /bin/ls -l src/linesw.c echo 'Extracting src/mbuf.c' sed 's/^X//' > src/mbuf.c << '+ END-OF-FILE src/mbuf.c' X#ifndef LINT Xstatic char * sccsdef = "@(#)mbuf.c 1.1 (Alex Crain) 6/20/89"; X#endif X X/* X * mbuf.c - high level socket routines X * X * Written by Alex Crain. X * X * This file is based in the Berkeley file uipc_mbuf.c, X * but is *not* guarenteed to be in any way compatable. It is X * close enough to the Berkeley code that the following applies... X * X * Copyright (c) 1982, 1986, 1988 Regents of the University of California. X * All rights reserved. X * X * Redistribution and use in source and binary forms are permitted X * provided that this notice is preserved and that due credit is given X * to the University of California at Berkeley. The name of the University X * may not be used to endorse or promote products derived from this X * software without specific prior written permission. This software X * is provided "as is" without express or implied warranty. X * X */ X X X#include <sys/types.h> X#include <sys/param.h> X#include <sys/systm.h> X#include <uipc/socketvar.h> X#include <uipc/protosw.h> X#include <uipc/domain.h> X#include <uipc/mbuf.h> X#include <uipc/fproto.h> X Xstatic char mbuf_data[sizeof (struct mbuf) * (NMBUF + 1)]; X X/* X * Initialize the mbuf map; all free in a null terminated linked list. X */ X Xvoid Xmbinit() X{ X register int i; X X mfree = mbmem = &(dtom (mbuf_data))[1]; X mbmask = ((unsigned int) mbmem & 0xFF800000); X X for (i = 0; i < NMBUF; i++) X { X mbmem[i].m_type = MT_FREE; X mbmem[i].m_next = &mbmem[i+1]; X } X mbmem[NMBUF-1].m_next = NULL; X} X X/* X * get one mbuf structure X */ X Xstruct mbuf * Xm_get (canwait, type) X int canwait, type; X{ X struct mbuf * m; X X MGET (m, canwait, type); X return m; X} X X/* X * get a clean mbuf (all zeros). X */ X Xstruct mbuf * Xm_getclr (canwait, type) X int canwait, type; X{ X register struct mbuf * m; X X MGET (m, canwait, type); X if (m == 0) X return 0; X bzero (mtod (m, caddr_t), MLEN); X return m; X} X X X/* X * free one mbuf structure. returns the next mbuf in the chain. X */ X Xstruct mbuf * Xm_free (m) X struct mbuf * m; X{ X struct mbuf * n; X X MFREE (m, n); X return n; X} X X/* X * get some more mbuf. X * There is no more, so we wait until some comes back. X */ X Xstruct mbuf * Xm_more (canwait, type) X int canwait, type; X{ X struct mbuf * m; X X if (canwait == M_WAIT) X { X m_want++; X (void) sleep ((caddr_t) &mfree, PZERO - 1); X MGET (m, canwait, type); X return m; X } X else X return NULL; X} X X/* X * free an mbuf chain. X */ X Xvoid Xm_freem (m) X struct mbuf * m; X{ X struct mbuf * n; X int s = splimp (); X X if (m == NULL) X goto done; X do { X MFREE(m, n); X } while (m = n); X done: X splx (s); X} X X/* X * copy an mbuf chain, return 0 on failure. X */ X Xstruct mbuf * Xm_copy (m, off, len) X struct mbuf * m; X int off, len; X{ X struct mbuf * n, ** np; X struct mbuf * top; X X if (len = 0) X return NULL; X X if (off < 0 || len < 0) X panic ("m_copy"); X X while (off > 0) X { X if (m == 0) X panic ("m_copy"); X if (off < m->m_len) X break; X off -= m->m_len; X m = m->m_next; X } X np = ⊤ X top = 0; X X while (len > 0) X { X if (m == 0) X { X if (len != M_COPYALL) X panic ("m_copy"); X break; X } X MGET (n, M_DONTWAIT, m->m_type); X if ((*np = n) == 0) X goto nospace; X X n->m_len = MIN (len, m->m_len - off); X bcopy (mtod (m, caddr_t), mtod (n, caddr_t), (unsigned) n->m_len); X if (len != M_COPYALL) X len -= n->m_len; X X off = 0; X m = m->m_next; X np = &n->m_next; X } X return top; X X nospace: X m_freem (top); X return NULL; X} X X X X + END-OF-FILE src/mbuf.c chmod 'u=rw,g=rw,o=rw' 'src/mbuf.c' echo ' -rw-rw-rw- 1 bes HSJ 3635 Aug 12 12:26 src/mbuf.c (as sent)' echo ' \c' /bin/ls -l src/mbuf.c echo 'Extracting src/proto.c' sed 's/^X//' > src/proto.c << '+ END-OF-FILE src/proto.c' X#ifndef LINT Xstatic char * sccsdef = "@(#)proto.c 1.1 (Alex Crain) 6/20/89"; X#endif X X/* X * proto.c - protocol spec for the UNIX domain. X * X * Written by Alex Crain. X * X * This file is loosly based in the Berkeley file uipc_proto.c, X * but is *not* guarenteed to be in any way compatable. It is X * close enough to the Berkeley code that the following applies... X * X * Copyright (c) 1982, 1986, 1988 Regents of the University of California. X * All rights reserved. X * X * Redistribution and use in source and binary forms are permitted X * provided that this notice is preserved and that due credit is given X * to the University of California at Berkeley. The name of the University X * may not be used to endorse or promote products derived from this X * software without specific prior written permission. This software X * is provided "as is" without express or implied warranty. X * X */ X X#include <sys/types.h> X#include <sys/param.h> X#include <sys/systm.h> X#include <uipc/mbuf.h> X#include <uipc/socket.h> X#include <uipc/socketvar.h> X#include <uipc/protosw.h> X#include <uipc/domain.h> X#include <uipc/fproto.h> X X/* X * UNIX domain protocols X */ X Xint uipc_usrreq (); Xint raw_init (), raw_usrreq (), raw_input (), raw_ctlinput (); Xextern struct domain unixdomain; X Xstruct protosw unixsw[] = { X { SOCK_STREAM, &unixdomain, 0, PR_CONNREQUIRED | PR_WANTRCVD | PR_RIGHTS, X 0, 0, 0, 0, X uipc_usrreq, X 0, 0, 0, 0, }, X { SOCK_DGRAM, &unixdomain, 0, PR_ATOMIC | PR_ADDR | PR_RIGHTS, X 0, 0, 0, 0, X uipc_usrreq, X 0, 0, 0, 0, }, X#ifdef SOCK_RAW X { 0, 0, 0, 0, X raw_input, 0, raw_ctlinput, 0, X raw_usrreq, X raw_init, 0, 0, 0, }, X#endif X}; X Xstruct domain unixdomain = X{ AF_UNIX, "unix", 0, unp_externalize, (int (*)()) unp_dispose, X unixsw, &unixsw[sizeof (unixsw) / sizeof (unixsw[0])] }; X + END-OF-FILE src/proto.c chmod 'u=rw,g=rw,o=rw' 'src/proto.c' echo ' -rw-rw-rw- 1 bes HSJ 1848 Aug 12 12:26 src/proto.c (as sent)' echo ' \c' /bin/ls -l src/proto.c echo 'Extracting src/prwopen.c' sed 's/^X//' > src/prwopen.c << '+ END-OF-FILE src/prwopen.c' X/* X * NAME X * prwopen - modified popen(3) to work with pty's instead of X * pipes, and also provide both read and write X * capabilities to the child process. X * X * SYNOPSIS X * #include <stdio.h> X * X * int prwopen( cmd, streams ) X * char *cmd; X * FILE streams[2]; X * X * AUTHOR (actually, merger!) X * John Ioannidis, ioannidis@cs.columbia.edu X * X * SEE ALSO X * popen(3), after which this call is modelled. X * X * UNIX SOURCES USED X * popen(3), script(1) X * X */ X#include <stdio.h> X#include <sys/ioctl.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <signal.h> X#include <sgtty.h> X Xstatic int pip_pid[ 20 ]; X Xint Xprwopen( cmd, streams ) Xchar *cmd; XFILE *streams[]; X{ X int pty, pid, j; X struct stat stb; X char c; X static char *line = "/dev/ptyp0"; X X for( c = 'p'; c <= 's'; c++ ) X { X line[strlen("/dev/pty")] = c; X line[strlen("/dev/ptyp")] = '0'; X if( stat( line, &stb ) < 0 ) X break; X for( j = 0; j < 16; j++ ) X { X line[strlen("/dev/ptyp")] = "0123456789abcdef"[j]; X if( ( pty = open( line, 2 )) > 0 ) X goto opened; X } X } X return( -1 ); X Xopened: X switch( pid = fork() ) X { X case -1: X return( -1 ); X X case 0: X { X int t, tty; X struct sgttyb bf; X t=open( "/dev/tty", 2 ); X if( t >= 0 ) X { X ioctl( t, TIOCNOTTY, (char *)0 ); X close( t ); X } X line[strlen("/dev/")] = 't'; X tty = open( line, 2 ); X close( pty ); X ioctl( tty, TIOCGETP, &bf ); X bf.sg_flags &= ~ECHO; X ioctl( tty, TIOCSETP, &bf ); X dup2( tty, 0 ); X dup2( tty, 1 ); X dup2( tty, 2 ); X close( tty ); X X execl( "/bin/sh", "sh", "-c", cmd, 0 ); X _exit(1); X } X } X X pip_pid[pty]=pid; X X if( (streams[0] = fdopen( pty, "r" )) == NULL || X (streams[1] = fdopen( pty, "w" )) == NULL ) X { X return( -1 ); X } X setbuf( streams[0], NULL ); X setbuf( streams[1], NULL ); X return( 0 ); X} X Xprwclose( streams ) XFILE *streams[]; X{ X register f, r, (*hstat)(), (*istat)(), (*qstat)(); X int status; X X f = fileno(streams[1]); X fclose(streams[0]); X fclose(streams[1]); X istat = signal(SIGINT, SIG_IGN); X qstat = signal(SIGQUIT, SIG_IGN); X hstat = signal(SIGHUP, SIG_IGN); X while((r = wait(&status)) != pip_pid[f] && r != -1) X ; X if(r == -1) X status = -1; X signal(SIGINT, istat); X signal(SIGQUIT, qstat); X signal(SIGHUP, hstat); X return(status); X} X + END-OF-FILE src/prwopen.c chmod 'u=rw,g=rw,o=' 'src/prwopen.c' echo ' -rw-rw---- 1 bes HSJ 2565 Aug 12 12:26 src/prwopen.c (as sent)' echo ' \c' /bin/ls -l src/prwopen.c echo 'Extracting src/pty.c' sed 's/^X//' > src/pty.c << '+ END-OF-FILE src/pty.c' X/* X * pty.c - Berkeley style pseudo tty driver for system V X * X * Copyright (c) 1987, Jens-Uwe Mager, FOCUS Computer GmbH X * Not derived from licensed software. X * X * Permission is granted to freely use, copy, modify, and redistribute X * this software, provided that no attempt is made to gain profit from it, X * the author is not construed to be liable for any results of using the X * software, alterations are clearly marked as such, and this notice is X * not modified. X */ X X/* X * Modified for use on the UnixPC by: X * Eric H. Herrin II X * University of Kentucky Mathematical Sciences Laboratories X * eric@ms.uky.edu, eric@ms.uky.csnet, !cbosgd!ukma!eric X * X * See README.3b1 for details of port and installation. X * Version 2.1 X */ X X/* X * the following are arbitrary 3 unused bits from t_state X * in sys/tty.h X */ X/* The UnixPC does not have any extra bits in t_state, thus X * one must provide other means of storing the state. X */ X#define MRWAIT 01 /* master waiting in read */ X#define t_rloc t_cc[0] /* wchannel */ X#define MWWAIT 02 /* master waiting in write */ X#define t_wloc t_cc[1] /* wchannel */ X#define MOPEN 04 /* master is open */ X X#include <uipc/pty.h> X#include <sys/param.h> X#include <sys/types.h> X#include <sys/sysmacros.h> X#include <sys/systm.h> X#include <sys/file.h> X#include <sys/conf.h> X#include <sys/proc.h> X#include <sys/dir.h> X#include <sys/tty.h> X#include <sys/signal.h> X#include <sys/user.h> X#include <sys/errno.h> X#include <sys/termio.h> X#include <sys/ttold.h> X X/* The tty structures must be local to this driver. One doesn't have X * conf.c X */ Xstruct tty pts_tty[PTYCNT]; Xint pts_cnt = PTYCNT; Xint ptystate[PTYCNT]; X/* This is needed so that we know what the major device is. This X * is need by socket driver. So we keep the Major device number X * here for socket, this is used by the select function X */ Xint pty_major = 0; /* if zero then no pty's are opened */ X Xptyopen(dev, flag) X register dev_t dev; X register int flag; X{ X register struct tty *tp; X X dev = minor(dev); X if (Master(dev) == True) { X# ifdef DEBUG X eprintf("open(master): \n"); X# endif X dev -= PTYCNT; X tp = &pts_tty[dev]; X if (dev >= pts_cnt) { X u.u_error = ENXIO; X return; X } X /* X * allow only one controlling process X */ X if (ptystate[dev] & MOPEN) { X u.u_error = EBUSY; X return; X } X if (tp->t_state & WOPEN) X wakeup((caddr_t)&tp->t_canq); X tp->t_state |= CARR_ON; X ptystate[dev] |= MOPEN; X } else { X# ifdef DEBUG X eprintf("open(slave): \n"); X# endif X tp = &pts_tty[dev]; X if (dev >= pts_cnt) { X u.u_error = ENXIO; X return; X } X if ((tp->t_state & (ISOPEN|WOPEN)) == 0) { X ttinit(tp); X tp->t_proc = ptsproc; X } X /* X * if master is still open, don't wait for carrier X */ X if (ptystate[dev] & MOPEN) X tp->t_state |= CARR_ON; X if (!(flag & FNDELAY)) { X while ((tp->t_state & CARR_ON) == 0) { X tp->t_state |= WOPEN; X sleep((caddr_t)&tp->t_canq, TTIPRI); X } X } X (*linesw[tp->t_line].l_open)(tp); X } X} X Xptyclose(dev, flag) X register dev_t dev; X register int flag; X{ X register struct tty *tp; X X dev = minor(dev); X if (Master(dev) == True) { X# ifdef DEBUG X eprintf("close(master): \n"); X# endif X dev -= PTYCNT; X tp = &pts_tty[dev]; X if (tp->t_state & ISOPEN) { X signal(tp->t_pgrp, SIGHUP); X ttyflush(tp, FREAD|FWRITE); X } X /* X * virtual carrier gone X */ X tp->t_state &= ~(CARR_ON); X ptystate[dev] &= ~MOPEN; X } else { X# ifdef DEBUG X eprintf("close(slave): \n"); X# endif X tp = &pts_tty[dev]; X (*linesw[tp->t_line].l_close)(tp); X tp->t_state &= ~CARR_ON; X } X} X Xptyread(dev) X register dev_t dev; X{ X register struct tty *tp; X register n; X X dev = minor(dev); X if (Master(dev) == True) { X# ifdef DEBUG X eprintf("read(master): \n"); X# endif X dev -= PTYCNT; X tp = &pts_tty[dev]; X X /* added fix for hanging master side when the slave hangs X * up too early. Fix by Michael Bloom (mb@ttidca.tti.com). X */ X if ((tp->t_state & (ISOPEN|TTIOW)) == 0) { X u.u_error = EIO; X return; X } X while (u.u_count > 0) { X ptsproc(tp, T_OUTPUT); X if ((tp->t_state & (TTSTOP|TIMEOUT)) X || tp->t_tbuf.c_ptr == NULL || tp->t_tbuf.c_count == 0) { X if (u.u_fmode & FNDELAY) X break; X# ifdef DEBUG X eprintf("read(master): master going to sleep\n"); X# endif X ptystate[dev] |= MRWAIT; X sleep((caddr_t)&tp->t_rloc, TTIPRI); X# ifdef DEBUG X eprintf("read(master): master woke up\n"); X# endif X X continue; X } X n = min(u.u_count, tp->t_tbuf.c_count); X if (n) { X# ifdef DEBUG X eprintf("read(master): got some stuff\n"); X# endif X if (copyout(tp->t_tbuf.c_ptr, u.u_base, n)) { X u.u_error = EFAULT; X break; X } X tp->t_tbuf.c_count -= n; X tp->t_tbuf.c_ptr += n; X u.u_base += n; X u.u_count -= n; X } X } X } else { X# ifdef DEBUG X eprintf("read(slave): \n"); X# endif X tp = &pts_tty[dev]; X# ifdef DEBUG X eprintf("read(slave): got some stuff\n"); X# endif X (*linesw[tp->t_line].l_read)(tp); X } X} X Xptywrite(dev) X register dev_t dev; X{ X register struct tty *tp; X register n; X X dev = minor(dev); X if (Master(dev) == True) { X# ifdef DEBUG X eprintf("write(master): \n"); X# endif X dev -= PTYCNT; X tp = &pts_tty[dev]; X X if ((tp->t_state & ISOPEN) == 0) { X u.u_error = EIO; X return; X } X while (u.u_count > 0) { X if ((tp->t_state & TBLOCK) || tp->t_rbuf.c_ptr == NULL) { X if (u.u_fmode & FNDELAY) X break; X ptystate[dev] |= MWWAIT; X# ifdef DEBUG X eprintf("write(master): going to sleep\n"); X# endif X X sleep((caddr_t)&tp->t_wloc, TTOPRI); X X# ifdef DEBUG X eprintf("write: waking up\n"); X# endif X X continue; X } X n = min(u.u_count, tp->t_rbuf.c_count); X if (n) { X# ifdef DEBUG X eprintf("write(master): sending some stuff\n"); X# endif X if (copyin(u.u_base,tp->t_rbuf.c_ptr, n)) { X u.u_error = EFAULT; X break; X } X tp->t_rbuf.c_count -= n; X u.u_base += n; X u.u_count -= n; X } X (*linesw[tp->t_line].l_input)(tp); X } X } else { X# ifdef DEBUG X eprintf("write(slave): \n"); X# endif X tp = &pts_tty[dev]; X# ifdef DEBUG X eprintf("write(slave): sending some stuff\n"); X# endif X (*linesw[tp->t_line].l_write)(tp); X } X} X Xptyioctl(dev, cmd, arg, mode) X dev_t dev; X int cmd, arg, mode; X{ X register struct tty *tp; X X dev = minor(dev); X if (Master(dev) == True) { X# ifdef DEBUG X eprintf("ioctl(master): \n"); X# endif X dev -= PTYCNT; X tp = &pts_tty[dev]; X /* X * sorry, but we can't fiddle with the tty struct without X * having done LDOPEN X */ X if (tp->t_state & ISOPEN) { X if (cmd == TCSBRK && arg == NULL) { X signal(tp->t_pgrp, SIGINT); X if ((tp->t_iflag & NOFLSH) == 0) X ttyflush(tp, FREAD|FWRITE); X } else { X /* X * we must flush output to avoid hang in ttywait X */ X if (cmd == TCSETAW || cmd == TCSETAF || X cmd == TCSBRK || cmd == TIOCSETP) X ttyflush(tp, FWRITE); X ttiocom(tp, cmd, arg, mode); X } X } X } else { X# ifdef DEBUG X eprintf("ioctl(slave): \n"); X# endif X tp = &pts_tty[dev]; X ttiocom(tp, cmd, arg, mode); X } X} X Xptsproc(tp, cmd) Xregister struct tty *tp; X{ X register struct ccblock *tbuf; X extern ttrstrt(); X X switch (cmd) { X case T_TIME: X# ifdef DEBUG X eprintf("ptsproc: T_TIME:\n"); X# endif X tp->t_state &= ~TIMEOUT; X goto start; X case T_WFLUSH: X# ifdef DEBUG X eprintf("ptsproc: T_WFLUSH:\n"); X# endif X tp->t_tbuf.c_size -= tp->t_tbuf.c_count; X tp->t_tbuf.c_count = 0; X /* fall through */ X case T_RESUME: X# ifdef DEBUG X eprintf("ptsproc: T_RESUME:\n"); X# endif X tp->t_state &= ~TTSTOP; X /* fall through */ X case T_OUTPUT: Xstart: X# ifdef DEBUG X eprintf("ptsproc: T_OUTPUT:\n"); X# endif X if (tp->t_state & (TTSTOP|TIMEOUT)) X break; X# ifdef DEBUG X eprintf("ptsproc: T_OUTPUT: past(TTSTOP|TIMEOUT)"); X# endif X tbuf = &tp->t_tbuf; X if (tbuf->c_ptr == NULL || tbuf->c_count == 0) { X# ifdef DEBUG X eprintf("ptsproc: T_OUTPUT: tbuf empty, may break\n"); X# endif X if (tbuf->c_ptr) X tbuf->c_ptr -= tbuf->c_size; X if (!(CPRES & (*linesw[tp->t_line].l_output)(tp))) X break; X } X if (tbuf->c_count && (ptystate[tp-pts_tty] & MRWAIT)) { X#ifdef DEBUG X eprintf("ptsproc: T_OUTPUT: waking up master\n"); X#endif X ptystate[tp-pts_tty] &= ~MRWAIT; X wakeup((caddr_t)&tp->t_rloc); X } X# ifdef DEBUG X eprintf("ptsproc: T_OUTPUT: leaving end\n"); X# endif X break; X case T_SUSPEND: X# ifdef DEBUG X eprintf("ptsproc: T_SUSPEND:\n"); X# endif X tp->t_state |= TTSTOP; X break; X case T_BLOCK: X# ifdef DEBUG X eprintf("ptsproc: T_BLOCK:\n"); X# endif X /* X * the check for ICANON appears to be neccessary X * to avoid a hang when overflowing input X */ X if ((tp->t_iflag & ICANON) == 0) X tp->t_state |= TBLOCK; X break; X case T_BREAK: X# ifdef DEBUG X eprintf("ptsproc: T_BREAK:\n"); X# endif X tp->t_state |= TIMEOUT; X timeout(ttrstrt, tp, HZ/4); X break; X#ifdef T_LOG_FLUSH X case T_LOG_FLUSH: X#endif X case T_RFLUSH: X# ifdef DEBUG X eprintf("ptsproc: T_RFLUSH:\n"); X# endif X if (!(tp->t_state & TBLOCK)) X break; X /* fall through */ X case T_UNBLOCK: X# ifdef DEBUG X eprintf("ptsproc: T_UNBLOCK:\n"); X# endif X tp->t_state &= ~(TTXOFF|TBLOCK); X /* fall through */ X case T_INPUT: X# ifdef DEBUG X eprintf("ptsproc: T_INPUT:\n"); X# endif X if (ptystate[tp-pts_tty] & MWWAIT) { X ptystate[tp-pts_tty] &= ~MWWAIT; X# ifdef DEBUG X eprintf("ptsproc: T_INPUT: waking up master\n"); X# endif X wakeup((caddr_t)&tp->t_wloc); X } X break; X default: X# ifdef DEBUG X eprintf("ptsproc: default:\n"); X# else X ; X# endif X } X} X X/* This routine used to be a stub, however, an industrious soul found X * the release routine caused a panic whenever the driver is released X * and some ptys are still open. The simple 'for' loop fixes this X * problem. X * X * Credit should be given to: X * Mike "Ford" Ditto X * kenobi!ford@crash.CTS.COM, ...!crash!kenobi!ford X * for finding the bug and writing the for loop. X * X * [Eric H. Herrin II, 10-7-87] X */ Xptyrelease() X{ X register int i; X X# ifdef DEBUG X eprintf("ptyrelease:\n"); X# endif X for (i=0; i<PTYCNT; i++) X if ((ptystate[i] & (ISOPEN|MOPEN)) || X (pts_tty[i].t_state & WOPEN)) { X u.u_error = EBUSY; X return; X } X /* next release socket driver */ X i = uipcrelease(); X return i; X} + END-OF-FILE src/pty.c chmod 'u=rw,g=r,o=r' 'src/pty.c' echo ' -rw-r--r-- 1 bes HSJ 10252 Aug 12 12:26 src/pty.c (as sent)' echo ' \c' /bin/ls -l src/pty.c exit 0 -- Bradley Smith Computer Systems Offer Integration Laboratory AT&T Bell Labs, Holmdel, NJ 201-949-0090 att!holin!bes or bes@holin.ATT.COM