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 3 (of 3)." # Contents: Transport/src/Socket.C Transport/src/Transport.h # Wrapped by schemers@vela.acs.oakland.edu on Thu Oct 25 15:44:48 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Transport/src/Socket.C' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Transport/src/Socket.C'\" else echo shar: Extracting \"'Transport/src/Socket.C'\" \(3702 characters\) sed "s/^X//" >'Transport/src/Socket.C' <<'END_OF_FILE' X#include <libc.h> X#include <osfcn.h> X#include <iostream.h> X#include <errno.h> X X#include "Transport.h" X#include "Util.h" X Xint Socket::check_syscall(int stat, char *mess) X{ X if (stat==-1) { X status=errno; X if (return_on_error) return 0; X Util::crash_and_burn("Socket",mess,sys_errlist[status]); X } else status=0; X return 1; X} X Xint Socket::syscall(int stat, char *mess) X{ X if (stat==-1) { X status=errno; X if (return_on_error) return stat; X Util::crash_and_burn("Socket",mess,sys_errlist[status]); X } else status=0; X return stat; X} X XSocket::Socket(AddressFamily af, SocketType st) X{ X type = st; // socket type X family = af; // address family X protocol = 0; // protocol X sex = Unknown; X} X X XSocket::Socket(AddressFamily af) // protected, only used from derived X{ // class constructor X family = af; // address family X protocol = 0; // protocol X sex = Unknown; X} X XSocket::Socket(SocketType st) // protected, only used from derived X{ // class constructor X type = st; // socket type X protocol = 0; // protocol X sex = Unknown; X} X Xint Socket::socket() X{ X td = ::socket(address_family(),socket_type(),0); X return check_syscall(td,"socket"); X} X Xint Socket::accept(struct sockaddr *sa,int &len) X{ X return syscall(::accept(td,sa, &len),"accept"); X} X Xint Socket::bind(const struct sockaddr *sa, int sa_len) X{ X return check_syscall(::bind(td,sa,sa_len),"bind"); X} X Xint Socket::connect(const struct sockaddr *sa, int sa_len) X{ X return check_syscall(::connect(td,sa,sa_len),"connect"); X} X Xint Socket::getpeername(struct sockaddr *sa, int &sa_len) X{ X return check_syscall(::getpeername(td,sa,&sa_len),"getpeername"); X} X Xint Socket::getsockname(struct sockaddr *sa, int &sa_len) X{ X return check_syscall(::getsockname(td,sa,&sa_len),"getsockname"); X} X Xint Socket::recv(char *buffer,int maxbuf,MsgReceiveFlags mrf) X{ X return syscall(::recv(td,buffer,maxbuf,int(mrf)),"recv"); X} X Xint Socket::recvfrom(char *buffer,int maxbuf,struct sockaddr *sa, X int &len,MsgReceiveFlags mrf) X{ X return syscall(::recvfrom(td,buffer,maxbuf,int(mrf),sa,&len),"recvfrom"); X} X Xint Socket::recvmsg(struct msghdr *mh,MsgReceiveFlags mrf) X{ X return syscall(::recvmsg(td,mh,int(mrf)),"recvmsg"); X} X Xint Socket::send(const char *buffer,int num,MsgSendFlags msf) X{ X return syscall(::send(td,buffer,num,int(msf)),"send"); X} X X Xint Socket::sendto(const char *buffer,int num, X const struct sockaddr *sa, int len,MsgSendFlags msf) X{ X return syscall(::sendto(td,buffer,num,int(msf),sa,len),"sendto"); X} X Xint Socket::sendmsg(struct msghdr *mh,MsgSendFlags msf) X{ X return syscall(::sendmsg(td,mh,int(msf)),"sendmsg"); X} X Xint Socket::listen(int max_conn) X{ X return check_syscall(::listen(td,max_conn),"listen"); X} X X XSocket::~Socket() X{ X if (inuse()) close(); X} X Xvoid Socket::linger() X{ X if (!inuse()) return; X static struct linger ling = {1,10}; X int stat=::setsockopt(td,SOL_SOCKET,SO_LINGER,(const char *)&ling,sizeof(ling)); X if (stat==-1) { X status=errno; X if (return_on_error) return; X Util::crash_and_burn("Socket","linger",sys_errlist[status]); X } X status=0; X X} X Xint Socket::setsockopt(SocketLevelOption slo, FlagOption fo) X{ X if (!inuse()) return 0; X int flag=fo; X return check_syscall(::setsockopt(td,SOL_SOCKET,int(slo), X (const char *) &flag,sizeof(flag)),"setsockopt"); X} X Xint Socket::getsockopt(SocketLevelOption slo,FlagOption &fo) X{ X if (!inuse()) return 0; X int flag; int flagsize=sizeof(flag); X int stat=check_syscall(::getsockopt(td,SOL_SOCKET,int(slo), X (char *) &flag,&flagsize),"getsockopt"); X if (flag) fo=On; else fo=Off; X return stat; X X} X Xvoid Socket::shutdown(ShutDownType sdt) X{ X if (!inuse()) return; X check_syscall(::shutdown(td,sdt),"shutdown"); X} END_OF_FILE if test 3702 -ne `wc -c <'Transport/src/Socket.C'`; then echo shar: \"'Transport/src/Socket.C'\" unpacked with wrong size! fi # end of 'Transport/src/Socket.C' fi if test -f 'Transport/src/Transport.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Transport/src/Transport.h'\" else echo shar: Extracting \"'Transport/src/Transport.h'\" \(8742 characters\) sed "s/^X//" >'Transport/src/Transport.h' <<'END_OF_FILE' X#ifndef TRANSPORT_CLASS_H X#define TRANSPORT_CLASS_H X X#include <sys/socket.h> X#include <sys/types.h> X#include <sys/un.h> X#include <netinet/in.h> X#include <arpa/inet.h> X X#ifdef USE_DECNET X#include <netdnet/dn.h> X#include <netdnet/dnetdb.h> X#endif X X#include <iostream.h> X Xtypedef struct sockaddr *SOCKADDR_PTR; Xtypedef const struct sockaddr *CONST_SOCKADDR_PTR; 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 isany() const { return any_flag; } X int isbroadcast() const { return broadcast_flag; } 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 int broadcast_flag; X}; X Xclass UnixAddress { X friend ostream &operator<<(ostream &os, const UnixAddress &ia); Xpublic: X static char *Temp; // any address X UnixAddress(); X UnixAddress(const char *pathname); X void set(const char *pathname); X const char *pathname() const; X int size() const { return sizeof(address); } X operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; } X operator CONST_SOCKADDR_PTR() const { return (SOCKADDR_PTR) &address; } X X struct sockaddr_un address; X int addrlen; X}; X Xclass Transport { X public: X Transport(); X virtual void abstract_class()=0; X virtual int close(); X virtual int read(char *buffer, int len); X virtual int write(const char *buffer,int len); X virtual int readv(const struct iovec *, int); X virtual int writev(const struct iovec *, int); X virtual int ok(); X virtual int inuse(); X virtual ~Transport() {}; X int return_on_error; Xprotected: X int status; // connection status X int td; // the transport file descriptor X}; X X Xclass Socket : public virtual Transport { X void abstract_class() {} Xpublic: X enum SocketSex { Unknown,Client, Server}; X enum AddressFamily { // just work with these three for now X AfUnix = AF_UNIX, X AfInet = AF_INET, X AfDECnet = AF_DECnet X }; X enum SocketType { X Stream = SOCK_STREAM, X Datagram = SOCK_DGRAM, X Raw = SOCK_RAW, X RDM = SOCK_RDM, X SeqPacket = SOCK_SEQPACKET X }; X enum MsgSendFlags { X MsgSendNoFlags = 0, X MsgSendDontRoute = MSG_DONTROUTE, X MsgSendOob = MSG_OOB, X MsgSendDontRouteOob = MSG_OOB|MSG_DONTROUTE X }; X enum MsgReceiveFlags { X MsgReceiveNoFlags = 0, X MsgReceivePeek = MSG_PEEK, X MsgReceiveOob = MSG_OOB, X MsgReceivePeekOob = MSG_OOB|MSG_PEEK X }; X enum ShutDownType { X ShutDownReceive=0, X ShutDownSend=1, X ShutDownBoth=2 X }; X enum FlagOption { Off = 0, On = 1 }; X enum SocketLevelOption { X Broadcast = SO_BROADCAST, X Debug = SO_DEBUG, X DontRoute = SO_DONTROUTE, X KeepAlive = SO_KEEPALIVE, X OOBInline = SO_OOBINLINE, X ReuseAddr = SO_REUSEADDR, X UseLoopBack = SO_USELOOPBACK X }; X Socket( AddressFamily af,SocketType st); X ~Socket(); X virtual int socket(); X int accept(struct sockaddr *sa, int &len); X int bind(const struct sockaddr *,int); X int connect(const struct sockaddr *,int); X int getpeername(struct sockaddr *, int &len); X int getsockname(struct sockaddr *, int &len); X int getsockopt(int, int, char *, int *); // X int listen(int); X int recv(char *, int, MsgReceiveFlags=MsgReceiveNoFlags); X int recvfrom(char *, int, struct sockaddr *, X int &,MsgReceiveFlags=MsgReceiveNoFlags); X int send(const char *, int,MsgSendFlags=MsgSendNoFlags); X int sendto(const char *, int, const struct sockaddr *, X int,MsgSendFlags=MsgSendNoFlags); X int setsockopt(int, int, const char *, int); // X int recvmsg(struct msghdr *, MsgReceiveFlags=MsgReceiveNoFlags); X int sendmsg(struct msghdr *, MsgSendFlags=MsgSendNoFlags); X virtual void shutdown(ShutDownType); X void linger(); X int setsockopt(SocketLevelOption slo, FlagOption fo); X int getsockopt(SocketLevelOption slo, FlagOption &fo); X AddressFamily address_family() { return family; } X SocketType socket_type() { return type; } X SocketSex socket_sex() { return sex; } X int socket_protocol() { return protocol; } X int isclient() { return sex==Client; } X int isserver() { return sex==Server; } Xprotected: X Socket(AddressFamily af); X Socket(SocketType st); X int check_syscall(int stat,char *mess); X int syscall(int stat,char *mess); X SocketType type; // Socket Type X AddressFamily family; // Address Family X int protocol; // Protocol (currently 0) X SocketSex sex; // Client or Server? X}; X Xclass UnixSocket : public virtual Socket { Xpublic: X UnixSocket(SocketType st) : Socket(Socket::AfUnix,st) {} X int open(const UnixAddress &ua, SocketSex sex); X ~UnixSocket(); X int accept(UnixSocket &newsocket); X int close(); X const UnixAddress &local_address() { return local; } X const UnixAddress &remote_address() { return remote; } Xprivate: X UnixAddress local,remote; X int unlink_socket; X}; X Xclass InetSocket : public virtual Socket { Xpublic: X InetSocket(SocketType st) : Socket(Socket::AfInet,st) {} X int accept(InetSocket &newsocket); X int bind(const InetAddress &ia); X int connect(const InetAddress &ia); X int getpeername(InetAddress &ia); X int getsockname(InetAddress &ia); X int recvfrom(char *buffer,int maxbuf,InetAddress &is); X int sendto(char *buffer,int len,const InetAddress &is); X}; X X#ifdef USE_DECNET Xclass DECnetSocket : public virtual Socket { Xpublic: X DECnetSocket(SocketType st) : Socket(AfDECnet,st) {}; X int accept(DECnetSocket &newsocket); X int open(const char *node, int obj); X int open(const char *node, const char *obj); X int open(int obj); // server Xprivate: X struct sockaddr_dn client_addr, server_addr; X int clen,slen; X int object; X struct dn_naddr *node_addr; X struct nodeent *nodep; X X}; X#endif X Xclass TransportStream : public virtual Transport { X public: X TransportStream() {} X virtual ~TransportStream() {}; X}; X Xclass SocketStream : public virtual Socket,public virtual TransportStream { Xpublic: X SocketStream(AddressFamily af) : Socket(af, Stream) {} X ~SocketStream() {} X}; X Xclass UnixStream : public virtual UnixSocket, public virtual SocketStream { Xpublic: X UnixStream() : Socket(AfUnix,Stream), SocketStream(AfUnix),UnixSocket(Stream) {} X int open(const char *path, SocketSex sex) { X return UnixSocket::open(path,sex); X } X int accept(UnixStream &newstream) { X return UnixSocket::accept(newstream); X } X int close() { X return UnixSocket::close(); X } X}; X Xclass InetStream :public virtual InetSocket, public virtual SocketStream { Xpublic: X InetStream() : Socket(AfInet,Stream), SocketStream(AfInet),InetSocket(Stream) { } X int accept(InetStream &newstream) { X return InetSocket::accept(newstream); X } X int socket_server(const InetAddress &ia); X int socket_client(const InetAddress &ia); X}; X X#ifdef USE_DECNET Xclass DECnetStream : public virtual DECnetSocket, public virtual SocketStream { Xpublic: X DECnetStream() : Socket(AfDECnet,Stream), SocketStream(AfDECnet),DECnetSocket(Stream) {}; X int accept(DECnetStream &newstream) { X return DECnetSocket::accept(newstream); X } X int open(const char *node, int obj) { X return DECnetSocket::open(node,obj); X } X int open(const char *node, const char *obj) { X return DECnetSocket::open(node,obj); X } X int open(int obj) { X return DECnetSocket::open(obj); X } X}; X X#endif X Xclass TransportDatagram : public virtual Transport { X public: X TransportDatagram() {} X virtual ~TransportDatagram() {}; X}; X Xclass SocketDatagram : public virtual Socket,public virtual TransportDatagram { Xpublic: X SocketDatagram(AddressFamily af) : Socket(af, Datagram) {} X ~SocketDatagram() {} X}; X Xclass InetDatagram :public virtual InetSocket, public virtual SocketDatagram { Xpublic: X InetDatagram() : Socket(AfInet,Datagram), X SocketDatagram(AfInet),InetSocket(Datagram) { } X int accept(InetDatagram &newsock) { X return InetSocket::accept(newsock); X } X int socket(); X int socket_client(); X int socket_server(const InetAddress &ia); X}; X X// endif TRANSPORT_CLASS_H X#endif END_OF_FILE if test 8742 -ne `wc -c <'Transport/src/Transport.h'`; then echo shar: \"'Transport/src/Transport.h'\" unpacked with wrong size! fi # end of 'Transport/src/Transport.h' fi echo shar: End of archive 3 \(of 3\). cp /dev/null ark3isdone 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