summaryrefslogtreecommitdiffstats
path: root/src/fuse/helper.c
diff options
context:
space:
mode:
authorSimon Rettberg2015-04-24 17:13:31 +0200
committerSimon Rettberg2015-04-24 17:13:31 +0200
commitee62ca14800eb27e51038a78a0dab4f71b6be31f (patch)
tree11bc7d301dafd884dfdfe52bf91d75dc84a83dfb /src/fuse/helper.c
parentFuse (diff)
downloaddnbd3-ee62ca14800eb27e51038a78a0dab4f71b6be31f.tar.gz
dnbd3-ee62ca14800eb27e51038a78a0dab4f71b6be31f.tar.xz
dnbd3-ee62ca14800eb27e51038a78a0dab4f71b6be31f.zip
[FUSE] Integrate into cmake build process
Diffstat (limited to 'src/fuse/helper.c')
-rw-r--r--src/fuse/helper.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/fuse/helper.c b/src/fuse/helper.c
new file mode 100644
index 0000000..7b1101d
--- /dev/null
+++ b/src/fuse/helper.c
@@ -0,0 +1,96 @@
+/*
+ * Helper functions for imageFuse
+ * by Stephan Schwaer, January 2014
+ */
+
+#include "helper.h"
+void printLog( log_info *info )
+{
+ FILE *logFile;
+
+ // Create logfile
+
+ logFile = fopen( "log.txt", "w" );
+ if ( logFile == NULL ) {
+ printf( "Error creating/opening log.txt\n" );
+ return;
+ }
+
+ //rewind(file);
+ fprintf( logFile, "ImageSize: %"PRIu64" MiB\n", ( uint64_t )( info->imageSize/ ( 1024ll*1024ll ) ) );
+ fprintf( logFile, "ReceivedMiB: %"PRIu64" MiB\n", ( uint64_t )( info->receivedBytes/ ( 1024ll*1024ll ) ) );
+ fprintf( logFile, "imageBlockCount: %"PRIu64"\n", info->imageBlockCount );
+ fprintf( logFile, "Blocksize: 4KiB\n\n" );
+ fprintf( logFile, "Block access count:\n" );
+
+ uint64_t i = 0;
+ for ( ; i < info->imageBlockCount; i++ ) {
+ if ( i % 50 == 0 ) {
+ fprintf( logFile, "\n" );
+ }
+ fprintf( logFile, "%i ", ( int ) info->blockRequestCount[i] );
+ }
+ fprintf( logFile, "\n" );
+ fclose( logFile );
+}
+
+bool sock_printable( struct sockaddr *addr, socklen_t addrLen, char *output, int len )
+{
+ char host[100], port[10];
+ int ret = getnameinfo( addr, addrLen, host, 100, port, 10, NI_NUMERICHOST | NI_NUMERICSERV );
+ if ( ret == 0 ) {
+ snprintf( output, len, "[%s]:%s", host, port );
+ }
+ return ret == 0;
+}
+
+// TODO: Pretty much same as in server/*
+int connect_to_server( char *server_address, int port )
+{
+ const int on = 1;
+ int sock = -1;
+ struct addrinfo hints, *res, *ptr;
+ char portStr[6];
+
+ // Set hints for local addresses.
+ memset( &hints, 0, sizeof( hints ) );
+ hints.ai_flags = AI_PASSIVE;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ snprintf( portStr, sizeof portStr, "%d", port );
+ if ( getaddrinfo( server_address, portStr, &hints, &res ) != 0 || res == NULL ) {
+ return false;
+ }
+ // Attempt to bind to all of the addresses as long as there's room in the poll list
+ for ( ptr = res; ptr != NULL; ptr = ptr->ai_next ) {
+ char bla[100];
+ if ( !sock_printable( ( struct sockaddr * ) ptr->ai_addr, ptr->ai_addrlen, bla, 100 ) ) {
+ snprintf( bla, 100, "[invalid]" );
+ }
+ printf( "Trying to connect to %s ", bla );
+ sock = socket( ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol );
+ if ( sock < 0 ) {
+ printf( "...cannot create socket, errno=%d\n", errno );
+ sock = -1;
+ continue;
+ }
+ setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof( on ) );
+ if ( ptr->ai_family == PF_INET6 ) {
+ setsockopt( sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof( on ) );
+ }
+ if ( connect( sock, ptr->ai_addr, ptr->ai_addrlen ) < 0 ) {
+ // if ( bind( sock, ptr->ai_addr, ptr->ai_addrlen ) == -1 ) {
+ printf( "...socket Error, errno=%d\n", errno );
+ close( sock );
+ sock = -1;
+ continue;
+ } else {
+ printf( "... connecting successful!\n" );
+ break;
+ }
+ }
+
+ freeaddrinfo( res );
+ return sock;
+}
+