Fixes windows warning about casting on x64

This commit is contained in:
Frank Morgner
2015-09-18 08:22:40 +02:00
parent 386a97b239
commit 16ee860a66
2 changed files with 47 additions and 33 deletions

View File

@@ -43,6 +43,7 @@ typedef WORD uint16_t;
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#define INVALID_SOCKET -1
#endif #endif
#include <errno.h> #include <errno.h>
@@ -54,40 +55,47 @@ typedef WORD uint16_t;
static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t size, const unsigned char *buffer); static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t size, const unsigned char *buffer);
static ssize_t recvFromVICC(struct vicc_ctx *ctx, unsigned char **buffer); static ssize_t recvFromVICC(struct vicc_ctx *ctx, unsigned char **buffer);
static ssize_t sendall(int sock, const void *buffer, size_t size); static ssize_t sendall(SOCKET sock, const void *buffer, size_t size);
static ssize_t recvall(int sock, void *buffer, size_t size); static ssize_t recvall(SOCKET sock, void *buffer, size_t size);
static int opensock(unsigned short port); static SOCKET opensock(unsigned short port);
static int connectsock(const char *hostname, unsigned short port); static SOCKET connectsock(const char *hostname, unsigned short port);
ssize_t sendall(int sock, const void *buffer, size_t size) ssize_t sendall(SOCKET sock, const void *buffer, size_t size)
{ {
size_t sent; size_t sent;
ssize_t r; ssize_t r;
/* FIXME we should actually check the length instead of simply casting from
* size_t to ssize_t (or int), which have both the same width! */
for (sent = 0; sent < size; sent += r) { for (sent = 0; sent < size; sent += r) {
r = send(sock, (void *) (((unsigned char *) buffer)+sent), size-sent, MSG_NOSIGNAL); r = send(sock, (void *) (((unsigned char *) buffer)+sent),
((int) size)-sent, MSG_NOSIGNAL);
if (r < 0) if (r < 0)
return r; return r;
} }
return sent; return (ssize_t) sent;
} }
ssize_t recvall(int sock, void *buffer, size_t size) { ssize_t recvall(SOCKET sock, void *buffer, size_t size) {
return recv(sock, buffer, size, MSG_WAITALL|MSG_NOSIGNAL); return recv(sock, buffer,
#ifdef _WIN32
(int)
#endif
size, MSG_WAITALL|MSG_NOSIGNAL);
} }
static int opensock(unsigned short port) static SOCKET opensock(unsigned short port)
{ {
int sock; SOCKET sock;
socklen_t yes = 1; socklen_t yes = 1;
struct sockaddr_in server_sockaddr; struct sockaddr_in server_sockaddr;
sock = socket(AF_INET, SOCK_STREAM, 0); sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) if (sock == INVALID_SOCKET)
return -1; return INVALID_SOCKET;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof yes) != 0) if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof yes) != 0)
goto err; goto err;
@@ -118,13 +126,13 @@ static int opensock(unsigned short port)
err: err:
close(sock); close(sock);
return -1; return INVALID_SOCKET;
} }
static int connectsock(const char *hostname, unsigned short port) static SOCKET connectsock(const char *hostname, unsigned short port)
{ {
struct addrinfo hints, *res = NULL, *cur; struct addrinfo hints, *res = NULL, *cur;
int sock = -1; SOCKET sock = INVALID_SOCKET;
char _port[10]; char _port[10];
if (snprintf(_port, sizeof _port, "%hu", port) < 0) if (snprintf(_port, sizeof _port, "%hu", port) < 0)
@@ -141,10 +149,14 @@ static int connectsock(const char *hostname, unsigned short port)
for (cur = res; cur; cur = cur->ai_next) { for (cur = res; cur; cur = cur->ai_next) {
sock = socket(cur->ai_family, cur->ai_socktype, cur->ai_protocol); sock = socket(cur->ai_family, cur->ai_socktype, cur->ai_protocol);
if (sock < 0) if (sock == INVALID_SOCKET)
continue; continue;
if (connect(sock, cur->ai_addr, cur->ai_addrlen) != -1) if (connect(sock, cur->ai_addr,
#ifdef _WIN32
(int)
#endif
cur->ai_addrlen) != -1)
break; break;
close(sock); close(sock);
@@ -155,7 +167,7 @@ err:
return sock; return sock;
} }
int waitforclient(int server, long secs, long usecs) SOCKET waitforclient(SOCKET server, long secs, long usecs)
{ {
fd_set rfds; fd_set rfds;
struct sockaddr_in client_sockaddr; struct sockaddr_in client_sockaddr;
@@ -166,7 +178,7 @@ int waitforclient(int server, long secs, long usecs)
#if _WIN32 #if _WIN32
/* work around clumsy define of FD_SET in winsock2.h */ /* work around clumsy define of FD_SET in winsock2.h */
#pragma warning(disable:4127) #pragma warning(disable:4127)
FD_SET((SOCKET) server, &rfds); FD_SET(server, &rfds);
#pragma warning(default:4127) #pragma warning(default:4127)
#else #else
FD_SET(server, &rfds); FD_SET(server, &rfds);
@@ -175,14 +187,14 @@ int waitforclient(int server, long secs, long usecs)
tv.tv_sec = secs; tv.tv_sec = secs;
tv.tv_usec = usecs; tv.tv_usec = usecs;
if (select(server+1, &rfds, NULL, NULL, &tv) == -1) if (select((int) server+1, &rfds, NULL, NULL, &tv) == -1)
return -1; return INVALID_SOCKET;
if (FD_ISSET(server, &rfds)) if (FD_ISSET(server, &rfds))
return accept(server, (struct sockaddr *) &client_sockaddr, return accept(server, (struct sockaddr *) &client_sockaddr,
&client_socklen); &client_socklen);
return 0; return INVALID_SOCKET;
} }
static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned char* buffer) static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned char* buffer)
@@ -244,7 +256,7 @@ int vicc_eject(struct vicc_ctx *ctx)
if (close(ctx->client_sock) < 0) { if (close(ctx->client_sock) < 0) {
r -= 1; r -= 1;
} }
ctx->client_sock = -1; ctx->client_sock = INVALID_SOCKET;
} }
return r; return r;
} }
@@ -260,8 +272,8 @@ struct vicc_ctx * vicc_init(const char *hostname, unsigned short port)
ctx->hostname = NULL; ctx->hostname = NULL;
ctx->io_lock = NULL; ctx->io_lock = NULL;
ctx->server_sock = -1; ctx->server_sock = INVALID_SOCKET;
ctx->client_sock = -1; ctx->client_sock = INVALID_SOCKET;
ctx->port = port; ctx->port = port;
#ifdef _WIN32 #ifdef _WIN32
@@ -282,7 +294,7 @@ struct vicc_ctx * vicc_init(const char *hostname, unsigned short port)
ctx->client_sock = connectsock(hostname, port); ctx->client_sock = connectsock(hostname, port);
} else { } else {
ctx->server_sock = opensock(port); ctx->server_sock = opensock(port);
if (ctx->server_sock < 0) { if (ctx->server_sock == INVALID_SOCKET) {
goto err; goto err;
} }
} }
@@ -304,7 +316,7 @@ int vicc_exit(struct vicc_ctx *ctx)
free(ctx->hostname); free(ctx->hostname);
if (ctx->server_sock > 0) { if (ctx->server_sock > 0) {
ctx->server_sock = close(ctx->server_sock); ctx->server_sock = close(ctx->server_sock);
if (ctx->server_sock < 0) { if (ctx->server_sock == INVALID_SOCKET) {
r -= 1; r -= 1;
} }
} }
@@ -347,12 +359,12 @@ int vicc_connect(struct vicc_ctx *ctx, long secs, long usecs)
if (!ctx) if (!ctx)
return 0; return 0;
if (ctx->client_sock < 0) { if (ctx->client_sock == INVALID_SOCKET) {
if (ctx->server_sock) { if (ctx->server_sock) {
/* server mode, try to accept a client */ /* server mode, try to accept a client */
ctx->client_sock = waitforclient(ctx->server_sock, secs, usecs); ctx->client_sock = waitforclient(ctx->server_sock, secs, usecs);
if (!ctx->client_sock) { if (!ctx->client_sock) {
ctx->client_sock = -1; ctx->client_sock = INVALID_SOCKET;
} }
} else { } else {
/* client mode, try to connect (again) */ /* client mode, try to connect (again) */
@@ -360,7 +372,7 @@ int vicc_connect(struct vicc_ctx *ctx, long secs, long usecs)
} }
} }
if (ctx->client_sock < 0) if (ctx->client_sock == INVALID_SOCKET)
/* not connected */ /* not connected */
return 0; return 0;
else else

View File

@@ -21,8 +21,10 @@
#ifdef _WIN32 #ifdef _WIN32
#include <stddef.h> #include <stddef.h>
#include <winsock2.h>
typedef int ssize_t; typedef int ssize_t;
#else #else
#define SOCKET int
#include <unistd.h> #include <unistd.h>
#endif #endif
@@ -34,8 +36,8 @@ typedef int ssize_t;
#define VPCD_CTRL_ATR 4 #define VPCD_CTRL_ATR 4
struct vicc_ctx { struct vicc_ctx {
int server_sock; SOCKET server_sock;
int client_sock; SOCKET client_sock;
char *hostname; char *hostname;
unsigned short port; unsigned short port;
void *io_lock; void *io_lock;