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