]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/mangle.c
Fix a problem where data was not being initialized correctly. This
[netatalk.git] / etc / afpd / mangle.c
1 /* 
2  * $Id: mangle.c,v 1.6 2002-06-03 22:55:27 jmarcus Exp $ 
3  *
4  * Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
5  * All Rights Reserved.  See COPYRIGHT.
6  *
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.
10  */
11
12 #ifdef HAVE_CONFIG_H
13 #include "config.h"
14 #endif /* HAVE_CONFIG_H */
15
16 #ifdef FILE_MANGLING
17 #include "mangle.h"
18
19 char *
20 demangle(const struct vol *vol, char *mfilename) {
21         char *filename = NULL;
22         char *ext = NULL;
23         int ext_len = 0;
24         char *mangle;
25
26         LOG(log_error, logtype_default, "demangle: Calling demangle on %s", mfilename);
27
28         /* Is this really a mangled file? */
29         mangle = strstr(mfilename, MANGLE_CHAR);
30         if (!mangle) {
31             LOG(log_error, logtype_default, "demangle: %s is not a mangled filename", mfilename);
32             return mfilename;
33         }
34
35         if ((ext = strrchr(mfilename, '.')) != NULL) {
36             ext_len = strlen(ext);
37         }
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);
40             return mfilename;
41         }
42
43         LOG(log_error, logtype_default, "demangle: Looking up %s in the mangle database", mfilename);
44         filename = cnid_mangle_get(vol->v_db, mfilename);
45
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);
49             return mfilename;
50         }
51
52         LOG(log_error, logtype_default, "demangle: Returning %s as the unmangled filename for %s", filename, mfilename);
53         return filename;
54 }
55
56 char *
57 mangle(const struct vol *vol, char *filename) {
58     char *ext = NULL;
59     char *tf = NULL;
60     char *m = NULL;
61     static char mfilename[MAX_LENGTH + 1];
62     char mangle_suffix[MANGLE_LENGTH + 1];
63     int ext_len = 0;
64     int mangle_suffix_int = 0;
65
66     /* Do we really need to mangle this filename? */
67     if (strlen(filename) <= MAX_LENGTH) {
68         return filename;
69     }
70
71     /* First, attmept to locate a file extension. */
72     if ((ext = strrchr(filename, '.')) != NULL) {
73         ext_len = strlen(ext);
74     }
75
76     /* Check to see if we already have a mangled filename by this name. */
77     while (1) {
78         m = mfilename;
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';
81
82         strcat(m, MANGLE_CHAR);
83         (void)sprintf(mangle_suffix, "%03d", mangle_suffix_int);
84         strcat(m, mangle_suffix);
85
86         if (ext) {
87                 strcat(m, ext);
88         }
89
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) {
93             break;
94         }
95         else {
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");
98                 return filename;
99             }
100         }
101     }
102
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) {
105         return filename;
106     }
107
108     LOG(log_error, logtype_default, "mangle: Returning %s", m);
109     return m;
110 }
111 #endif /* FILE_MANGLING */