]> andersk Git - moira.git/blame - clients/lib/mail.c
Support EXCHANGE poboxes.
[moira.git] / clients / lib / mail.c
CommitLineData
d5a7ea17 1/* $Id$
2 *
3 * Library-internal routines for categorizing machines in terms
4 * of email.
5 *
6 * Copyright (C) 1999 by the Massachusetts Institute of Technology
7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
9 */
10
11#include <mit-copyright.h>
12#include <moira.h>
13#include <mrclient.h>
14#include "mrclient-internal.h"
15
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19
20RCSID("$Header$");
21
22static int save_sloc_machine(int argc, char **argv, void *sq);
23static int save_alias_value(int argc, char **argv, void *sq);
24
25/* Given a canonicalized machine name, ask the Moira server if it is of type
26 * POP, LOCAL, or MAILHUB -- if none of those, we assume it's FOREIGN.
27 */
28int mailtype(char *machine)
29{
30 char *name;
31 int status, match = 0;
32 static struct save_queue *pop = NULL, *local = NULL;
33 static struct save_queue *mailhub = NULL, *mailhub_name = NULL;
22bbb6f0 34 static struct save_queue *imap = NULL, *exchange = NULL;
d5a7ea17 35
36 mrcl_clear_message();
37
38 /* 1. Check if the machine is an IMAP server. */
39 if (!imap)
40 {
41 char *service = "POSTOFFICE";
42 imap = sq_create();
43 status = mr_query("get_server_locations", 1, &service,
44 save_sloc_machine, imap);
45 if (status && (status != MR_NO_MATCH))
46 {
47 mrcl_set_message("Could not read list of IMAP servers: %s",
48 error_message(status));
49 return MAILTYPE_ERROR;
50 }
51 }
52
53 /* Because of how sq_get_data works, we need to go through the entire
54 * queue even if we find a match, so that it gets reset for the next
55 * call.
56 */
57 while (sq_get_data(imap, &name))
58 {
59 if (!match && !strcasecmp(name, machine))
60 match = 1;
61 }
62
63 if (match)
64 return MAILTYPE_IMAP;
65
66
67 /* 2. Check if the machine is a POP server. */
68 if (!pop)
69 {
70 char *service = "POP";
71 pop = sq_create();
72 status = mr_query("get_server_locations", 1, &service,
73 save_sloc_machine, pop);
74 if (status && (status != MR_NO_MATCH))
75 {
76 mrcl_set_message("Could not read list of POP servers: %s",
77 error_message(status));
78 return MAILTYPE_ERROR;
79 }
80 }
81
82 /* Because of how sq_get_data works, we need to go through the entire
83 * queue even if we find a match, so that it gets reset for the next
84 * call.
85 */
86 while (sq_get_data(pop, &name))
87 {
88 if (!match && !strcasecmp(name, machine))
89 match = 1;
90 }
91 if (match)
92 return MAILTYPE_POP;
93
94
95 /* 3. Check if the machine is "LOCAL". */
96 if (!local)
97 {
98 char *service = "LOCAL";
99 local = sq_create();
100 status = mr_query("get_server_locations", 1, &service,
101 save_sloc_machine, local);
102 if (status && (status != MR_NO_MATCH))
103 {
104 mrcl_set_message("Could not read list of LOCAL servers: %s",
105 error_message(status));
106 return MAILTYPE_ERROR;
107 }
108 }
109
110 while (sq_get_data(local, &name))
111 {
112 if (!match && !strcasecmp(name, machine))
113 match = 1;
114 }
115 if (match)
116 return MAILTYPE_LOCAL;
117
118
119 /* 4. Check if the machine is one of the mailhubs. */
120 if (!mailhub)
121 {
122 char *service = "MAILHUB";
123 mailhub = sq_create();
124 status = mr_query("get_server_locations", 1, &service,
125 save_sloc_machine, mailhub);
126 if (!status || status == MR_NO_MATCH)
127 {
128 service = "NMAILHUB";
129 status = mr_query("get_server_locations", 1, &service,
130 save_sloc_machine, mailhub);
131 }
132
133 if (status && (status != MR_NO_MATCH))
134 {
135 mrcl_set_message("Could not read list of MAILHUB servers: %s",
136 error_message(status));
137 return MAILTYPE_ERROR;
138 }
139
140 }
141
142 while (sq_get_data(mailhub, &name))
143 {
144 if (!match && !strcasecmp(name, machine))
145 match = 1;
146 }
147 if (match)
148 return MAILTYPE_MAILHUB;
149
150
151 /* 5. Check if the machine is one of the external names of the mailhubs. */
152 if (!mailhub_name)
153 {
154 char *argv[3];
155 mailhub_name = sq_create();
156 argv[0] = "mailhub";
157 argv[1] = "TYPE";
158 argv[2] = "*";
159 status = mr_query("get_alias", 3, argv, save_alias_value, mailhub_name);
160 if (status && (status != MR_NO_MATCH))
161 {
162 mrcl_set_message("Could not read list of mailhub names: %s",
163 error_message(status));
164 return MAILTYPE_ERROR;
165 }
166 }
167
168 while (sq_get_data(mailhub_name, &name))
169 {
170 if (!match && !strcasecmp(name, machine))
171 match = 1;
172 }
173 if (match)
174 return MAILTYPE_MAILHUB;
175
22bbb6f0 176 /* 6. Check for EXCHANGE service. */
177 if (!exchange)
178 {
179 char *service = "EXCHANGE";
180 exchange = sq_create();
181 status = mr_query("get_server_locations", 1, &service,
182 save_sloc_machine, exchange);
183 if (status && (status != MR_NO_MATCH))
184 {
185 mrcl_set_message("Could not read list of EXCHANGE servers: %s",
186 error_message(status));
187 return MAILTYPE_ERROR;
188 }
189 }
190
191 while (sq_get_data(exchange, &name))
192 {
193 if (!match && !strcasecmp(name, machine))
194 match = 1;
195 }
196 if (match)
197 return MAILTYPE_EXCHANGE;
198
d5a7ea17 199 return MAILTYPE_SMTP;
200}
201
202static int save_sloc_machine(int argc, char **argv, void *sq)
203{
204 sq_save_data(sq, strdup(argv[1]));
205 return MR_CONT;
206}
207
208static int save_alias_value(int argc, char **argv, void *sq)
209{
210 sq_save_data(sq, canonicalize_hostname(strdup(argv[2])));
211 return MR_CONT;
212}
This page took 0.082207 seconds and 5 git commands to generate.