summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastian2016-02-10 21:53:15 +0100
committerSebastian2016-02-11 00:09:39 +0100
commit1ee67aedd55b452c7d5851d0e39e01aef4aca766 (patch)
treecaf482cd40463d5a4b15f14e5bd5b2d34bf936bd /src
parentcleanup commits (diff)
downloaddnbd3-1ee67aedd55b452c7d5851d0e39e01aef4aca766.tar.gz
dnbd3-1ee67aedd55b452c7d5851d0e39e01aef4aca766.tar.xz
dnbd3-1ee67aedd55b452c7d5851d0e39e01aef4aca766.zip
dnbd3server build success on freebsd :)
Diffstat (limited to 'src')
-rw-r--r--src/server/altservers.c4
-rw-r--r--src/server/fileutil.c8
-rw-r--r--src/server/helper.c8
-rw-r--r--src/server/helper.h1
-rw-r--r--src/server/image.c22
-rw-r--r--src/server/net.c15
-rw-r--r--src/server/server.c25
-rw-r--r--src/shared/protocol.h9
-rw-r--r--src/types.h15
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 <arpa/inet.h>
#include <stdlib.h>
-#include <sys/prctl.h> // For thread names
#include <signal.h>
+#ifdef HAVE_THREAD_NAMES
+#include <sys/prctl.h> // 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 <string.h>
#include <errno.h>
#include <unistd.h>
+#include <sys/socket.h>
#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 <assert.h>
-#include <stdio.h>
#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
#include <sys/stat.h>
-#include <sys/types.h>
#include <dirent.h>
#include <zlib.h>
#include <inttypes.h>
-#include <pthread.h>
-#include <errno.h>
#include <glob.h>
#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 <sys/sendfile.h>
#include <assert.h>
+#ifdef __linux__
+#include <sys/sendfile.h>
+#endif
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#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 <getopt.h>
#include <assert.h>
+#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 <sys/types.h>
-#include <sys/socket.h>
-#include <errno.h>
#include "sockhelper.h"
+
#include "../types.h"
#include "../serialize.h"
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+
#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 <netinet/in.h>
+#endif
+
// ioctl
#define DNBD3_MAGIC 'd'
#define IOCTL_OPEN _IO(0xab, 1)