summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-01 17:24:43 +0200
committerSimon Rettberg2017-10-01 17:24:43 +0200
commitf86126bfc3fefac726dcb613be91012a656f7c6f (patch)
tree6abf4289db94f7953ce762ed57c7745fd571cc34 /src/server
parent[*] constness for sock_sendAll params (diff)
downloaddnbd3-f86126bfc3fefac726dcb613be91012a656f7c6f.tar.gz
dnbd3-f86126bfc3fefac726dcb613be91012a656f7c6f.tar.xz
dnbd3-f86126bfc3fefac726dcb613be91012a656f7c6f.zip
[SERVER] Helper function for loading line based space separated data from file
Diffstat (limited to 'src/server')
-rw-r--r--src/server/altservers.c60
-rw-r--r--src/server/fileutil.c33
-rw-r--r--src/server/fileutil.h4
3 files changed, 63 insertions, 34 deletions
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 <assert.h>
@@ -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 <fcntl.h>
#include <unistd.h>
@@ -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 <stdint.h>
+#include <stdbool.h>
#include <time.h>
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_ */