Fix shadow.
[openssl.git] / apps / s_socket.c
index 724d48a07169ca522e2dbc77207fb3e705696f54..888b66df18ea1d9e8a7ed05fb11f94abe6a67877 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <signal.h>
+
+/* 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"
 #include "s_apps.h"
 #include <openssl/ssl.h>
 
+#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 <processes.h> /* for vfork() */
+#endif
+
 static struct hostent *GetHostByName(char *name);
 int sock_init(void );
 #ifdef WIN16
@@ -206,7 +224,12 @@ int nbio_sock_error(int sock)
        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
@@ -233,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); }
@@ -321,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)
@@ -365,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
@@ -465,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)
@@ -589,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");