]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/enumerate.c
bugfix: cache handling when inodes are reused.
[netatalk.git] / etc / afpd / enumerate.c
index 0bb64e463c0509d0700f19958986c0d9a249c198..469d1bce2540240c4c34e3286c1063177d623ce8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: enumerate.c,v 1.35 2003-03-09 19:55:34 didg Exp $
+ * $Id: enumerate.c,v 1.38 2003-04-16 06:55:44 didg Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -48,6 +48,7 @@ struct path     *path;
     char        *name;
     char        *upath;
     struct stat *st;
+    int         deleted;
 
     upath = path->u_name;
     name  = path->m_name;    
@@ -75,15 +76,17 @@ struct path     *path;
            - it's an ID reused as above
            - it's a hash duplicate and we are in big trouble
         */
+        deleted = (edir->d_m_name == NULL);
         dirfreename(edir);
         edir->d_m_name = cdir->d_m_name;
         edir->d_u_name = cdir->d_u_name;
         free(cdir);
         cdir = edir;
-        if (!cdir->d_parent || cdir->d_parent == dir)
+        if (!cdir->d_parent || (cdir->d_parent == dir && !deleted))
             return cdir;
         /* the old was not in the same folder */
-       dirchildremove(cdir->d_parent, cdir);
+        if (!deleted)
+            dirchildremove(cdir->d_parent, cdir);
     }
 
     /* parent/child directories */
@@ -103,19 +106,20 @@ struct savedir {
     char        *sd_last;
     unsigned int sd_sindex;
 };
-#define SDBUFBRK       1024
+#define SDBUFBRK       2048
 
 static int enumerate_loop(struct dirent *de, char *mname, void *data)
 {
     struct savedir *sd = data; 
     char *start, *end;
-    int  len;
+    int  len,lenm;
     
     end = sd->sd_buf + sd->sd_buflen;
     len = strlen(de->d_name);
     *(sd->sd_last)++ = len;
+    lenm = strlen(mname);
 
-    if ( sd->sd_last + len + 2 > end ) {
+    if ( sd->sd_last + len +lenm + 4 > end ) {
         char *buf;
 
         start = sd->sd_buf;
@@ -133,6 +137,11 @@ static int enumerate_loop(struct dirent *de, char *mname, void *data)
 
     memcpy( sd->sd_last, de->d_name, len + 1 );
     sd->sd_last += len + 1;
+
+    *(sd->sd_last)++ = lenm;
+    memcpy( sd->sd_last, mname, lenm + 1 );
+    sd->sd_last += lenm + 1;
+    
     return 0;
 }
 
@@ -305,7 +314,7 @@ int     ext;
 
     *rbuflen = 0;
     if (NULL == o_path ) {
-        return afp_errno;
+        return get_afp_errno(AFPERR_NOOBJ); 
     }
     if ( *o_path->m_name != '\0') {
         /* it's a file or it's a dir and extendir() was unable to chdir in it */
@@ -362,6 +371,8 @@ int     ext;
             return( AFPERR_NOOBJ );
         }
         sd.sd_last += len + 1;
+        len = *(sd.sd_last)++;
+        sd.sd_last += len + 1;
         sd.sd_sindex++;
     }
 
@@ -383,6 +394,8 @@ int     ext;
         if (*sd.sd_last == 0) {
             /* stat() already failed on this one */
             sd.sd_last += len + 1;
+            len = *(sd.sd_last)++;
+            sd.sd_last += len + 1;
             continue;
         }
         s_path.u_name = sd.sd_last;
@@ -398,10 +411,16 @@ int     ext;
              */
             *sd.sd_last = 0;
             sd.sd_last += len + 1;
+            len = *(sd.sd_last)++;
+            sd.sd_last += len + 1;
             curdir->offcnt--;          /* a little lie */
             continue;
         }
 
+        sd.sd_last += len + 1;
+        len = *(sd.sd_last)++;
+        s_path.m_name = sd.sd_last;
+        sd.sd_last += len + 1;
         /*
          * If a fil/dir is not a dir, it's a file. This is slightly
          * inaccurate, since that means /dev/null is a file, /dev/printer
@@ -409,12 +428,10 @@ int     ext;
          */
         if ( S_ISDIR(s_path.st.st_mode)) {
             if ( dbitmap == 0 ) {
-                sd.sd_last += len + 1;
                 continue;
             }
             dir = dirsearch_byname(curdir, s_path.u_name);
             if (!dir) {
-                s_path.m_name = utompath(vol, s_path.u_name, utf8_encoding() );
                 if (s_path.m_name == NULL || (dir = adddir( vol, curdir, &s_path)) == NULL) {
                     return AFPERR_MISC;
                 }
@@ -429,10 +446,8 @@ int     ext;
 
         } else {
             if ( fbitmap == 0 ) {
-                sd.sd_last += len + 1;
                 continue;
             }
-            s_path.m_name = utompath(vol, s_path.u_name, utf8_encoding());
             if (s_path.m_name == NULL ) {
                 return AFPERR_MISC;
             }
@@ -481,7 +496,6 @@ int     ext;
         }
         data += esz;
         actcnt++;
-        sd.sd_last += len + 1;
     }
 
     if ( actcnt == 0 ) {