[comp.lang.c++] Transport Part02/03

schemers@vela.acs.oakland.edu (Roland Schemers III) (10/26/90)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 3)."
# Contents:  Transport/src/DECnetSocket.C Transport/src/InetAddress.C
#   Transport/src/InetAddress.h Transport/src/InetSocket.C
#   Transport/src/Transport.C Transport/src/UnixSocket.C
#   Transport/src/Util.C Transport/tests/makefile
# Wrapped by schemers@vela.acs.oakland.edu on Thu Oct 25 15:44:47 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Transport/src/DECnetSocket.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/DECnetSocket.C'\"
else
echo shar: Extracting \"'Transport/src/DECnetSocket.C'\" \(2552 characters\)
sed "s/^X//" >'Transport/src/DECnetSocket.C' <<'END_OF_FILE'
X#ifdef USE_DECNET
X
X#include "Transport.h"
X#include "Util.h"
X
X#include <stdio.h>
X#include <osfcn.h>
X#include <libc.h>
X#include <string.h>
X
Xextern "C" {
X	int dnet_conn(
X		const char *node, 
X		const char *obj,
X		int type,
X		u_char *opt_out,
X		int opt_outl,
X		u_char *opt_in,
X		int *opt_inl
X	);
X	struct dn_naddr *dnet_addr(const char *cp);
X	struct nodeent  *getnodebyname(const char *node);
X}
X
Xint DECnetSocket::open(int obj)
X{
X	object=obj;
X	if (inuse()) close();
X	if (!socket()) goto error;
X
X        bzero((char *) &server_addr, sizeof(struct sockaddr_dn));
X        server_addr.sdn_family = address_family();
X        server_addr.sdn_objnum = object;
X
X	if (!bind((struct sockaddr*)&server_addr,sizeof(server_addr)))
X		goto error;
X
X	if (!listen(SOMAXCONN)) goto error;
X
X	status=0;
X	sex=Server;
X	return 1;
Xerror:
X	if (!return_on_error)
X		Util::crash_and_burn("DECnetSocket","open",sys_errlist[status]);
X	return 0;
X}
X
Xint DECnetSocket::open(const char *node,int obj)
X{
X	object=obj;
X	if (inuse()) close();
X	if (!socket()) goto error;	// error creating socket
X
X         bzero((char *) &client_addr , sizeof(client_addr));
X         client_addr.sdn_family = address_family();
X	 client_addr.sdn_objnum = object;
X	 if ( (node_addr = dnet_addr(node)) == NULL) {
X		if ((nodep=getnodebyname(node))==NULL) {
X		  status=-1;
X		  if (return_on_error) return 0;
X		  Util::crash_and_burn("DECnetSocket","open","host not found");
X		} else {
X			bcopy(nodep->n_addr,client_addr.sdn_nodeaddr,
X				nodep->n_length);
X			client_addr.sdn_nodeaddrl = nodep->n_length;
X		}
X	} else client_addr.sdn_add = *node_addr;
X
X	if (!connect((struct sockaddr*)&client_addr,sizeof(client_addr))) 
X		goto error;
X
X	status=0;
X	sex=Client;
X	return 1;
Xerror:
X	if (!return_on_error)
X		Util::crash_and_burn("DECnetSocket","open",sys_errlist[status]);
X	return 0;
X}
X
Xint DECnetSocket::open(const char *node,const char *obj)
X{
X	td=dnet_conn(node,obj,type,NULL,NULL,NULL,NULL);
X        if (td<0) status=errno;
X        else status=0;
X	sex = Client;
X	return (status==0);
X}
X
Xint DECnetSocket::accept(DECnetSocket &newsocket)
X{
X	if (!ok() || (socket_sex()!=Server)) {
X		newsocket.td = -1;
X		newsocket.status = -1;
X		return 0;
X	}
X
X	if (newsocket.inuse()) newsocket.close();
X
X	newsocket = *this;	
X
X	clen=sizeof(client_addr);
X        newsocket.td = Socket::accept((struct sockaddr *) &client_addr,clen);
X	if (newsocket.td < 0 ) {
X		newsocket.status=errno;
X		if (return_on_error) return 0;
X		Util::crash_and_burn("DECnetSocket","accept",sys_errlist[errno]);
X	} else {
X		newsocket.status=0;
X		return 1;
X	}
X}
X
X
X#endif
END_OF_FILE
if test 2552 -ne `wc -c <'Transport/src/DECnetSocket.C'`; then
    echo shar: \"'Transport/src/DECnetSocket.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/DECnetSocket.C'
