Article View: comp.sources.mac
Article #36UW v4.2 (part 3 of 9)
From: John Bruner
Date: Tue, 05 Apr 1988 16:05
Date: Tue, 05 Apr 1988 16:05
1028 lines
38460 bytes
38460 bytes
[UW v4.2 - part 3 of 9]
---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# h/openpty.h
# h/uw_clk.h
# h/uw_err.h
# h/uw_fd.h
# h/uw_ipc.h
# h/uw_opt.h
# h/uw_param.h
# h/uw_pcl.h
# h/uw_win.h
# h/uwlib.h
# This archive created: Mon Apr 4 07:51:49 1988
# By: Roger L. Long (macintosh@dhw68k.cts.com)
export PATH; PATH=/bin:$PATH
if test ! -d h
then
echo shar: mkdir h
mkdir h
fi
echo shar: extracting "'h/openpty.h'" '(308 characters)'
if test -f 'h/openpty.h'
then
echo shar: will not over-write existing file "'h/openpty.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/openpty.h'
X/*
X * This file defines the "ptydesc" structure which is returned
X * by the routine "openpty".
X */
X
Xstruct ptydesc {
X int pt_pfd; /* file descriptor of master side */
X int pt_tfd; /* file descriptor of slave side */
X char *pt_pname; /* master device name */
X char *pt_tname; /* slave device name */
X};
SHAR_EOF
if test 308 -ne "`wc -c < 'h/openpty.h'`"
then
echo shar: error transmitting "'h/openpty.h'" '(should have been 308 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_clk.h'" '(1161 characters)'
if test -f 'h/uw_clk.h'
then
echo shar: will not over-write existing file "'h/uw_clk.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_clk.h'
X/*
X * uw_clk - timer support for UW
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_CLK
X#define UW_CLK
X
X/*
X * Events which are supposed to occur at a certain time are handled by
X * setting "timeout"s. The list of timeouts is sorted in order of
X * occurrence. The "alarm" mechanism is used to send SIGALRM when the
X * first timeout expires. However, the timeout is not processed
X * immediately. Instead, it will be processed upon exit from the
X * select() in main(). This prevents timeouts from happening at
X * inappropriate times.
X *
X * The resolution of timeouts is in seconds. The server doesn't need
X * any better resolution, and this allows all of the hair associated with
X * (struct timeval) and (struct itimerval) types to be avoided.
X */
X
X#define CLK_HZ 1 /* one tick/second */
X
Xtypedef long toarg_t;
X
Xstruct timeout {
X struct timeout *to_next;
X time_t to_when;
X void (*to_fn)();
X toarg_t to_arg;
X};
X
Xextern int timer_rdy;
X
X#define CLK_CHECK() if (timer_rdy) clk_service(); else
X#endif
SHAR_EOF
if test 1161 -ne "`wc -c < 'h/uw_clk.h'`"
then
echo shar: error transmitting "'h/uw_clk.h'" '(should have been 1161 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_err.h'" '(759 characters)'
if test -f 'h/uw_err.h'
then
echo shar: will not over-write existing file "'h/uw_err.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_err.h'
X/*
X * uw error codes
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_ERR
X#define UW_ERR
X
Xtypedef int uwerr_t;
X
X#define UWE_NONE 0 /* no error */
X#define UWE_ERRNO 1 /* system call error, consult errno */
X#define UWE_NXTYPE 2 /* nonexistent window type */
X#define UWE_DUPID 3 /* window ID duplicated (in use) */
X#define UWE_NOTIMPL 4 /* operation not implemented yet */
X#define UWE_NXSERV 5 /* non-existent server */
X#define UWE_NOMEM 6 /* unable to allocate required memory */
X#define UWE_INVAL 7 /* invalid argument to function */
X#define UWE_NOCTL 8 /* no control file descriptor */
X
X#endif
SHAR_EOF
if test 759 -ne "`wc -c < 'h/uw_err.h'`"
then
echo shar: error transmitting "'h/uw_err.h'" '(should have been 759 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_fd.h'" '(1488 characters)'
if test -f 'h/uw_fd.h'
then
echo shar: will not over-write existing file "'h/uw_fd.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_fd.h'
X/*
X * uw_fd - file-descriptor/select data
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_FD
X#define UW_FD
X
X#include "uw_param.h"
X
X/*
X * If FD_SET and friends aren't defined in <sys/types.h>, then we
X * provide simple definitions here.
X */
X#ifndef FD_SET
X#define FD_SET(n,p) ((p)->fds_bits[0] |= (1 << (n)))
X#define FD_CLR(n,p) ((p)->fds_bits[0] &= ~(1 << (n)))
X#define FD_ISSET(n,p) ((p)->fds_bits[0] & (1 << (n)))
X#define FD_ZERO(p) ((p)->fds_bits[0] = 0)
X#define FD_SETSIZE (NBBY*sizeof(long))
X#endif
X
X/*
X * We use file descriptors for several different things. "fdmap" associates
X * a file descriptor number with its use.
X */
Xtypedef enum { /* file descriptor type */
X FDT_NONE, /* not in use */
X FDT_DATA, /* data connection for window */
X FDT_CTL, /* control connection for window */
X FDT_MAC, /* tty line which talks to Mac */
X FDT_UDSOCK, /* UNIX-domain datagram socket */
X FDT_ISSOCK, /* Internet-domain stream sock */
X FDT_DEBUG, /* debugging use */
X FDT_OTHER /* other uses */
X} fdtype_t;
X
Xstruct fdmap {
X fdtype_t f_type; /* file descriptor type */
X struct window *f_win; /* associate window (if any) */
X};
X
Xstruct selmask {
X struct fd_set sm_rd;
X struct fd_set sm_wt;
X struct fd_set sm_ex;
X};
X
Xextern struct fdmap fdmap[FD_SETSIZE];
Xextern fildes_t nfds;
Xextern struct selmask selmask[2];
X#endif
SHAR_EOF
if test 1488 -ne "`wc -c < 'h/uw_fd.h'`"
then
echo shar: error transmitting "'h/uw_fd.h'" '(should have been 1488 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_ipc.h'" '(5403 characters)'
if test -f 'h/uw_ipc.h'
then
echo shar: will not over-write existing file "'h/uw_ipc.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_ipc.h'
X/*
X * uw IPC definitions
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_IPC
X#define UW_IPC
X
X/*
X * UW accepts network connections in both the UNIX domain and the
X * Internet domain. UNIX domain datagrams are used by processes on
X * the local machine to create new windows and to change the value
X * of window parameters (window options). TCP (Internet stream)
X * connections are used by local and non-local processes which wish
X * to handle their own host activity (e.g. pseudo-terminal handling).
X *
X * Some of the definitions in this file duplicate definitions in the
X * UW server source code, because this file is also intended for use
X * with the UW library.
X *
X * The code which performs byte-order conversions knows the size of the
X * types defined in this file (since there is no typeof() operator).
X */
X
X#define UIPC_ENV "UW_UIPC" /* Unix-domain port environment var */
X#define INET_ENV "UW_INET" /* Internet-domain port environ var */
X
Xtypedef long uwid_t; /* unique window identifier */
X
Xtypedef short uwcmd_t; /* commands: */
X#define UWC_NEWW 0 /* create new window */
X#define UWC_NEWT 1 /* create new tty window */
X#define UWC_STATUS 2 /* creation status message */
X#define UWC_KILLW 3 /* kill existing window */
X#define UWC_OPTION 4 /* act upon window option */
X
Xtypedef short uwoptcmd_t; /* option subcommands: */
X#define UWOC_SET 0 /* set value of option */
X#define UWOC_ASK 2 /* ask for value of option */
X#define UWOC_DO 4 /* report changes in value */
X#define UWOC_DONT 5 /* don't report changes */
X#define UWOC_WILL 6 /* will report changes */
X#define UWOC_WONT 7 /* won't report changes */
X
Xtypedef short uwtype_t; /* window type (see also uw_win.h): */
X#define UWT_ADM31 0 /* ADM-31 */
X#define UWT_VT52 1 /* VT-52 */
X#define UWT_ANSI 2 /* ANSI */
X#define UWT_TEK4010 3 /* Tektronix 4010 */
X#define UWT_FTP 4 /* file transfer */
X#define UWT_PRINT 5 /* output to Macintosh printer */
X#define UWT_PLOT 6 /* plot window */
X
Xtypedef short uwopt_t; /* window option number: */
X#define UWOP_VIS 1 /* visibility */
X#define UWOP_TYPE 2 /* window type */
X#define UWOP_POS 3 /* window position */
X#define UWOP_TITLE 4 /* window title */
X#define UWOP_WSIZE 5 /* window size (in bits) */
X
X#define UWOP_TSIZE 8 /* terminal size (row,col) */
X#define UWOP_TFONTSZ 9 /* small/large font size */
X#define UWOP_TCLIPB 10 /* clipboard/mouse encoding */
X#define UWOP_TBELL 11 /* audible, visual bell */
X#define UWOP_TCURS 12 /* cursor shape */
X
Xunion uwoptval {
X unsigned char uwov_1bit;
X unsigned char uwov_6bit;
X unsigned short uwov_12bit;
X struct {
X unsigned short v,h;
X } uwov_point;
X char uwov_string[256];
X};
X
X
X/*
X * UWC_NEWW: create a new window
X *
X * This command is only valid when it is sent as the first message on an
X * Internet stream socket. The remote port is the data fd for the window.
X * If a control fd is desired, its port number is contained in "uwnt_ctlport"
X */
Xstruct uwneww {
X uwid_t uwnw_id; /* unique window identifier */
X uwtype_t uwnw_type; /* window type */
X short uwnw_ctlport; /* port number of control fd */
X};
X
X/*
X * UWC_NEWT: create a new tty window
X *
X * This command is only valid when it is sent as a datagram to the Unix-domain
X * socket. It must be accompanied by an access right (file descriptor) for
X * the master side of a pty. The server takes over all responsibilities for
X * this window. "uwnt_pty" is variable-length.
X */
Xstruct uwnewt {
X uwid_t uwnt_id; /* unique window identifier */
X uwtype_t uwnt_type; /* window type */
X char uwnt_pty[1]; /* name of associated pty */
X};
X
X/*
X * UWC_STATUS: status report for UWC_NEWW
X *
X * This type of packet is sent by the server to the data fd in response
X * to a UWC_NEWW. It specifies whether the window was successfully
X * created and what unique ID was assigned.
X */
Xstruct uwstatus {
X uwid_t uwst_id; /* unique window identifier */
X short uwst_err; /* error status */
X short uwst_errno; /* UNIX error code (see <errno.h>) */
X};
X
X/*
X * UWC_KILLW: kill the window
X *
X * This command may be sent to either the Unix-domain socket or the control
X * file descriptor of an external window. In the latter case, "uwkw_id"
X * must match the ID of the window associated with the file descriptor.
X */
Xstruct uwkillw {
X uwid_t uwkw_id; /* unique window identifier */
X};
X
X/*
X * UWC_OPTION: act upon window option
X *
X * This command may be sent to either the Unix-domain socket or the control
X * file descriptor of an external window. In the former case, only the
X * UWOC_SET command is processed.
X */
Xstruct uwoption {
X uwid_t uwop_id; /* unique window identifier */
X uwopt_t uwop_opt; /* option number */
X uwoptcmd_t uwop_cmd; /* option subcommand */
X union uwoptval uwop_val; /* option value (for UWOC_SET) */
X};
X
Xstruct uwipc {
X unsigned short uwip_len; /* length of this message */
X uwcmd_t uwip_cmd; /* command (message type) */
X union {
X struct uwneww uwipu_neww;
X struct uwnewt uwipu_newt;
X struct uwstatus uwipu_status;
X struct uwkillw uwipu_killw;
X struct uwoption uwipu_option;
X } uwip_u;
X#define uwip_neww uwip_u.uwipu_neww
X#define uwip_newt uwip_u.uwipu_newt
X#define uwip_status uwip_u.uwipu_status
X#define uwip_killw uwip_u.uwipu_killw
X#define uwip_option uwip_u.uwipu_option
X};
X
X#endif
SHAR_EOF
if test 5403 -ne "`wc -c < 'h/uw_ipc.h'`"
then
echo shar: error transmitting "'h/uw_ipc.h'" '(should have been 5403 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_opt.h'" '(6447 characters)'
if test -f 'h/uw_opt.h'
then
echo shar: will not over-write existing file "'h/uw_opt.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_opt.h'
X/*
X * uw window options
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X *
X * Some protocols support the transmission of window options. A window
X * option is a parameter (or collection of related parameters) which
X * describes the layout, appearance, or other characteristic of a
X * window. Some options are common to all window types, while others
X * are window emulation-specific.
X *
X * Window options may be "set" by one side on its own initiative or in
X * response to an "inquiry" from the other side. In addition, one side
X * may request that the other side "report" changes in options.
X *
X * Options are passed as part of a "new window" command or as part of
X * an "option" command (as defined by the protocol, above). The option
X * format has been chosen to minimize the need for protocol encoding
X * of special or meta characters.
X */
X
X#ifndef UW_OPT
X#define UW_OPT
X
Xtypedef unsigned int woptcmd_t; /* window option command: */
X#define WOC_SET 0 /* request current option value */
X#define WOC_INQUIRE 2 /* report current option value */
X#define WOC_DO 4 /* do report changes to option */
X#define WOC_DONT 5 /* don't report changes */
X#define WOC_WILL 6 /* will report changes */
X#define WOC_WONT 7 /* won't report changes */
X#define WOC_MASK 7 /* mask */
X#define WOC_BADCMD(n) ((n)==1 || (n)==3)
X
X/*
X * Option commands include an option number specifier. If the option
X * number is in the range 1-14 a short-form specifier can be used;
X * otherwise, a long-form specifier must be used. Option (sub)command
X * bytes consist of 7 bits of data. The lower order 3 bits specify the
X * option command. The next higher 4 bits specify the option number.
X * The value zero is reserved (as described below). If the option
X * number is greater than 14, these four bits specify 017 (15) and the
X * option number is specified in a second byte. The value is encoded
X * by adding ' ' to the option number. Multiple options may be specified
X * in one command -- the last option is followed by a reference to
X * "option" 0 (as an endmarker).
X */
X
Xtypedef unsigned int woption_t; /* window option number: */
X#define WONUM_MIN 1 /* minimum option number */
X#define WONUM_GENERIC 7 /* maximum generic option number */
X#define WONUM_SHORT 14 /* maximum short option number */
X#define WONUM_MAX 31 /* maximum option number */
X#define WONUM_MASK (017<<3) /* mask for extraction */
X#define WONUM_USELONG(n) ((unsigned)(n) > WONUM_SHORT)
X#define WONUM_SENCODE(n) (((n)&017)<<3) /* short encoding function */
X#define WONUM_SDECODE(b) (((b)>>3)&017) /* short decoding function */
X#define WONUM_LPREFIX (017<<3) /* long encoding prefix */
X#define WONUM_LENCODE(n) ((n)+' ') /* long encoding function */
X#define WONUM_LDECODE(c) (((c)&0177)-' ') /* long decoding function */
X
X
X/*
X * The following option numbers are generic (recognized for all window
X * types):
X */
X#define WOG_END 0 /* [endmarker] */
X#define WOG_VIS 1 /* 0=invisible, 1=visible */
X#define WOG_TYPE 2 /* window emulation type (see below) */
X#define WOG_POS 3 /* window position on screen */
X#define WOG_TITLE 4 /* window title */
X#define WOG_SIZE 5 /* window size (in bits) */
X#define WOG_6 6 /* unassigned, reserved */
X#define WOG_7 7 /* unassigned, reserved */
X
X/*
X * Option arguments immediately follow option (sub)command bytes. They are
X * encoded to prevent interference with flow-control and IAC recognition.
X * Three types of options are recognized: non-graphic character strings of
X * fixed length, general character strings of variable length, and binary
X * numbers of fixed width.
X *
X * Non-graphic character strings are transmitted directly. They CANNOT
X * include IAC, XON, or XOFF and should not include "meta" characters.
X *
X * General character strings are encoded in the UW protocol fashion: "meta"
X * characters and special characters are escaped. The string is terminated
X * with a null byte. The string may not exceed some predetermined maximum
X * number of characters (which may be less than or equal to 256, including
X * the terminating null byte).
X *
X * Binary numbers are transmitted in 6-bit chunks, least-significant bits
X * first. The number of 6-bit chunks required depends upon the width of
X * the number. The 0100 bit in each byte is always set to prevent
X * collisions with special characters (such as flow control and IAC).
X */
X
X/*
X * Implementation:
X *
X * Arrays of type "woptarg_t" are used to describe the arguments associated
X * with each option. (Note that arguments are associated only with
X * the "set" option subcommand.)
X */
X
Xtypedef unsigned woptarg_t; /* option argument type: */
X#define WOA_END 0 /* endmarker */
X#define WOA_CHARS(n) ((1<<8)|(n)) /* "n" untranslated characters */
X#define WOA_STRING(m) ((2<<8)|(m)) /* string of max length "m" */
X#define WOA_UDATA(b) ((3<<8)|(b)) /* binary number "b" bits wide */
X#define WOA_CMDMASK 0177400 /* command mask */
X
Xtypedef long woptbmask_t; /* option bitmask (>= 32 bits wide) */
X#define WOPT_SET(mask,bit) ((mask) |= (1<<(bit)))
X#define WOPT_CLR(mask,bit) ((mask) &= ~(1<<(bit)))
X#define WOPT_ISSET(mask,bit) ((mask) & (1<<(bit)))
X
Xstruct woptdefn {
X woptbmask_t wod_pending; /* pending notifications to Mac */
X woptbmask_t wod_inquire; /* pending inquiries from Mac */
X woptbmask_t wod_do; /* pending DO commands to Mac */
X woptbmask_t wod_dont; /* pending DONT commands to Mac */
X woptbmask_t wod_askrpt; /* reports (of changes) we ask for */
X struct woptlst {
X woptarg_t *wol_argdefn; /* option argument definition */
X char *(*wol_get)(); /* called to get option value */
X void (*wol_set)(); /* called to set option value */
X void (*wol_ext)(); /* called for external window */
X } wod_optlst[WONUM_MAX+1];
X};
X
X/*
X * The following structure is used by routines that fetch and set option
X * values.
X */
Xunion optvalue {
X unsigned char ov_udata1;
X unsigned char ov_udata2;
X unsigned char ov_udata6;
X unsigned short ov_udata12;
X struct {
X unsigned short v,h;
X } ov_point;
X char ov_string[256];
X};
X
X/*
X * When it is necessary to convert between host byte order and network
X * byte order, opt_netadj() is called. A pointer to the following
X * structure is passed.
X */
Xstruct netadj {
X short (*na_short)();
X long (*na_long)();
X unsigned short (*na_ushort)();
X unsigned long (*na_ulong)();
X};
X
X#endif
SHAR_EOF
if test 6447 -ne "`wc -c < 'h/uw_opt.h'`"
then
echo shar: error transmitting "'h/uw_opt.h'" '(should have been 6447 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_param.h'" '(1006 characters)'
if test -f 'h/uw_param.h'
then
echo shar: will not over-write existing file "'h/uw_param.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_param.h'
X/*
X * uw parameters
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X/*
X * This file exists because #include file definitions aren't in the same
X * place on all machines. Also, it seems pointless to drag in all of
X * <stdio.h> just to define NULL. Finally, a few declarations are
X * sufficiently global that this is the most logical place to put them.
X *
X * This file should be #included after all of the system include files
X * (e.g. <sys/types.h>) but before any other UW include files.
X */
X#ifndef UW_PARAM
X#define UW_PARAM
X
Xtypedef int fildes_t; /* this really should be in <sys/types.h> */
X
X#ifndef NBBY /* this is in <sys/types.h> in 4.3BSD */
X#define NBBY 8 /* (number of bits/byte) */
X#endif
X
X#ifndef NULL
X#define NULL 0
X#endif
X
Xextern char *malloc();
Xextern char *mktemp();
Xextern char *getenv();
Xextern void done();
Xextern void cwait();
X
X#endif
SHAR_EOF
if test 1006 -ne "`wc -c < 'h/uw_param.h'`"
then
echo shar: error transmitting "'h/uw_param.h'" '(should have been 1006 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_pcl.h'" '(9801 characters)'
if test -f 'h/uw_pcl.h'
then
echo shar: will not over-write existing file "'h/uw_pcl.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_pcl.h'
X/*
X * uw protocol
X *
X * Copyright 1985,1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_PCL
X#define UW_PCL
X
X#include "uw_win.h"
X
X/* UW may operate over connections which speak one of several protocols.
X * Internally these protocols are assigned numbers starting at zero.
X * Three such protocols are currently defined:
X *
X * 0: no special protocol
X * 1: original UW (v1.6, v2.10) protocol
X * 2: extended protocol (v3.x)
X */
X
X/*
X * Protocol 0:
X *
X * The connection between the Macintosh and the host is simply a serial
X * line. Flow control may be enabled, but no special commands are
X * recognized. Only one active window is supported. This "protocol"
X * does not require the UW server; hence, there is no need to support it.
X */
X
X/*
X * Protocol 1: (original UW protocol)
X *
X * Two types of information are exchanged through the 7-bit serial line:
X * ordinary data and command bytes. Command bytes are preceeded by
X * an IAC byte. IAC bytes and literal XON/XOFF characters (those which
X * are not used for flow control) are sent by a P1_FN_CTLCH command.
X * Characters with the eighth bit set (the "meta" bit) are prefixed with
X * a P1_FN_META function.
X *
X * The next most-significant bit in the byte specifies the sender and
X * recipient of the command. If this bit is clear (0), the command byte
X * was sent from the host computer to the Macintosh; if it is set (1)
X * the command byte was sent from the Macintosh to the host computer.
X * This prevents confusion in the event that the host computer
X * (incorrectly) echos a command back to the Macintosh.
X *
X * The remaining six bits are partitioned into two fields. The low-order
X * three bits specify a window number from 1-7 (window 0 is reserved for
X * other uses) or another type of command-dependent parameter. The next
X * three bits specify the operation to be performed by the recipient of
X * the command byte.
X *
X * Note that the choice of command bytes prevents the ASCII XON (021) and
X * XOFF (023) characters from being sent as commands. P1_FN_ISELW commands
X * are only sent by the Macintosh (and thus are tagged with the P1_DIR_MTOH
X * bit). Since XON and XOFF data characters are handled via P1_FN_CTLCH,
X * this allows them to be used for flow control purposes.
X */
X#define P1_IAC 0001 /* interpret as command */
X#define P1_DIR 0100 /* command direction: */
X#define P1_DIR_HTOM 0000 /* from host to Mac */
X#define P1_DIR_MTOH 0100 /* from Mac to host */
X#define P1_FN 0070 /* function code: */
X#define P1_FN_NEWW 0000 /* new window */
X#define P1_FN_KILLW 0010 /* kill (delete) window */
X#define P1_FN_ISELW 0020 /* select window for input */
X#define P1_FN_OSELW 0030 /* select window for output */
X#define P1_FN_META 0050 /* add meta to next data char */
X#define P1_FN_CTLCH 0060 /* low 3 bits specify char */
X#define P1_FN_MAINT 0070 /* maintenance functions */
X#define P1_WINDOW 0007 /* window number mask */
X#define P1_CC 0007 /* control character specifier: */
X#define P1_CC_IAC 1 /* IAC */
X#define P1_CC_XON 2 /* XON */
X#define P1_CC_XOFF 3 /* XOFF */
X#define P1_MF 0007 /* maintenance functions: */
X#define P1_MF_ENTRY 0 /* beginning execution */
X#define P1_MF_ASKPCL 2 /* request protocol negotiation */
X#define P1_MF_CANPCL 3 /* suggest protocol */
X#define P1_MF_SETPCL 4 /* set current protocol */
X#define P1_MF_EXIT 7 /* execution terminating */
X#define P1_NWINDOW 7 /* maximum number of windows */
X
X/*
X * Protocol 2: (extended UW protocol)
X *
X * Protocol 2 is an extension of protocol 1. The P2_FN_NEWW command and
X * the new command P2_FN_WOPT communicate window options between the host
X * and the Macintosh. (See "uw_opt.h" for details.)
X */
X#define P2_IAC P1_IAC /* interpret as command */
X#define P2_DIR P1_DIR /* command direction: */
X#define P2_DIR_HTOM P1_DIR_HTOM /* from host to Mac */
X#define P2_DIR_MTOH P1_DIR_MTOH /* from Mac to host */
X#define P2_FN P1_FN /* function code: */
X#define P2_FN_NEWW P1_FN_NEWW /* new window */
X#define P2_FN_KILLW P1_FN_KILLW /* kill (delete) window */
X#define P2_FN_ISELW P1_FN_ISELW /* select window for input */
X#define P2_FN_OSELW P1_FN_OSELW /* select window for output */
X#define P2_FN_WOPT 0040 /* communicate window options */
X#define P2_FN_META P1_FN_META /* add meta to next data char */
X#define P2_FN_CTLCH P1_FN_CTLCH /* low 3 bits specify char */
X#define P2_FN_MAINT P1_FN_MAINT /* maintenance functions */
X#define P2_WINDOW P1_WINDOW /* window number mask */
X#define P2_CC P1_CC /* control character specifier: */
X#define P2_CC_IAC P1_CC_IAC /* IAC */
X#define P2_CC_XON P1_CC_XON /* XON */
X#define P2_CC_XOFF P1_CC_XOFF /* XOFF */
X#define P2_MF P1_MF /* maintenance functions: */
X#define P2_MF_ENTRY P1_MF_ENTRY /* beginning execution */
X#define P2_MF_ASKPCL P1_MF_ASKPCL /* request protocol negotiation */
X#define P2_MF_CANPCL P1_MF_CANPCL /* suggest protocol */
X#define P2_MF_SETPCL P1_MF_SETPCL /* set current protocol */
X#define P2_MF_EXIT P1_MF_EXIT /* execution terminating */
X#define P2_NWINDOW P1_NWINDOW /* maximum number of windows */
X
X/*
X * Protocol negotiation
X *
X * The server is not used for protocol 0. For the other protocols, the
X * Macintosh and the server negotiate to select the active protocol. The
X * basic idea is that the Macintosh will express its desire for a protocol
X * and the server will attempt to satisfy that desire. Until negotiations
X * are complete, protocol 1 is used.
X *
X * Protocols are identified by single-character names which are formed by
X * adding the ASCII code for a space (040) to the protocol number minus 1
X * (i.e. protocol 1 is ' ', protocol 2 is '!').
X *
X * P1_FN_CANPCL and P1_FN_SETPCL are three-byte commands: P1_IAC,
X * P1_FN_XXXPCL, protocol-name.
X *
X * Macintosh:
X * If UW v2.10 is used on the Macintosh or if a newer Macintosh program
X * wishes to use protocol 1, it will never initiate protocol negotiation.
X * Hence, all interaction will use protocol 1 by default.
X *
X * If the Macintosh program is capable of supporting protocol 2 and the
X * user requests its use, the Mac will remember this fact but will
X * continue to use protocol 1. The Mac program will assume that no
X * server is present until instructed otherwise by the user or until a
X * P1_FN_ENTRY command is received (e.g. when the server starts up).
X * At this time, the Mac program issues P1_FN_ASKPCL. If the server
X * cannot support protocol 2 (i.e. it is an old server), then it will
X * ignore the P1_FN_ASKPCL. The Macintosh will retry the P1_FN_ASKPCL
X * a couple of times (about five seconds apart) and, if there is no
X * response from the server, will abandon negotiations. Protocol 1
X * will be used for the remainder of the session.
X *
X * If the server recognizes the P1_FN_ASKPCL command it will respond
X * with the name of the most complex protocol it can support (currently
X * '!'). If this is acceptable to the Macintosh, it will instruct the
X * server to use this protocol. If the Macintosh cannot support this
X * protocol it will respond with a P1_FN_CANPCL suggesting a less-complex
X * protocol. If the server agrees to this it will answer establish the
X * protocol; otherwise, it will suggest an even weaker protocol.
X * Eventually someone will suggest protocol 1 (which is universal) and
X * the other side will issue a P1_FN_SETPCL command to establish its use.
X *
X * Host:
X * If the host receives a P1_FN_ASKPCL it will respond with the most
X * complex protocol it can support (using the P1_FN_CANPCL command).
X * Negotiations will proceed as described above until one side
X * establishes a new protocol with P1_FN_SETPCL. At this time, the
X * host will switch to the new protocol.
X *
X * If the host receives a P1_FN_ENTRY (P2_FN_ENTRY) command, it will
X * switch back to protocol 1. Receipt of this command indicates that
X * the Macintosh program was restarted. The Macintosh must initiate
X * protocol negotiations again.
X */
X
X/*
X * Although many of the functions are identical (and the code is shared
X * between them), each protocol is accessed through a (struct protocol)
X * which specifies the functions for various operations.
X *
X * In theory, the main program knows nothing about the protocol in use.
X * In practice, the externally-visible functions are accessed as macros
X * for greater efficiency.
X *
X * The protocol layer is aware of the (struct window) data structures.
X */
X
Xstruct protocol {
X char p_name; /* single-character protocol name */
X nwin_t p_maxwin; /* maximum window number */
X int *p_ctlch; /* control character map table */
X unsigned p_szctlch; /* size (# of entries) in ctlch table */
X void (*p_entry)(); /* start up (ENTRY maintenance fn) */
X void (*p_exit)(); /* shut down (EXIT maintenance fn) */
X void (*p_renew)(); /* renew (re-init) */
X struct window *(*p_neww)(); /* create new window */
X void (*p_killw)(); /* kill window */
X void (*p_xmit)(); /* transmit to specified window */
X void (*p_recv)(); /* receive from Macintosh */
X void (*p_chkopt)(); /* check for pending option output */
X void (*p_sendopt)(); /* send option string to Macintosh */
X void (*p_askpcl)(); /* send an ASKPCL maintenance command */
X void (*p_canpcl)(); /* send a CANPCL maintenance command */
X void (*p_setpcl)(); /* send a SETPCL maintenance command */
X};
X
Xextern struct protocol *protocol;
X
X#define PCL_NEWW(mfd,class,wtype,wnum,wid,dfd,cfd) \
X (*protocol->p_neww)(mfd,class,wtype,wnum,(long)wid,dfd,cfd)
X#define PCL_KILLW(mfd,w) (*protocol->p_killw)(mfd,w)
X#define PCL_RECV(mfd,buf,len) (*protocol->p_recv)(mfd,buf,len)
X#define PCL_XMIT(mfd,w) (*protocol->p_xmit)(mfd,w)
X#define PCL_SENDOPT(mfd,fn,buf,len) \
X (protocol->p_sendopt ? (*protocol->p_sendopt)(mfd,fn,buf,len) : 0)
X#endif
SHAR_EOF
if test 9801 -ne "`wc -c < 'h/uw_pcl.h'`"
then
echo shar: error transmitting "'h/uw_pcl.h'" '(should have been 9801 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uw_win.h'" '(3453 characters)'
if test -f 'h/uw_win.h'
then
echo shar: will not over-write existing file "'h/uw_win.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uw_win.h'
X/*
X * uw window data definition
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#ifndef UW_WIN
X#define UW_WIN
X
X#include "uw_opt.h"
X
X/*
X * A "point" is a pair of 16-bit integers. This may specify the horizontal
X * and vertical position or size of a window.
X */
Xtypedef short npixel_t; /* number of pixels */
Xstruct point {
X npixel_t v,h;
X};
X
X/*
X * The type of a window determines how it responds to I/O and which
X * window options it supports. I'd like to declare these with an "enum",
X * but the stupid PCC screams if I use enums as array indices, so they
X * are defined via #define's instead.
X */
Xtypedef unsigned int wtype_t; /* window type: */
X#define WT_ADM31 0 /* ADM-31 terminal emulation */
X#define WT_VT52 1 /* VT52 terminal emulation */
X#define WT_ANSI 2 /* ANSI terminal emulation */
X#define WT_TEK4010 3 /* Tek4010 terminal emulation */
X#define WT_FTP 4 /* file transfer */
X#define WT_PRINT 5 /* output to printer */
X#define WT_PLOT 6 /* plot window */
X#define WT_MAXTYPE 6 /* maximum window type */
X
Xextern wtype_t defwtype; /* default window type */
X
X/*
X * There are two basic classes of windows -- those which are processed
X * directly by the server and those which are processed by outside
X * programs. Directly-handled windows are always terminal emulations.
X * Externally-handled windows may be any window type.
X */
Xtypedef enum { /* window class: */
X WC_INTERNAL, /* processed directly */
X WC_EXTERNAL, /* processed externally */
X} wclass_t;
X
Xstruct window {
X int w_alloc; /* window allocated if nonzero */
X long w_id; /* window unique ID */
X wtype_t w_type; /* window emulation type */
X wclass_t w_class; /* window class */
X fildes_t w_datafd; /* data file descriptor */
X union {
X struct winint {
X char wi_tty[32]; /* terminal name */
X } wu_int;
X struct winext {
X fildes_t we_ctlfd; /* control file descriptor */
X } wu_ext;
X } w_un;
X struct woptdefn w_optdefn; /* window option definitions */
X int w_visible; /* nonzero if window is visible */
X struct point w_position; /* position of window on screen */
X struct point w_size; /* size of window in pixels */
X char w_title[256]; /* window title */
X char *w_private; /* storage private to emulation type */
X};
X#define w_tty w_un.wu_int.wi_tty
X#define w_ctlfd w_un.wu_ext.we_ctlfd
X
Xtypedef int nwin_t; /* window index data type */
X
X/*
X * Some operations upon windows depend upon the window type. For each
X * emulation type there is a "emulation" structure which specifies
X * emulation-specific data.
X */
Xstruct emulation {
X struct woptdefn we_optdefn; /* window option definitions */
X int (*we_start)(); /* emulation setup code */
X void (*we_stop)(); /* emulation shutdown code */
X void (*we_setext)(); /* make changes req'd for extern win */
X};
X
Xextern struct window *win_neww(); /* create new window */
Xextern struct window *win_search(); /* convert window ID to window ptr */
X
X/*
X * The following macros convert between a window number and a pointer to
X * the corresponding window structure (and vice versa).
X *
X * NWINDOW *must* be >= P1_NWINDOW and >= P2_NWINDOW (in "uw_pcl.h").
X */
X#define NWINDOW 7 /* maximum number of windows */
X#define WIN_NUM(wptr) ((wptr)-window+1)
X#define WIN_PTR(wnum) (window+(wnum)-1)
Xextern struct window window[]; /* window data structures */
X#endif
SHAR_EOF
if test 3453 -ne "`wc -c < 'h/uw_win.h'`"
then
echo shar: error transmitting "'h/uw_win.h'" '(should have been 3453 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'h/uwlib.h'" '(1974 characters)'
if test -f 'h/uwlib.h'
then
echo shar: will not over-write existing file "'h/uwlib.h'"
else
sed 's/^X//' << \SHAR_EOF > 'h/uwlib.h'
X/*
X * uw library definitions
X *
X * Copyright 1986 by John D. Bruner. All rights reserved. Permission to
X * copy this program is given provided that the copy is not sold and that
X * this copyright notice is included.
X */
X
X#include "uw_err.h"
X#include "uw_ipc.h"
X
X#ifndef NBBY
X#define NBBY 8 /* defined in <sys/types.h> in 4.3BSD */
X#endif
X
X#define UW_NUMOPTS 32 /* number of window options */
X#define UW_NWTYPES 6 /* number of window emulation types */
X
Xtypedef char uwtitle_t[256];
X
Xstruct uwpoint {
X unsigned uwp_v; /* vertical component */
X unsigned uwp_h; /* horizontal component */
X};
X
Xstruct uw_info {
X uwid_t uwi_id; /* unique window ID */
X int uwi_datafd; /* file descriptor for data */
X int uwi_ctlfd; /* file descriptor for control */
X uwerr_t uwi_uwerr; /* last error from UW */
X int uwi_errno; /* last error from system call */
X int uwi_vis; /* visiblility */
X uwtype_t uwi_type; /* window type */
X struct uwpoint uwi_pos; /* window position (in pixels) */
X uwtitle_t uwi_title; /* window title */
X struct uwpoint uwi_wsize; /* window size (in pixels) */
X struct {
X void (*uwi_optfn)(); /* option handler */
X } uwi_options[UW_NUMOPTS];
X int uwi_ipclen; /* length of data in IPC buffer */
X struct uwipc uwi_ipcbuf; /* buffer for IPC messages */
X};
X
X#define UW_DATAFD(uwin) (uwin)->uwi_datafd
X#define UW_ID(uwin) (uwin)->uwi_id
X#define UW_PERROR(uwin, mesg) \
X uw_perror(mesg, (uwin)->uwi_uwerr, (uwin)->uwi_errno)
X
Xtypedef struct uw_info *UWIN;
Xtypedef void (*uwfnptr_t)();
X
Xextern uwid_t uw_cmd();
Xextern UWIN uw_new();
Xextern uw_close(), uw_detach();
Xextern uw_optcmd();
Xextern uw_kill();
Xextern uwfnptr_t uw_optfn();
Xextern uw_rsetopt();
Xextern void uw_perror();
Xextern uwid_t uw_fork(), uw_cmd(), uw_shell();
X
Xextern uw_gvis(), uw_svis();
Xextern uw_gtype(), uw_stype();
Xextern uw_gtitle(), uw_stitle();
Xextern uw_gwsize(), uw_swsize();
Xextern uw_gpos(), uw_spos();
X
Xextern uwerr_t uwerrno;
Xextern char *uwerrlist[];
Xextern unsigned uwnerr;
SHAR_EOF
if test 1974 -ne "`wc -c < 'h/uwlib.h'`"
then
echo shar: error transmitting "'h/uwlib.h'" '(should have been 1974 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
--- end of part 3 ---
Technical Details
Message-ID:
<6515@dhw68k.cts.com>Path:
arc1-ca.pugleaf.net!utzoo!mnetor!uunet!lll-winken!lll-tis!ames!pasteur!ucbvax!ucsd!sdcsvax!ucsdhub!hp-sdd!hplabs!felix!dhw68k!macintoshReferences:
<6493@dhw68k.cts.com> <6497@dhw68k.cts.com>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!mnetor!uunet!lll-winken!lll-tis!ames!pasteur!ucbvax!ucsd!sdcsvax!ucsdhub!hp-sdd!hplabs!felix!dhw68k!macintosh From: jdb@mordor.s1.gov (John Bruner) Newsgroups: comp.sources.mac Subject: UW v4.2 (part 3 of 9) Message-ID: <6515@dhw68k.cts.com> Date: 5 Apr 88 16:05:46 GMT References: <6493@dhw68k.cts.com> <6497@dhw68k.cts.com> Sender: macintosh@dhw68k.cts.com Organization: Lawrence Livermore National Laboratory, S-1 Project Lines: 1027 Approved: bytebug@dhw68k.cts.com (Roger L. Long)