From d45b7f29190174659d597b966e09662afd820bad Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Sun, 25 Jun 2023 13:35:35 +1000 Subject: [PATCH] Minor refactoring. --- fusefile.c | 137 ++++++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 64 deletions(-) diff --git a/fusefile.c b/fusefile.c index d8729b9..f886287 100644 --- a/fusefile.c +++ b/fusefile.c @@ -290,6 +290,78 @@ static int RANGE(int s,int n ) { return ( s == n ) && *(range+c) == 0; } +static int setup_source(struct Source *p,char *frag) { + struct stat filestat; + // Open the fragment file rw if possible, else ro + range = strrchr( frag, '/' ); // last '/' + p->filename = range? strndup( frag, range - frag ) : frag; + p->fd = open( p->filename, O_RDWR ); + int rdonly = 0; + if ( p->fd < 0 ) { + rdonly = 1; + p->fd = open( p->filename, O_RDONLY ); + } + if ( p->fd < 0 ) { + perror( p->filename ); + return 1; // Error return + } + if ( stat( p->filename, &filestat ) ) { + perror( p->filename ); + return 1; + } + if ( rdonly ) { + fprintf( stderr, "** %s opened read-only\n", p->filename ); + } + p->from = 0; + p->to = filestat.st_size; + // Process any range variation + if ( range && *(++range) ) { + int a,b; + if ( 0 ) { + } else if ( RANGE( sscanf( range, "%d:%d%n", &a, &b, &c ), 2 )) { + p->from = ( a < 0 )? ( p->to + a ) : a; + p->to = ( b < 0 )? ( p->to + b ) : b; + } else if ( RANGE( sscanf( range, "%d+%d%n", &a, &b, &c ), 2 )) { + p->from = ( a < 0 )? ( p->to + a ) : a; + p->to = ( ( b < 0 )? p->to : p->from ) + b; + } else if ( RANGE( sscanf( range, "%d+%n", &a, &c ), 1 )) { + p->from = ( a < 0 )? ( p->to + a ) : a; + } else if ( RANGE( sscanf( range, ":%d%n", &b, &c ), 1 )) { + p->to = ( b < 0 )? ( p->to + b ) : b; + } else if ( RANGE( sscanf( range, "%d:%n", &a, &c ), 1 )) { + p->from = ( a < 0 )? ( p->to + a ) : a; + } else if ( RANGE( sscanf( range, "%d%n", &a, &c ), 1 )) { + if ( a >= 0 ) { + p->from = a; + } else { + p->from = p->to + a; + } + } else if ( RANGE( sscanf( range, ":%n", &c), 0 ) ) { + // to end from start + } else { + fprintf( stderr, "** BAD RANGE: %s\n", frag ); + return 1; + } + } + if ( ( filestat.st_mode & S_IFMT ) == S_IFCHR ) { + filestat.st_size = p->to; // Pretend size of character device + } + if ( p->from < 0 ) { + p->from = 0; + } + if ( p->to > filestat.st_size ) { + p->to = filestat.st_size; + } + if ( p->from >= p->to || p->from >= filestat.st_size ) { + fprintf( stderr, "** BAD RANGE: %s [%ld:%ld]\n", + frag, p->from, p->to ); + return 1; + } + p->start = sources.size; // the fusefile position of fragment + sources.size += p->to - p->from; + return 0; +} + static int setup_sources(char **argv,int i,int n) { sources.array = calloc( n, sizeof( struct Source ) ); if ( sources.array == 0 ) { @@ -299,71 +371,8 @@ static int setup_sources(char **argv,int i,int n) { int j = 0; sources.size = 0; for ( ; j < n; i++, j++ ) { - struct stat filestat; struct Source *p = sources.array + j; - // Open the fragment file rw if possible, else ro - range = strrchr( argv[i], '/' ); // last '/' - p->filename = range? strndup( argv[i], range - argv[i] ) : argv[i]; - p->fd = open( p->filename, O_RDWR ); - int rdonly = 0; - if ( p->fd < 0 ) { - rdonly = 1; - p->fd = open( p->filename, O_RDONLY ); - } - if ( p->fd < 0 ) { - perror( p->filename ); - return 1; // Error return - } - if ( stat( p->filename, &filestat ) ) { - perror( p->filename ); - return 1; - } - if ( rdonly ) { - fprintf( stderr, "** %s opened read-only\n", p->filename ); - } - p->from = 0; - p->to = filestat.st_size; - // Process any range variation - if ( range && *(++range) ) { - int a,b; - if ( 0 ) { - } else if ( RANGE( sscanf( range, "%d:%d%n", &a, &b, &c ), 2 )) { - p->from = ( a < 0 )? ( p->to + a ) : a; - p->to = ( b < 0 )? ( p->to + b ) : b; - } else if ( RANGE( sscanf( range, "%d+%d%n", &a, &b, &c ), 2 )) { - p->from = ( a < 0 )? ( p->to + a ) : a; - p->to = ( ( b < 0 )? p->to : p->from ) + b; - } else if ( RANGE( sscanf( range, "%d+%n", &a, &c ), 1 )) { - p->from = ( a < 0 )? ( p->to + a ) : a; - } else if ( RANGE( sscanf( range, ":%d%n", &b, &c ), 1 )) { - p->to = ( b < 0 )? ( p->to + b ) : b; - } else if ( RANGE( sscanf( range, "%d:%n", &a, &c ), 1 )) { - p->from = ( a < 0 )? ( p->to + a ) : a; - } else if ( RANGE( sscanf( range, "%d%n", &a, &c ), 1 )) { - if ( a >= 0 ) { - p->from = a; - } else { - p->from = p->to + a; - } - } else if ( RANGE( sscanf( range, ":%n", &c), 0 ) ) { - // to end from start - } else { - fprintf( stderr, "** BAD RANGE: %s\n", argv[i] ); - return 1; - } - } - if ( ( filestat.st_mode & S_IFMT ) == S_IFCHR ) { - filestat.st_size = p->to; // Pretend size of character device - } - if ( p->from < 0 ) { - p->from = 0; - } - if ( p->to > filestat.st_size ) { - p->to = filestat.st_size; - } - if ( p->from >= p->to || p->from >= filestat.st_size ) { - fprintf( stderr, "** BAD RANGE: %s [%ld:%ld]\n", - argv[i], p->from, p->to ); + if ( setup_source( p, argv[i] ) ) { return 1; } p->start = sources.size; // the fusefile position of fragment -- 2.39.2