fi
if test -f 'Transport/src/InetAddress.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/InetAddress.C'\"
else
echo shar: Extracting \"'Transport/src/InetAddress.C'\" \(2519 characters\)
sed "s/^X//" >'Transport/src/InetAddress.C' <<'END_OF_FILE'
X#include <stdio.h>
X#include <osfcn.h>
X#include <libc.h>
X#include <errno.h>
X#include <string.h>
X#include <netdb.h>
X#include <iostream.h>
X
X#include "Transport.h"
X
Xextern "C" {
X	unsigned long htonl(unsigned long);
X	unsigned short htons(unsigned short);
X	unsigned short ntohs(unsigned short);
X	struct hostent *gethostbyname(const char *host);
X}
X
Xchar *InetAddress::Any="0.0.0.0";
Xchar *InetAddress::Broadcast="255.255.255.255";
X
Xostream &operator<<(ostream &os, const InetAddress &ia)
X{
X	if (!ia.ok()) os <<"(UnKnownHost)";
X	else os << "(" << ia.hostname() << "," << ia.port() << ")";
X	return os;
X}
X
XInetAddress::InetAddress() 
X{
X	stat=NoHostGiven;	// no address looked up
X	addrlen=sizeof(address);
X}
X
XInetAddress::InetAddress(int port) 
X{
X	lookup(Any,port);
X}
X
X
XInetAddress::InetAddress(const char *hostname, int port) 
X{
X	lookup(hostname,port);
X}
X
XInetAddress::InetAddress(const char *hostname,
X			 const char *service,
X			 const char *proto) 
X{
X	lookup(hostname,service,proto);
X}
X
X
XInetAddress::InetAddress(const char *service,
X			 const char *proto) 
X{
X	lookup(Any,service,proto);
X}
X
Xint InetAddress::lookup(const char *hostname, int port) 
X{
X	stat=HostFound;
X	addrlen=sizeof(address);
X        bzero((char *) &address , addrlen);
X        address.sin_family = Socket::AfInet;
X	address.sin_port   = htons(port);
X	if (hostname==Any) address.sin_addr.s_addr = htonl(INADDR_ANY);
X        else if (hostname==Broadcast) address.sin_addr.s_addr = htonl(INADDR_BROADCAST);
X	else if ((address.sin_addr.s_addr =inet_addr(hostname))==-1) {
X        	struct hostent *hp=gethostbyname(hostname);
X	        if (hp==NULL) stat=UnknownHost;
X		else bcopy(hp->h_addr,(char*)&address.sin_addr,hp->h_length);
X	}
X        any_flag = 
X             (address.sin_addr.s_addr==htonl(INADDR_ANY)) ? 1 : 0;
X        broadcast_flag = 
X	     (address.sin_addr.s_addr==htonl(INADDR_BROADCAST)) ? 1 : 0;
X	return stat==HostFound;
X}
X
Xint InetAddress::lookup(const char *hostname, 
X			const char *service,
X			const char *proto) 
X{
X	struct servent *se=getservbyname(service,proto);
X	if (se==NULL) {
X		stat=UnKnownService;
X		return 0;
X	}
X
X	return lookup(hostname,ntohs(se->s_port));
X}
X
Xconst char *InetAddress::hostname() const
X{
X	struct hostent *hp;
X	hp=gethostbyaddr((char *)&address.sin_addr,addrlen,Socket::AfInet);
X	if (hp==NULL) return inet_ntoa( address.sin_addr);
X	else return hp->h_name;
X}
X
Xconst char *InetAddress::numeric_hostname() const
X{
X	return inet_ntoa( address.sin_addr);
X}
X
Xint InetAddress::port() const
X{
X	return ntohs(address.sin_port);
X}
END_OF_FILE
if test 2519 -ne `wc -c <'Transport/src/InetAddress.C'`; then
    echo shar: \"'Transport/src/InetAddress.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/InetAddress.C'
