/[imapfilter]/imapfilter/imapfilter.c
ViewVC logotype

Contents of /imapfilter/imapfilter.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.31 - (show annotations)
Fri Feb 8 22:15:43 2002 UTC (22 years, 1 month ago) by lefcha
Branch: MAIN
Changes since 1.30: +0 -4 lines
File MIME type: text/plain
Allow ssl appear in config file, but fail with error message.

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <limits.h>
6 #include <errno.h>
7
8 #include "config.h"
9 #include "imapfilter.h"
10 #include "data.h"
11
12
13 extern account_t *accounts;
14 extern filter_t *filters;
15
16 unsigned int options; /* Program options. */
17 unsigned int flags = 0; /* Program flags. */
18 unsigned int capabilities; /* Capabilities of mail server. */
19 unsigned int interval = 0; /* Poll at the specified interval. */
20 char logfile[PATH_MAX]; /* Log file. */
21 char *home = NULL; /* User's home directory. */
22 uid_t ruid, euid; /* Real and effective UID. */
23
24
25
26 /*
27 * In the beginning there was main()...
28 */
29 int main(int argc, char *argv[])
30 {
31 int c, r, f = 0;
32 pid_t pid;
33 char *confile = NULL; /* Configuration file. */
34 account_t *ca; /* Current account. */
35 mbox_t *cm; /* Current mailbox. */
36
37 ruid = getuid();
38 euid = geteuid();
39 seteuid(ruid); /* Drop root privileges. */
40
41 home = getenv("HOME");
42 options = (OPTION_DETAILS_NORMAL | OPTION_NAMESPACE);
43 *logfile = 0;
44
45 while ((c = getopt(argc, argv, "c:d:hkl:"
46 #ifdef ENCRYPTED_PASSWORDS
47 "p"
48 #endif
49 "qv")) != -1) {
50 switch (c) {
51 case 'c':
52 confile = optarg;
53 break;
54 case 'd':
55 options |= OPTION_DAEMON_MODE;
56 errno = 0;
57 interval = strtoul(optarg, NULL, 10);
58 if (errno)
59 interval = 0;
60 break;
61 case 'h':
62 usage();
63 exit(ERROR_UNDEFINED);
64 break;
65 case 'k':
66 kill_imapfilter();
67 break;
68 case 'l':
69 strncat(logfile, optarg, PATH_MAX - 1);
70 break;
71 #ifdef ENCRYPTED_PASSWORDS
72 case 'p':
73 options |= OPTION_PASSWORD_EDITOR;
74 break;
75 #endif
76 case 'q':
77 options &= OPTION_DETAILS_CLEAR;
78 options |= OPTION_DETAILS_QUIET;
79 break;
80 case 'v':
81 options &= OPTION_DETAILS_CLEAR;
82 options |= OPTION_DETAILS_VERBOSE;
83 break;
84 default:
85 usage();
86 exit(ERROR_UNDEFINED);
87 break;
88 }
89 }
90
91 lockfile_check();
92 lockfile_create();
93
94 corefile_disable();
95
96 tty_store();
97 catch_signals();
98
99 create_homedir();
100
101 read_config(confile);
102 open_logfile();
103
104
105 #ifdef ENCRYPTED_PASSWORDS
106 read_passwords();
107
108 if ((options & OPTION_PASSWORD_EDITOR))
109 password_editor();
110 #endif
111
112 if (options & OPTION_DAEMON_MODE) {
113 f = 1;
114 options &= OPTION_DETAILS_CLEAR;
115 options |= OPTION_DETAILS_QUIET;
116 }
117
118 do {
119 for (ca = accounts; ca; ca = ca->next) {
120
121 if (init_connection(ca->server, ca->port, ca->ssl))
122 continue;
123
124 r = greeting_response();
125
126 if (r == RESPONSE_BYE || check_capabilities())
127 continue;
128
129 #ifdef DEBUG
130 test();
131 #endif
132
133 if (r != RESPONSE_PREAUTH) {
134 if (ca->passwdattr == PASSWORD_NONE) {
135 printf("Enter password for %s@%s: ", ca->username, ca->server);
136 get_password(ca->password, PASSWORD_LEN);
137 ca->passwdattr = PASSWORD_PLAIN;
138 }
139 if (login(ca->username, ca->password) == RESPONSE_NO) {
140 error("imapfilter: username %s or password rejected at %s\n",
141 ca->username, ca->server);
142 continue;
143 }
144 }
145 check_namespace();
146
147 for (cm = ca->mboxes; cm; cm = cm->next)
148 if (!*cm->filters)
149 mailbox_status(cm->name);
150 else if (!select_mailbox(cm->name)) {
151 apply_filters(cm->filters);
152 close_mailbox();
153 }
154 logout();
155
156 close_connection();
157 }
158
159 if (f) {
160 f = 0;
161 pid = fork();
162 switch (pid) {
163 case -1:
164 fatal(ERROR_FORK, "imapfilter: forking; %s\n", strerror(errno));
165 break;
166 case 0:
167 secmem_lock();
168 setuid(ruid); /* Capability to regain root privileges
169 will not be needed any more. */
170 lockfile_create();
171 corefile_disable();
172 break;
173 default:
174 secmem_clear();
175 close_logfile();
176 exit(0);
177 break;
178 }
179 }
180
181 if (interval)
182 sleep(interval);
183 } while (options & OPTION_DAEMON_MODE && interval);
184
185 secmem_clear();
186 close_logfile();
187
188 lockfile_remove();
189
190 exit(0);
191 }
192
193
194 /*
195 * Print a very brief usage message.
196 */
197 void usage(void)
198 {
199 fprintf(stderr,
200 "usage: imapfilter [-hk"
201 #ifdef ENCRYPTED_PASSWORDS
202 "p"
203 #endif
204 "qv] [-c configfile] [-d interval] [-l logfile]\n");
205 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26