/*
- * $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.
int len;
int olen = 0;
u_int32_t hint;
+ u_int16_t len16;
int size = 0;
char sep;
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 = '/';
return &ret;
}
- if ( *data == '\0' ) {
+ if (!*data || *data == sep ) {
data++;
len--;
}
/* 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 );
{
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;
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 );
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;
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 ) {
if (of_stat(s_path) < 0) {
return AFPERR_MISC;
}
+ curdir->offcnt++;
if ((dir = adddir( vol, curdir, s_path)) == NULL) {
return AFPERR_MISC;
}
}
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;
sfunc = (unsigned char) *ibuf++;
memcpy( &id, ibuf, sizeof( id ));
- *rbuflen = 0;
id = ntohl(id);
+ *rbuflen = 0;
if ( id != 0 ) {
switch ( sfunc ) {
break;
default :
- *rbuflen = 0;
return( AFPERR_PARAM );
}
switch ( sfunc ) {
}
else {
*rbuf++ = len;
- *rbuflen++;
+ *rbuflen += 1;
}
if ( len > 0 ) {
memcpy( rbuf, name, len );