/*
- * $Id: directory.c,v 1.131.2.2 2010-02-01 12:59:09 franklahm Exp $
+ * $Id: directory.c,v 1.131.2.3 2010-02-01 14:25:45 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
* o setdirparams doesn't change parent mdate anymore
* o catsearch doesn't work, see FIXMEs in catsearch.c
* o curdir per volume caching is gone
+ * o directory offspring count calculation probably broken
*/
char *t;
cnid_t fileid;
- LOG(log_maxdebug, logtype_afpd, "cname_mtouname('%s', toUTF8:%u)", ret->m_name, toUTF8);
-
if (afp_version >= 30) {
if (toUTF8) {
if (dir->d_did == DIRDID_ROOT_PARENT) {
/* check for OS X mangled filename :( */
t = demangle_osx(vol, ret->m_name, dir->d_did, &fileid);
+ LOG(log_maxdebug, logtype_afpd, "cname_mtouname('%s',did:%u) {demangled:'%s', fileid:%u}",
+ ret->m_name, ntohl(dir->d_did), t, ntohl(fileid));
+
if (t != ret->m_name) {
ret->u_name = t;
/* duplicate work but we can't reuse all convert_char we did in demangle_osx
return err;
}
- LOG(log_debug, logtype_afpd, "afp_createdir: alive1");
-
if (of_stat(s_path) < 0) {
return AFPERR_MISC;
}
- LOG(log_debug, logtype_afpd, "afp_createdir: alive2");
+
curdir->offcnt++;
- LOG(log_debug, logtype_afpd, "afp_createdir: alive3");
+
if ((dir = dir_add(vol, curdir, s_path, strlen(s_path->u_name))) == NULL) {
return AFPERR_MISC;
}
- LOG(log_debug, logtype_afpd, "afp_createdir: alive4");
+
if ( movecwd( vol, dir ) < 0 ) {
return( AFPERR_PARAM );
}
- LOG(log_debug, logtype_afpd, "afp_createdir: alive5");
+
ad_init(&ad, vol->v_adouble, vol->v_ad_options);
if (ad_open_metadata( ".", ADFLAGS_DIR, O_CREAT, &ad ) < 0) {
if (vol_noadouble(vol))
/*
- * $Id: mangle.c,v 1.19.4.1 2010-02-01 10:56:08 franklahm Exp $
+ * $Id: mangle.c,v 1.19.4.2 2010-02-01 14:25:45 franklahm Exp $
*
* Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
* All Rights Reserved. See COPYRIGHT.
#include <stdio.h>
#include <ctype.h>
+
+#include <atalk/util.h>
+#include <atalk/bstradd.h>
+
#include "mangle.h"
#include "desktop.h"
-#include <atalk/util.h>
+
#define hextoint( c ) ( isdigit( c ) ? c - '0' : c + 10 - 'A' )
#define isuxdigit(x) (isdigit(x) || (isupper(x) && isxdigit(x)))
return 0;
}
-static char *demangle_checks ( const struct vol *vol, char* uname, char * mfilename, size_t prefix, char * ext)
+static char *demangle_checks(const struct vol *vol, char* uname, char * mfilename, size_t prefix, char * ext)
{
u_int16_t flags;
static char buffer[MAXPATHLEN +2]; /* for convert_charset dest_len parameter +2 */
/* We need to check, whether we really need to demangle the filename */
/* i.e. it's not just a file with a valid #HEX in the name ... */
/* but we don't want to miss valid demangle as well. */
-
/* check whether file extensions match */
- {
- char buf[MAX_EXT_LENGTH + 2]; /* for convert_charset dest_len parameter +2 */
- size_t ext_len = mangle_extension(vol, uname, buf, CH_UTF8_MAC);
- if (ext_len) {
- buf[ext_len] = '\0';
- if (strcmp(ext, buf)) return mfilename;
- } else {
- if (*ext) return mfilename;
- }
+ char buf[MAX_EXT_LENGTH + 2]; /* for convert_charset dest_len parameter +2 */
+ size_t ext_len = mangle_extension(vol, uname, buf, CH_UTF8_MAC);
+
+ if (ext_len) {
+ buf[ext_len] = '\0';
+ if (strcmp(ext, buf))
+ return mfilename;
+ } else {
+ if (*ext)
+ return mfilename;
}
/* First we convert the unix name to our volume maccharset */
/* is it a dir?, there's a conflict with pre OSX 'trash #2' */
if ((dir = dirlookup(vol, id))) {
- if (dir->d_did != did) {
+ if (dir->d_pdid != did) {
/* not in the same folder, there's a race with outdate cache
* but we have to live with it, hopefully client will recover
*/
}
if (!osx) {
/* it's not from cname so mfilename and dir must be the same */
- if (strcmp((char *)dir->d_m_name->data, mfilename) == 0) {
- return (char *)dir->d_u_name->data;
+ if (strcmp(cfrombstring(dir->d_m_name), mfilename) == 0) {
+ return cfrombstring(dir->d_u_name);
}
- }
- else {
- return demangle_checks (vol, (char *)dir->d_u_name->data, mfilename, prefix, t);
- }
+ } else {
+ return demangle_checks(vol, cfrombstring(dir->d_u_name), mfilename, prefix, t);
+ }
}
else if (NULL != (u_name = cnid_resolve(vol->v_cdb, &id, buffer, len)) ) {
if (id != did) {