X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fofork.c;h=b124351a2b9cba91d7c5e8feb9a604db50f48024;hb=1738057a2d61e5bbb4a80ae6debf81829d754950;hp=225f25391985f33ed43f93083afdc18144bfa9e9;hpb=ec19ba243cd30f9030091e5a2bf0dab13da61c0e;p=netatalk.git diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index 225f2539..b124351a 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -1,5 +1,5 @@ /* - * $Id: ofork.c,v 1.20.6.5 2004-03-02 13:27:08 didg Exp $ + * $Id: ofork.c,v 1.20.6.6.2.6 2008-08-16 20:40:55 didg Exp $ * * Copyright (c) 1996 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -80,7 +80,7 @@ FILE *f; for ( ofrefnum = 0; ofrefnum < nforks; ofrefnum++ ) { if ( oforks[ ofrefnum ] != NULL ) { - fprintf( f, "%hu <%s>\n", ofrefnum, oforks[ ofrefnum ]->of_name); + fprintf( f, "%hu <%s>\n", ofrefnum, of_name(oforks[ ofrefnum ])); } } } @@ -106,9 +106,10 @@ int of_rename(vol, s_of, olddir, oldpath, newdir, newpath) const struct vol *vol; struct ofork *s_of; struct dir *olddir, *newdir; -const char *oldpath, *newpath; +const char *oldpath _U_, *newpath; { struct ofork *of, *next, *d_ofork; + int done = 0; if (!s_of) return AFP_OK; @@ -120,7 +121,10 @@ const char *oldpath, *newpath; if (vol == of->of_vol && olddir == of->of_dir && s_of->key.dev == of->key.dev && s_of->key.inode == of->key.inode ) { - strlcpy( of->of_name, newpath, of->of_namelen); + if (!done) { + strlcpy( of_name(of), newpath, of->of_ad->ad_m_namelen); + done = 1; + } if (newdir != olddir) { of->of_d_prev->of_d_next = of->of_d_next; of->of_d_next->of_d_prev = of->of_d_prev; @@ -162,7 +166,7 @@ struct stat *st; int i; if (!oforks) { - nforks = (getdtablesize() - 10) / 2; + nforks = getdtablesize() - 10; /* protect against insane ulimit -n */ nforks = min(nforks, 0xffff); oforks = (struct ofork **) calloc(nforks, sizeof(struct ofork *)); @@ -215,12 +219,27 @@ struct stat *st; ad = malloc( sizeof( struct adouble ) ); if (!ad) { LOG(log_error, logtype_afpd, "of_alloc: malloc: %s", strerror(errno) ); + free(of); + oforks[ of_refnum ] = NULL; return NULL; } /* initialize to zero. This is important to ensure that ad_open really does reinitialize the structure. */ - ad_init(ad, vol->v_adouble); + ad_init(ad, vol->v_adouble, vol->v_ad_options); + + ad->ad_m_namelen = 255 +1; + /* here's the deal: we allocate enough for the standard mac file length. + * in the future, we'll reallocate in fairly large jumps in case + * of long unicode names */ + if (( ad->ad_m_name =(char *)malloc( ad->ad_m_namelen )) == NULL ) { + LOG(log_error, logtype_afpd, "of_alloc: malloc: %s", strerror(errno) ); + free(ad); + free(of); + oforks[ of_refnum ] = NULL; + 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. */ @@ -228,7 +247,6 @@ struct stat *st; } of->of_ad = ad; - of->of_vol = vol; of->of_dir = dir; @@ -242,18 +260,6 @@ struct stat *st; d_ofork->of_d_prev = of; } - /* here's the deal: we allocate enough for the standard mac file length. - * in the future, we'll reallocate in fairly large jumps in case - * of long unicode names */ - if (( of->of_name =(char *)malloc(255 + 1)) == NULL ) { - LOG(log_error, logtype_afpd, "of_alloc: malloc: %s", strerror(errno) ); - if (!ad) - free(of->of_ad); - free(of); - oforks[ of_refnum ] = NULL; - return NULL; - } - strlcpy( of->of_name, path, of->of_namelen = 255 + 1); *ofrefnum = refnum; of->of_refnum = refnum; of->key.dev = st->st_dev; @@ -286,10 +292,8 @@ int ret; return ret; } -/* -------------------------- - * assume -*/ -int of_statdir (struct path *path) +/* -------------------------- */ +int of_statdir (const struct vol *vol, struct path *path) { static char pathname[ MAXPATHLEN + 1]; int ret; @@ -300,11 +304,23 @@ int ret; } path->st_errno = 0; path->st_valid = 1; + /* FIXME, what about: we don't have r-x perm anymore ? */ strcpy(pathname, "../"); - strlcat(pathname, path->dir->d_u_name, MAXPATHLEN); - if ((ret = stat(pathname, &path->st)) < 0) - path->st_errno = errno; - return ret; + strlcat(pathname, path->d_dir->d_u_name, MAXPATHLEN); + + if (!(ret = stat(pathname, &path->st))) + return 0; + + path->st_errno = errno; + /* hmm, can't stat curdir anymore */ + if (errno == EACCES && curdir->d_parent ) { + if (movecwd(vol, curdir->d_parent)) + return -1; + path->st_errno = 0; + if ((ret = stat(path->d_dir->d_u_name, &path->st)) < 0) + path->st_errno = errno; + } + return ret; } /* -------------------------- */ @@ -349,12 +365,12 @@ struct ofork *of; } oforks[ of->of_refnum % nforks ] = NULL; - free( of->of_name ); /* 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); @@ -362,3 +378,21 @@ struct ofork *of; free( of ); } + +/* ---------------------- + +*/ +struct adouble *of_ad(const struct vol *vol, struct path *path, struct adouble *ad) +{ + struct ofork *of; + struct adouble *adp; + + if ((of = of_findname(path))) { + adp = of->of_ad; + } else { + ad_init(ad, vol->v_adouble, vol->v_ad_options); + adp = ad; + } + return adp; +} +