4
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
1 |
/* |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
2 |
* Copyright (c) 2014 Sunil Nimmagadda <sunil@nimmagadda.net> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
3 |
* |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
4 |
* Permission to use, copy, modify, and distribute this software for any |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
5 |
* purpose with or without fee is hereby granted, provided that the above |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
6 |
* copyright notice and this permission notice appear in all copies. |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
7 |
* |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
8 |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
9 |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
10 |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
11 |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
12 |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
13 |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
14 |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
15 |
*/ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
16 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
17 |
#include <sys/param.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
18 |
#include <sys/types.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
19 |
#include <sys/socket.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
20 |
#include <sys/stat.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
21 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
22 |
#include <event.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
23 |
#include <fcntl.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
24 |
#include <pwd.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
25 |
#include <signal.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
26 |
#include <stdio.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
27 |
#include <stdlib.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
28 |
#include <string.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
29 |
#include <syslog.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
30 |
#include <unistd.h> |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
31 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
32 |
#include "imsgev.h" |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
33 |
#include "pop3d.h" |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
34 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
35 |
static void session_imsgev(struct imsgev *, int, struct imsg *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
36 |
static void update(struct imsgev *, struct imsg *, struct m_backend *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
37 |
static void retr(struct imsgev *, struct imsg *, struct m_backend *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
38 |
static void dele(struct imsgev *, struct imsg *, struct m_backend *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
39 |
static void rset(struct imsgev *, struct imsg *, struct m_backend *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
40 |
static void list(struct imsgev *, struct imsg *, struct m_backend *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
41 |
static void list_all(struct imsgev *, struct imsg *, struct m_backend *, int); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
42 |
static void do_list(unsigned int, size_t *, char *, size_t); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
43 |
static void *do_list_all(int, size_t *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
44 |
static struct m_backend *m_backend_lookup(enum m_type); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
45 |
static void sig_handler(int, short, void *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
46 |
static void needfd(struct imsgev *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
47 |
static size_t expand(char *, const char *, size_t, struct passwd *); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
48 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
49 |
static struct mdrop m; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
50 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
51 |
pid_t |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
52 |
maildrop_init(uint32_t session_id, int pair[2], struct passwd *pw, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
53 |
int type, const char *path) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
54 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
55 |
struct imsgev iev_session; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
56 |
struct event ev_sigint, ev_sigterm; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
57 |
struct stats stats; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
58 |
struct m_backend *mb; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
59 |
char buf[MAXPATHLEN]; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
60 |
pid_t pid; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
61 |
mode_t old_mask; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
62 |
int fd, flags, res = -1; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
63 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
64 |
if ((pid = fork()) != 0) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
65 |
return (pid); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
66 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
67 |
if (setgroups(1, &pw->pw_gid) || |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
68 |
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) || |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
69 |
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
70 |
fatal("cannot drop privileges"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
71 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
72 |
close(pair[0]); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
73 |
setproctitle("maildrop"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
74 |
if ((mb = m_backend_lookup(type)) == NULL) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
75 |
fatalx("maildrop: invalid backend"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
76 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
77 |
if (expand(buf, path, sizeof(buf), pw) >= sizeof(buf)) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
78 |
fatalx("maildrop: path truncation"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
79 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
80 |
flags = O_CREAT; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
81 |
if (type == M_MBOX) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
82 |
flags |= O_RDWR; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
83 |
else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
84 |
flags |= O_RDONLY; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
85 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
86 |
old_mask = umask(S_IXUSR|S_IXGRP|S_IWOTH|S_IROTH|S_IXOTH); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
87 |
if ((fd = open(buf, flags)) == -1) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
88 |
logit(LOG_CRIT, "%zu: failed to open %s", session_id , buf); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
89 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
90 |
if (fd != -1) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
91 |
m.fd = fd; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
92 |
res = mb->init(&m, &stats.nmsgs, &stats.sz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
93 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
94 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
95 |
umask(old_mask); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
96 |
event_init(); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
97 |
signal_set(&ev_sigint, SIGINT, sig_handler, NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
98 |
signal_set(&ev_sigterm, SIGTERM, sig_handler, NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
99 |
signal_add(&ev_sigint, NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
100 |
signal_add(&ev_sigterm, NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
101 |
imsgev_init(&iev_session, pair[1], mb, session_imsgev, needfd); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
102 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
103 |
if (res == 0) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
104 |
imsgev_xcompose(&iev_session, IMSG_MAILDROP_INIT, session_id, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
105 |
0, -1, &stats, sizeof(struct stats), "maildrop_init"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
106 |
} else { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
107 |
logit(LOG_CRIT, "%zu: maildrop init failed %s", |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
108 |
session_id, buf); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
109 |
imsgev_xcompose(&iev_session, IMSG_MAILDROP_INIT, session_id, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
110 |
0, -1, NULL, 0, "maildrop_init"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
111 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
112 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
113 |
if (event_dispatch() < 0) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
114 |
fatal("event_dispatch"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
115 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
116 |
logit(LOG_INFO, "maildrop process exiting"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
117 |
_exit(0); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
118 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
119 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
120 |
/* |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
121 |
* Build dst by substituting '~' with user's home dir and '%u' with user name |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
122 |
* in src. Return the length of string built. If return value >= dst_sz then |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
123 |
* dst is truncated. |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
124 |
*/ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
125 |
static size_t |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
126 |
expand(char *dst, const char *src, size_t dst_sz, struct passwd *pw) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
127 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
128 |
size_t i = 0, r; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
129 |
int c; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
130 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
131 |
memset(dst, 0, dst_sz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
132 |
while ((c = *src++)) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
133 |
if (i >= dst_sz) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
134 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
135 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
136 |
switch (c) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
137 |
case '~': |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
138 |
if ((r = strlcpy(&dst[i], pw->pw_dir, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
139 |
(dst_sz - i))) >= (dst_sz - i)) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
140 |
i += r; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
141 |
goto end; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
142 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
143 |
i += r; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
144 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
145 |
case '%': |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
146 |
if (*src == 'u') { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
147 |
if ((r = strlcpy(&dst[i], pw->pw_name, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
148 |
(dst_sz - i))) >= (dst_sz - i)) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
149 |
i += r; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
150 |
goto end; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
151 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
152 |
i += r; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
153 |
src++; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
154 |
} else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
155 |
dst[i++] = c; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
156 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
157 |
default: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
158 |
dst[i++] = c; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
159 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
160 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
161 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
162 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
163 |
end: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
164 |
if (c) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
165 |
while ((c = *src++)) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
166 |
i++; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
167 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
168 |
dst[dst_sz - 1] = '\0'; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
169 |
return (i); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
170 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
171 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
172 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
173 |
session_imsgev(struct imsgev *iev, int code, struct imsg *imsg) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
174 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
175 |
struct m_backend *mb = iev->data; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
176 |
int uidl = 0; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
177 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
178 |
switch (code) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
179 |
case IMSGEV_IMSG: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
180 |
switch (imsg->hdr.type) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
181 |
case IMSG_MAILDROP_UPDATE: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
182 |
update(iev, imsg, mb); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
183 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
184 |
case IMSG_MAILDROP_RETR: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
185 |
retr(iev, imsg, mb); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
186 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
187 |
case IMSG_MAILDROP_DELE: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
188 |
dele(iev, imsg, mb); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
189 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
190 |
case IMSG_MAILDROP_RSET: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
191 |
rset(iev, imsg, mb); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
192 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
193 |
case IMSG_MAILDROP_LIST: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
194 |
list(iev, imsg, mb); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
195 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
196 |
case IMSG_MAILDROP_UIDLALL: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
197 |
uidl = 1; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
198 |
/* FALLTHROUGH */ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
199 |
case IMSG_MAILDROP_LISTALL: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
200 |
list_all(iev, imsg, mb, uidl); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
201 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
202 |
default: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
203 |
logit(LOG_DEBUG, "%s: unexpected imsg %u", |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
204 |
__func__, imsg->hdr.type); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
205 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
206 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
207 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
208 |
case IMSGEV_EREAD: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
209 |
case IMSGEV_EWRITE: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
210 |
case IMSGEV_EIMSG: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
211 |
fatal("maildrop: imsgev read/write error"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
212 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
213 |
case IMSGEV_DONE: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
214 |
event_loopexit(NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
215 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
216 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
217 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
218 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
219 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
220 |
update(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
221 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
222 |
int res; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
223 |
uint32_t session_id = imsg->hdr.peerid; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
224 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
225 |
if ((res = mb->update(&m)) == 0) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
226 |
logit(LOG_INFO, "%zu: maildrop updated", session_id); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
227 |
else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
228 |
logit(LOG_CRIT, "%zu: maildrop updated failed", session_id); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
229 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
230 |
imsgev_xcompose(iev, IMSG_MAILDROP_UPDATE, session_id, 0, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
231 |
-1, &res, sizeof(res), "maildrop_update"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
232 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
233 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
234 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
235 |
retr(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
236 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
237 |
struct retr_res res; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
238 |
struct retr_req *req = imsg->data; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
239 |
int fd; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
240 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
241 |
fd = mb->retr(&m, req->idx, &res.nlines, &res.offset); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
242 |
/* pass on top arguments */ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
243 |
res.top = req->top; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
244 |
res.ntop = req->ntop; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
245 |
imsgev_xcompose(iev, IMSG_MAILDROP_RETR, imsg->hdr.peerid, 0, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
246 |
fd, &res, sizeof(res), "maildrop_retr"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
247 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
248 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
249 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
250 |
dele(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
251 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
252 |
unsigned int *idx = imsg->data; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
253 |
int res = 0; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
254 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
255 |
if (m.msgs_index[*idx]->flags & F_DELE) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
256 |
res = -1; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
257 |
goto end; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
258 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
259 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
260 |
m.msgs_index[*idx]->flags |= F_DELE; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
261 |
end: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
262 |
imsgev_xcompose(iev, IMSG_MAILDROP_DELE, imsg->hdr.peerid, 0, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
263 |
-1, &res, sizeof(res), "maildrop_dele"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
264 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
265 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
266 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
267 |
rset(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
268 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
269 |
size_t i; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
270 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
271 |
for (i = 0; i < m.nmsgs; i++) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
272 |
m.msgs_index[i]->flags = 0; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
273 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
274 |
imsgev_xcompose(iev, IMSG_MAILDROP_RSET, imsg->hdr.peerid, 0, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
275 |
-1, NULL, 0, "maildrop_rset"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
276 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
277 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
278 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
279 |
list(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
280 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
281 |
struct list_req *req = imsg->data; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
282 |
struct list_res res; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
283 |
char hash[SHA1_DIGEST_STRING_LENGTH]; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
284 |
size_t sz; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
285 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
286 |
res.idx = req->idx; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
287 |
do_list(req->idx, &sz, hash, sizeof(hash)); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
288 |
res.uidl = req->uidl; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
289 |
if (res.uidl) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
290 |
strlcpy(res.u.hash, hash, sizeof(res.u.hash)); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
291 |
else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
292 |
res.u.sz = sz; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
293 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
294 |
imsgev_xcompose(iev, IMSG_MAILDROP_LIST, imsg->hdr.peerid, 0, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
295 |
-1, &res, sizeof(res), "maildrop_list"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
296 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
297 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
298 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
299 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
300 |
list_all(struct imsgev *iev, struct imsg *imsg, struct m_backend *mb, int uidl) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
301 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
302 |
void *res; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
303 |
size_t sz; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
304 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
305 |
res = do_list_all(uidl, &sz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
306 |
/* XXX watchout for sz > MAX_IMSGSIZE */ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
307 |
imsgev_xcompose(iev, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
308 |
(uidl) ? IMSG_MAILDROP_UIDLALL : IMSG_MAILDROP_LISTALL, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
309 |
imsg->hdr.peerid, 0, -1, res, sz, "maildrop_list"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
310 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
311 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
312 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
313 |
do_list(unsigned int idx, size_t *sz, char *hash, size_t hash_sz) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
314 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
315 |
if (m.msgs_index[idx]->flags & F_DELE) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
316 |
*sz = 0; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
317 |
strlcpy(hash, "", hash_sz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
318 |
return; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
319 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
320 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
321 |
*sz = m.msgs_index[idx]->sz; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
322 |
strlcpy(hash, m.msgs_index[idx]->hash, hash_sz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
323 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
324 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
325 |
static void * |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
326 |
do_list_all(int uidl, size_t *sz) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
327 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
328 |
size_t i, j, *nsz = NULL; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
329 |
char *nhash = NULL; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
330 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
331 |
if (uidl) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
332 |
nhash = xcalloc(m.nmsgs, SHA1_DIGEST_STRING_LENGTH, "list_all"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
333 |
} else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
334 |
nsz = xcalloc(m.nmsgs, sizeof(size_t), "list_all"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
335 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
336 |
for (i = 0; i < m.nmsgs; i++) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
337 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
338 |
if (uidl) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
339 |
j = i * SHA1_DIGEST_STRING_LENGTH; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
340 |
if (m.msgs_index[i]->flags & F_DELE) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
341 |
nhash[j] = '\0'; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
342 |
else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
343 |
strlcpy(nhash + j, m.msgs_index[i]->hash, |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
344 |
SHA1_DIGEST_STRING_LENGTH); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
345 |
} else { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
346 |
if (m.msgs_index[i]->flags & F_DELE) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
347 |
nsz[i] = 0; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
348 |
else |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
349 |
nsz[i] = m.msgs_index[i]->sz; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
350 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
351 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
352 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
353 |
if (uidl) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
354 |
*sz = m.nmsgs * SHA1_DIGEST_STRING_LENGTH; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
355 |
return (nhash); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
356 |
} else { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
357 |
*sz = m.nmsgs * sizeof(size_t); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
358 |
return (nsz); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
359 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
360 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
361 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
362 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
363 |
needfd(struct imsgev *iev) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
364 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
365 |
fatalx("maildrop should never need an fd"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
366 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
367 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
368 |
static void |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
369 |
sig_handler(int sig, short event, void *arg) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
370 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
371 |
switch (sig) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
372 |
case SIGINT: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
373 |
case SIGTERM: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
374 |
event_loopexit(NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
375 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
376 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
377 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
378 |
extern struct m_backend m_backend_mbox; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
379 |
extern struct m_backend m_backend_maildir; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
380 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
381 |
static struct m_backend * |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
382 |
m_backend_lookup(enum m_type type) |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
383 |
{ |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
384 |
switch (type) { |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
385 |
case M_MBOX: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
386 |
return &m_backend_mbox; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
387 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
388 |
case M_MAILDIR: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
389 |
return &m_backend_maildir; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
390 |
break; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
391 |
default: |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
392 |
fatalx("m_backend_lookup: invalid m_type"); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
393 |
}; |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
394 |
|
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
395 |
return (NULL); |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
396 |
} |
Sunil Nimmagadda <sunil@sunilnimmagadda.com>
parents:
diff
changeset
|
397 |
|