-/* crypto/bio/b_sock.c */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
-#define USE_SOCKETS
-#include "cryptlib.h"
-#include <openssl/bio.h>
-#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK)
-# include <netdb.h>
-# if defined(NETWARE_CLIB)
-# include <sys/ioctl.h>
+#include "bio_lcl.h"
+#if defined(NETWARE_CLIB)
+# include <sys/ioctl.h>
NETDB_DEFINE_CONTEXT
-# endif
#endif
#ifndef OPENSSL_NO_SOCK
# include <openssl/dso.h>
# define WSAAPI
# endif
+# if OPENSSL_API_COMPAT < 0x10100000L
static int get_ip(const char *str, unsigned char *ip);
int BIO_get_host_ip(const char *str, unsigned char *ip)
{
}
return (1);
}
+# endif
int BIO_sock_error(int sock)
{
return (j);
}
+# if OPENSSL_API_COMPAT < 0x10100000L
struct hostent *BIO_gethostbyname(const char *name)
{
/*
return gethostbyname(name);
# endif
}
+# endif
int BIO_sock_init(void)
{
}
# endif /* __VMS_VER */
+# if OPENSSL_API_COMPAT < 0x10100000L
/*
* The reason I have implemented this instead of using sscanf is because
* Visual C 1.52c gives an unresolved external when linking a DLL :-(
struct sockaddr_in6 sa_in6;
# endif
} server, client;
- int s = INVALID_SOCKET, cs, addrlen;
+ int s = (int)INVALID_SOCKET, cs, addrlen;
unsigned char ip[4];
unsigned short port;
char *str = NULL, *e;
int err_num;
if (BIO_sock_init() != 1)
- return (INVALID_SOCKET);
+ return ((int)INVALID_SOCKET);
- if ((str = BUF_strdup(host)) == NULL)
- return (INVALID_SOCKET);
+ if ((str = OPENSSL_strdup(host)) == NULL)
+ return ((int)INVALID_SOCKET);
h = p = NULL;
h = str;
if (!BIO_get_port(p, &port))
goto err;
- memset((char *)&server, 0, sizeof(server));
+ memset(&server, 0, sizeof(server));
server.sa_in.sin_family = AF_INET;
server.sa_in.sin_port = htons(port);
addrlen = sizeof(server.sa_in);
again:
s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
- if (s == INVALID_SOCKET) {
+ if (s == (int)INVALID_SOCKET) {
SYSerr(SYS_F_SOCKET, get_last_socket_error());
ERR_add_error_data(3, "port='", host, "'");
BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET);
goto err;
}
cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL);
- if (cs != INVALID_SOCKET) {
+ if (cs != (int)INVALID_SOCKET) {
int ii;
ii = connect(cs, &client.sa, addrlen);
closesocket(cs);
- if (ii == INVALID_SOCKET) {
+ if (ii == (int)INVALID_SOCKET) {
bind_mode = BIO_BIND_REUSEADDR;
closesocket(s);
goto again;
}
ret = 1;
err:
- if (str != NULL)
- OPENSSL_free(str);
- if ((ret == 0) && (s != INVALID_SOCKET)) {
+ OPENSSL_free(str);
+ if ((ret == 0) && (s != (int)INVALID_SOCKET)) {
closesocket(s);
- s = INVALID_SOCKET;
+ s = (int)INVALID_SOCKET;
}
return (s);
}
int BIO_accept(int sock, char **addr)
{
- int ret = INVALID_SOCKET;
+ int ret = (int)INVALID_SOCKET;
unsigned long l;
unsigned short port;
char *p;
sa.len.i = (int)sa.len.s;
/* use sa.len.i from this point */
}
- if (ret == INVALID_SOCKET) {
+ if (ret == (int)INVALID_SOCKET) {
if (BIO_sock_should_retry(ret))
return -2;
SYSerr(SYS_F_ACCEPT, get_last_socket_error());
end:
return (ret);
}
+# endif
int BIO_set_tcp_ndelay(int s, int on)
{
# endif
return (ret == 0);
}
+
+int BIO_sock_info(int sock,
+ enum BIO_sock_info_type type, union BIO_sock_info_u *info)
+{
+ switch (type) {
+ case BIO_SOCK_INFO_ADDRESS:
+ {
+ socklen_t addr_len;
+ int ret = 0;
+ addr_len = sizeof(*info->addr);
+ ret = getsockname(sock, BIO_ADDR_sockaddr_noconst(info->addr),
+ &addr_len);
+ if (ret == -1) {
+ SYSerr(SYS_F_GETSOCKNAME, get_last_socket_error());
+ BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_GETSOCKNAME_ERROR);
+ return 0;
+ }
+ if (addr_len > sizeof(*info->addr)) {
+ BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS);
+ return 0;
+ }
+ }
+ break;
+ default:
+ BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_UNKNOWN_INFO_TYPE);
+ return 0;
+ }
+ return 1;
+}
+
#endif