Some kernels don't support additional user defined line disciplines.
Especially notable in this regard is SunOS and System V. They
provide similar support in the form of "Streams". Accordingly,
included in this directory is a pair of STREAMS modules to
replace the line disciplines that provide clock support for
xntpd. Notice that the "clkdefs.h" file is not used in the
original line discipline, but the "chudefs.h" file is the
same one used in the original line discipline.

TO INSTALL A NEW STREAMS DRIVER:

1. Copy your choice to /sys/os, removing the "_STREAMS" in the
filename.

2. Copy the appropriate *defs.h file to /usr/include/sys,
then link it (with ln) to /sys/sys.

In the following steps, substitute "clk" for "chu" if you're
installing the clk driver.

3. Append to /sys/conf.common/files.cmn:

os/tty_chu.c	optional chu

4. Edit /sys/sun/str_conf.c. You'll want to add lines in three
places. It'll be sort of clear where when you see the file.

.
.
.
#include "chu.h"
.
.
.
#if NCHU > 0
extern struct streamtab chuinfo;
#endif
.
.
.
#if NCHU > 0
	{ "chu", &chuinfo },
#endif
.
.
.

At this point, the kernel-making "config [k-name] ; cd ../[k-name] ; make"
should produce a kernel just as it did before. If it fouls up,
something's wrong.

5. Edit /sys/[arch]/conf/[k-name] (substituting the architecture and
kernel name) to stick in:

pseudo-device	chu4		# CHU clock support

You can change 4 to anything you like. It will limit the number
of instantiations of the chu driver you can use at the same time.

6. Make a new kernel and boot it.

HOW TO USE THE CHU STREAMS DRIVER:

The driver should act exactly like the line discipline.
After setting the raw mode, and exclusive access (if you want),
pop off all the extra streams, then push the chu module
on. From then on, any reads from the file in question
will return chucode structures as defined in chudefs.h.
Depending on the settings of PEDANTIC and ANAL_RETENTIVE
used when compiling the kernel, some checking of the
data may or may not be necessary.

HOW TO USE THE CLK STREAMS DRIVER:

First, it should be noted that a new ioctl() has been defined.
The CLK_SETSTR ioctl takes a pointer to a string of no more
than CLK_MAXSTRSIZE characters. Until the first CLK_SETSTR
is performed, the driver will simply pass through characters.
Once it is passed a string, then any character in that string
will be immediately followed by a struct timeval. You can
change the string whenever you want by doing another
CLK_SETSTR. The character must be an exact, 8 bit match.
The character '\000' cannot, unfortunately, be stamped.
Passing an empty string to CLK_SETSTR turns off stamping.
Passing NULL will produce undefined results.

