From f86126bfc3fefac726dcb613be91012a656f7c6f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Sun, 1 Oct 2017 17:24:43 +0200 Subject: [SERVER] Helper function for loading line based space separated data from file --- src/server/altservers.c | 60 ++++++++++++++++++++++--------------------------- src/server/fileutil.c | 33 +++++++++++++++++++++++++++ src/server/fileutil.h | 4 +++- 3 files changed, 63 insertions(+), 34 deletions(-) (limited to 'src/server') diff --git a/src/server/altservers.c b/src/server/altservers.c index 208af92..bf9d8f2 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -2,6 +2,7 @@ #include "locks.h" #include "helper.h" #include "image.h" +#include "fileutil.h" #include "../shared/protocol.h" #include "../serverconfig.h" #include @@ -46,43 +47,36 @@ void altservers_shutdown() thread_join( altThread, NULL ); } +static void addalt(int argc, char **argv, void *data) +{ + char *shost; + dnbd3_host_t host; + bool isPrivate = false; + bool isClientOnly = false; + if ( argv[0][0] == '#' ) return; + for (shost = argv[0]; *shost != '\0'; ) { // Trim left and scan for "-" prefix + if ( *shost == '-' ) isPrivate = true; + else if ( *shost == '+' ) isClientOnly = true; + else if ( *shost != ' ' && *shost != '\t' ) break; + shost++; + } + if ( !parse_address( shost, &host ) ) { + logadd( LOG_WARNING, "Invalid entry in alt-servers file ignored: '%s'", shost ); + return; + } + if ( argc == 1 ) argv[1] = ""; + if ( altservers_add( &host, argv[1], isPrivate, isClientOnly ) ) { + (*(int*)data)++; + } +} + int altservers_load() { int count = 0; - char *name = NULL, *space; - char buffer[1000], *line; - dnbd3_host_t host; - asprintf( &name, "%s/%s", _configDir, "alt-servers" ); - if ( name == NULL ) return -1; - FILE *fp = fopen( name, "r" ); + char *name; + if ( asprintf( &name, "%s/%s", _configDir, "alt-servers" ) == -1 ) return -1; + file_loadLineBased( name, 1, 2, &addalt, (void*)&count ); free( name ); - if ( fp == NULL ) return -1; - while ( fgets( buffer, 1000, fp ) != NULL ) { - bool isPrivate = false; - bool isClientOnly = false; - for (line = buffer; *line != '\0'; ) { // Trim left and scan for "-" prefix - if ( *line == '-' ) isPrivate = true; - else if ( *line == '+' ) isClientOnly = true; - else if ( *line != ' ' && *line != '\t' ) break; - line++; - } - if ( *line == '\r' || *line == '\n' || *line == '\0' ) continue; // Ignore empty lines - trim_right( line ); - space = line; - while ( *space != '\0' ) { - if ( *space == ' ' || *space == '\t' ) break; - space++; - } - if ( *space == '\0' ) space = NULL; - else *space++ = '\0'; - if ( !parse_address( line, &host ) ) { - if ( space != NULL ) *--space = ' '; - logadd( LOG_WARNING, "Invalid entry in alt-servers file ignored: '%s'", line ); - continue; - } - if ( altservers_add( &host, space, isPrivate, isClientOnly ) ) ++count; - } - fclose( fp ); logadd( LOG_DEBUG1, "Added %d alt servers\n", count ); return count; } diff --git a/src/server/fileutil.c b/src/server/fileutil.c index 58ac0e9..d68649e 100644 --- a/src/server/fileutil.c +++ b/src/server/fileutil.c @@ -1,4 +1,5 @@ #include "fileutil.h" +#include "helper.h" #include #include @@ -80,3 +81,35 @@ time_t file_lastModification(const char * const file) if ( stat( file, &st ) != 0 ) return 0; return st.st_mtime; } + +int file_loadLineBased(const char * const file, int minFields, int maxFields, void (*cb)(int argc, char **argv, void *data), void *data) +{ + char buffer[1000], *line; + char *items[20]; + int count = 0, itemCount; + + if ( file == NULL || cb == NULL ) return -1; + FILE *fp = fopen( file, "r" ); + if ( fp == NULL ) return -1; + while ( fgets( buffer, sizeof(buffer), fp ) != NULL ) { + itemCount = 0; + for (line = buffer; *line != '\0' && itemCount < 20; ) { // Trim left and scan for "-" prefix + while ( *line == ' ' || *line == '\t' ) ++line; + if ( *line == '\r' || *line == '\n' || *line == '\0' ) break; // Ignore empty lines + items[itemCount++] = line; + if ( itemCount >= maxFields ) { + trim_right( line ); + break; + } + while ( *line != '\0' && *line != ' ' && *line != '\t' && *line != '\r' && *line != '\n' ) ++line; + if ( *line != '\0' ) *line++ = '\0'; + } + if ( itemCount >= minFields ) { + cb( itemCount, items, data ); + count++; + } + } + fclose( fp ); + return count; +} + diff --git a/src/server/fileutil.h b/src/server/fileutil.h index d868ccc..36ee432 100644 --- a/src/server/fileutil.h +++ b/src/server/fileutil.h @@ -1,7 +1,8 @@ #ifndef _FILEUTIL_H_ #define _FILEUTIL_H_ -#include "../types.h" +#include +#include #include bool file_isReadable(char *file); @@ -10,5 +11,6 @@ bool mkdir_p(const char* path); bool file_alloc(int fd, uint64_t offset, uint64_t size); int64_t file_freeDiskSpace(const char * const path); time_t file_lastModification(const char * const file); +int file_loadLineBased(const char * const file, int minFields, int maxFields, void (*cb)(int argc, char **argv, void *data), void *data); #endif /* FILEUTIL_H_ */ -- cgit v1.2.3-55-g7522