X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=bin%2Fmegatron%2Fasingle.c;h=9ba3918b6a0a2dfa65b7d6de7b6e022003e74f50;hb=3a84db87064922ad10ac10cc1d6833380e575995;hp=53877a8820580c4a7cb2f7f887637b52fe08e6d5;hpb=efc466d375e2b60c34990b39b135ce56bd38a99b;p=netatalk.git diff --git a/bin/megatron/asingle.c b/bin/megatron/asingle.c index 53877a88..9ba3918b 100644 --- a/bin/megatron/asingle.c +++ b/bin/megatron/asingle.c @@ -1,5 +1,4 @@ /* - * $Id: asingle.c,v 1.7 2002-01-04 04:45:47 sibaz Exp $ */ #ifdef HAVE_CONFIG_H @@ -10,17 +9,13 @@ #include #include #include -#ifdef HAVE_FCNTL_H #include -#endif /* HAVE_FCNTL_H */ #include #include -#include #include #include -#ifdef HAVE_UNISTD_H #include -#endif /* HAVE_UNISTD_H */ + #include #include #include "asingle.h" @@ -48,14 +43,14 @@ following globals; therefore this module can only be used for one of the two functions at a time. */ -struct single_file_data { +static struct single_file_data { int filed; char path[ MAXPATHLEN + 1]; struct ad_entry entry[ ADEID_MAX ]; } single; extern char *forkname[]; -u_char header_buf[ AD_HEADER_LEN ]; +static u_char header_buf[ AD_HEADER_LEN ]; /* * single_open must be called first. pass it a filename that is supposed @@ -63,10 +58,7 @@ u_char header_buf[ AD_HEADER_LEN ]; * somewhat initialized; single_filed is set. */ -int single_open( singlefile, flags, fh, options ) - char *singlefile; - int flags, options; - struct FHeader *fh; +int single_open(char *singlefile, int flags, struct FHeader *fh, int options _U_) { int rc; @@ -97,8 +89,7 @@ int single_open( singlefile, flags, fh, options ) * Otherwise, a value of -1 is returned. */ -int single_close( keepflag ) - int keepflag; +int single_close( int keepflag) { if ( keepflag == KEEP ) { return( close( single.filed )); @@ -117,22 +108,20 @@ int single_close( keepflag ) * bytes of the other two forks can be read, as well. */ -int single_header_read( fh, version ) - struct FHeader *fh; - int version; +int single_header_read( struct FHeader *fh, int version) { /* * entry_buf is used for reading in entry descriptors, and for reading in * the actual entries of FILEINFO, FINDERINFO, and DATES. */ - u_char entry_buf[ 16 ]; + u_char entry_buf[ADEDLEN_FINDERI]; u_int32_t entry_id; u_int32_t time_seconds; u_short mask = 0xfcee; u_short num_entries; int n; int readlen; - int date_entry; + int date_entry = 0; off_t pos; /* @@ -181,17 +170,11 @@ int single_header_read( fh, version ) */ if ( version == 1 ) { - if ( single.entry[ ADEID_FILEI ].ade_len > 0 ) { + if ( single.entry[ ADEID_FILEI ].ade_len > 0 ) date_entry = ADEID_FILEI; - } else { - date_entry = 0; - } } else if ( version == 2 ) { - if ( single.entry[ ADEID_FILEDATESI ].ade_len > 0 ) { + if ( single.entry[ ADEID_FILEDATESI ].ade_len > 0 ) date_entry = ADEID_FILEDATESI; - } else { - date_entry = 0; - } } #if DEBUG fprintf( stderr, "date_entry = %d\n", date_entry ); @@ -217,15 +200,14 @@ int single_header_read( fh, version ) return( -1 ); } } - if (( single.entry[ ADEID_FINDERI ].ade_len < 16 ) || + if (( single.entry[ ADEID_FINDERI ].ade_len < ADEDLEN_FINDERI ) || ( single.entry[ ADEID_FINDERI ].ade_off <= AD_HEADER_LEN )) { fprintf( stderr, "%s has bogus FinderInfo.\n", single.path ); return( -1 ); } else { pos = lseek( single.filed, single.entry[ ADEID_FINDERI ].ade_off, SEEK_SET ); - if ( read( single.filed, (char *)entry_buf, sizeof( entry_buf )) != - sizeof( entry_buf )) { + if ( read( single.filed, (char *)entry_buf, ADEDLEN_FINDERI) != ADEDLEN_FINDERI) { perror( "Premature end of file :" ); return( -1 ); } @@ -275,7 +257,7 @@ int single_header_read( fh, version ) * Unless I can't get the current date, in which case use time zero. */ if (( date_entry < 7 ) || ( date_entry > 8 )) { - if (( time_seconds = time( NULL )) == -1 ) { + if (( time_seconds = time( NULL )) == (u_int32_t)-1 ) { time_seconds = AD_DATE_START; } else { time_seconds = AD_DATE_FROM_UNIX(time_seconds); @@ -317,9 +299,9 @@ int single_header_read( fh, version ) sizeof(fh->backup_date)); } if ( single.entry[ ADEID_RFORK ].ade_off == 0 ) { - fh->forklen[ ADEID_RFORK ] = 0; + fh->forklen[RESOURCE] = 0; } else { - fh->forklen[ ADEID_RFORK ] = + fh->forklen[RESOURCE] = htonl( single.entry[ ADEID_RFORK ].ade_len ); } if ( single.entry[ ADEID_DFORK ].ade_off == 0 ) { @@ -346,16 +328,16 @@ int single_header_read( fh, version ) * "Macintosh " (that is seven blanks of padding). */ #define MACINTOSH "Macintosh " -u_char sixteennulls[] = { 0, 0, 0, 0, 0, 0, 0, 0, +static u_char sixteennulls[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int single_header_test(void) { - int cc; + ssize_t cc; u_int32_t templong; cc = read( single.filed, (char *)header_buf, sizeof( header_buf )); - if ( cc < sizeof( header_buf )) { + if ( cc < (ssize_t)sizeof( header_buf )) { perror( "Premature end of file :" ); return( -1 ); } @@ -402,15 +384,12 @@ int single_header_test(void) * */ -int single_read( fork, buffer, length ) - int fork; - char *buffer; - int length; +ssize_t single_read( int fork, char *buffer, size_t length) { u_int32_t entry_id; char *buf_ptr; - int readlen; - int cc = 1; + size_t readlen; + ssize_t cc = 1; off_t pos; switch ( fork ) { @@ -425,9 +404,9 @@ int single_read( fork, buffer, length ) break; } - if ( single.entry[ entry_id ].ade_len < 0 ) { - fprintf( stderr, "single_read: Trying to read past end of fork!\n" ); - return( single.entry[ entry_id ].ade_len ); + if (single.entry[entry_id].ade_len > 0x7FFFFFFF) { + fprintf(stderr, "single_read: Trying to read past end of fork!, ade_len == %u\n", single.entry[entry_id].ade_len); + return -1; } if ( single.entry[ entry_id ].ade_len == 0 ) { if ( fork == DATA ) {