fi
if test -f 'Transport/src/InetAddress.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/InetAddress.h'\"
else
echo shar: Extracting \"'Transport/src/InetAddress.h'\" \(1445 characters\)
sed "s/^X//" >'Transport/src/InetAddress.h' <<'END_OF_FILE'
X#ifndef INETADDRESS_CLASS_H
X#define INETADDRESS_CLASS_H
X
X#include <sys/socket.h>
X#include <sys/types.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <iostream.h>
X
Xclass InetAddress {
X	friend ostream &operator<<(ostream &os, const InetAddress &ia);
Xpublic:
X	static char *Any;	// any address
X	static char *Broadcast;	// broadcast address
X	enum Status {NoHostGiven,UnknownHost,UnKnownService,HostFound};
X	InetAddress();
X	InetAddress(const char *hostname,int port);
X	InetAddress(int port);
X	InetAddress(const char *hostname,const char *service,const char *proto);
X	InetAddress(const char *service,const char *proto);
X	lookup(const char *hostname,int port);
X	lookup(int port) {
X			return lookup(Any,port);
X	}
X	lookup(const char *hostname,const char *service,const char *proto);
X	lookup(const char *service,const char *proto) {
X			return lookup(Any,service,proto);
X	}
X	int ok() const { return stat==HostFound; }
X	Status status() const { return stat; }
X	const char *hostname() const;
X	const char *numeric_hostname() const;
X	int size() const { return sizeof(address); }
X	int port() const;
X	int any() const { return any_flag; }
X	typedef struct sockaddr *SOCKADDR_PTR;
X	typedef const struct sockaddr *CONST_SOCKADDR_PTR;
X	operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; }
X	operator CONST_SOCKADDR_PTR() const { return (SOCKADDR_PTR) &address; }
X
X	struct sockaddr_in	address;
X	int			addrlen;
X	Status			stat;
X	int			any_flag;
X};
X#endif
END_OF_FILE
if test 1445 -ne `wc -c <'Transport/src/InetAddress.h'`; then
    echo shar: \"'Transport/src/InetAddress.h'\" unpacked with wrong size!
fi
# end of 'Transport/src/InetAddress.h'
fi
if test -f 'Transport/src/InetSocket.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/InetSocket.C'\"
else
echo shar: Extracting \"'Transport/src/InetSocket.C'\" \(1889 characters\)
sed "s/^X//" >'Transport/src/InetSocket.C' <<'END_OF_FILE'
X
X#include <stdio.h>
X#include <osfcn.h>
X#include <libc.h>
X#include <errno.h>
X#include <string.h>
X#include <netdb.h>
X#include <iostream.h>
X
X#include "Transport.h"
X#include "Util.h"
X
Xextern "C" {
X	unsigned long htonl(unsigned long);
X	unsigned short htons(unsigned short);
X	struct hostent *gethostbyname(const char *host);
X}
X
Xint InetSocket::connect(const InetAddress &ia)
X{
X	return Socket::connect(ia,ia.size());
X}
X
Xint InetSocket::bind(const InetAddress &ia)
X{
X	return Socket::bind(ia,ia.size());
X}
X
Xint InetSocket::getpeername(InetAddress &ia)
X{
X	ia.addrlen=ia.size();
X	int stat=Socket::getpeername(ia,ia.addrlen);
X	if (stat) ia.stat=InetAddress::HostFound;
X	else ia.stat=InetAddress::UnknownHost;
X	return stat;
X}
X
Xint InetSocket::getsockname(InetAddress &ia)
X{
X	ia.addrlen=ia.size();
X	int stat=Socket::getsockname(ia,ia.addrlen);
X	if (stat) ia.stat=InetAddress::HostFound;
X	else ia.stat=InetAddress::UnknownHost;
X	return stat;
X}
X
Xint InetSocket::accept(InetSocket &newsocket)
X {
X 	if (!ok() || (socket_sex()!=Server)) { // socket is bad!
X 		newsocket.td = -1; 
X		newsocket.status = -1;
X		return 0; 
X	} 
X
X	if (newsocket.inuse()) newsocket.close();
X
X	newsocket = *this; // copy current socket
X	InetAddress remote;
X	remote.addrlen=remote.size();
X        newsocket.td = Socket::accept(remote,remote.addrlen);
X
X	if (newsocket.td < 0 ) {
X		newsocket.status=errno;
X		if (return_on_error) return 0;
X		Util::crash_and_burn("InetSocket","accept",sys_errlist[errno]);
X	} else {
X		newsocket.status=0;
X		return 1;
X	}
X
X}
X
Xint InetSocket::recvfrom(char *buffer,int maxbuf, InetAddress &ia)
X{
X	ia.addrlen=ia.size();
X	int stat=Socket::recvfrom(buffer,maxbuf,ia,ia.addrlen); 
X        if (stat) ia.stat=InetAddress::HostFound;
X	else ia.stat=InetAddress::NoHostGiven;
X	return stat;
X}
X
Xint InetSocket::sendto(char *buffer,int len,const InetAddress &ia)
X{
X	return Socket::sendto(buffer,len,ia,ia.addrlen); 
X}
X
X
END_OF_FILE
if test 1889 -ne `wc -c <'Transport/src/InetSocket.C'`; then
    echo shar: \"'Transport/src/InetSocket.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/InetSocket.C'
