125 lines
2.6 KiB
C
125 lines
2.6 KiB
C
/* Copyright (C) 2007-2010 Erik Faye-Lund and Egbert Teeselink
|
|
* For conditions of distribution and use, see copyright notice in COPYING
|
|
*/
|
|
|
|
#ifndef SYNC_BASE_H
|
|
#define SYNC_BASE_H
|
|
|
|
/* configure inline keyword */
|
|
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
|
|
#if defined(_MSC_VER) || defined(__GNUC__) || defined(__SASC)
|
|
#ifndef inline
|
|
#define inline __inline
|
|
#endif
|
|
#else
|
|
/* compiler does not support inline, make function static instead */
|
|
#define inline static
|
|
#endif
|
|
#endif
|
|
|
|
/* configure lacking CRT features */
|
|
#ifdef _MSC_VER
|
|
#define strdup _strdup
|
|
#define snprintf _snprintf
|
|
/* int is 32-bit for both x86 and x64 */
|
|
typedef unsigned int uint32_t;
|
|
#define UINT32_MAX UINT_MAX
|
|
#elif defined(__GNUC__)
|
|
#include <stdint.h>
|
|
#elif defined(M68000)
|
|
typedef unsigned int uint32_t;
|
|
#endif
|
|
|
|
/* configure socket-stack */
|
|
#ifdef _WIN32
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#define NOMINMAX
|
|
#include <winsock2.h>
|
|
#include <windows.h>
|
|
#include <limits.h>
|
|
#elif defined(USE_AMITCP)
|
|
#include <sys/socket.h>
|
|
#include <proto/exec.h>
|
|
#include <proto/socket.h>
|
|
#include <netdb.h>
|
|
#define SOCKET int
|
|
#define INVALID_SOCKET -1
|
|
#define select(n,r,w,e,t) WaitSelect(n,r,w,e,t,0)
|
|
#define closesocket(x) CloseSocket(x)
|
|
#else
|
|
#include <sys/socket.h>
|
|
#include <sys/time.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <unistd.h>
|
|
#define SOCKET int
|
|
#define INVALID_SOCKET -1
|
|
#define closesocket(x) close(x)
|
|
#endif
|
|
|
|
#define CLIENT_GREET "hello, synctracker!"
|
|
#define SERVER_GREET "hello, demo!"
|
|
|
|
enum {
|
|
SET_KEY = 0,
|
|
DELETE_KEY = 1,
|
|
GET_TRACK = 2,
|
|
SET_ROW = 3,
|
|
PAUSE = 4,
|
|
SAVE_TRACKS = 5
|
|
};
|
|
|
|
static inline int socket_poll(SOCKET socket)
|
|
{
|
|
struct timeval to = { 0, 0 };
|
|
fd_set fds;
|
|
|
|
FD_ZERO(&fds);
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(push)
|
|
#pragma warning(disable: 4127)
|
|
#endif
|
|
FD_SET(socket, &fds);
|
|
#ifdef _MSC_VER
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
return select((int)socket + 1, &fds, NULL, NULL, &to) > 0;
|
|
}
|
|
|
|
#include <assert.h>
|
|
|
|
static inline int xsend(SOCKET s, const void *buf, size_t len, int flags)
|
|
{
|
|
#ifdef WIN32
|
|
assert(len <= INT_MAX);
|
|
return send(s, (const char *)buf, (int)len, flags) != (int)len;
|
|
#else
|
|
return send(s, (const char *)buf, len, flags) != len;
|
|
#endif
|
|
}
|
|
|
|
static inline int xrecv(SOCKET s, void *buf, size_t len, int flags)
|
|
{
|
|
#ifdef WIN32
|
|
assert(len <= INT_MAX);
|
|
return recv(s, (char *)buf, (int)len, flags) != (int)len;
|
|
#else
|
|
return recv(s, (char *)buf, len, flags) != len;
|
|
#endif
|
|
}
|
|
|
|
#ifdef NEED_STRDUP
|
|
static inline char *rocket_strdup(const char *str)
|
|
{
|
|
char *ret = malloc(strlen(str) + 1);
|
|
if (ret)
|
|
strcpy(ret, str);
|
|
return ret;
|
|
}
|
|
#define strdup rocket_strdup
|
|
#endif
|
|
|
|
#endif /* SYNC_BASE_H */
|