2 * $Id: mangle.c,v 1.6 2002-06-03 22:55:27 jmarcus 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 LOG(log_error, logtype_default, "demangle: Calling demangle on %s", mfilename);
28 /* Is this really a mangled file? */
29 mangle = strstr(mfilename, MANGLE_CHAR);
31 LOG(log_error, logtype_default, "demangle: %s is not a mangled filename", mfilename);
35 if ((ext = strrchr(mfilename, '.')) != NULL) {
36 ext_len = strlen(ext);
38 if (strlen(mangle) != strlen(MANGLE_CHAR) + MANGLE_LENGTH + ext_len) {
39 LOG(log_error, logtype_default, "demangle: %s is not long enough to be a mangled filename", mfilename);
43 LOG(log_error, logtype_default, "demangle: Looking up %s in the mangle database", mfilename);
44 filename = cnid_mangle_get(vol->v_db, mfilename);
46 /* No unmangled filename was found. */
47 if (filename == NULL) {
48 LOG(log_error, logtype_default, "demangle: Unable to lookup %s in the mangle database", mfilename);
52 LOG(log_error, logtype_default, "demangle: Returning %s as the unmangled filename for %s", filename, mfilename);
57 mangle(const struct vol *vol, char *filename) {
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 (strlen(filename) <= MAX_LENGTH) {
71 /* First, attmept to locate a file extension. */
72 if ((ext = strrchr(filename, '.')) != NULL) {
73 ext_len = strlen(ext);
76 /* Check to see if we already have a mangled filename by this name. */
79 strncpy(m, filename, MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len);
80 m[MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len] = '\0';
82 strcat(m, MANGLE_CHAR);
83 (void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
84 strcat(m, mangle_suffix);
90 LOG(log_error, logtype_default, "mangle: Looking up %s in the mangle database", m);
91 tf = cnid_mangle_get(vol->v_db, m);
92 if (tf == NULL || (strcmp(tf, filename)) == 0) {
96 if (++mangle_suffix_int > MAX_MANGLE_SUFFIX_LENGTH) {
97 LOG(log_error, logtype_default, "mangle: Failed to find a free mangle suffix; returning original filename");
103 LOG(log_error, logtype_default, "mangle: Adding %s to the mangle database as the mangled filename for %s", m, filename);
104 if (cnid_mangle_add(vol->v_db, m, filename) < 0) {
108 LOG(log_error, logtype_default, "mangle: Returning %s", m);
111 #endif /* FILE_MANGLING */