2 * $Id: mangle.c,v 1.15 2003-03-09 19:55:35 didg Exp $
4 * Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
5 * All Rights Reserved. See COPYRIGHT.
7 * mangle, demangle (filename):
8 * mangle or demangle filenames if they are greater than the max allowed
9 * characters for a given version of AFP.
14 #endif /* HAVE_CONFIG_H */
20 demangle(const struct vol *vol, char *mfilename) {
21 char *filename = NULL;
26 /* Is this really a mangled file? */
27 mangle = strstr(mfilename, MANGLE_CHAR);
32 if (NULL != (ext = strrchr(mfilename, '.')) ) {
33 ext_len = strlen(ext);
35 if (strlen(mangle) != strlen(MANGLE_CHAR) + MANGLE_LENGTH + ext_len) {
39 filename = cnid_mangle_get(vol->v_db, mfilename);
41 /* No unmangled filename was found. */
42 if (filename == NULL) {
44 LOG(log_debug, logtype_afpd, "demangle: Unable to lookup %s in the mangle database", mfilename);
51 /* -----------------------
52 with utf8 filename not always round trip
53 filename mac filename too long or with unmatchable utf8 replaced with _
57 mangle(const struct vol *vol, char *filename, char *uname, int flags) {
61 static char mfilename[MAX_LENGTH + 1];
62 char mangle_suffix[MANGLE_LENGTH + 1];
64 int mangle_suffix_int = 0;
66 /* Do we really need to mangle this filename? */
67 if (!flags && strlen(filename) <= vol->max_filename) {
70 /* First, attempt to locate a file extension. */
71 if (NULL != (ext = strrchr(filename, '.')) ) {
72 ext_len = strlen(ext);
73 if (ext_len > MAX_EXT_LENGTH) {
74 /* Do some bounds checking to prevent an extension overflow. */
75 ext_len = MAX_EXT_LENGTH;
79 /* Check to see if we already have a mangled filename by this name. */
82 strncpy(m, filename, MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len);
83 m[MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len] = '\0';
85 strcat(m, MANGLE_CHAR);
86 (void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
87 strcat(m, mangle_suffix);
90 strncat(m, ext, ext_len);
93 tf = cnid_mangle_get(vol->v_db, m);
94 if (tf == NULL || (strcmp(tf, uname)) == 0) {
98 if (++mangle_suffix_int > MAX_MANGLE_SUFFIX_LENGTH) {
99 LOG(log_error, logtype_afpd, "mangle: Failed to find a free mangle suffix; returning original filename");
105 if (cnid_mangle_add(vol->v_db, m, uname) < 0) {
111 #endif /* FILE_MANGLING */