]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/ofork.c
Symlink patch from Anton Starikov
[netatalk.git] / etc / afpd / ofork.c
index 1d59b06115e69501a605fa9f81ede423aaa70809..75f89eba038646a86f822f2248b7930fe01896e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ofork.c,v 1.26 2008-08-16 21:11:36 didg Exp $
+ * $Id: ofork.c,v 1.30.2.1 2010-01-02 10:22:32 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;
 
@@ -102,11 +101,11 @@ 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;
@@ -151,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;
@@ -287,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) {
@@ -305,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;
@@ -317,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;
@@ -349,8 +350,7 @@ struct ofork *
     return NULL;
 }
 
-void of_dealloc( of )
-struct ofork   *of;
+void of_dealloc( struct ofork *of)
 {
     if (!oforks)
         return;