Subject: How to support clone devices (i.e. /dev/tcp)
To: None <christos@deshaw.com>
From: Gordon W. Ross <gwr@jericho.mc.com>
List: tech-kern
Date: 11/15/1994 12:02:37
> From: Christos Zoulas <christos@deshaw.com>
> Date: Tue, 15 Nov 1994 11:39:54 -0500

> Well, not everything uses libsocket.so; actually almost nothing except
> XFree86 and the berkeley utilities [telnet,rlogin,rsh].  Most of the
> commercial stuff including the version of X that comes bundled with the
> OS and framemaker uses libnsl.so directly.

Ugh!  That's really unfortunate.  I guess they couldn't figure out:

  cc -o the_objs.o -Bstatic -lX11 ... -Bdynamic -lsocket -lnsl

> But for /dev/udp and /dev/tcp there is no corresponding vnode.

Oh. I thought every open into specfs got a vnode...

> The solution I proposed is much more general; by passing struct file *
> in directly, the open routine can do anything it wants with it.

I see.  Including not even really doing a device open, I guess?
(doing a socreate() instead?)  Interesting.  Glad I asked.

> | I think the above interface can be implemented without any
> | changes outside the specfs module (though I'm not sure).
> 
> You would need to change *every* device driver open() routine to take
> a pointer to a dev_t instead of dev_t itself. Plus all the files I had
> to change for my changes...

I suppose you're right.

> In any case; I have /dev/tcp and /dev/udp mostly working; well enough
> to run X clients [xclock] and telnet directly using /dev/tcp and
> nslookup using /dev/udp...
> 
> Pretty amazing how few streams calls I needed to implement to make
> libnsl.so happy!

Great!  Congratulations.

Gordon