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

Annotation of /imapfilter/imapfilter.c

Parent Directory Parent Directory | Revision Log Revision Log


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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26