X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fs_socket.c;h=888b66df18ea1d9e8a7ed05fb11f94abe6a67877;hp=9c08ec0985c82f9433f262b4e2a72251144a4144;hb=ef7eaa4cb0cf07c79cb0d294c7d24c2f74e1bdcf;hpb=95dc05bc6d0dfe0f3f3681f5e27afbc3f7a35eea diff --git a/apps/s_socket.c b/apps/s_socket.c index 9c08ec0985..888b66df18 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -61,22 +61,34 @@ #include #include #include + +/* With IPv6, it looks like Digital has mixed up the proper order of + recursive header file inclusion, resulting in the compiler complaining + that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which + is needed to have fileno() declared correctly... So let's define u_int */ +#if defined(VMS) && defined(__DECC) && !defined(__U_INT) +#define __U_INT +typedef unsigned int u_int; +#endif + #define USE_SOCKETS #define NON_MAIN #include "apps.h" #undef USE_SOCKETS #undef NON_MAIN #include "s_apps.h" -#include "ssl.h" +#include -#ifndef NOPROTO -static struct hostent *GetHostByName(char *name); -int sock_init(void ); -#else -static struct hostent *GetHostByName(); -int sock_init(); +#ifdef VMS +#if (__VMS_VER < 70000000) /* FIONBIO used as a switch to enable ioctl, + and that isn't in VMS < 7.0 */ +#undef FIONBIO +#endif +#include /* for vfork() */ #endif +static struct hostent *GetHostByName(char *name); +int sock_init(void ); #ifdef WIN16 #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ #else @@ -209,10 +221,15 @@ int init_client_ip(int *sock, unsigned char ip[4], int port) int nbio_sock_error(int sock) { int j,i; - unsigned int size; + int size; size=sizeof(int); - i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(char *)&j,&size); + /* Note: under VMS with SOCKETSHR the third parameter is currently + * of type (int *) whereas under other systems it is (void *) if + * you don't have a cast it will choke the compiler: if you do + * have a cast then you can either go for (int *) or (void *). + */ + i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(char *)&j,(void *)&size); if (i < 0) return(1); else @@ -239,7 +256,9 @@ int nbio_init_client_ip(int *sock, unsigned char ip[4], int port) if (*sock <= 0) { +#ifdef FIONBIO unsigned long l=1; +#endif s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); if (s == INVALID_SOCKET) { perror("socket"); return(0); } @@ -327,7 +346,7 @@ int init_server_long(int *sock, int port, char *ip) { int j = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, - (const void *) &j, sizeof j); + (void *) &j, sizeof j); } #endif if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) @@ -360,7 +379,7 @@ int do_accept(int acc_sock, int *sock, char **host) int ret,i; struct hostent *h1,*h2; static struct sockaddr_in from; - unsigned int len; + int len; /* struct linger ling; */ if (!sock_init()) return(0); @@ -371,7 +390,12 @@ redoit: memset((char *)&from,0,sizeof(from)); len=sizeof(from); - ret=accept(acc_sock,(struct sockaddr *)&from,&len); + /* Note: under VMS with SOCKETSHR the fourth parameter is currently + * of type (int *) whereas under other systems it is (void *) if + * you don't have a cast it will choke the compiler: if you do + * have a cast then you can either go for (int *) or (void *). + */ + ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len); if (ret == INVALID_SOCKET) { #ifdef WINDOWS @@ -471,7 +495,7 @@ int host_ip(char *str, unsigned char ip[4]) unsigned int in[4]; int i; - if (sscanf(str,"%d.%d.%d.%d",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4) + if (sscanf(str,"%u.%u.%u.%u",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4) { for (i=0; i<4; i++) if (in[i] > 255) @@ -595,7 +619,11 @@ int spawn(int argc, char **argv, int *in, int *out) if ((pipe(p1) < 0) || (pipe(p2) < 0)) return(-1); +#ifdef VMS + if ((pid=vfork()) == 0) +#else if ((pid=fork()) == 0) +#endif { /* child */ if (dup2(CHILD_WRITE,fileno(stdout)) < 0) perror("dup2");