X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=etc%2Fafpd%2Fofork.c;h=ed5f732814e7dd5d35ad2aa088c319a2f3d3d8e6;hp=a6359ad29329373e5db2fdb7b673cfbf3fee6241;hb=5116ed2346ea7ee6e5a9858dee94f3eacdc00d7e;hpb=e6a19801e7d0ad53350a396b4a7f3d5762d4fc1a diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index a6359ad2..ed5f7328 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -1,6 +1,4 @@ /* - * $Id: ofork.c,v 1.32 2010/03/12 15:16:49 franklahm Exp $ - * * Copyright (c) 1996 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. */ @@ -28,6 +26,7 @@ #include "volume.h" #include "directory.h" #include "fork.h" +#include "fce_api.h" /* we need to have a hashed list of oforks (by dev inode). just hash * by first letter. */ @@ -108,7 +107,7 @@ int of_rename(const struct vol *vol, struct dir *olddir, const char *oldpath _U_, struct dir *newdir, const char *newpath) { - struct ofork *of, *next, *d_ofork; + struct ofork *of, *next; int done = 0; if (!s_of) @@ -118,30 +117,16 @@ int of_rename(const struct vol *vol, while ((of = next)) { next = next->next; /* so we can unhash and still be all right. */ - if (vol == of->of_vol && olddir == of->of_dir && - s_of->key.dev == of->key.dev && - s_of->key.inode == of->key.inode ) { + if (vol == of->of_vol + && olddir->d_did == of->of_did + && s_of->key.dev == of->key.dev + && s_of->key.inode == of->key.inode ) { 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; - if (of->of_dir->d_ofork == of) { - of->of_dir->d_ofork = (of == of->of_d_next) ? NULL : of->of_d_next; - } - of->of_dir = newdir; - if (!(d_ofork = newdir->d_ofork)) { - newdir->d_ofork = of; - of->of_d_next = of->of_d_prev = of; - } else { - of->of_d_next = d_ofork; - of->of_d_prev = d_ofork->of_d_prev; - of->of_d_prev->of_d_next = of; - d_ofork->of_d_prev = of; - } - } + if (newdir != olddir) + of->of_did = newdir->d_did; } } @@ -159,7 +144,7 @@ of_alloc(struct vol *vol, struct adouble *ad, struct stat *st) { - struct ofork *of, *d_ofork; + struct ofork *of; u_int16_t refnum, of_refnum; int i; @@ -227,7 +212,7 @@ of_alloc(struct vol *vol, ad_open really does reinitialize the structure. */ ad_init(ad, vol->v_adouble, vol->v_ad_options); - ad->ad_m_namelen = 255 +1; + ad->ad_m_namelen = UTF8FILELEN_EARLY +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 */ @@ -247,17 +232,7 @@ of_alloc(struct vol *vol, of->of_ad = ad; of->of_vol = vol; - of->of_dir = dir; - - if (!(d_ofork = dir->d_ofork)) { - dir->d_ofork = of; - of->of_d_next = of->of_d_prev = of; - } else { - of->of_d_next = d_ofork; - of->of_d_prev = d_ofork->of_d_prev; - d_ofork->of_d_prev->of_d_next = of; - d_ofork->of_d_prev = of; - } + of->of_did = dir->d_did; *ofrefnum = refnum; of->of_refnum = refnum; @@ -290,7 +265,7 @@ int of_stat(struct path *path) if ((ret = lstat(path->u_name, &path->st)) < 0) { LOG(log_debug, logtype_afpd, "of_stat('%s/%s': %s)", - cfrombstring(curdir->d_fullpath), path->u_name, strerror(errno)); + cfrombstr(curdir->d_fullpath), path->u_name, strerror(errno)); path->st_errno = errno; } @@ -298,7 +273,7 @@ int of_stat(struct path *path) } -#ifdef HAVE_RENAMEAT +#ifdef HAVE_ATFUNCS int of_fstatat(int dirfd, struct path *path) { int ret; @@ -311,7 +286,7 @@ int of_fstatat(int dirfd, struct path *path) return ret; } -#endif /* HAVE_RENAMEAT */ +#endif /* HAVE_ATFUNCS */ /* -------------------------- stat the current directory. @@ -335,7 +310,7 @@ int of_statdir(struct vol *vol, struct path *path) len = blength(path->d_dir->d_u_name); if (len > (MAXPATHLEN - 3)) len = MAXPATHLEN - 3; - strncpy(pathname + 3, cfrombstring(path->d_dir->d_u_name), len + 1); + strncpy(pathname + 3, cfrombstr(path->d_dir->d_u_name), len + 1); LOG(log_debug, logtype_afpd, "of_statdir: stating: '%s'", pathname); @@ -350,7 +325,7 @@ int of_statdir(struct vol *vol, struct path *path) return -1; path->st_errno = 0; - if ((ret = lstat(cfrombstring(path->d_dir->d_u_name), &path->st)) < 0) + if ((ret = lstat(cfrombstr(path->d_dir->d_u_name), &path->st)) < 0) path->st_errno = errno; } @@ -391,7 +366,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; @@ -423,14 +398,6 @@ void of_dealloc( struct ofork *of) return; of_unhash(of); - - /* detach ofork */ - of->of_d_prev->of_d_next = of->of_d_next; - of->of_d_next->of_d_prev = of->of_d_prev; - if (of->of_dir->d_ofork == of) { - of->of_dir->d_ofork = (of == of->of_d_next) ? NULL : of->of_d_next; - } - oforks[ of->of_refnum % nforks ] = NULL; /* decrease refcount */ @@ -473,6 +440,12 @@ int of_closefork(struct ofork *ofork) } } } + + /* Somone has used write_fork, we assume file was changed, register it to file change event api */ + if (ofork->of_flags & AFPFORK_MODIFIED) { + fce_register_file_modification(ofork); + } + ret = 0; if ( ad_close( ofork->of_ad, adflags ) < 0 ) { ret = -1; @@ -519,3 +492,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; +} +