fi
if test -f 'Transport/src/Transport.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/Transport.C'\"
else
echo shar: Extracting \"'Transport/src/Transport.C'\" \(1756 characters\)
sed "s/^X//" >'Transport/src/Transport.C' <<'END_OF_FILE'
X#include <libc.h>
X#include <osfcn.h>
X#include <sys/uio.h>
X#include <iostream.h>
X#include <errno.h>
X
X#include "Transport.h"
X#include "Util.h"
X
XTransport::Transport()
X{
X  td       = -1;
X  status   = -1;
X  return_on_error=0;
X}
X
Xint Transport::close()
X{
X  if (td == -1) { status=0; return 1; }
X  int s = ::close(td);
X  if (s==-1) {
X	status=errno;
X	if (return_on_error) return 0;
X	Util::crash_and_burn("Transport","close",sys_errlist[status]);
X  }
X  else {
X	status=0;
X	td=-1;
X	return 1;
X  }
X}
X
Xint Transport::ok()
X{ 
X	if (td==-1) return 0;
X	else return status==0;
X}
X
Xint Transport::inuse()
X{ 
X	return (td!=-1);
X}
X
Xint Transport::read(char *buffer, int mlen)
X{
X  if (td == -1) return -1;
X  int nbr = ::read(td,buffer,mlen);
X  if (nbr==-1) {
X	status=errno;
X	if (return_on_error) return nbr;
X	Util::crash_and_burn("Transport","read",sys_errlist[status]);
X  }
X  else status=0;
X  return nbr;
X}
X
Xint Transport::readv(const struct iovec *iov, int iovlen)
X{
X  if (td == -1) return -1;
X  int nbr = ::readv(td,iov,iovlen);
X  if (nbr==-1) {
X	status=errno;
X	if (return_on_error) return nbr;
X	Util::crash_and_burn("Transport","readv",sys_errlist[status]);
X  }
X  else status=0;
X  return nbr;
X}
X
Xint Transport::write(const char *buffer, int len)
X{
X  if (td == -1) return -1;
X  int nbw = ::write(td,buffer,len);
X  if (nbw==-1) {
X	status=errno;
X	if (return_on_error) return nbw;
X	Util::crash_and_burn("Transport","write",sys_errlist[status]);
X  }
X  else status=0;
X  return nbw;
X}
X
X
X
Xint Transport::writev(const struct iovec *iov, int iovlen)
X{
X  if (td == -1) return -1;
X  int nbw = ::writev(td,iov,iovlen);
X  if (nbw==-1) {
X	status=errno;
X	if (return_on_error) return nbw;
X	Util::crash_and_burn("Transport","writev",sys_errlist[status]);
X  }
X  else status=0;
X  return nbw;
X}
X
X
END_OF_FILE
if test 1756 -ne `wc -c <'Transport/src/Transport.C'`; then
    echo shar: \"'Transport/src/Transport.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/Transport.C'
