]> andersk Git - moira.git/blob - clients/lib/mail.c
2228120deb83b9cbf51870291258a0bb6844e27f
[moira.git] / clients / lib / mail.c
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
20 RCSID("$Header$");
21
22 static int save_sloc_machine(int argc, char **argv, void *sq);
23 static 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  */
28 int 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;
34   static struct save_queue *imap = NULL;
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
176   return MAILTYPE_SMTP;
177 }
178
179 static int save_sloc_machine(int argc, char **argv, void *sq)
180 {
181   sq_save_data(sq, strdup(argv[1]));
182   return MR_CONT;
183 }
184
185 static int save_alias_value(int argc, char **argv, void *sq)
186 {
187   sq_save_data(sq, canonicalize_hostname(strdup(argv[2])));
188   return MR_CONT;
189 }
This page took 0.041209 seconds and 3 git commands to generate.