4.4BSD/usr/src/contrib/connectd/doc/abs.model

tip ernie or tip ernie -1200
	getphonenumberbyname("ernie")	# only if not number (note: will just
					# pass back numbers if given unchanged)
	if (-1) -> p_errno
	serial_connect(errorfd, pnstruct, optstruct, optlen)
	if (-1) -> c_errno
	...
	close (fd)
	cancel_serial_connect(pnstruct)
	...
serial_connect
	socket
	connect /dev/connect
	sendmsg ... iov -> pnstruct,optstruct accrights-> errorfd
		if want to abort request, send out of band data msg
		cancel_serial_connect(pnstruct)
	recvmsg ... iov -> optstruct,errorstruct accrights-> serialfd
	rtn serialfd
	don't close socket, keep in table associated with fd
	other sub calls will ref fd to find socket, while connectd
	will ref socket to identify specific request. after finish call
	it is safe to close socket. connectd will assume fd is deallocated
	when socket is closed, and will reallocate resource. connectd
	does not maintain a fd on an open resource, it only keeps the
	socket to the process.  the daemon will do a vhangup on a tty
	before issuing it to a drop request.
connectd
	socket
	bind /dev/connect
	listen
	accept
	recvmsg
	for all dialout lines
		check lines(5) if a line can be used
			can work at desired baudrate
			can call this kind of phone number
		check if being used
	if one found that can work & is not busy, use
	if found but busy, return notyet
	if not found, return notavailable
	translate phonenumber to number per line
	open non-blocking, flock, ioctl to disable carrier (kern mod)
	set baud rate and line parameters
	fork
		rearrange filedescriptors
		setuid/geteuid?
		exec /etc/connector/hayes
	linestate=CONNECTINGOUTBOUND
	...
	for all in/out lines
		block on select writeable (kern mod)
		if one becomes writable (CARRIER), fork a getty
			and mark linestate = CONNECTINGINBOUND
		else linestate = UNCONNECTED
	...
	wait/sigchild
	if linestate == UNCONNECTED syslog error
	if linestate == CONNECTINGINBOUND forceclose, mark line SLEEPINGTWOSEC
	if linestate == CONNECTINGOUTBOUND
		if errorstat !=0 forceclose, mark line SLEEPINGTWOSEC
		else	linestate = CONNECTEDOUTBOUND 
			sendmsg (samemesgfdmt, with fd)
	...
	sigurg
	recvmsg
	if existing request on socket, killoff pid if any, forceclose line
		close socket
states
	UNUSED or
	MONITORED	<--> OPENINBOUND
	^
	|
	CONNECTOROPEN
	|
	OPENOUTBOUND	DOOPTION
	|
	CONNECTORDROP

	UNUSED:
	not open by anyone (we know), (ttys:out)

	MONITORED:
	open by us, looking for carrier via select writable or exception

	OPENINBOUND:
	we do inits and some of gettys functions (vhangup), and exec getty
	while closing fd's. we find out resource is reusable by child
	status return or sigcild.

	CONNECTOROPEN:
	we processed a request, found a connector and asked it to do
	our bidding. like getty, but on positve conculsion, we move
	to next state. we have a open socket per request and an open fd

	OPENOUTBOUND:
	we have passed back to user program a filedesc, and it is in possesion
	of fd which we don't have. but we have his socket, and we know
	what resource he has by virtue of the socket.

	DOOPTION:
	we have recieved another request from user, and we have passed the
	option off with the fd from user to connector program to implement
	the function. this is like connectoropen, but we don't clean off
	the descriptors before use.

	CONNECTORDROP:
	we recieved either a EPIPE/SIGPIPE, select returned a EBAF, or...
	or we processed a finish request, and we vhangup'd the line
	and spawned a connector with fd to do a drop. by this time
	we forsure don't have a open socket.

	ABORT:
	an abort request recieved at any time causes any outstanding
	connector to be killed (SIGTERM, followed by SIGKILL), and
	any outstanding request to be responded with negative result.
	if not connected, then we go into connector drop state.
	abort's are not acked! aborts on no connector active aare
	ignored.

methods:
	tty/modem/pots	- get a tty, and a modem, and a final number --> dial

	alloc a tty	tty/alloc
	config the line for modem	tty/setline modemdialingopts
	check for presence of modem	tty/modem/hayes probe
	config generic hayes stuff	tty/modem/hayes config modemopts
	config courier stuff		tty/modem/hayes courier
	translate number		tty/modem/pots/translate
	dial number			tty/modem/hayes dial
	accept connection		tty/modem/hayes connect
	change line for connection (speed?) tty/setline connectionopts
	done

	config the line for incoming	tty/setline incomingmodemopts
	check for presence of modem	tty/modem/hayes probe
	config generic hayes stuff	tty/modem/hayes config modemopts
	config courier stuff		tty/modem/hayes courier
	config incoming hayes stuff	tty/modem/hayes config incoming
	line select	****
	accept connection		tty/modem/hayes inconnect
	change line for connection (speed?) tty/setline inconnectionopts
	
	
/etc/connect/
	connectd
	tty/
		lines
		alloc=?
		modem/
			hayes
			hayes=type/
				courier
				trailblaizer
			pots/
				rewrite number
			fts/
	datakit/
		tty/
			modem/
				pots/