From 1ee67aedd55b452c7d5851d0e39e01aef4aca766 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 10 Feb 2016 21:53:15 +0100 Subject: dnbd3server build success on freebsd :) --- src/server/altservers.c | 4 ++-- src/server/fileutil.c | 8 +++++++- src/server/helper.c | 8 +++++++- src/server/helper.h | 1 + src/server/image.c | 22 ++++++++++------------ src/server/net.c | 15 ++++++++++++++- src/server/server.c | 25 +++++++++++++++---------- src/shared/protocol.h | 9 ++++++--- src/types.h | 15 +++++++++++++++ 9 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/server/altservers.c b/src/server/altservers.c index 41c0a27..bccf758 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -416,7 +416,7 @@ static void *altservers_main(void *data UNUSED) for (itAlt = 0; itAlt < numAlts; ++itAlt) { usleep( 1000 ); // Wait a very short moment for the network to recover (we might be doing lots of measurements...) // Connect - clock_gettime( CLOCK_MONOTONIC_RAW, &start ); + clock_gettime( CLOCK_MONOTONIC, &start ); int sock = sock_connect( &servers[itAlt], 750, _uplinkTimeout ); if ( sock < 0 ) continue; // Select image ++++++++++++++++++++++++++++++ @@ -462,7 +462,7 @@ static void *altservers_main(void *data UNUSED) if ( recv( sock, buffer, DNBD3_BLOCK_SIZE, MSG_WAITALL ) != DNBD3_BLOCK_SIZE ) { ERROR_GOTO( server_failed, "[RTT] Could not read first block payload for %s", image->name ); } - clock_gettime( CLOCK_MONOTONIC_RAW, &end ); + clock_gettime( CLOCK_MONOTONIC, &end ); // Measurement done - everything fine so far const unsigned int rtt = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; // µs const unsigned int avg = altservers_updateRtt( &servers[itAlt], rtt ); diff --git a/src/server/fileutil.c b/src/server/fileutil.c index f09a899..58ac0e9 100644 --- a/src/server/fileutil.c +++ b/src/server/fileutil.c @@ -52,11 +52,17 @@ bool mkdir_p(const char* path) bool file_alloc(int fd, uint64_t offset, uint64_t size) { +#ifdef __linux__ if ( fallocate( fd, 0, offset, size ) == 0 ) return true; // fast way +#elif defined(__FreeBSD__) if ( posix_fallocate( fd, offset, size ) == 0 ) return true; // slow way +#endif + + /* This doesn't make any sense, AFAIK if ( lseek( fd, offset + size - 1, SEEK_SET ) != (off_t)offset ) return false; // dumb way if ( write( fd, "", 1 ) != 1 ) return false; - return true; + */ + return false; } int64_t file_freeDiskSpace(const char * const path) diff --git a/src/server/helper.c b/src/server/helper.c index 477acef..40d22f0 100644 --- a/src/server/helper.c +++ b/src/server/helper.c @@ -1,9 +1,12 @@ #include "helper.h" #include #include -#include // For thread names #include +#ifdef HAVE_THREAD_NAMES +#include // For thread names +#endif + /** * Parse IPv4 or IPv6 address in string representation to a suitable format usable by the BSD socket library * !! Contents of 'string' might be modified by this function !! @@ -121,7 +124,10 @@ void setThreadName(const char *name) newName[15] = '\0'; name = newName; } +#ifdef HAVE_THREAD_NAMES prctl( PR_SET_NAME, (unsigned long)name, 0, 0, 0 ); +#endif + //TODO: On FreeBSD set threadname with pthread_setname_np } void blockNoncriticalSignals() diff --git a/src/server/helper.h b/src/server/helper.h index 2173046..5702f47 100644 --- a/src/server/helper.h +++ b/src/server/helper.h @@ -8,6 +8,7 @@ #include #include #include +#include #define ERROR_GOTO(jumplabel, ...) do { logadd(LOG_ERROR, __VA_ARGS__); goto jumplabel; } while (0); diff --git a/src/server/image.c b/src/server/image.c index 7c9680e..3d4aab6 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -1,28 +1,18 @@ #include "image.h" #include "helper.h" #include "fileutil.h" -#include "../shared/log.h" #include "uplink.h" #include "locks.h" #include "integrity.h" -#include "../shared/protocol.h" -#include "../shared/sockhelper.h" #include "altservers.h" -#include "server.h" -#include "../shared/fdsignal.h" +#include "../shared/protocol.h" #include -#include #include -#include -#include #include -#include #include #include #include -#include -#include #include #define PATHLEN (2000) @@ -243,9 +233,17 @@ bool image_saveCacheMap(dnbd3_image_t *image) write( fd, map, size ); if ( image->cacheFd != -1 ) { +#ifdef HAVE_FDATASYNC fdatasync( image->cacheFd ); +#else + fsync( image->cacheFd ); +#endif } +#ifdef HAVE_FDATASYNC fdatasync( fd ); +#else + fsync( fd ); +#endif close( fd ); free( map ); @@ -1167,7 +1165,7 @@ static dnbd3_image_t *loadImageServer(char * const name, const uint16_t requeste snprintf( imageFile, PATHLEN, "%s/%s.r%d", _basePath, name, requestedRid ); detectedRid = requestedRid; } else { - glob_t g = { 0 }; + glob_t g; snprintf( imageFile, PATHLEN, "%s/%s.r*", _basePath, name ); const int ret = glob( imageFile, GLOB_NOSORT | GLOB_MARK, NULL, &g ); imageFile[0] = '\0'; diff --git a/src/server/net.c b/src/server/net.c index d840718..b919d62 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -28,9 +28,17 @@ #include "../shared/sockhelper.h" #include "../serialize.h" -#include #include +#ifdef __linux__ +#include +#endif +#ifdef __FreeBSD__ +#include +#include +#include +#endif + static char nullbytes[500]; static uint64_t totalBytesSent = 0; @@ -350,7 +358,12 @@ void *net_client_handler(void *dnbd3_client) realBytes = image->realFilesize - request.offset; } while ( done < realBytes ) { +#ifdef __linux__ const ssize_t ret = sendfile( client->sock, image_file, &offset, realBytes - done ); +#elif defined(__FreeBSD__) + off_t sent; + int ret = sendfile( image_file, client->sock, offset, realBytes - done, NULL, &sent, 0 ); +#endif if ( ret <= 0 ) { const int err = errno; if ( lock ) pthread_mutex_unlock( &client->sendMutex ); diff --git a/src/server/server.c b/src/server/server.c index d62f6c2..674abce 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -36,6 +36,11 @@ #include #include +#define LONGOPT_CRC4 1000 +#define LONGOPT_ASSERT 1001 +#define LONGOPT_CREATE 1002 +#define LONGOPT_REVISION 1003 +#define LONGOPT_SIZE 1004 poll_list_t *listeners = NULL; @@ -175,11 +180,11 @@ int main(int argc, char *argv[]) { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { "bind", required_argument, NULL, 'b' }, - { "crc", required_argument, NULL, 'crc4' }, - { "assert", no_argument, NULL, 'asrt' }, - { "create", required_argument, NULL, 'crat' }, - { "revision", required_argument, NULL, 'rvid' }, - { "size", required_argument, NULL, 'size' }, + { "crc", required_argument, NULL, LONGOPT_CRC4 }, + { "assert", no_argument, NULL, LONGOPT_ASSERT }, + { "create", required_argument, NULL, LONGOPT_CREATE }, + { "revision", required_argument, NULL, LONGOPT_REVISION }, + { "size", required_argument, NULL, LONGOPT_SIZE }, { 0, 0, 0, 0 } }; @@ -215,20 +220,20 @@ int main(int argc, char *argv[]) case 'b': bindAddress = strdup( optarg ); break; - case 'crc4': + case LONGOPT_CRC4: return image_generateCrcFile( optarg ) ? 0 : EXIT_FAILURE; - case 'asrt': + case LONGOPT_ASSERT: printf( "Testing a failing assertion:\n" ); assert( 4 == 5 ); printf( "Assertion 4 == 5 seems to hold. ;-)\n" ); return EXIT_SUCCESS; - case 'crat': + case LONGOPT_CREATE: paramCreate = strdup( optarg ); break; - case 'rvid': + case LONGOPT_REVISION: paramRevision = atoi( optarg ); break; - case 'size': + case LONGOPT_SIZE: paramSize = strtoll( optarg, NULL, 10 ); break; } diff --git a/src/shared/protocol.h b/src/shared/protocol.h index a2f79f4..9e28e7a 100644 --- a/src/shared/protocol.h +++ b/src/shared/protocol.h @@ -1,13 +1,16 @@ #ifndef _PROTOCOL_H_ #define _PROTOCOL_H_ -#include -#include -#include #include "sockhelper.h" + #include "../types.h" #include "../serialize.h" +#include +#include +#include +#include + #define FLAGS8_SERVER (1) #define REPLY_OK (0) diff --git a/src/types.h b/src/types.h index 6652a0d..7893da4 100644 --- a/src/types.h +++ b/src/types.h @@ -40,6 +40,21 @@ #define UNUSED dfg dsfg dg #endif +#ifdef __linux__ +#define HAVE_THREAD_NAMES +#define HAVE_FDATASYNC +#endif + +#ifdef __FreeBSD__ +#ifndef MSG_MORE +#define MSG_MORE 0 +#endif +#ifndef POLLRDHUP +#define POLLRDHUP 0x2000 +#endif +#include +#endif + // ioctl #define DNBD3_MAGIC 'd' #define IOCTL_OPEN _IO(0xab, 1) -- cgit v1.2.3-55-g7522