BSD 4 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Fri, 22 Aug 1980 06:58:10 +0000 (22:58 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Fri, 22 Aug 1980 06:58:10 +0000 (22:58 -0800)
Work on file usr/src/cmd/berknet/update
Work on file usr/src/cmd/berknet/dz1.c
Work on file usr/src/cmd/berknet/dz2.c
Work on file usr/src/cmd/berknet/store.c
Work on file usr/src/cmd/berknet/setlength
Work on file usr/src/cmd/berknet/setmode.c
Work on file usr/src/cmd/berknet/listen.c
Work on file usr/src/cmd/berknet/network.map
Work on file usr/src/cmd/berknet/interact.c
Work on file usr/src/cmd/berknet/receive.c
Work on file usr/src/cmd/berknet/start
Work on file usr/src/cmd/berknet/initfile

Synthesized-from: CSRG//cd1/4.0

12 files changed:
usr/src/cmd/berknet/dz1.c [new file with mode: 0644]
usr/src/cmd/berknet/dz2.c [new file with mode: 0644]
usr/src/cmd/berknet/initfile [new file with mode: 0644]
usr/src/cmd/berknet/interact.c [new file with mode: 0644]
usr/src/cmd/berknet/listen.c [new file with mode: 0644]
usr/src/cmd/berknet/network.map [new file with mode: 0644]
usr/src/cmd/berknet/receive.c [new file with mode: 0644]
usr/src/cmd/berknet/setlength [new file with mode: 0755]
usr/src/cmd/berknet/setmode.c [new file with mode: 0644]
usr/src/cmd/berknet/start [new file with mode: 0755]
usr/src/cmd/berknet/store.c [new file with mode: 0644]
usr/src/cmd/berknet/update [new file with mode: 0755]

diff --git a/usr/src/cmd/berknet/dz1.c b/usr/src/cmd/berknet/dz1.c
new file mode 100644 (file)
index 0000000..c1f471e
--- /dev/null
@@ -0,0 +1,518 @@
+/*
+ *     DZ-11 driver
+ *     ------------
+ *
+ *     OPTIMIZED dz driver to handle multiple dzs as efficiently
+ *     as possible.  The efficiency is gained by disabling all
+ *     dz transmitter interrupts and using a KW11-P to generate
+ *     suitable interrupts.  Carrier is supported but not Ring.
+ *
+ *                             Ian Johnstone   UNSW
+ *                             May 1979
+ */ 
+
+#include       "../defines.h"
+#include       "../param.h"
+#include       "../conf.h"
+#include       "../user.h"
+#include       "../tty.h"
+#include       "../proc.h"
+
+#define        NDZ              7              /* no. of dz-11s */
+
+#define NDZLIN          8              /* no. of lines per dz DO NOT ALTER */
+#define NLINES (NDZLIN*NDZ)            /* total no. of lines available */
+
+#define SSPEED         11              /* standard speed 2400 bd */
+
+#define CLOCK           0172540        /* kw11-p lives here */
+
+struct
+{
+       int csr;                        /* control and status */
+#define GO     0101                    /* down, single, 100K, run */
+       unsigned counter;               /* counter */
+};
+\f
+struct tty dz11[NLINES];               /* tty structures for this dz */
+
+struct dz                              /* one for each dz-11 */ 
+{
+       int *dzaddr;                    /* control registers for this dz */ 
+       char nocarr;                    /* set for lines WITHOUT carrier */ 
+       char sopen;                     /* set for lines with exclusive use */ 
+       struct tty *ttys[NDZLIN];       /* address of tty structs this dz */
+                                       /* that is only ONE `open' allowed */ 
+       char openl;                     /* flags for open lines */ 
+       char closl;                     /* flags to indicate closing lines */
+       char xmit;                      /* set for lines to transmit on */
+       unsigned pyerrors;              /* number of parity errors on input */ 
+       unsigned overrors;              /* number of overrun errors on input */ 
+       int closet[NDZLIN];             /* handle closing via this field */
+}
+dz[NDZ]
+{
+       {
+         0160100, 0377, 0000,
+         &dz11[000],&dz11[001],&dz11[002],&dz11[003],
+         &dz11[004],&dz11[005],&dz11[006],&dz11[007]
+       },
+       {
+         0160110, 0007, 0000,
+         &dz11[010],&dz11[011],&dz11[012],&dz11[013],
+         &dz11[014],&dz11[015],&dz11[016],&dz11[017]
+       },
+       {
+         0160120, 0320, 0020,
+         &dz11[020],&dz11[021],&dz11[022],&dz11[023],
+         &dz11[024],&dz11[025],&dz11[026],&dz11[027]
+       },
+       {
+         0160130, 0000, 0000,
+         &dz11[030],&dz11[031],&dz11[032],&dz11[033],
+         &dz11[034],&dz11[035],&dz11[036],&dz11[037]
+       },
+       {
+         0160140, 0000, 0000,
+         &dz11[040],&dz11[041],&dz11[042],&dz11[043],
+         &dz11[044],&dz11[045],&dz11[046],&dz11[047]
+       },
+       {
+         0160150, 0360, 0100,
+         &dz11[050],&dz11[051],&dz11[052],&dz11[053],
+         &dz11[054],&dz11[055],&dz11[056],&dz11[057]
+       },
+       {
+         0160160, 0110, 0013,
+         &dz11[060],&dz11[061],&dz11[062],&dz11[063],
+         &dz11[064],&dz11[065],&dz11[066],&dz11[067]
+       },
+/*
+       {
+         0160170, 0377, 0000,
+         &dz11[070],&dz11[071],&dz11[072],&dz11[073],
+         &dz11[074],&dz11[075],&dz11[076],&dz11[077]
+       }
+*/
+};
+
+int dzopenc;                   /* equal to total number of 'open' lines */
+
+int dzrcvscan;                 /* when <= 0 scan receiver silos */
+
+char dzbitab[NDZLIN]           /* convert line numbers to bit pattern */
+{
+       0001, 0002, 0004, 0010, 0020, 0040, 0100, 0200
+};
+
+#define        SPLDZ   spl5            /* dz interrupts at this priority */
+\f
+/*
+ *     DZ11 register layout
+ */ 
+struct dzr_read
+{
+       int dzcsr;      /* r/w */ 
+       int dzrbuf;     /* no bit, byte, or tst ops */ 
+       char dztcr;     /* r/w */ 
+       char dzdtr;     /* r/w */ 
+       char dzring;
+       char dzcarr;
+};
+struct dzr_write
+{
+       int dzcsr;
+       int dzlpr;      /* no bit or byte ops */ 
+       char dztcr;
+       char dzdtr;
+       char dztbuf;    /* no bit ops */ 
+       char dzbrk;     /* no bit ops */ 
+};
+/*
+ *     register control bits
+ */ 
+#define SAE            010000          /* dzcsr */
+#define RIE            0100
+#define MSE            040
+#define RCVR_ON        010000          /* dzlpr */
+#define ODD_PAR        0300
+#define EVN_PAR        0100
+#define TWOSBIT                040
+#define C8BIT          030
+#define C7BIT          020
+#define        RERROR          070000          /* dzrbuf */
+#define OVR_RUN        040000  
+#define FRAME          020000
+#define PARITY         010000
+\f
+/*
+ *     Table to map UNIX standard speeds to DZ11 speeds.
+ *     Illegal speeds are ignored, and are indicated by 0200 bit.
+ */ 
+char dzspeedmap[16]
+{
+         0200  /* 0 - zero */ 
+       , 0220  /* 1 - 50 */ 
+       , 0221  /* 2 - 75 */ 
+       , 0222  /* 3 - 110 */ 
+       , 0223  /* 4 - 134.5 */ 
+       , 0224  /* 5 - 150 */ 
+       , 0200  /* 6 - ILLEGAL */ 
+#define        LOWSPEED 7      /* lowest speed allowed on dz */
+       ,  025  /* 7 - 300 */ 
+       ,  026  /* 8 - 600 */ 
+       ,  027  /* 9 - 1200 */ 
+       , 0230  /* 10 - 1800 */ 
+       ,  032  /* 11 - 2400 */ 
+       ,  034  /* 12 - 4800 */ 
+       ,  036  /* 13 - 9600 */ 
+       , 0231  /* 14 - ext A - maps to 2000 */ 
+       , 0237  /* 15 - ext B - maps to 19200 */ 
+};
+\f
+/*
+ *     Table to map UNIX standard speeds to time between interrupts for
+ *     a line running at that speed.  The value in the table is multiplied
+ *     by 10 to get a value in microseconds.  A nominal 20 microseconds
+ *     is subtracted to make up for interrupt overhead.
+ */ 
+
+unsigned dzmicmap[16]
+{
+              0                /* 0 - zero */ 
+       ,  19998                /* 1 - 50 */ 
+       ,  13331                /* 2 - 75 */ 
+       ,   9088                /* 3 - 110 */ 
+       ,   7433                /* 4 - 134.5 */ 
+       ,   6665                /* 5 - 150 */ 
+       ,      0                /* 6 - ILLEGAL */ 
+       ,   3331                /* 7 - 300 */ 
+       ,   1665                /* 8 - 600 */ 
+       ,    831                /* 9 - 1200 */ 
+       ,    554                /* 10 - 1800 */ 
+       ,    415                /* 11 - 2400 */ 
+       ,    206                /* 12 - 4800 */ 
+       ,    102                /* 13 - 9600 */ 
+       ,    498                /* 14 - ext A - maps to 2000 */ 
+       ,     50                /* 15 - ext B - maps to 19200 */ 
+};
+\f
+/*
+ *     open a DZ11 line
+ */ 
+dzopen(dev, flag)
+{
+       extern dzstart();
+       register struct tty *tp;
+       register struct dz *dzp;
+       register lino;
+
+       lino =  dev.d_minor;
+       if(lino >= NLINES)
+       {
+               u.u_error = ENXIO;
+               return;
+       }
+       dzp   =  &dz[lino>>3];
+       if(!fkword(dzp->dzaddr))                /* fix036 */
+       {
+               u.u_error = ENXIO;
+               return;
+       }                                       /* fix036 */
+       tp    =  &dz11[lino];
+       lino =& 07;
+
+       if( (dzp->sopen&dzbitab[lino]) && (dzp->openl&dzbitab[lino]) )
+       {
+               u.u_error = EOPENFAIL;
+               return;
+       }
+
+       if(u.u_procp->p_ttyp == 0)
+               u.u_procp->p_ttyp = tp;
+
+       SPLDZ();
+
+       if( (dzp->openl&dzbitab[lino]) == 0 )
+       {
+               tp->t_dev    = dev;
+               tp->t_state  = (ISOPEN|CARR_ON|SSTART);
+               tp->t_addr   = &dzstart;
+               tp->t_speeds = SSPEED|(SSPEED<<8);
+               tp->t_flags  = ODDP|EVENP|XTABS|RAW;
+               tp->t_erase  = CERASE;
+               tp->t_kill   = CKILL;
+
+               dzparam(tp);
+
+               if(dzp->openl == 0)
+                       dzp->dzaddr->dzcsr =| (RIE|SAE|MSE); /* init */
+
+               dzp->openl =| dzbitab[lino];
+
+               if(dzopenc++ == 0)
+                       dzxint();       /* start transmitting */
+
+       }
+       else
+               dzp->closl =& ~dzbitab[lino];
+       spl0();
+}
+
+/*
+ *     close a DZ11 line
+ */ 
+dzclose(dev)
+{
+       register struct tty *tp;
+       register struct dz *dzp;
+       register lino;
+
+       lino  =  dev.d_minor;
+       dzp   =  &dz[lino>>3];
+       tp    =  &dz11[lino];
+       lino  =& 07;
+
+       dzp->closet[lino] =  tp->t_outq.c_cc << 1;      /* time for close */
+       dzp->closl  =| dzbitab[lino];
+       dzp->xmit   =| dzbitab[lino];                   /* start transmitting */
+       dzp->dzaddr->dztcr =| dzbitab[lino];            /* start transmitting */
+}
+\f
+/*
+ *     read from a DZ11 line
+ */ 
+dzread(dev)
+{
+       ttread( &dz11[dev.d_minor] );
+}
+
+/*
+ *     write on a DZ11 line
+ */ 
+dzwrite(dev)
+{
+       ttwrite( &dz11[dev.d_minor] );
+}
+
+/*
+ *     stty/gtty for DZ11
+ */ 
+dzsgtty(dev, av)
+{
+       register struct tty *tp;
+
+       if((av == 0) && (dzspeedmap[u.u_arg[0]&017] < 0))
+       {
+               u.u_error = ENXIO;      /* illegal speed */ 
+               return;
+       }
+       tp = &dz11[dev.d_minor];
+       if(ttystty(tp, av))
+               return;
+       dzparam(tp);
+}
+\f
+/*
+ *     set parameters from open or stty into DZ hardware registers
+ */ 
+dzparam(tp)
+register struct tty *tp;
+{
+       register lpr, x;
+       extern wakeup();
+
+       lpr = dzspeedmap[tp->t_speeds&017]<<8;
+
+       if((x = tp->t_flags)&EVENP)
+               if((x&ODDP) == 0)
+                       lpr =| (EVN_PAR|C7BIT);
+               else
+                       lpr =| C8BIT;
+       else if(x&ODDP)
+               lpr =| (ODD_PAR|C7BIT);
+       else
+               lpr =| C8BIT;
+
+       /* set new speed, char currently in uart may be screwed */ 
+
+       dz[tp->t_dev.d_minor>>3].dzaddr->dzlpr = lpr|(tp->t_dev.d_minor&07);
+}
+/*
+ *     dz start routine
+ */
+dzstart(tp)    /* at SPLDZ */
+struct tty *tp;
+{
+       register lino = tp->t_dev.d_minor;
+       register struct dz *dzp;
+
+       dzp  =  &dz[lino>>3];
+       lino =& 07;
+       dzp->xmit =| dzbitab[lino];             /* start transmitting */
+       dzp->dzaddr->dztcr =| dzbitab[lino];    /* start transmitting */
+}
+\f
+/*
+ *     DZ11 transmitter interrupt.
+ *
+ *     Scan every line on each dz.  Internal dz limitations
+ *     force this scan to take an unusual form.  One line
+ *     from each dz is serviced each scan until no dz requires
+ *     service.  This is less efficient than servicing
+ *     entirely a dz prior to scanning the next dz but it
+ *     it is necessary.
+ *
+ *     dzxint is not actually invoked by a dz interrupt
+ *     rather it is invoked by a clock interrupt.
+ *     to drive multiple dz's efficiently utilizing dz
+ *     transmitter interrupts is just NOT possible.
+ */ 
+int dzxc;
+dzxint()        /* at SPLDZ */ 
+{
+       extern ttrstrt();
+       register struct dz *dzp;
+       int hspeed = LOWSPEED;  /* to determine clock speed */
+       int flag;               /* control dz scanning */
+
+dzxc++;        /* count */
+       if( dzopenc == 0 ) return;      /* stop if inactive */
+
+       /*      scan every dz for characters to transmit        */
+
+   do
+   {
+       for(dzp = &dz[0], flag=0; dzp < &dz[NDZ]; dzp++ )
+       {
+               register struct tty *tp;
+               register struct dzr_read *dza = dzp->dzaddr;
+               int lino, t_bit;
+
+               if((lino = dza->dzcsr.hibyte)  < 0) /* xmit ?? */ 
+               {
+                       lino =& 07;             /* isolate line number */ 
+                       tp = dzp->ttys[lino];
+                       t_bit = dzbitab[lino];  /* bit mask, not line number */
+                       flag++;                 /* note service */
+                       if( (dzp->closl & t_bit)
+                       && ((--(dzp->closet[lino]) <= 0) || (tp->t_outq.c_cc == 0)) )
+                       {
+                               /* line closed, no time or chars left */
+                               flushtty(tp);
+                               tp->t_state = SSTART;
+                               dzp->closl =& ~t_bit;
+                               dzp->openl =& ~t_bit;
+                               dzp->xmit  =& ~t_bit;
+                               dza->dztcr =& ~t_bit;
+                               dza->dzdtr =& ~t_bit;
+                               if( (dzp->closl==0) && (dzp->openl==0) )
+                                       dza->dzcsr = 0;
+                               if( --dzopenc == 0 )
+                                       return;
+                       }
+                       else if(tp->t_outq.c_cc == 0)
+                       {
+                               dzp->xmit =& ~t_bit;
+                               dza->dztcr =& ~t_bit;
+                       }
+                       else if((dzp->nocarr&t_bit)||(dza->dzcarr&t_bit))
+                       {
+                               int c = getc(&tp->t_outq);
+                               if( c <= 0177 || tp->t_flags == RAW )
+                               {
+                                       /* transmit the char for this line */ 
+                                       dza->dztbuf = c;
+                                       if( tp->t_speeds.lobyte > hspeed )
+                                               hspeed = tp->t_speeds.lobyte;
+                               }
+                               else
+                               {
+                                       dzp->xmit =& ~t_bit;
+                                       dza->dztcr =& ~t_bit;
+                                       timeout( &ttrstrt, tp, c&0177 );
+                                       tp->t_state =| TIMEOUT;
+                               }
+                               /* if low water mark then want more */ 
+                               if( tp->t_state&ASLEEP
+                               &&  tp->t_outq.c_cc <= TTLOWAT )
+                               {
+                                       tp->t_state =& ~ASLEEP;
+                                       wakeup(&tp->t_outq);
+                               }
+                       }
+                       else
+                       {
+                               dza->dztcr =& ~t_bit;
+                       }
+               }
+       }
+  } while( flag );
+
+       /* finalize state of DZs prior to exitting */
+
+       for(dzp = &dz[0]; dzp < &dz[NDZ]; dzp++ )
+       {
+               register struct dzr_read *dza = dzp->dzaddr;
+
+               /* dtr to reflect state of carrier, for carrier lines */ 
+
+               dza->dzdtr = (dza->dzcarr | dzp->nocarr) & dzp->openl;
+
+               /* Enable all lines still with characters to send */
+
+               dza->dztcr = dzp->xmit;
+       }
+
+       /*      setup for next interrupt        */
+
+       CLOCK->counter = dzmicmap[hspeed];      /* count in 10microseconds */
+       CLOCK->csr = GO;
+
+       /*      call dzrint if needed   */
+
+       if( dzrcvscan <= 0 )
+               dzrint(0);
+       dzrcvscan =- dzmicmap[hspeed];
+}
+\f
+/*
+ *     DZ11 receiver interrupt
+ *
+ *     Scan each dz commencing with the particular device that caused this call
+ *     Scan at least every dzmicmap[LOWSPEED] microseconds.
+ */ 
+dzrint(dev)
+{
+       register struct tty *tp;
+       register struct dz *dzp;
+       register int lino;
+       int i, c;
+
+       for(dzp = &dz[dev], i = 0; i < NDZ; i++)
+       {
+               while((c = dzp->dzaddr->dzrbuf) < 0)    /* char present in silo */ 
+               {
+                       lino =  c.hibyte; lino =& 07;
+                       if( ((dzp->nocarr&dzbitab[lino]) == 0 )
+                       &&  ((dzp->dzaddr->dzcarr&dzbitab[lino]) == 0 )) continue;
+                       if( (dzp->openl&dzbitab[lino]) == 0 ) continue;
+                       tp = dzp->ttys[lino];
+                       if(c&RERROR)
+                       {
+                               if( (c & FRAME) && (tp->t_flags & RAW ) )
+                                       ttyinput(0, tp); /* break for getty */
+                               else if(c & OVR_RUN)
+                                       dzp->overrors++;
+                               else if(c & PARITY)
+                                       dzp->pyerrors++;
+                       }
+                       else
+                       {
+                               ttyinput(c, tp);
+                       }
+               }
+               if( ++dzp >= &dz[NDZ] ) dzp = &dz[0];
+       }
+       dzrcvscan = dzmicmap[LOWSPEED];
+}
diff --git a/usr/src/cmd/berknet/dz2.c b/usr/src/cmd/berknet/dz2.c
new file mode 100644 (file)
index 0000000..144be6b
--- /dev/null
@@ -0,0 +1,635 @@
+/*
+ *          DZ-11 driver
+ *          ------------
+ *
+ *             Written to handle single dz - `carrier'|`ring' support non-existent
+ *
+ *                                     Piers Lauder
+ *                                     SYDNEY UNIVERSITY
+ *                                     July 1977
+ *
+ *             Re-written to handle multiple dz's and `carrier'|`ring'.
+ *
+ *                                     Ian Johnstone
+ *                                     UNSW
+ *                                     December 1977
+ *                                     January  1978
+ *
+ *             General tidy up, new comments etc. Removal of ifdefs
+ *             for CARRIER and RING. If you don't want them, tough.
+ *
+ *                                     Chris Maltby
+ *                                     Basser October 1979
+ */ 
+
+
+/* ( no messages )
+#define        MESSAGES
+       /*
+        * Define this if you want parity and framing errors
+        * to be logged (via printf). It can be very wordy.
+        */
+
+#define        INTR_ON_BREAK
+       /*
+        * Define this to translate framing errors (breaks)
+        * to CINTR for terminals which lack a DEL key.
+        * Can be nasty if you get lots of line errors.
+        */
+
+/* (not        DEBUG)
+#define        DEBUG
+       /*
+        * Define to debug info for dialup lines.
+        * costs approximately 128 bytes 
+        */
+
+#include       "../defines.h"
+#include       "../param.h"
+#ifdef DEBUG
+#ifdef AUSAML
+#include       "../lnode.h"
+#endif AUSAML
+#include       "../systm.h"
+#endif DEBUG
+#include       "../conf.h"
+#include       "../user.h"
+#include       "../tty.h"
+#include       "../proc.h"
+
+
+#define        NDZ             2               /* number of DZ-11s */
+#define NLINES         8*NDZ           /* total number of lines */
+#define        TSCANRATE       2               /* dzscan called every 2 tics */
+                                       /* Must be >= 2 always        */
+
+#define        RESPONDTIME     (25*HZ)         /* Carrier must be raised inside this */
+#define        CARRIERTIME     (1*HZ)          /* Carrier must drop for this before hangup */
+
+#define FLUSHTIME      5               /* time required to allow hardware buffered
+                                        * characters to flush before setting speed */
+
+#define SSPEED         12              /* standard speed 4800 bd */
+
+struct dz      /* one for each dz-11 */ 
+{
+       int     *dzaddr;        /* dz device address */
+       char    sopen;          /* bit set for single open lines */
+       char    carrier;        /* bits set for carrier controlled lines */
+       char    ring;           /* bits set for lines with dial in modems */ 
+       char    active;         /* bits set for active dialup lines */ 
+       char    openl;          /* bits set for open lines */ 
+       unsigned pyerrors;      /* count of of parity errors on input */ 
+       unsigned overrors;      /* count of of overrun errors on input */ 
+}
+dz[NDZ]
+{
+       /* dzaddr  sopen  carr  ring */ 
+       { 0160040,  0002, 0077, 0074 },
+       { 0160050,  0000, 0000, 0000 }
+};
+int    dzscanning;     /* set when scanning for input and modem change */
+
+/*
+ *     DZ11 register layout
+ */ 
+
+struct dzr_read
+{
+       int     dzcsr;  /* r/w */ 
+       int     dzrbuf; /* no bit, byte, or tst ops */ 
+       char    dztcr;  /* r/w */ 
+       char    dzdtr;  /* r/w */ 
+       char    dzring;
+       char    dzcarr;
+};
+
+struct dzr_write
+{
+       int     dzcsr;  /* r/w */
+       int     dzlpr;  /* no bit or byte ops */ 
+       char    dztcr;  /* r/w */
+       char    dzdtr;  /* r/w */
+       char    dztbuf; /* no bit ops */ 
+       char    dzbrk;  /* no bit ops */ 
+};
+
+/*
+ *     register control bits
+ */ 
+#define TRDY           0100000         /* dzcsr */
+#define TIE            040000
+#define SA             020000
+#define SAE            010000
+#define TLINE          03400
+#define RDONE          0200
+#define RIE            0100
+#define MSE            040
+#define CLR            020
+
+#define RCVR_ON        010000          /* dzlpr */
+#define S9600          07000
+#define S300           02400
+#define S134_5         01400
+#define S110           01000
+#define ODD_PAR        0300
+#define EVN_PAR        0100
+#define TWOSBIT                040
+#define C8BIT          030
+#define C7BIT          020
+#define        C6BIT           010
+/*
+#define IBM2741                RCVR_ON|S134_5|ODD_PAR|C6BIT    /* if you must */ 
+
+#define        RERROR          070000          /* dzrbuf */
+#define OVR_RUN        040000  
+#define FRAME          020000
+#define PARITY         010000
+#define LINE_NO        03400
+
+/*
+ *     table to map UNIX standard speeds to DZ11 speeds
+ *     illegal speeds are ignored.
+ */ 
+char   dzspeedmap[16]
+{
+           0 /*  0 - zero */ 
+       , 020 /*  1 -   50 */ 
+       , 021 /*  2 -   75 */ 
+       , 022 /*  3 -  110 */ 
+       , 023 /*  4 -  134.5 */ 
+       , 024 /*  5 -  150 */ 
+       ,0200 /*  6 -  200 -- ## ILLEGAL ## */ 
+       , 025 /*  7 -  300 */ 
+       , 026 /*  8 -  600 */ 
+       , 027 /*  9 - 1200 */ 
+       , 030 /* 10 - 1800 */ 
+       , 032 /* 11 - 2400 */ 
+       , 034 /* 12 - 4800 */ 
+       , 036 /* 13 - 9600 */ 
+       , 031 /* 14 - ext A - maps to 2000 */ 
+       , 037 /* 15 - ext B - maps to 19200 */ 
+};
+
+
+
+struct tty     dz11[NLINES];
+
+char           dzdelays[NLINES];       /* Count of clock ticks for per-line
+                                        * delays. Count of <= 0 means no delay.
+                                        * Reduces requirement of timeouts.
+                                        */
+
+int            dzringt[NLINES];        /* Delay counts for modem control */
+
+/*
+ *     open a DZ11 line
+ */ 
+dzopen(dev, flag)
+{
+       register struct tty     *tp;
+       register struct dz      *dzp;
+       register int            t_bit;
+       extern  dzstart(), dzscan();
+
+
+       if(dev.d_minor >= NLINES)
+       {
+               u.u_error = ENXIO;
+               return;
+       }
+       dzp = &dz[dev.d_minor>>3];
+       t_bit = (1<<(dev.d_minor&07));
+       if((dzp->sopen&t_bit) && (dzp->openl&t_bit))
+       {
+               u.u_error = EOPENFAIL;
+               return;
+       }
+       tp = &dz11[dev.d_minor];
+       if(u.u_procp->p_ttyp == 0)
+               u.u_procp->p_ttyp = tp;
+       if((tp->t_state&ISOPEN) == 0)
+       {
+               tp->t_dev = dev;
+               tp->t_addr = &dzstart;
+               tp->t_speeds = SSPEED|(SSPEED<<8);
+               tp->t_flags = ODDP|EVENP|XTABS|RAW;
+               tp->t_erase = CERASE;
+               tp->t_kill = CKILL;
+               if(dzp->openl == 0)
+                       dzp->dzaddr->dzcsr =| (TIE|RIE|SAE|MSE);        /* reciever interrupt every 16 chars */ 
+               dzp->openl =| t_bit;
+               spl5();
+               if(dzscanning == 0)
+                       dzscan();       /* start scanning */ 
+               if(!(dzp->ring&t_bit) && !(dzp->carrier&t_bit))
+                       dzp->dzaddr->dzdtr =| t_bit;    /* turn on DTR for non-dialup lines */ 
+               else
+               {
+#                      ifdef   DEBUG
+                               printf("%d wo%d\n", time.loint, dev.d_minor);
+#                      endif   DEBUG
+                       while(!(dzp->dzaddr->dzcarr&t_bit))
+                       {
+                               tp->t_state =| WOPEN;
+                               sleep(&tp->t_rawq, TTIPRI);
+                       }
+#                      ifdef   DEBUG
+                               printf("%d op%d\n", time.loint, dev.d_minor);
+#                      endif   DEBUG
+               }
+               spl0();
+               tp->t_state = (ISOPEN|CARR_ON|SSTART);
+               dzparam(tp, 1);
+       }
+}
+
+
+/*
+ *     scan open lines for:
+ *                     1.  modem status changes
+ *                     2.  process timeouts as dictated by dzdelays
+ *                     3.  input by calling dzrint
+ */ 
+dzscan()       /* at spl5 */ 
+{
+       register struct dz      *dzp;
+       struct tty              *tp;
+       int                     *p;
+       extern dzstart(), dzrint(), dzscan();
+#      define  openring        (dzp->openl & dzp->ring)
+#      define  opencarrier     (dzp->openl & dzp->carrier)
+
+       /*
+        *      scan open dialup/carrier lines.
+        */ 
+       tp = &dz11[0];
+       p = &dzringt[0];
+       for(dzp = dz; dzp < &dz[NDZ]; dzp++)
+       {
+           register int        *dzaddr;
+           char        scanl, scanc;
+
+           dzaddr = dzp->dzaddr;
+           if((scanl = openring) | (scanc = opencarrier))
+           {
+               register int    t_bit;
+
+               for(t_bit = 1; t_bit&0377; t_bit =<< 1, tp++, p++)
+               {
+                   if(scanl&t_bit)
+                   {
+                       /* this is an open `dialup' line */ 
+                       if(dzp->active&t_bit)
+                       {
+                           if(!(dzaddr->dzcarr&t_bit))
+                           {
+                               if(*p == 0)
+                                   *p = CARRIERTIME;
+                               else if((*p =- TSCANRATE) <= 0)
+                               {
+                                   *p = 0;     /* disable */ 
+#                                  ifdef       DEBUG
+                                       printf("%d hu%d\n", time.loint, tp->t_dev.d_minor);
+#                                  endif       DEBUG
+                                   dzaddr->dzdtr =& ~t_bit;    /* hang up the phone */ 
+                                   signal(tp, SIGHUP);
+                                   flushtty(tp);
+                                   dzaddr->dztcr =& ~t_bit;    /* disable transmit */ 
+                                   dzp->active =& ~t_bit;
+                               }
+                           }
+                           else
+                           {
+                               if(tp->t_state&WOPEN)
+                                   wakeup(&tp->t_rawq);
+                               *p = 0;
+                               if(!(tp->t_state&TIMEOUT) && (tp->t_outq.c_cc))
+                                   dzaddr->dztcr =| t_bit;
+                           }
+                       }
+                       else
+                       {
+                           if(!(dzaddr->dzdtr&t_bit) && (dzaddr->dzring&t_bit))
+                           {
+                               dzaddr->dzdtr =| t_bit; /* answer the phone */ 
+                               *p = RESPONDTIME;
+                               dzp->active =| t_bit;
+#                              ifdef   DEBUG
+                                   printf("%d ap%d\n", time.loint, tp->t_dev.d_minor);
+#                              endif   DEBUG
+                           }
+                       }
+                   }
+                   else if((scanc&t_bit) && (dzaddr->dzcarr&t_bit))
+                   {   /* carrier only line */
+                       if(tp->t_state&WOPEN)
+                       {
+                           dzaddr->dzdtr =| t_bit;
+                           wakeup(&tp->t_rawq);
+                       }
+                       else if((!(tp->t_state&TIMEOUT)) && (tp->t_outq.c_cc))
+                           dzaddr->dztcr =| t_bit;
+                   }
+               }
+           }
+           else
+           {
+               tp =+ 8; p =+ 8;        /* in the case where no dialup/carrier lines on current dz */ 
+           }
+       }
+
+       /*
+        *      process timeouts for each line
+        */ 
+
+       {
+               register i;
+
+               for(i = 0; i < NLINES; i++)
+                       if((dzdelays[i] > 0) && (--dzdelays[i] <= 0))
+                       {
+                               dz11[i].t_state =& ~TIMEOUT;
+                               dzstart(&dz11[i]);
+                       }
+       }
+
+       /*
+        *      scan each dz for input
+        */ 
+
+       dzrint(0);
+
+       /*
+        *      restart scanning if necessary
+        */ 
+
+       dzp = dz;
+       do
+       {
+               if(dzp->openl)
+               {
+                       dzscanning = timeout(&dzscan, 0, TSCANRATE);
+                       return;
+               }
+               dzp++;
+       } while(dzp < &dz[NDZ]);
+       dzscanning = 0;
+}
+
+/*
+ *     close a DZ11 line
+ */ 
+dzclose(dev)
+{
+       register struct tty *tp;
+       register t_bit;
+       register struct dz *dzp;
+
+       tp = &dz11[dev.d_minor];
+       wflushtty(tp);
+       tp->t_state = SSTART;
+       dzp = &dz[dev.d_minor>>3];
+       t_bit = 1<<(dev.d_minor&07);
+       if(dzp->ring&t_bit)
+       {
+               if(tp->t_flags&HUPCL)
+                       dzp->dzaddr->dzdtr =& ~t_bit;   /* hang up the phone */ 
+       }
+       else
+       {
+               dzp->dzaddr->dzdtr =& ~t_bit;   /* turn off dtr for non-dialup lines */ 
+       }
+       if((dzp->openl =& ~t_bit) == 0)
+               dzp->dzaddr->dzcsr = 0; /* disable receive on final close */ 
+}
+
+
+
+/*
+ *     read from a DZ11 line
+ */ 
+dzread(dev)
+{
+       ttread(&dz11[dev.d_minor]);
+}
+
+
+
+/*
+ *     write on a DZ11 line
+ */ 
+dzwrite(dev)
+{
+       ttwrite(&dz11[dev.d_minor]);
+}
+
+
+
+/*
+ *     stty/gtty for DZ11
+ */ 
+dzsgtty(dev, av)
+int *av;
+{
+       register struct tty *tp;
+
+       if((av == 0) && (dzspeedmap[u.u_arg[0]&017] < 0))
+       {
+               u.u_error = ENXIO;      /* illegal speed */ 
+               return;
+       }
+       tp = &dz11[dev.d_minor];
+       if(ttystty(tp, av))
+               return;
+       dzparam(tp, 1);
+}
+
+
+
+/*
+ *     set parameters from open or stty into DZ hardware registers
+ */ 
+dzparam(tp, dflag)
+register struct tty *tp;
+{
+       register lpr, x;
+       extern wakeup();
+
+
+       lpr = dzspeedmap[tp->t_speeds&017]<<8;
+
+#ifdef IBM2741
+       if(lpr == (RCVR_ON|S134_5))
+               lpr = IBM2741;
+       else
+       {
+#endif IBM2741
+               if(lpr == (RCVR_ON|S110))
+                       lpr =| TWOSBIT;
+
+               if((x = tp->t_flags)&EVENP)
+                       if((x&ODDP) == 0)
+                               lpr =| (EVN_PAR|C7BIT);
+                       else
+                               lpr =| C8BIT;
+               else if(x&ODDP)
+                       lpr =| (ODD_PAR|C7BIT);
+               else
+                       lpr =| C8BIT;
+#ifdef IBM2741
+       }
+#endif IBM2741
+
+       if(dflag)
+       {
+               /* delay only if it is permissible */ 
+#ifndef        DELAY
+               timeout(&wakeup, tp, FLUSHTIME);        /* wakeup in 5 tics */ 
+               sleep(tp, TTOPRI);      /* delay while controller flushes */ 
+#else
+               delay(FLUSHTIME);       /* hang 5 */ 
+#endif DELAY
+       }
+
+       dz[tp->t_dev.d_minor>>3].dzaddr->dzlpr = lpr|(tp->t_dev.d_minor&07);
+}
+
+
+
+/*
+ *     start (restart) transmission on a DZ11 line
+ */ 
+dzstart(tp)
+register struct tty *tp;
+{
+       register t_bit;
+       register struct dz *dzp;
+
+
+       t_bit = 1<<(tp->t_dev.d_minor&07);
+       dzp = &dz[tp->t_dev.d_minor>>3];
+       if((!(dzp->carrier&t_bit)) || (dzp->dzaddr->dzcarr&t_bit))
+               dzp->dzaddr->dztcr =| t_bit;
+}
+
+
+/*
+ *     DZ11 transmitter interrupt.
+ *
+ *     Scan every line on each dz.
+ *     Commencing with the device that caused
+ *     dzxint to be called.
+ */ 
+dzxint(dev)
+{
+       register struct tty *tp;
+       register c;
+       register struct dzr_read *dzaddr;
+       struct dz *dzp;
+       struct tty *dzbase;
+       int t_bit, lino, i, n;
+
+       n = dev.d_minor;
+       for(i = 0; i < NDZ; i++)
+       {
+               dzaddr = (dzp = &dz[n])->dzaddr;
+               dzbase = &dz11[n*8];
+               while((c = dzaddr->dzcsr) < 0)  /* xmit line ready */ 
+               {
+                       t_bit = 1<<(lino = (c>>8)&07);
+
+                       tp = &dzbase[lino];
+
+                       if((!(dzp->carrier&t_bit) || (dzaddr->dzcarr&t_bit)) && (c = getc(&tp->t_outq)) >= 0)
+                               if(c <= 0177 || tp->t_flags == RAW)
+                                       dzaddr->dztbuf = c;
+                               else
+                               {
+                                       dzaddr->dztcr =& ~t_bit;
+                                       tp->t_state =| TIMEOUT;
+                                       dzdelays[tp-dz11] = ((c&0177)+(TSCANRATE-1))/TSCANRATE+1;       /* set up timeout */ 
+                                       continue;
+                               }
+                       else
+                               dzaddr->dztcr =& ~t_bit;
+
+#ifdef TTY_HISPEED
+                       if(tp->t_outq.c_cc <= ((tp->t_speeds&017) > B1200?TTHSLOWAT:TTLOWAT) && (tp->t_state&ASLEEP))
+#else
+                       if(tp->t_outq.c_cc <= TTLOWAT && (tp->t_state&ASLEEP))
+#endif TTY_HISPEED
+                       {
+                               tp->t_state =& ~ASLEEP;
+                               wakeup(&tp->t_outq);
+                       }
+               }
+               if(++n >= NDZ)
+                       n = 0;
+       }
+}
+
+
+
+/*
+ *     DZ11 receiver interrupt
+ *
+ *     Scan each dz commencing with the
+ *     particular device that caused this call.
+ *     Storing each charater as it comes.
+ */ 
+dzrint(dev)
+{
+       register struct tty *tp;
+       register c;
+       register struct dzr_read *dzaddr;
+       struct dz *dzp;
+       struct tty *dzbase;
+       int i, n, lino, t_bit;
+
+       n = dev.d_minor;
+       for(i = 0; i < NDZ; i++)
+       {
+               dzp = &dz[n];
+               if(dzp->openl)
+               {
+                       dzbase = &dz11[n*8];
+                       while((c = dzp->dzaddr->dzrbuf) < 0)    /* char present in silo */ 
+                       {
+                               tp = &dzbase[lino = ((c>>8)&07)];
+                               t_bit = 1<<lino;
+                               if(c&RERROR)
+                               {
+                                       if(c&OVR_RUN)
+                                       {
+                                               dzp->overrors++;
+#                                              ifdef   MESSAGES
+                                                       printf("over run on dz %d/%d\n", n, lino);
+#                                              endif   MESSAGES
+                                       }
+                                       if(c&FRAME)     /* break */ 
+                                               if(tp->t_flags&RAW)
+                                                       c = 0;  /* null ( for getty ) */ 
+                                               else
+#                                                  ifdef       INTR_ON_BREAK
+                                                       c = CINTR;      /* del for NCRs. */ 
+#                                                  else
+                                                       continue;       /* ignore framing errors if not raw */ 
+#                                                  endif       INTR_ON_BREAK
+                                       else if(c&PARITY)
+                                       {
+                                               dzp->pyerrors++;
+#                                              ifdef   MESSAGES
+                                                       printf("parity on dz %d/%d\n", n, lino);
+#                                              endif   MESSAGES
+                                               continue;       /* throw away bad chars */ 
+                                       }
+                               }
+                               if((!(dzp->carrier&t_bit)) || (dzp->dzaddr->dzcarr&t_bit))
+                                       ttyinput(c, tp);
+                       }
+               }
+               if(++n >= NDZ)
+                       n = 0;
+       }
+}
diff --git a/usr/src/cmd/berknet/initfile b/usr/src/cmd/berknet/initfile
new file mode 100644 (file)
index 0000000..0a50bf4
--- /dev/null
@@ -0,0 +1,5 @@
+default Cory
+machine Cory  local CSVAX  link /dev/ttyny  speed 9 time 20 count 3
+machine Ing70 local CSVAX  link /dev/ttyni  speed 9 time 15 count 2 length 100
+machine v local r link /dev/null speed 13 vaxtovax time 3 count 1 length 758
+machine r local v link /dev/null speed 13 vaxtovax time 3 count 1 length 758
diff --git a/usr/src/cmd/berknet/interact.c b/usr/src/cmd/berknet/interact.c
new file mode 100644 (file)
index 0000000..2b7f939
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+       interact.c
+
+       send a packet to the program "listen"
+*/
+# include "defs.h"
+main(argc,argv)
+  char **argv;
+       {
+       int i,c;
+       char buf[2000];
+       setupdaemon(argc,argv);
+       sendreset();
+       for(;;){
+               putchar('?');
+               i = 0;
+               while((c = getchar()) != '\n' && c != EOF)
+                       buf[i++] = c;
+               if(xwrite(buf,i) == WRITEFAIL)fprintf(stderr,"writefail\n");
+               }
+       }
diff --git a/usr/src/cmd/berknet/listen.c b/usr/src/cmd/berknet/listen.c
new file mode 100644 (file)
index 0000000..d9734d7
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+       listen.c
+
+       listen for a packet from the program interact.c and print it
+*/
+# include "defs.h"
+main(argc,argv)
+  char **argv;
+  {
+       struct packet *pp;
+       char buf[BUFSIZ];
+       setupdaemon(argc,argv);
+       putchar('!');
+       while(getreset() == BROKENREAD);
+       printf("got reset\n");
+       for(;;){
+               pp = getpacket();
+               printpacket(pp,buf);
+               printf("got %s\n",buf);
+               if(pp == NULL || pp->pcode == RESET)continue;
+               pp->pcode = ACK;
+               pp->len = 0;
+               sendpacket(pp);
+               printpacket(pp,buf);
+               printf("sent %s\n",buf);
+               }
+       }
diff --git a/usr/src/cmd/berknet/network.map b/usr/src/cmd/berknet/network.map
new file mode 100644 (file)
index 0000000..0e49837
--- /dev/null
@@ -0,0 +1,67 @@
+               T H E   B E R K E L E Y   N E T W O R K
+
+                       April 23, 1980
+
+IngVAX------Ing70                A        B
+             |                   |        |
+             |                   |        |
+           CSVAX------Cory-------C--------D-------SRC
+                       |         |
+                       |         |
+            Image-----ESVAX       E--------Q
+                       |
+                       |
+                     EECS40
+
+
+               M A C H I N E   G U I D E 
+
+Name   Char    Run By          Type    Vers.   Default Machine
+----   ----    ------          ----    ----    ---------------
+A      a       Comp. Center    11/70   V6      C
+B      b       Comp. Center    11/70   V6      D
+C      c       Comp. Center    11/70   V6      A
+D      d       Comp. Center    11/70   V6      C
+E      e       Comp. Center    11/70   V6      C
+Ing70  i       Ingres Group    11/70   V6      IngVAX
+IngVAX j       Ingres Group    VAX     V7      Ing70
+Image  m       Sakrison        11/40   V6      ESVAX
+ESVAX  o       EECS-CE Res.    VAX     V7      CSVAX
+Q      q       Comp. Center    11/34   V6      E
+SRC    s       Survey Res.     11/34   V6      D
+CSVAX  v       CS Research     VAX     V7      Cory
+Cory   y       EECS Dept.      11/70   V7      CSVAX
+EECS40 z       EECS Dept.      11/40   V6      Ing70
+
+(the following machines are not connected or do not exist yet)
+MathStat t     Math/Stat Dept  11/45   V6      E       (to be connected to E)
+Virus  k       MicroBiology    11/40   V7      E       (to be connected to E)
+F      f       Comp. Center    VAX     V7      D       (on order, exp. 7/1/80)
+G      g       Comp. Center    11/70   V7      D       (on order(?),exp.9/1/80)
+ARPAVAX        r       Fabry           VAX     V7      CSVAX   (on order, exp. 10/1/80)
+VLSI   l       Brodersen       VAX     V7      Image   (on order, exp. 11/1/80)
+Phonology      Linguistics     11/45   V6              ?
+
+The links between Ing70-IngVAX, Ing70-CSVAX, A-C, C-D, B-D, and C-E run
+at 9600 Baud, all others run at 1200 Baud.  There is a file-length limit
+of 100,000 bytes (500,000 bytes between the two Ingres machines).
+Larger files must be split up (use the split command).
+
+Free Commands (log in as user "network", no password):
+
+       bpq             news            vpq             yank
+       epq             ps              w
+       finger          pstat           wc
+       help            rcs             where
+       lpq             rcslog          who
+       netlog          rcsq            whom
+       netq            trq             write           
+
+In addition, the "lpr" command is free on the Ingres machines.
+Sending mail between machines, and netlpr between the Computer Center machines
+is free.  On the EECS40, there are no free commands (but sending mail is free).
+The netlpr command to Cory will allow the -c option to "epr" and "bpr",
+and to the CSVAX will allow "vpr".
+
+Mail complaints, etc. to "csvax:schmidt".
diff --git a/usr/src/cmd/berknet/receive.c b/usr/src/cmd/berknet/receive.c
new file mode 100644 (file)
index 0000000..ac6babc
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+       receive.c
+
+       take the file sent by "store.c" and write it locally
+*/
+# include "defs.h"
+
+/* global variables */
+struct daemonparms netd;
+
+main(argc,argv)
+  char **argv; {
+       FILE *fp;
+       char *p, save[40];
+       int i, n;
+       char buf[BUFSIZ];
+       long length;
+       debugflg = DBV;
+       setupdaemon(argc,argv);
+       putchar('!');
+       for(;;){
+               netd.dp_lastseqno = -1;
+               while(getreset() == BROKENREAD);
+               while((i = nread(buf,20)) == BROKENREAD);
+               if(i != 20){
+                       printf("Didn't read file name\n");
+                       exit(EX_USAGE);
+                       }
+               for(p=buf; *p && *p != '\n' && *p != ' '; p++);
+               *p = 0;
+               printf("Creating file %s ",buf);
+               fp = fopen(buf,"w");
+               if(fp == NULL){
+                       perror(buf);
+                       exit(EX_OSFILE);
+                       }
+               strcpy(save,buf);
+               while((i = nread(&length,4)) == BROKENREAD);
+               if(i != 4){
+                       printf("Didn't read length right\n");
+                       exit(EX_SOFTWARE);
+                       }
+               length = fixuplong(length);
+               printf("length %ld\n",length);
+               while(length > 0){
+                       i = min(length,512);
+                       while((n = nread(buf,i)) == BROKENREAD);
+                       length -= n;
+                       fwrite(buf,1,n,fp);
+                       }
+               fclose(fp);
+               printf("Finished file %s\n",save);
+               }
+       }
diff --git a/usr/src/cmd/berknet/setlength b/usr/src/cmd/berknet/setlength
new file mode 100755 (executable)
index 0000000..6ce98d4
--- /dev/null
@@ -0,0 +1,10 @@
+# set the length of the logfiles
+set a=$1
+set tmp=setl$$
+shift
+unset noclobber
+foreach i ($argv)
+       tail -$a $i >/tmp/$tmp
+       cp /tmp/$tmp $i
+end
+rm -f /tmp/$tmp
diff --git a/usr/src/cmd/berknet/setmode.c b/usr/src/cmd/berknet/setmode.c
new file mode 100644 (file)
index 0000000..f3c4e5d
--- /dev/null
@@ -0,0 +1,34 @@
+/* 
+       setmode.c
+       
+       used to set the mode to cat files to check the net tty drivers
+*/
+# include <stdio.h>
+# include <sgtty.h>
+main(argc,argv)
+  char **argv; {
+       struct sgttyb stt;
+       FILE *readtty;
+       if(fork() != 0)exit(0);
+       printf("kill %d\n",getpid());
+       readtty = fopen(argv[1],"w");
+       if(readtty == NULL)goto err1;
+       if(gtty(fileno(readtty),&stt) < 0)goto err2;
+       stt.sg_ispeed = stt.sg_ospeed = 9;  /* 1200 baud */
+       stt.sg_erase = stt.sg_kill = 0;         /* erase and kill off */
+       stt.sg_flags = ANYP;    /* even and odd parity, off everything else */
+       if(stty(fileno(readtty),&stt) < 0)goto err3;
+       sleep(30000);
+err1:
+       printf("Error1: ");
+       perror(argv[1]);
+       exit(1);
+err2:
+       printf("Error2: ");
+       perror(argv[1]);
+       exit(1);
+err3:
+       printf("Error3: ");
+       perror(argv[1]);
+       exit(1);
+       }
diff --git a/usr/src/cmd/berknet/start b/usr/src/cmd/berknet/start
new file mode 100755 (executable)
index 0000000..6f13ca8
--- /dev/null
@@ -0,0 +1,5 @@
+cd /usr/spool/berknet
+rm -f rcv/*
+csh /usr/net/bin/setlength 50 plogfile? logfile 
+/usr/net/bin/onetstart -m Cory
+/usr/net/bin/netstart -m Ing70
diff --git a/usr/src/cmd/berknet/store.c b/usr/src/cmd/berknet/store.c
new file mode 100644 (file)
index 0000000..87f7bb3
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+       store.c
+
+       send a file to the program "receive.c" 
+*/
+# include "defs.h"
+main(argc,argv)
+  char **argv; {
+       FILE *fp;
+       int buf[BUFSIZ], n;
+       long work;
+       char str[50];
+       char ifile[20],ofile[20];
+       struct stat statbuf;
+
+       printf("from file: ");
+       fflush(stdout);
+       gets(ifile,stdout);
+       printf("to file: ");
+       fflush(stdout);
+       gets(ofile,stdout);
+       fp = fopen(ifile,"r");
+       if(fp == NULL){
+               perror(ifile);
+               exit(1);
+               }
+       debugflg = DBV;
+       setupdaemon(argc,argv);
+       strcpy(str,ofile);
+       strcat(str,"                             ");
+       sendreset();
+       xwrite(str,20);
+       if(stat(ifile,&statbuf) < 0){
+               perror(ifile);
+               exit(1);
+               }
+       work = getsize(&statbuf);
+       work = fixuplong(work);
+       xwrite(&work,4);
+       while((n = fread(buf,1,BUFSIZ,fp)) > 0)
+               xwrite(buf,n);
+       fclose(fp);
+       }
diff --git a/usr/src/cmd/berknet/update b/usr/src/cmd/berknet/update
new file mode 100755 (executable)
index 0000000..2325611
--- /dev/null
@@ -0,0 +1,6 @@
+# this script sends its args to the machine its first argument represents
+set mach=$1
+shift
+foreach i ($argv)
+       netcp -q $i $mach\:upd/$i
+end