X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fofork.c;h=7e2d3d57630a3b28a76011d227db44abacc8a5e0;hb=6d60f95c388da5f8f901d67e0018cf4896e6c6dc;hp=a69a73c56c5de3d015f07858ea6d0e9b029ad3a9;hpb=840295b66c50077fd34d1a03073b765ab5647de9;p=netatalk.git diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index a69a73c5..7e2d3d57 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -69,22 +69,6 @@ static void of_unhash(struct ofork *of) } } -#ifdef DEBUG1 -void of_pforkdesc( FILE *f) -{ - int ofrefnum; - - if (!oforks) - return; - - for ( ofrefnum = 0; ofrefnum < nforks; ofrefnum++ ) { - if ( oforks[ ofrefnum ] != NULL ) { - fprintf( f, "%hu <%s>\n", ofrefnum, of_name(oforks[ ofrefnum ])); - } - } -} -#endif - int of_flush(const struct vol *vol) { int refnum; @@ -223,12 +207,9 @@ of_alloc(struct vol *vol, return NULL; } strlcpy( ad->ad_m_name, path, ad->ad_m_namelen); - } else { - /* Increase the refcount on this struct adouble. This is - decremented again in oforc_dealloc. */ - ad->ad_refcount++; } + ad_ref(ad); of->of_ad = ad; of->of_vol = vol; of->of_did = dir->d_did; @@ -272,7 +253,7 @@ int of_stat(struct path *path) } -#ifdef HAVE_RENAMEAT +#ifdef HAVE_ATFUNCS int of_fstatat(int dirfd, struct path *path) { int ret; @@ -285,7 +266,7 @@ int of_fstatat(int dirfd, struct path *path) return ret; } -#endif /* HAVE_RENAMEAT */ +#endif /* HAVE_ATFUNCS */ /* -------------------------- stat the current directory. @@ -365,7 +346,7 @@ struct ofork *of_findname(struct path *path) * @param dirfd (r) directory fd * @param path (rw) pointer to struct path */ -#ifdef HAVE_RENAMEAT +#ifdef HAVE_ATFUNCS struct ofork *of_findnameat(int dirfd, struct path *path) { struct ofork *of; @@ -398,17 +379,6 @@ void of_dealloc( struct ofork *of) of_unhash(of); oforks[ of->of_refnum % nforks ] = NULL; - - /* decrease refcount */ - of->of_ad->ad_refcount--; - - if ( of->of_ad->ad_refcount <= 0) { - free( of->of_ad->ad_m_name ); - free( of->of_ad); - } else {/* someone's still using it. just free this user's locks */ - ad_unlock(of->of_ad, of->of_refnum); - } - free( of ); } @@ -416,15 +386,10 @@ void of_dealloc( struct ofork *of) int of_closefork(struct ofork *ofork) { struct timeval tv; - int adflags, doflush = 0; + int doflush = 0; int ret; - adflags = 0; - if ((ofork->of_flags & AFPFORK_DATA) && (ad_data_fileno( ofork->of_ad ) != -1)) { - adflags |= ADFLAGS_DF; - } if ( (ofork->of_flags & AFPFORK_OPEN) && ad_reso_fileno( ofork->of_ad ) != -1 ) { - adflags |= ADFLAGS_HF; /* * Only set the rfork's length if we're closing the rfork. */ @@ -440,8 +405,13 @@ int of_closefork(struct ofork *ofork) } } ret = 0; - if ( ad_close( ofork->of_ad, adflags ) < 0 ) { - ret = -1; + + ad_unlock(ofork->of_ad, ofork->of_refnum); + + if (ad_unref(ofork->of_ad) == 0) { + if ( ad_close( ofork->of_ad, 0 ) < 0 ) { + ret = -1; + } } of_dealloc( ofork ); @@ -485,3 +455,23 @@ void of_closevol(const struct vol *vol) return; } +/* ---------------------- + close all forks for a volume +*/ +void of_close_all_forks(void) +{ + int refnum; + + if (!oforks) + return; + + for ( refnum = 0; refnum < nforks; refnum++ ) { + if (oforks[ refnum ] != NULL) { + if (of_closefork( oforks[ refnum ]) < 0 ) { + LOG(log_error, logtype_afpd, "of_close_all_forks: %s", strerror(errno) ); + } + } + } + return; +} +