1 
2 #include <config.h>
3 
4 #ifdef WITH_DIRALIASES
5 
6 #include "ftpd.h"
7 #include "messages.h"
8 #include "diraliases.h"
9 
10 #ifdef WITH_DMALLOC
11 # include <dmalloc.h>
12 #endif
13 
14 static DirAlias *head, *tail;
15 static signed char aliases_up;
16 
init_aliases(void)17 int init_aliases(void)
18 {
19     FILE *fp;
20     char alias[MAXALIASLEN + 1U];
21     char dir[PATH_MAX + 1U];
22 
23     if ((fp = fopen(ALIASES_FILE, "r")) == NULL) {
24         return 0;
25     }
26     while (fgets(alias, sizeof alias, fp) != NULL) {
27         if (*alias == '#' || *alias == '\n' || *alias == 0) {
28             continue;
29         }
30         {
31             char * const z = alias + strlen(alias) - 1U;
32 
33             if (*z != '\n') {
34                 goto bad;
35             }
36             *z = 0;
37         }
38         do {
39             if (fgets(dir, sizeof dir, fp) == NULL || *dir == 0) {
40                 goto bad;
41             }
42             {
43                 char * const z = dir + strlen(dir) - 1U;
44 
45                 if (*z == '\n') {
46                     *z = 0;
47                 }
48             }
49         } while (*dir == '#' || *dir == 0);
50         if (head == NULL) {
51             if ((head = tail = malloc(sizeof *head)) == NULL ||
52                 (tail->alias = strdup(alias)) == NULL ||
53                 (tail->dir = strdup(dir)) == NULL) {
54                 die_mem();
55             }
56         } else {
57             DirAlias *curr;
58 
59             if ((curr = malloc(sizeof *curr)) == NULL ||
60                 (curr->alias = strdup(alias)) == NULL ||
61                 (curr->dir = strdup(dir)) == NULL) {
62                 die_mem();
63             }
64             tail->next = curr;
65             tail = curr;
66         }
67         tail->next = NULL;
68     }
69     fclose(fp);
70     aliases_up++;
71 
72     return 0;
73 
74     bad:
75     fclose(fp);
76     logfile(LOG_ERR, MSG_ALIASES_BROKEN_FILE " [" ALIASES_FILE "]");
77 
78     return -1;
79 }
80 
81 
lookup_alias(const char * alias)82 char *lookup_alias(const char *alias)
83 {
84     const DirAlias *curr = head;
85 
86     if (aliases_up == 0) {
87         return NULL;
88     }
89     while (curr != NULL) {
90         if (strcmp(curr->alias, alias) == 0) {
91             return curr->dir;
92         }
93         curr = curr->next;
94     }
95     return NULL;
96 }
97 
98 
print_aliases(void)99 void print_aliases(void)
100 {
101     const DirAlias *curr = head;
102 
103     if (aliases_up == 0) {
104         addreply_noformat(502, MSG_CONF_ERR);
105 
106         return;
107     }
108     addreply_noformat(214, MSG_ALIASES_LIST);
109     while (curr != NULL) {
110         char line[MAXALIASLEN + PATH_MAX + 3U];
111 
112         snprintf(line, sizeof line, " %s %s", curr->alias, curr->dir);
113         addreply_noformat(0, line);
114         curr = curr->next;
115     }
116     addreply_noformat(214, " ");
117 }
118 
119 #endif
120