X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=etc%2Fafpd%2Fofork.c;h=d9c4f31e8e5b0d2685b740a9cddf0dc6a8303fa7;hp=0c8c5feb8f8be39a83d1c6b24c392aeeb9186a4a;hb=2bf71d3ccf20c072bc67a9d075b6ac8b0798021e;hpb=a44aaa274efb6ba49b701fc2375005bbcef62f2a diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index 0c8c5feb..d9c4f31e 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -1,5 +1,5 @@ /* - * $Id: ofork.c,v 1.23 2005-07-20 21:23:52 didg Exp $ + * $Id: ofork.c,v 1.31 2010-02-10 14:05:37 franklahm Exp $ * * Copyright (c) 1996 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -38,7 +38,7 @@ static u_short lastrefnum = 0; /* OR some of each character for the hash*/ -static __inline__ unsigned long hashfn(const struct file_key *key) +static unsigned long hashfn(const struct file_key *key) { #if 0 unsigned long i = 0; @@ -49,7 +49,7 @@ static __inline__ unsigned long hashfn(const struct file_key *key) return key->inode & (OFORK_HASHSIZE - 1); } -static __inline__ void of_hash(struct ofork *of) +static void of_hash(struct ofork *of) { struct ofork **table; @@ -60,7 +60,7 @@ static __inline__ void of_hash(struct ofork *of) of->prevp = table; } -static __inline__ void of_unhash(struct ofork *of) +static void of_unhash(struct ofork *of) { if (of->prevp) { if (of->next) @@ -70,8 +70,7 @@ static __inline__ void of_unhash(struct ofork *of) } #ifdef DEBUG1 -void of_pforkdesc( f ) -FILE *f; +void of_pforkdesc( FILE *f) { int ofrefnum; @@ -80,7 +79,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 ])); } } } @@ -102,13 +101,14 @@ int of_flush(const struct vol *vol) return( 0 ); } -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 _U_, *newpath; +int of_rename( + const struct vol *vol, + struct ofork *s_of, + struct dir *olddir, const char *oldpath _U_, + struct dir *newdir, const char *newpath) { struct ofork *of, *next, *d_ofork; + int done = 0; if (!s_of) return AFP_OK; @@ -120,7 +120,10 @@ const char *oldpath _U_, *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; @@ -147,14 +150,13 @@ const char *oldpath _U_, *newpath; #define min(a,b) ((a)<(b)?(a):(b)) struct ofork * - of_alloc(vol, dir, path, ofrefnum, eid, ad, st) -struct vol *vol; -struct dir *dir; -char *path; -u_int16_t *ofrefnum; -const int eid; -struct adouble *ad; -struct stat *st; +of_alloc(struct vol *vol, + struct dir *dir, + char *path, + u_int16_t *ofrefnum, + const int eid, + struct adouble *ad, + struct stat *st) { struct ofork *of, *d_ofork; u_int16_t refnum, of_refnum; @@ -162,7 +164,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 *)); @@ -210,23 +212,11 @@ struct stat *st; } of = oforks[of_refnum]; - /* 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 */ - of->of_namelen = 255 +1; - if (( of->of_name =(char *)malloc( of->of_namelen )) == NULL ) { - LOG(log_error, logtype_afpd, "of_alloc: malloc: %s", strerror(errno) ); - free(of); - oforks[ of_refnum ] = NULL; - return NULL; - } - /* see if we need to allocate space for the adouble struct */ if (!ad) { ad = malloc( sizeof( struct adouble ) ); if (!ad) { LOG(log_error, logtype_afpd, "of_alloc: malloc: %s", strerror(errno) ); - free(of->of_name); free(of); oforks[ of_refnum ] = NULL; return NULL; @@ -235,6 +225,19 @@ struct stat *st; /* initialize to zero. This is important to ensure that ad_open really does reinitialize the structure. */ 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. */ @@ -255,7 +258,6 @@ struct stat *st; d_ofork->of_d_prev = of; } - strlcpy( of->of_name, path, of->of_namelen); *ofrefnum = refnum; of->of_refnum = refnum; of->key.dev = st->st_dev; @@ -283,15 +285,19 @@ int of_stat (struct path *path) int ret; path->st_errno = 0; path->st_valid = 1; - if ((ret = stat(path->u_name, &path->st)) < 0) + if ((ret = lstat(path->u_name, &path->st)) < 0) path->st_errno = errno; return ret; } -/* -------------------------- */ -int of_statdir (const struct vol *vol, struct path *path) +/* -------------------------- + stat the current directory. + stat(".") works even if "." is deleted thus + we have to stat ../name because we want to know if it's there +*/ +int of_statdir (struct vol *vol, struct path *path) { -static char pathname[ MAXPATHLEN + 1]; +static char pathname[ MAXPATHLEN + 1] = "../"; int ret; if (*path->m_name) { @@ -301,10 +307,9 @@ 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->d_dir->d_u_name, MAXPATHLEN); + strlcpy(pathname +3, path->d_dir->d_u_name, sizeof (pathname) -3); - if (!(ret = stat(pathname, &path->st))) + if (!(ret = lstat(pathname, &path->st))) return 0; path->st_errno = errno; @@ -313,7 +318,7 @@ int ret; if (movecwd(vol, curdir->d_parent)) return -1; path->st_errno = 0; - if ((ret = stat(path->d_dir->d_u_name, &path->st)) < 0) + if ((ret = lstat(path->d_dir->d_u_name, &path->st)) < 0) path->st_errno = errno; } return ret; @@ -345,8 +350,7 @@ struct ofork * return NULL; } -void of_dealloc( of ) -struct ofork *of; +void of_dealloc( struct ofork *of) { if (!oforks) return; @@ -361,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); @@ -383,10 +387,10 @@ int of_closefork(struct ofork *ofork) int ret; adflags = 0; - if ((ofork->of_flags & AFPFORK_DATA) && (ad_dfileno( ofork->of_ad ) != -1)) { + if ((ofork->of_flags & AFPFORK_DATA) && (ad_data_fileno( ofork->of_ad ) != -1)) { adflags |= ADFLAGS_DF; } - if ( (ofork->of_flags & AFPFORK_OPEN) && ad_hfileno( ofork->of_ad ) != -1 ) { + 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. @@ -398,7 +402,7 @@ int of_closefork(struct ofork *ofork) doflush++; } if ( doflush ) { - ad_flush( ofork->of_ad, adflags ); + ad_flush( ofork->of_ad ); } } }