2
* $Id: mangle.c,v 1.11 2002/10/05 20:13:31 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
/* Is this really a mangled file? */
27
mangle = strstr(mfilename, MANGLE_CHAR);
32
if ((ext = strrchr(mfilename, '.')) != NULL) {
33
ext_len = strlen(ext);
35
if (strlen(mangle) != strlen(MANGLE_CHAR) + MANGLE_LENGTH + ext_len) {
36
LOG(log_error, logtype_afpd, "demangle: %s is not long enough to be a mangled filename", mfilename);
40
filename = cnid_mangle_get(vol->v_db, mfilename);
42
/* No unmangled filename was found. */
43
if (filename == NULL) {
44
LOG(log_error, logtype_afpd, "demangle: Unable to lookup %s in the mangle database", mfilename);
52
mangle(const struct vol *vol, char *filename) {
56
static char mfilename[MAX_LENGTH + 1];
57
char mangle_suffix[MANGLE_LENGTH + 1];
59
int mangle_suffix_int = 0;
61
/* Do we really need to mangle this filename? */
62
if (strlen(filename) <= MAX_LENGTH) {
66
/* First, attmept to locate a file extension. */
67
if ((ext = strrchr(filename, '.')) != NULL) {
68
ext_len = strlen(ext);
69
if (ext_len > MAX_EXT_LENGTH) {
70
/* Do some bounds checking to prevent an extension overflow. */
71
ext_len = MAX_EXT_LENGTH;
75
/* Check to see if we already have a mangled filename by this name. */
78
strncpy(m, filename, MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len);
79
m[MAX_LENGTH - strlen(MANGLE_CHAR) - MANGLE_LENGTH - ext_len] = '\0';
81
strcat(m, MANGLE_CHAR);
82
(void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
83
strcat(m, mangle_suffix);
86
strncat(m, ext, ext_len);
89
tf = cnid_mangle_get(vol->v_db, m);
90
if (tf == NULL || (strcmp(tf, filename)) == 0) {
94
if (++mangle_suffix_int > MAX_MANGLE_SUFFIX_LENGTH) {
95
LOG(log_error, logtype_afpd, "mangle: Failed to find a free mangle suffix; returning original filename");
101
if (cnid_mangle_add(vol->v_db, m, filename) < 0) {
107
#endif /* FILE_MANGLING */