X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=apps%2Fs_socket.c;h=adaeef646a9e0663d4ac594c57287d75dbdb3e57;hb=be1bd9239ff7874ec8f60c6217898654d016674a;hp=6302f9f934ce043317de43845d2357a0be3de497;hpb=1e44804e3308e9a40b882e09e87d0f241b7d55ca;p=oweals%2Fopenssl.git diff --git a/apps/s_socket.c b/apps/s_socket.c index 6302f9f934..adaeef646a 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -1,4 +1,4 @@ -/* apps/s_socket.c */ +/* apps/s_socket.c - socket-related functions used by s_client and s_server */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -56,20 +56,12 @@ * [including the GNU Public Licence.] */ -/* 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 - #include #include #include #include #include + #define USE_SOCKETS #define NON_MAIN #include "apps.h" @@ -77,28 +69,39 @@ typedef unsigned int u_int; #undef NON_MAIN #include "s_apps.h" #include +#include -#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() */ +/* 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(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) +#define __U_INT +typedef unsigned int u_int; #endif static struct hostent *GetHostByName(char *name); -int sock_init(void ); -#ifdef WIN16 +#ifdef OPENSSL_SYS_WINDOWS +static void sock_cleanup(void); +#endif +static int sock_init(void); +static int init_client_ip(int *sock,unsigned char ip[4], int port); +static int init_server(int *sock, int port); +static int init_server_long(int *sock, int port,char *ip); +static int do_accept(int acc_sock, int *sock, char **host); +static int host_ip(char *str, unsigned char ip[4]); + +#ifdef OPENSSL_SYS_WIN16 #define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ #else #define SOCKET_PROTOCOL IPPROTO_TCP #endif -#ifdef WINDOWS +#ifdef OPENSSL_SYS_WINDOWS static struct WSAData wsa_state; static int wsa_init_done=0; -#ifdef WIN16 +#ifdef OPENSSL_SYS_WIN16 static HWND topWnd=0; static FARPROC lpTopWndProc=NULL; static FARPROC lpTopHookProc=NULL; @@ -127,24 +130,24 @@ static BOOL CALLBACK enumproc(HWND hwnd,LPARAM lParam) return(FALSE); } -#endif /* WIN32 */ -#endif /* WINDOWS */ +#endif /* OPENSSL_SYS_WIN32 */ +#endif /* OPENSSL_SYS_WINDOWS */ -void sock_cleanup(void) +#ifdef OPENSSL_SYS_WINDOWS +static void sock_cleanup(void) { -#ifdef WINDOWS if (wsa_init_done) { wsa_init_done=0; WSACancelBlockingCall(); WSACleanup(); } -#endif } +#endif -int sock_init(void) +static int sock_init(void) { -#ifdef WINDOWS +#ifdef OPENSSL_SYS_WINDOWS if (!wsa_init_done) { int err; @@ -161,15 +164,15 @@ int sock_init(void) return(0); } -#ifdef WIN16 +#ifdef OPENSSL_SYS_WIN16 EnumTaskWindows(GetCurrentTask(),enumproc,0L); lpTopWndProc=(FARPROC)GetWindowLong(topWnd,GWL_WNDPROC); lpTopHookProc=MakeProcInstance((FARPROC)topHookProc,_hInstance); SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopHookProc); -#endif /* WIN16 */ +#endif /* OPENSSL_SYS_WIN16 */ } -#endif /* WINDOWS */ +#endif /* OPENSSL_SYS_WINDOWS */ return(1); } @@ -186,7 +189,7 @@ int init_client(int *sock, char *host, int port) return(init_client_ip(sock,ip,port)); } -int init_client_ip(int *sock, unsigned char ip[4], int port) +static int init_client_ip(int *sock, unsigned char ip[4], int port) { unsigned long addr; struct sockaddr_in them; @@ -207,9 +210,11 @@ int init_client_ip(int *sock, unsigned char ip[4], int port) s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); if (s == INVALID_SOCKET) { perror("socket"); return(0); } +#ifndef OPENSSL_SYS_MPE i=0; i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); if (i < 0) { perror("keepalive"); return(0); } +#endif if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1) { close(s); perror("connect"); return(0); } @@ -217,75 +222,6 @@ int init_client_ip(int *sock, unsigned char ip[4], int port) return(1); } -int nbio_sock_error(int sock) - { - int j,i; - int size; - - size=sizeof(int); - /* 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 - return(j); - } - -int nbio_init_client_ip(int *sock, unsigned char ip[4], int port) - { - unsigned long addr; - struct sockaddr_in them; - int s,i; - - if (!sock_init()) return(0); - - memset((char *)&them,0,sizeof(them)); - them.sin_family=AF_INET; - them.sin_port=htons((unsigned short)port); - addr= (unsigned long) - ((unsigned long)ip[0]<<24L)| - ((unsigned long)ip[1]<<16L)| - ((unsigned long)ip[2]<< 8L)| - ((unsigned long)ip[3]); - them.sin_addr.s_addr=htonl(addr); - - 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); } - - i=0; - i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); - if (i < 0) { perror("keepalive"); return(0); } - *sock=s; - -#ifdef FIONBIO - BIO_socket_ioctl(s,FIONBIO,&l); -#endif - } - else - s= *sock; - - i=connect(s,(struct sockaddr *)&them,sizeof(them)); - if (i == INVALID_SOCKET) - { - if (BIO_sock_should_retry(i)) - return(-1); - else - return(0); - } - else - return(1); - } - int do_server(int port, int *ret, int (*cb)(), char *context) { int sock; @@ -308,7 +244,7 @@ int do_server(int port, int *ret, int (*cb)(), char *context) return(0); } i=(*cb)(name,sock, context); - if (name != NULL) Free(name); + if (name != NULL) OPENSSL_free(name); SHUTDOWN2(sock); if (i < 0) { @@ -318,7 +254,7 @@ int do_server(int port, int *ret, int (*cb)(), char *context) } } -int init_server_long(int *sock, int port, char *ip) +static int init_server_long(int *sock, int port, char *ip) { int ret=0; struct sockaddr_in server; @@ -350,7 +286,7 @@ int init_server_long(int *sock, int port, char *ip) #endif if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) { -#ifndef WINDOWS +#ifndef OPENSSL_SYS_WINDOWS perror("bind"); #endif goto err; @@ -368,12 +304,12 @@ err: return(ret); } -int init_server(int *sock, int port) +static int init_server(int *sock, int port) { return(init_server_long(sock, port, NULL)); } -int do_accept(int acc_sock, int *sock, char **host) +static int do_accept(int acc_sock, int *sock, char **host) { int ret,i; struct hostent *h1,*h2; @@ -383,7 +319,7 @@ int do_accept(int acc_sock, int *sock, char **host) if (!sock_init()) return(0); -#ifndef WINDOWS +#ifndef OPENSSL_SYS_WINDOWS redoit: #endif @@ -397,7 +333,7 @@ redoit: ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len); if (ret == INVALID_SOCKET) { -#ifdef WINDOWS +#ifdef OPENSSL_SYS_WINDOWS i=WSAGetLastError(); BIO_printf(bio_err,"accept error %d\n",i); #else @@ -439,9 +375,9 @@ redoit: } else { - if ((*host=(char *)Malloc(strlen(h1->h_name)+1)) == NULL) + if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL) { - perror("Malloc"); + perror("OPENSSL_malloc"); return(0); } strcpy(*host,h1->h_name); @@ -489,12 +425,12 @@ err: return(0); } -int host_ip(char *str, unsigned char ip[4]) +static 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) @@ -605,69 +541,3 @@ static struct hostent *GetHostByName(char *name) return(ret); } } - -#ifndef MSDOS -int spawn(int argc, char **argv, int *in, int *out) - { - int pid; -#define CHILD_READ p1[0] -#define CHILD_WRITE p2[1] -#define PARENT_READ p2[0] -#define PARENT_WRITE p1[1] - int p1[2],p2[2]; - - 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"); - if (dup2(CHILD_WRITE,fileno(stderr)) < 0) - perror("dup2"); - if (dup2(CHILD_READ,fileno(stdin)) < 0) - perror("dup2"); - close(CHILD_READ); - close(CHILD_WRITE); - - close(PARENT_READ); - close(PARENT_WRITE); - execvp(argv[0],argv); - perror("child"); - exit(1); - } - - /* parent */ - *in= PARENT_READ; - *out=PARENT_WRITE; - close(CHILD_READ); - close(CHILD_WRITE); - return(pid); - } -#endif /* MSDOS */ - - -#ifdef undef - /* Turn on synchronous sockets so that we can do a WaitForMultipleObjects - * on sockets */ - { - SOCKET s; - int optionValue = SO_SYNCHRONOUS_NONALERT; - int err; - - err = setsockopt( - INVALID_SOCKET, - SOL_SOCKET, - SO_OPENTYPE, - (char *)&optionValue, - sizeof(optionValue)); - if (err != NO_ERROR) { - /* failed for some reason... */ - BIO_printf(bio_err, "failed to setsockopt(SO_OPENTYPE, SO_SYNCHRONOUS_ALERT) - %d\n", - WSAGetLastError()); - } - } -#endif