int init_client_unix(int *sock, const char *server) { struct sockaddr_un them; int s; if (strlen(server) > (UNIX_PATH_MAX + 1)) return (0); if (!ssl_sock_init()) return (0); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { perror("socket"); return (0); } memset(&them, 0, sizeof(them)); them.sun_family = AF_UNIX; strcpy(them.sun_path, server); if (connect(s, (struct sockaddr *)&them, sizeof(them)) == -1) { closesocket(s); perror("connect"); return (0); } *sock = s; return (1); }
static int init_server_long(int *sock, int port, char *ip, int type) { int ret=0; struct sockaddr_in server; int s= -1,i; if (!ssl_sock_init()) return(0); memset((char *)&server,0,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons((unsigned short)port); if (ip == NULL) server.sin_addr.s_addr=INADDR_ANY; else /* Added for T3E, address-of fails on bit field ([email protected]) */ #ifndef BIT_FIELD_LIMITS memcpy(&server.sin_addr.s_addr,ip,4); #else memcpy(&server.sin_addr,ip,4); #endif if (type == SOCK_STREAM) s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); else /* type == SOCK_DGRAM */ s=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); if (s == INVALID_SOCKET) goto err; #if defined SOL_SOCKET && defined SO_REUSEADDR { int j = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &j, sizeof j); } #endif if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) { #ifndef OPENSSL_SYS_WINDOWS perror("bind"); #endif goto err; } /* Make it 128 for linux */ if (type==SOCK_STREAM && listen(s,128) == -1) goto err; i=0; *sock=s; ret=1; err: if ((ret == 0) && (s != -1)) { SHUTDOWN(s); } return(ret); }
int init_client(int *sock, char *host, char *port, int type, int af) { struct addrinfo hints, *ai_top, *ai; int i, s = 0; if (!ssl_sock_init()) return 0; memset(&hints, '\0', sizeof(hints)); hints.ai_family = af; hints.ai_socktype = type; if ((i = getaddrinfo(host, port, &hints, &ai_top)) != 0) { BIO_printf(bio_err, "getaddrinfo: %s\n", gai_strerror(i)); return 0; } if (ai_top == NULL || ai_top->ai_addr == NULL) { BIO_printf(bio_err, "getaddrinfo returned no addresses\n"); if (ai_top != NULL) { freeaddrinfo(ai_top); } return 0; } for (ai = ai_top; ai != NULL; ai = ai->ai_next) { s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s == -1) { continue; } if (type == SOCK_STREAM) { i = 0; i = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&i, sizeof(i)); if (i < 0) { perror("keepalive"); goto out; } } if ((i = connect(s, ai->ai_addr, ai->ai_addrlen)) == 0) { *sock = s; freeaddrinfo(ai_top); return 1; } close(s); s = -1; } perror("connect"); out: if (s != -1) close(s); freeaddrinfo(ai_top); return 0; }
static int init_server_long(int *sock, int port, char *ip, int type) { int ret = 0; struct sockaddr_in server; int s = -1; if (!ssl_sock_init()) return (0); memset((char *) &server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons((unsigned short) port); if (ip == NULL) server.sin_addr.s_addr = INADDR_ANY; else memcpy(&server.sin_addr.s_addr, ip, 4); if (type == SOCK_STREAM) s = socket(AF_INET, SOCK_STREAM, SOCKET_PROTOCOL); else /* type == SOCK_DGRAM */ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) goto err; #if defined SOL_SOCKET && defined SO_REUSEADDR { int j = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &j, sizeof j); } #endif if (bind(s, (struct sockaddr *) & server, sizeof(server)) == -1) { perror("bind"); goto err; } /* Make it 128 for linux */ if (type == SOCK_STREAM && listen(s, 128) == -1) goto err; *sock = s; ret = 1; err: if ((ret == 0) && (s != -1)) { shutdown(s, SHUT_RD); close(s); } return (ret); }
static int init_client_ip(int *sock, const unsigned char ip[4], int port, int type) { unsigned long addr; struct sockaddr_in them; int s, i; if (!ssl_sock_init()) return (0); memset(&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 (type == SOCK_STREAM) s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); else /* ( type == SOCK_DGRAM) */ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == INVALID_SOCKET) { perror("socket"); return (0); } # if defined(SO_KEEPALIVE) if (type == SOCK_STREAM) { i = 0; i = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&i, sizeof(i)); if (i < 0) { closesocket(s); perror("keepalive"); return (0); } } # endif if (connect(s, (struct sockaddr *)&them, sizeof(them)) == -1) { closesocket(s); perror("connect"); return (0); } *sock = s; return (1); }
static int host_ip(char *str, unsigned char ip[4]) { unsigned int in[4]; int i; 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) { BIO_printf(bio_err,"invalid IP address\n"); goto err; } ip[0]=in[0]; ip[1]=in[1]; ip[2]=in[2]; ip[3]=in[3]; } else { /* do a gethostbyname */ struct hostent *he; if (!ssl_sock_init()) return(0); he=GetHostByName(str); if (he == NULL) { BIO_printf(bio_err,"gethostbyname failure\n"); goto err; } /* cast to short because of win16 winsock definition */ if ((short)he->h_addrtype != AF_INET) { BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); return(0); } ip[0]=he->h_addr_list[0][0]; ip[1]=he->h_addr_list[0][1]; ip[2]=he->h_addr_list[0][2]; ip[3]=he->h_addr_list[0][3]; } return(1); err: return(0); }
static int init_client_ip(int *sock, unsigned char ip[4], int port) { unsigned long addr; struct sockaddr_in them; int s,i; if (!ssl_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); 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); } *sock=s; return(1); }
static int init_server_unix(int *sock, const char *path) { int ret = 0; struct sockaddr_un server; int s = -1; if (strlen(path) > (UNIX_PATH_MAX + 1)) return (0); if (!ssl_sock_init()) return (0); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s == INVALID_SOCKET) goto err; memset(&server, 0, sizeof(server)); server.sun_family = AF_UNIX; strcpy(server.sun_path, path); if (bind(s, (struct sockaddr *)&server, sizeof(server)) == -1) { # ifndef OPENSSL_SYS_WINDOWS perror("bind"); # endif goto err; } /* Make it 128 for linux */ if (listen(s, 128) == -1) { # ifndef OPENSSL_SYS_WINDOWS perror("listen"); # endif unlink(path); goto err; } *sock = s; ret = 1; err: if ((ret == 0) && (s != -1)) { SHUTDOWN(s); } return (ret); }
static int do_accept_unix(int acc_sock, int *sock) { int ret; if (!ssl_sock_init()) return (0); redoit: ret = accept(acc_sock, NULL, NULL); if (ret == INVALID_SOCKET) { if (errno == EINTR) { /* * check_timeout(); */ goto redoit; } BIO_printf(bio_err, "accept errno=%d, %s\n", errno, strerror(errno)); return (0); } *sock = ret; return (1); }
static int do_accept(int acc_sock, int *sock, char **host) { int ret; struct hostent *h1,*h2; static struct sockaddr_in from; int len; /* struct linger ling; */ if (!ssl_sock_init()) return(0); #ifndef OPENSSL_SYS_WINDOWS redoit: #endif memset((char *)&from,0,sizeof(from)); len=sizeof(from); /* 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) { #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) int i; i=WSAGetLastError(); BIO_printf(bio_err,"accept error %d\n",i); #else if (errno == EINTR) { /*check_timeout(); */ goto redoit; } fprintf(stderr,"errno=%d ",errno); perror("accept"); #endif return(0); } /* ling.l_onoff=1; ling.l_linger=0; i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling)); if (i < 0) { perror("linger"); return(0); } i=0; i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); if (i < 0) { perror("keepalive"); return(0); } */ if (host == NULL) goto end; #ifndef BIT_FIELD_LIMITS /* I should use WSAAsyncGetHostByName() under windows */ h1=gethostbyaddr((char *)&from.sin_addr.s_addr, sizeof(from.sin_addr.s_addr),AF_INET); #else h1=gethostbyaddr((char *)&from.sin_addr, sizeof(struct in_addr),AF_INET); #endif if (h1 == NULL) { BIO_printf(bio_err,"bad gethostbyaddr\n"); *host=NULL; /* return(0); */ } else { if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL) { perror("OPENSSL_malloc"); closesocket(ret); return(0); } BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1); h2=GetHostByName(*host); if (h2 == NULL) { BIO_printf(bio_err,"gethostbyname failure\n"); closesocket(ret); return(0); } if (h2->h_addrtype != AF_INET) { BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); closesocket(ret); return(0); } } end: *sock=ret; return(1); }
static int do_accept(int acc_sock, int *sock, char **host) { int ret; struct hostent *h1, *h2; static struct sockaddr_in from; socklen_t len; /* struct linger ling; */ if (!ssl_sock_init()) return (0); redoit: memset((char *) &from, 0, sizeof(from)); len = sizeof(from); ret = accept(acc_sock, (struct sockaddr *) & from, &len); if (ret == -1) { if (errno == EINTR) { /* check_timeout(); */ goto redoit; } fprintf(stderr, "errno=%d ", errno); perror("accept"); return (0); } /* ling.l_onoff=1; ling.l_linger=0; i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling)); if (i < 0) { perror("linger"); return(0); } i=0; i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); if (i < 0) { perror("keepalive"); return(0); } */ if (host == NULL) goto end; h1 = gethostbyaddr((char *) &from.sin_addr.s_addr, sizeof(from.sin_addr.s_addr), AF_INET); if (h1 == NULL) { BIO_printf(bio_err, "bad gethostbyaddr\n"); *host = NULL; /* return(0); */ } else { if ((*host = strdup(h1->h_name)) == NULL) { perror("strdup"); close(ret); return (0); } h2 = gethostbyname(*host); if (h2 == NULL) { BIO_printf(bio_err, "gethostbyname failure\n"); close(ret); return (0); } if (h2->h_addrtype != AF_INET) { BIO_printf(bio_err, "gethostbyname addr is not AF_INET\n"); close(ret); return (0); } } end: *sock = ret; return (1); }