fi
if test -f 'Transport/src/UnixSocket.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/UnixSocket.C'\"
else
echo shar: Extracting \"'Transport/src/UnixSocket.C'\" \(1521 characters\)
sed "s/^X//" >'Transport/src/UnixSocket.C' <<'END_OF_FILE'
X#include "Transport.h"
X#include "Util.h"
X
X#include <stdio.h>
X#include <osfcn.h>
X#include <libc.h>
X#include <string.h>
X//#include <iostream.h>
X
X
Xint UnixSocket::open(const UnixAddress &ua,
X		       Socket::SocketSex sx)
X{
X
X  sex=sx;   
X  if (inuse()) close();
X  if (!socket()) goto error;
X
X  switch (socket_sex()) {
X     case Client:
X	remote = ua;
X	if (!connect(remote,remote.addrlen)) goto error;
X	break;
X     case Server:
X	local = ua;
X	if (!bind(local,local.addrlen)) goto error;
X	unlink_socket=1;
X	if (!listen(SOMAXCONN)) goto error;
X        break;
X  }
X	status=0; 
X	return 1;
Xerror:
X	if (return_on_error) return 1;
X	Util::crash_and_burn("UnixSocket","open",sys_errlist[errno]);
X}
X
XUnixSocket::~UnixSocket() 
X{
X  if (inuse()) close();
X}
X
Xint UnixSocket::close() 
X{
X
X  if (	unlink_socket) unlink(local.pathname());
X
X  int s = ::close(td);
X  if (s==-1) {
X	status=errno;
X	if (return_on_error) return 0;
X	Util::crash_and_burn("UnixSocket","close",sys_errlist[status]);
X  }
X
X  status=0;
X  td = -1;
X  return 1;
X}
X
Xint UnixSocket::accept(UnixSocket &newsocket)
X{
X	if (!ok() || (socket_sex()!=Server)) {
X		newsocket.td     = -1;
X		newsocket.status = -1;
X		return 0;
X	}
X
X	if (newsocket.inuse()) newsocket.close();
X
X	newsocket = *this;
X	remote.addrlen=remote.size();
X        newsocket.td = Socket::accept(remote,remote.addrlen);
X
X	if (newsocket.td < 0 ) {
X		newsocket.status=errno;
X		if (return_on_error) return 0;
X		Util::crash_and_burn("UnixSocket","accept",sys_errlist[errno]);
X	} else {
X		newsocket.status=0;
X		return 1;
X	}
X}
END_OF_FILE
if test 1521 -ne `wc -c <'Transport/src/UnixSocket.C'`; then
    echo shar: \"'Transport/src/UnixSocket.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/UnixSocket.C'
fi
if test -f 'Transport/src/Util.C' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/src/Util.C'\"
else
echo shar: Extracting \"'Transport/src/Util.C'\" \(1507 characters\)
sed "s/^X//" >'Transport/src/Util.C' <<'END_OF_FILE'
X#include <sys/signal.h>
X#include <iostream.h>
X#include <libc.h>
X#include <osfcn.h>
X#include <sys/wait.h>
X#include <sys/param.h>
X#include <errno.h>
X#include <sys/file.h>
X#include <sys/ioctl.h>
X
X#include "Util.h"
X
Xvoid Util::crash_and_burn(char *module, char *func, char *mess) 
X{
X	cerr << module << "(" << func << ") : " << mess << endl;
X	exit(1);
X}
X
Xstatic void sig_child(int sig)
X{
Xint pid;
Xunion wait stat;
X
Xwhile ((pid = wait3(&stat, WNOHANG, (struct rusage *) 0)) >0);
X
X}
X
Xvoid Util::daemon_start(int ignore_sigcld)
X{
Xint childpid,fd;
X
X#ifdef SIGTTOU
X	signal(SIGTTOU,SIG_IGN);
X#endif
X#ifdef SIGTTIN
X	signal(SIGTTIN,SIG_IGN);
X#endif
X#ifdef SIGTSTP
X	signal(SIGTSTP,SIG_IGN);
X#endif
X
X	/*
X	 * If we were not started in the background, fork and let the 
X	 * parent exit. This also guarantees the first child is not a
X	 * process group leader.
X	 */
X
X	if ( (childpid=fork()) <0) {
X		perror("Can't fork first child");
X		exit(1);
X	} else if (childpid>0) exit(0); // parent
X
X	/*
X	 * First child process
X	 *
X	 * Disassociate from controlling terminal and process group.
X	 * Ensure the process can't reacquire a controlling terminal
X	 */
X
X	if (setpgrp(0, getpid()) == -1) {
X		perror("can't change process group");
X		exit(1);
X	}
X
X	if (fd=open("/dev/tty",O_RDWR) >=0 ) {
X		ioctl(fd,TIOCNOTTY, (char *) NULL);
X		close(fd);
X	}
X
X	// close any open files
X
X	for (fd=0; fd < NOFILE; fd++) close(fd);
X
X	errno=0;
X
X	chdir("/"); // be nice to mounted file systems
X
X	umask(0);
X
X	if (ignore_sigcld) signal(SIGCLD,sig_child);
X 
X}
END_OF_FILE
if test 1507 -ne `wc -c <'Transport/src/Util.C'`; then
    echo shar: \"'Transport/src/Util.C'\" unpacked with wrong size!
