| 1 | /* sockadapt.h
|
|---|
| 2 | *
|
|---|
| 3 | * Authors: Charles Bailey [email protected]
|
|---|
| 4 | * David Denholm [email protected]
|
|---|
| 5 | * Last Revised: 4-Mar-1997
|
|---|
| 6 | *
|
|---|
| 7 | * This file should include any other header files and procide any
|
|---|
| 8 | * declarations, typedefs, and prototypes needed by perl for TCP/IP
|
|---|
| 9 | * operations.
|
|---|
| 10 | *
|
|---|
| 11 | * This version is set up for perl5 with socketshr 0.9D TCP/IP support.
|
|---|
| 12 | */
|
|---|
| 13 |
|
|---|
| 14 | #ifndef __SOCKADAPT_INCLUDED
|
|---|
| 15 | #define __SOCKADAPT_INCLUDED 1
|
|---|
| 16 |
|
|---|
| 17 | #if defined(DECCRTL_SOCKETS)
|
|---|
| 18 | /* Use builtin socket interface in DECCRTL and
|
|---|
| 19 | * UCX emulation in whatever TCP/IP stack is present.
|
|---|
| 20 | * Provide prototypes for missing routines; stubs are
|
|---|
| 21 | * in sockadapt.c.
|
|---|
| 22 | */
|
|---|
| 23 | # include <socket.h>
|
|---|
| 24 | # include <inet.h>
|
|---|
| 25 | # include <in.h>
|
|---|
| 26 | # include <netdb.h>
|
|---|
| 27 | #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
|
|---|
| 28 | #else
|
|---|
| 29 | void sethostent(int);
|
|---|
| 30 | void endhostent(void);
|
|---|
| 31 | void setnetent(int);
|
|---|
| 32 | void endnetent(void);
|
|---|
| 33 | void setprotoent(int);
|
|---|
| 34 | void endprotoent(void);
|
|---|
| 35 | void setservent(int);
|
|---|
| 36 | void endservent(void);
|
|---|
| 37 | #endif
|
|---|
| 38 | # if defined(__DECC) && defined(__DECC_VER) && (__DECC_VER >= 50200000) && !defined(Sock_size_t)
|
|---|
| 39 | # define Sock_size_t unsigned int
|
|---|
| 40 | # endif
|
|---|
| 41 |
|
|---|
| 42 | #else
|
|---|
| 43 | /* Pull in SOCKETSHR's header, and set up structures for
|
|---|
| 44 | * gcc, whose basic header file set doesn't include the
|
|---|
| 45 | * TCP/IP stuff.
|
|---|
| 46 | */
|
|---|
| 47 |
|
|---|
| 48 |
|
|---|
| 49 | #ifdef __GNU_CC__
|
|---|
| 50 |
|
|---|
| 51 | /* we may not have netdb.h etc, so lets just do this here - div */
|
|---|
| 52 | /* no harm doing this for all .c files - needed only by pp_sys.c */
|
|---|
| 53 |
|
|---|
| 54 | struct hostent {
|
|---|
| 55 | char *h_name; /* official name of host */
|
|---|
| 56 | char **h_aliases; /* alias list */
|
|---|
| 57 | int h_addrtype; /* host address type */
|
|---|
| 58 | int h_length; /* length of address */
|
|---|
| 59 | char **h_addr_list; /* address */
|
|---|
| 60 | };
|
|---|
| 61 | #ifdef h_addr
|
|---|
| 62 | # undef h_addr
|
|---|
| 63 | #endif
|
|---|
| 64 | #define h_addr h_addr_list[0]
|
|---|
| 65 |
|
|---|
| 66 | struct protoent {
|
|---|
| 67 | char *p_name; /* official protocol name */
|
|---|
| 68 | char **p_aliases; /* alias list */
|
|---|
| 69 | int p_proto; /* protocol # */
|
|---|
| 70 | };
|
|---|
| 71 |
|
|---|
| 72 | struct servent {
|
|---|
| 73 | char *s_name; /* official service name */
|
|---|
| 74 | char **s_aliases; /* alias list */
|
|---|
| 75 | int s_port; /* port # */
|
|---|
| 76 | char *s_proto; /* protocol to use */
|
|---|
| 77 | };
|
|---|
| 78 |
|
|---|
| 79 | struct in_addr {
|
|---|
| 80 | unsigned long s_addr;
|
|---|
| 81 | };
|
|---|
| 82 |
|
|---|
| 83 | struct sockaddr {
|
|---|
| 84 | unsigned short sa_family; /* address family */
|
|---|
| 85 | char sa_data[14]; /* up to 14 bytes of direct address */
|
|---|
| 86 | };
|
|---|
| 87 |
|
|---|
| 88 | /*
|
|---|
| 89 | * Socket address, internet style.
|
|---|
| 90 | */
|
|---|
| 91 | struct sockaddr_in {
|
|---|
| 92 | short sin_family;
|
|---|
| 93 | unsigned short sin_port;
|
|---|
| 94 | struct in_addr sin_addr;
|
|---|
| 95 | char sin_zero[8];
|
|---|
| 96 | };
|
|---|
| 97 |
|
|---|
| 98 | struct timeval {
|
|---|
| 99 | long tv_sec;
|
|---|
| 100 | long tv_usec;
|
|---|
| 101 | };
|
|---|
| 102 |
|
|---|
| 103 | struct netent {
|
|---|
| 104 | char *n_name;
|
|---|
| 105 | char **n_aliases;
|
|---|
| 106 | int n_addrtype;
|
|---|
| 107 | long n_net;
|
|---|
| 108 | };
|
|---|
| 109 |
|
|---|
| 110 | /* Since socketshr.h won't declare function prototypes unless it thinks
|
|---|
| 111 | * the system headers have already been included, we convince it that
|
|---|
| 112 | * this is the case.
|
|---|
| 113 | */
|
|---|
| 114 |
|
|---|
| 115 | #ifndef AF_INET
|
|---|
| 116 | # define AF_INET 2
|
|---|
| 117 | #endif
|
|---|
| 118 | #ifndef IPPROTO_TCP
|
|---|
| 119 | # define IPPROTO_TCP 6
|
|---|
| 120 | #endif
|
|---|
| 121 | #ifndef __INET_LOADED
|
|---|
| 122 | # define __INET_LOADED
|
|---|
| 123 | #endif
|
|---|
| 124 | #ifndef __NETDB_LOADED
|
|---|
| 125 | # define __NETDB_LOADED
|
|---|
| 126 | #endif
|
|---|
| 127 |
|
|---|
| 128 | /* Finally, we provide prototypes for routines not supported by SocketShr,
|
|---|
| 129 | * so that the stubs in sockadapt.c won't cause complaints about
|
|---|
| 130 | * undeclared routines.
|
|---|
| 131 | */
|
|---|
| 132 |
|
|---|
| 133 | struct netent *getnetbyaddr( long net, int type);
|
|---|
| 134 | struct netent *getnetbyname( char *name);
|
|---|
| 135 | struct netent *getnetent();
|
|---|
| 136 | void setnetent(int);
|
|---|
| 137 | void endnetent();
|
|---|
| 138 |
|
|---|
| 139 | #else /* !__GNU_CC__ */
|
|---|
| 140 |
|
|---|
| 141 | /* DECC and VAXC have socket headers in the system set; they're for UCX, but
|
|---|
| 142 | * we'll assume that the actual calling sequence is identical across the
|
|---|
| 143 | * various TCP/IP stacks; these routines are pretty standard.
|
|---|
| 144 | */
|
|---|
| 145 | #include <socket.h>
|
|---|
| 146 | #include <in.h>
|
|---|
| 147 | #include <inet.h>
|
|---|
| 148 |
|
|---|
| 149 | /* SocketShr doesn't support these routines, but the DECC RTL contains
|
|---|
| 150 | * stubs with these names, designed to be used with the UCX socket
|
|---|
| 151 | * library. We avoid linker collisions by substituting new names.
|
|---|
| 152 | */
|
|---|
| 153 | #define getnetbyaddr no_getnetbyaddr
|
|---|
| 154 | #define getnetbyname no_getnetbyname
|
|---|
| 155 | #define getnetent no_getnetent
|
|---|
| 156 | #define setnetent no_setnetent
|
|---|
| 157 | #define endnetent no_endnetent
|
|---|
| 158 |
|
|---|
| 159 | #include <netdb.h>
|
|---|
| 160 | #endif
|
|---|
| 161 |
|
|---|
| 162 | /* We don't have these two in the system headers. */
|
|---|
| 163 | void setnetent(int);
|
|---|
| 164 | void endnetent();
|
|---|
| 165 |
|
|---|
| 166 | #include <socketshr.h>
|
|---|
| 167 | /* socketshr.h from SocketShr 0.9D doesn't alias fileno; its comments say
|
|---|
| 168 | * that the CRTL version works OK. This isn't the case, at least with
|
|---|
| 169 | * VAXC, so we use the SocketShr version.
|
|---|
| 170 | * N.B. This means that sockadapt.h must be included *after* stdio.h.
|
|---|
| 171 | * This is presently the case for Perl.
|
|---|
| 172 | */
|
|---|
| 173 | #ifdef fileno
|
|---|
| 174 | # undef fileno
|
|---|
| 175 | #endif
|
|---|
| 176 | #define fileno si_fileno
|
|---|
| 177 | int si_fileno(FILE *);
|
|---|
| 178 |
|
|---|
| 179 |
|
|---|
| 180 | /* Catch erroneous results for UDP sockets -- see sockadapt.c */
|
|---|
| 181 | #ifdef getpeername
|
|---|
| 182 | # undef getpeername
|
|---|
| 183 | #endif
|
|---|
| 184 | #define getpeername my_getpeername
|
|---|
| 185 | int my_getpeername (int, struct sockaddr *, int *);
|
|---|
| 186 |
|
|---|
| 187 | #endif /* SOCKETSHR stuff */
|
|---|
| 188 | #endif /* include guard */
|
|---|