Path: utzoo!attcan!uunet!wuarchive!zaphod.mps.ohio-state.edu!samsung!umich!vela!schemers From: schemers@vela.acs.oakland.edu (Roland Schemers III) Newsgroups: comp.lang.c++ Subject: Transport Part02/03 Message-ID: <3522@vela.acs.oakland.edu> Date: 25 Oct 90 19:52:25 GMT References: <3520@vela.acs.oakland.edu> Reply-To: schemers@vela.acs.oakland.edu (Roland Schemers III) Organization: Oakland University, Rochester MI Lines: 813 #! /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 'Transport/src/DECnetSocket.C' <<'END_OF_FILE' X#ifdef USE_DECNET X X#include "Transport.h" X#include "Util.h" X X#include X#include X#include X#include 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 X#include X#include X#include X#include X#include X#include 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 X#include X#include X#include X#include 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 X#include X#include X#include X#include X#include X#include 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 X#include X#include X#include X#include 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 X#include X#include X#include X//#include 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 X#include X#include X#include X#include X#include X#include X#include X#include 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