fi
# end of 'Transport/src/Util.C'
fi
if test -f 'Transport/tests/makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Transport/tests/makefile'\"
else
echo shar: Extracting \"'Transport/tests/makefile'\" \(1445 characters\)
sed "s/^X//" >'Transport/tests/makefile' <<'END_OF_FILE'
X#
X#
X# Makefile 
X#
X
XCC=CC
XYFLAGS = -d
XCFLAGS = -I../../lib
X
X.SUFFIXES: .o .c .y .l .s .C
X#
XPROG=qtest
X#
X# C++ rules
X#
X.C.o:
X	$(CC) $(CFLAGS) -c $*.C
X
X.C.a:
X	$(CC) -c $(CFLAGS) $<
X	ar rv $@ $*.o
X	rm -f $*.o
X
X
XTLIB  = ../../lib/$(MACHINE)/libTransport.a
X
Xitest: $(MACHINE)/iserver $(MACHINE)/iclient
X
X$(MACHINE)/iserver : iserver.o $(TLIB)
X	CC -o $(MACHINE)/iserver iserver.o $(TLIB) -ldnet
X
X$(MACHINE)/iclient : iclient.o $(TLIB)
X	CC -o $(MACHINE)/iclient iclient.o $(TLIB) -ldnet
X
Xdtest: $(MACHINE)/dserver $(MACHINE)/dclient
X
X$(MACHINE)/dserver : dserver.o $(TLIB)
X	CC -o $(MACHINE)/dserver dserver.o $(TLIB) -ldnet
X
X$(MACHINE)/dclient : dclient.o $(TLIB)
X	CC -o $(MACHINE)/dclient dclient.o $(TLIB) -ldnet
X
Xutest: $(MACHINE)/userver $(MACHINE)/uclient
X
X$(MACHINE)/userver : userver.o $(TLIB)
X	CC -o $(MACHINE)/userver userver.o $(TLIB) -ldnet
X
X$(MACHINE)/uclient : uclient.o $(TLIB)
X	CC -o $(MACHINE)/uclient uclient.o $(TLIB) -ldnet
X
Xstest:	$(MACHINE)/sserver $(MACHINE)/sclient
X
X$(MACHINE)/sserver :  sserver.o $(TLIB)
X	CC -o $(MACHINE)/sserver sserver.o $(TLIB) -ldnet
X
X$(MACHINE)/sclient :  sclient.o $(TLIB)
X	CC -o $(MACHINE)/sclient sclient.o $(TLIB) -ldnet
X
X$(MACHINE)/qtest :  qtest.o $(TLIB)
X	CC -o $(MACHINE)/qtest qtest.o $(TLIB) -ldnet
X
X$(PROG): $(MACHINE)/$(PROG)
X
X$(MACHINE)/$(PROG) :  $(PROG).o $(TLIB)
X	CC -o $(MACHINE)/$(PROG) $(PROG).o $(TLIB) -ldnet
X
Xbackup:
X	(cd ..; tar cf - src | compress > backup.tar)
Xclean:
X	rm -f *.o 
END_OF_FILE
if test 1445 -ne `wc -c <'Transport/tests/makefile'`; then
    echo shar: \"'Transport/tests/makefile'\" unpacked with wrong size!
fi
# end of 'Transport/tests/makefile'
fi
echo shar: End of archive 2 \(of 3\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Roland J. Schemers III                              Systems Programmer 
schemers@vela.acs.oakland.edu (Ultrix)              Oakland University 
schemers@argo.acs.oakland.edu (VMS)                 Rochester, MI 48309-4401
"As long as the systems are up, I get to sleep in!" (313)-370-4323