]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/directory.c
long name an utf8 name in the same query (copy the same name for now). More
[netatalk.git] / etc / afpd / directory.c
index f76df1a395dbf33bfe8d176f14754eaefde15dd0..c03c47ba5113ee95f4fc63b736f38d41613bee7e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: directory.c,v 1.44 2002-10-12 17:27:18 didg Exp $
+ * $Id: directory.c,v 1.49 2002-10-25 11:10:46 didg Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -816,6 +816,7 @@ char        **cpath;
     int                        len;
     int                        olen = 0;
     u_int32_t   hint;
+    u_int16_t   len16;
     int         size = 0;
     char        sep;
                
@@ -830,9 +831,12 @@ char       **cpath;
     case 3:
        if (afp_version >= 30) {
            data++;
-           hint = ntohl(*data);
-           data += 4;
-           len = ntohs(*data);
+           memcpy(&hint, data, sizeof(hint));
+           hint = ntohl(hint);
+           data += sizeof(hint);
+           
+           memcpy(&len16, data, sizeof(len16));
+           len = ntohs(len16);
            data += 2;
            size = 7;
            sep = '/';
@@ -885,7 +889,7 @@ char        **cpath;
             return &ret;
         }
 
-        if ( *data == '\0' ) {
+        if (!*data || *data == sep ) {
             data++;
             len--;
         }
@@ -939,7 +943,8 @@ char        **cpath;
                        /* dir is not valid anymore 
                           we delete dir from the cache and abort.
                        */
-                       dir_invalidate(vol, dir);
+                       if ( dir->d_did != DIRDID_ROOT_PARENT) 
+                           dir_invalidate(vol, dir);
                         return NULL;
                     }
                     cdir = extenddir( vol, dir, &ret );
@@ -1042,7 +1047,7 @@ int getdirparams(const struct vol *vol,
 {
     struct maccess     ma;
     struct adouble     ad;
-    char               *data, *nameoff = NULL;
+    char               *data, *l_nameoff = NULL, *utf_nameoff = NULL;
     int                        bit = 0, isad = 0;
     u_int32_t           aint;
     u_int16_t          ashort;
@@ -1138,7 +1143,7 @@ int getdirparams(const struct vol *vol,
 
         case DIRPBIT_LNAME :
             if (dir->d_m_name) /* root of parent can have a null name */
-                nameoff = data;
+                l_nameoff = data;
             else
                 memset(data, 0, sizeof(u_int16_t));
             data += sizeof( u_int16_t );
@@ -1198,10 +1203,13 @@ int getdirparams(const struct vol *vol,
             if (afp_version >= 30) { /* UTF8 name */
                 utf8 = kTextEncodingUTF8;
                 if (dir->d_m_name) /* root of parent can have a null name */
-                    nameoff = data;
+                    utf_nameoff = data;
                 else
                     memset(data, 0, sizeof(u_int16_t));
                 data += sizeof( u_int16_t );
+                aint = 0;
+                memcpy(data, &aint, sizeof( aint ));
+                data += sizeof( aint );
             }
             else { /* ProDOS Info Block */
                 *data++ = 0x0f;
@@ -1223,9 +1231,14 @@ int getdirparams(const struct vol *vol,
         bitmap = bitmap>>1;
         bit++;
     }
-    if ( nameoff ) {
+    if ( l_nameoff ) {
+        ashort = htons( data - buf );
+        memcpy( l_nameoff, &ashort, sizeof( ashort ));
+        data = set_name(data, dir->d_m_name, 0);
+    }
+    if ( utf_nameoff ) {
         ashort = htons( data - buf );
-        memcpy( nameoff, &ashort, sizeof( ashort ));
+        memcpy( utf_nameoff, &ashort, sizeof( ashort ));
         data = set_name(data, dir->d_m_name, utf8);
     }
     if ( isad ) {
@@ -1680,6 +1693,7 @@ int               ibuflen, *rbuflen;
     if (of_stat(s_path) < 0) {
         return AFPERR_MISC;
     }
+    curdir->offcnt++;
     if ((dir = adddir( vol, curdir, s_path)) == NULL) {
         return AFPERR_MISC;
     }
@@ -1689,7 +1703,7 @@ int               ibuflen, *rbuflen;
     }
 
     memset(&ad, 0, sizeof(ad));
-    if (ad_open( "", vol_noadouble(vol)|ADFLAGS_HF|ADFLAGS_DIR,
+    if (ad_open( ".", vol_noadouble(vol)|ADFLAGS_HF|ADFLAGS_DIR,
                  O_RDWR|O_CREAT, 0666, &ad ) < 0)  {
         if (vol_noadouble(vol))
             goto createdir_done;
@@ -1972,8 +1986,8 @@ int               ibuflen, *rbuflen;
     sfunc = (unsigned char) *ibuf++;
     memcpy( &id, ibuf, sizeof( id ));
 
-    *rbuflen = 0;
     id = ntohl(id);
+    *rbuflen = 0;
 
     if ( id != 0 ) {
         switch ( sfunc ) {
@@ -1994,7 +2008,6 @@ int               ibuflen, *rbuflen;
             break;
 
         default :
-            *rbuflen = 0;
             return( AFPERR_PARAM );
         }
         switch ( sfunc ) {
@@ -2021,7 +2034,7 @@ int               ibuflen, *rbuflen;
     }
     else {
         *rbuf++ = len;
-        *rbuflen++;
+        *rbuflen += 1;
     }
     if ( len > 0 ) {
         memcpy( rbuf, name, len );