X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fmangle.c;h=21bd80f30037c9bba3bd61b9b834c02b1c911089;hb=HEAD;hp=7769542df4a4fe8e9df8a8f94043bbab57b42866;hpb=4178967bf281a63438b3c076db90057ff2195f98;p=netatalk.git diff --git a/etc/afpd/mangle.c b/etc/afpd/mangle.c index 7769542d..21bd80f3 100644 --- a/etc/afpd/mangle.c +++ b/etc/afpd/mangle.c @@ -1,6 +1,4 @@ /* - * $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. * @@ -32,7 +30,7 @@ static size_t mangle_extension(const struct vol *vol, const char* uname, char *p = strrchr(uname, '.'); if (p && p != uname) { - u_int16_t flags = CONV_FORCE | CONV_UNESCAPEHEX; + uint16_t flags = CONV_FORCE | CONV_UNESCAPEHEX; size_t len = convert_charset(vol->v_volcharset, charset, vol->v_maccharset, p, strlen(p), extension, MAX_EXT_LENGTH, &flags); @@ -44,7 +42,7 @@ static size_t mangle_extension(const struct vol *vol, const char* uname, static char *demangle_checks(const struct vol *vol, char* uname, char * mfilename, size_t prefix, char * ext) { - u_int16_t flags; + uint16_t flags; static char buffer[MAXPATHLEN +2]; /* for convert_charset dest_len parameter +2 */ size_t len; size_t mfilenamelen; @@ -138,7 +136,7 @@ private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx { char *t; char *u_name; - u_int32_t id, file_id; + uint32_t id, file_id; static char buffer[12 + MAXPATHLEN + 1]; int len = 12 + MAXPATHLEN + 1; struct dir *dir; @@ -182,11 +180,11 @@ private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx } if (!osx) { /* it's not from cname so mfilename and dir must be the same */ - if (strcmp(cfrombstring(dir->d_m_name), mfilename) == 0) { - return cfrombstring(dir->d_u_name); + if (strcmp(cfrombstr(dir->d_m_name), mfilename) == 0) { + return cfrombstr(dir->d_u_name); } } else { - return demangle_checks(vol, cfrombstring(dir->d_u_name), mfilename, prefix, t); + return demangle_checks(vol, cfrombstr(dir->d_u_name), mfilename, prefix, t); } } else if (NULL != (u_name = cnid_resolve(vol->v_cdb, &id, buffer, len)) ) { @@ -195,7 +193,7 @@ private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx } if (!osx) { /* convert back to mac name and check it's the same */ - t = utompath(vol, u_name, file_id, utf8_encoding()); + t = utompath(vol, u_name, file_id, utf8_encoding(vol->v_obj)); if (!strcmp(t, mfilename)) { return u_name; } @@ -225,13 +223,22 @@ demangle_osx(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *fileid) return private_demangle(vol, mfilename, did, fileid); } +/* ------------------------------------------------------- + FIXME !!! + + Early Mac OS X (10.0-10.4.?) had the limitation up to 255 Byte. + Current implementation is: + volcharset -> UTF16-MAC -> truncated 255 UTF8-MAC + + Recent Mac OS X (10.4.?-) don't have this limitation. + Desirable implementation is: + volcharset -> truncated 510 UTF16-MAC -> UTF8-MAC -/* ----------------------- + ------------------------ with utf8 filename not always round trip filename mac filename too long or first chars if unmatchable chars. uname unix filename id file/folder ID or 0 - */ char * mangle(const struct vol *vol, char *filename, size_t filenamelen, char *uname, cnid_t id, int flags) { @@ -243,7 +250,7 @@ mangle(const struct vol *vol, char *filename, size_t filenamelen, char *uname, c size_t maxlen; int k; - maxlen = (flags & 2)?255:MACFILELEN; /* was vol->max_filename */ + maxlen = (flags & 2)?UTF8FILELEN_EARLY:MACFILELEN; /* was vol->max_filename */ /* Do we really need to mangle this filename? */ if (!(flags & 1) && filenamelen <= maxlen) { return filename; @@ -259,7 +266,7 @@ mangle(const struct vol *vol, char *filename, size_t filenamelen, char *uname, c k = sprintf(mangle_suffix, "%c%X", MANGLE_CHAR, ntohl(id)); if (filenamelen + k + ext_len > maxlen) { - u_int16_t opt = CONV_FORCE | CONV_UNESCAPEHEX; + uint16_t opt = CONV_FORCE | CONV_UNESCAPEHEX; size_t n = convert_charset(vol->v_volcharset, (flags & 2) ? CH_UTF8_MAC : vol->v_maccharset, vol->v_maccharset, uname, strlen(uname),