2 * $Id: mangle.c,v 1.3 2002-05-30 20:48:29 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;
23 char dir[MAXPATHLEN+1];
26 /* Is this really a mangled file? */
27 mangle = strstr(mfilename, MANGLE_CHAR);
32 ext = strrchr(mfilename, '.');
33 if (strlen(mangle) != strlen(MANGLE_CHAR) + MANGLE_LENGTH + (ext != NULL)?strlen(ext):0) {
37 getcwd(dir, MAXPATHLEN);
39 if (strlen(dir) > MAXPATHLEN - strlen(mfilename) - 1) {
40 LOG(log_error, logtype_default, "demangle: Path is too large");
45 strcat(dir, mfilename);
47 filename = cnid_mangle_get(vol->v_db, dir);
49 /* No unmangled filename was found. */
50 if (filename == NULL) {
51 LOG(log_debug, logtype_default, "demangle: Unable to lookup %s in the mangle database", dir);
59 mangle(const struct vol *vol, char *filename) {
61 char *mfilename = NULL;
63 char mangle_suffix[MANGLE_LENGTH+1];
64 char dir[MAXPATHLEN+1];
65 char tmp[MAXPATHLEN+1];
66 int mangle_suffix_int = 0;
68 /* Do we really need to mangle this filename? */
69 if (strlen(filename) <= MAX_LENGTH) {
73 /* First, attmept to locate a file extension. */
74 ext = strrchr(filename, '.');
76 getcwd(dir, MAXPATHLEN);
78 if (strlen(dir) > MAXPATHLEN - strlen(filename) - 1) {
79 LOG(log_error, logtype_default, "mangle: path is too large");
83 if ((mfilename = malloc(MAX_LENGTH + 1)) == NULL) {
84 LOG(log_error, logtype_default, "mangle: Failed to allocate memory to hold the mangled filename");
88 /* Check to see if we already have a mangled filename by this name. */
92 strncpy(mfilename, filename, MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ((ext != NULL)?strlen(ext):0));
93 mfilename[MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ((ext != NULL)?strlen(ext):0)] = '\0';
95 strcat(mfilename, MANGLE_CHAR);
96 (void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
97 strcat(mfilename, mangle_suffix);
100 strcat(mfilename, ext);
104 strcat(tmp, mfilename);
106 tf = cnid_mangle_get(vol->v_db, tmp);
107 if (tf == NULL || (strcmp(tf, filename)) == 0) {
111 if (++mangle_suffix_int > MAX_MANGLE_SUFFIX_LENGTH) {
112 LOG(log_error, logtype_default, "mangle: Failed to find a free mangle suffix; returning original filename");
119 strcat(dir, filename);
121 if (cnid_mangle_add(vol->v_db, tmp, dir) < 0) {
127 #endif /* FILE_MANGLING */