]> arthur.barton.de Git - netatalk.git/blobdiff - bin/megatron/asingle.c
Writing metadata xattr on directories with sticky bit set, FR#94
[netatalk.git] / bin / megatron / asingle.c
index 53877a8820580c4a7cb2f7f887637b52fe08e6d5..9ba3918b6a0a2dfa65b7d6de7b6e022003e74f50 100644 (file)
@@ -1,5 +1,4 @@
 /*
- * $Id: asingle.c,v 1.7 2002-01-04 04:45:47 sibaz Exp $
  */
 
 #ifdef HAVE_CONFIG_H
 #include <sys/uio.h>
 #include <sys/time.h>
 #include <sys/param.h>
-#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
-#endif /* HAVE_FCNTL_H */
 #include <time.h>
 #include <string.h>
-#include <atalk/logger.h>
 #include <ctype.h>
 #include <stdio.h>
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif /* HAVE_UNISTD_H */
+
 #include <atalk/adouble.h>
 #include <netatalk/endian.h>
 #include "asingle.h"
        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 ) {