X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_read.c;h=852a6e963b94f964e3b47d1ea8b67df6cac0717e;hb=3a84db87064922ad10ac10cc1d6833380e575995;hp=877ab574cff326dc3b70750572fa2577d4bec1ab;hpb=313b5f94348618d65523c1d8bde1fba9988f040a;p=netatalk.git diff --git a/libatalk/adouble/ad_read.c b/libatalk/adouble/ad_read.c index 877ab574..852a6e96 100644 --- a/libatalk/adouble/ad_read.c +++ b/libatalk/adouble/ad_read.c @@ -28,13 +28,12 @@ #include #include #include +#include #include #include - -#ifndef MIN -#define MIN(a,b) ((a)<(b)?(a):(b)) -#endif /* ! MIN */ +#include +#include ssize_t adf_pread(struct ad_fd *ad_fd, void *buf, size_t count, off_t offset) { @@ -60,9 +59,10 @@ ssize_t adf_pread(struct ad_fd *ad_fd, void *buf, size_t count, off_t offset) /* XXX: locks have to be checked before each stream of consecutive * ad_reads to prevent a denial in the middle from causing * problems. */ -ssize_t ad_read( struct adouble *ad, const u_int32_t eid, off_t off, char *buf, const size_t buflen) +ssize_t ad_read( struct adouble *ad, const uint32_t eid, off_t off, char *buf, const size_t buflen) { ssize_t cc; + off_t r_off = 0; /* We're either reading the data fork (and thus the data file) * or we're reading anything else (and thus the header file). */ @@ -78,37 +78,22 @@ ssize_t ad_read( struct adouble *ad, const u_int32_t eid, off_t off, char *buf, cc = adf_pread(&ad->ad_data_fork, buf, buflen, off); } } else { - if (ad->ad_flags != AD_VERSION_EA) { - off_t r_off; - if ( ad_reso_fileno( ad ) == -1 ) - /* resource fork is not open ( cf etc/afp/fork.c) */ - return 0; + if (! AD_RSRC_OPEN(ad)) + /* resource fork is not open ( cf etc/afp/fork.c) */ + return 0; + + if (ad->ad_vers == AD_VERSION_EA) { +#ifdef HAVE_EAFD + r_off = off; +#else + r_off = off + ADEDOFF_RFORK_OSX; +#endif + } else { r_off = ad_getentryoff(ad, eid) + off; - if (( cc = adf_pread( &ad->ad_resource_fork, buf, buflen, r_off )) < 0 ) - return( -1 ); - /* - * We've just read in bytes from the disk that we read earlier - * into ad_data. If we're going to write this buffer out later, - * we need to update ad_data. - * FIXME : always false? - */ - if (r_off < ad_getentryoff(ad, ADEID_RFORK)) { - if ( ad->ad_resource_fork.adf_flags & O_RDWR ) { - memcpy(buf, ad->ad_data + r_off, - MIN(sizeof( ad->ad_data ) - r_off, cc)); - } else { - memcpy(ad->ad_data + r_off, buf, - MIN(sizeof( ad->ad_data ) - r_off, cc)); - } - } - } else { /* AD_VERSION_EA */ - if ((off + buflen) > ad->ad_rlen) { - errno = ERANGE; - return -1; - } - memcpy(buf, ad->ad_resforkbuf + off, buflen); - cc = buflen; } + + if (( cc = adf_pread( &ad->ad_resource_fork, buf, buflen, r_off )) < 0 ) + return( -1 ); } return( cc );