23#define WHO "ezmlm-reject"
54char strnum[FMT_ULONG];
67buffer
bq = BUFFER_INIT(
qqwrite,-1,qqbuf,(
int)
sizeof(qqbuf));
69stralloc outhost = {0};
70stralloc outlocal = {0};
81static void die_usage() {
logmsg(
WHO,100,USAGE,
"ezmlm-reject [-bBcCfFhHqQsStT] [dir]"); }
98 if (s <= first)
return n;
100 while (--s >= first) {
102 case ' ':
case '\t':
case '\n':
break;
103 case ')':
if (--s <= first)
return n;
104 if (*s ==
'\\')
break;
106 while (level && --s > first) {
107 if (*s ==
')')
if (*(s-1) !=
'\\') ++level;
108 if (*s ==
'(')
if (*(s-1) !=
'\\') --level;
112 if (s < first)
return n;
113 return (
unsigned int) (s - first);
114 default:
return (
unsigned int) (s - first);
130 last = sa->s + sa->len - 1;
132 if (s >= last)
return n;
134 while (++s <= last) {
136 case ' ':
case '\t':
case '\n':
break;
138 while (level && (++s < last)) {
139 if (*s ==
')') --level;
if (!level)
break;
140 if (*s ==
'(') ++level;
144 case '"':
while (++s < last) {
145 if (*s ==
'"')
break;
149 default:
return (
unsigned int) (s - sa->s);
162 unsigned int pos = 0;
165 if (!sa->len)
return 0;
166 while ((pos += 1 + byte_chr(sa->s+pos+1,sa->len-pos-1,
'@')) != sa->len) {
168 if (pos1 == pos)
break;
169 if (pos1 + outhost.len <= sa->len)
170 if (!case_diffb(sa->s+pos1,outhost.len,outhost.s)) {
172 if (pos1 == pos)
break;
174 if (pos1 >= outlocal.len)
175 if (!case_diffb(sa->s+pos1-outlocal.len,outlocal.len,outlocal.s))
184 unsigned long maxmsgsize = 0L;
185 unsigned long minmsgsize = 0L;
189 char *
cp, *cpstart, *cpafter;
196 while ((
opt = getoptb(argc,argv,
"bBcCfFhHqQsStT")) != opteof)
214 default: die_usage();
219 if (chdir(
dir) == -1)
225 len = scan_ulong(line.s,&maxmsgsize);
226 if (line.s[
len] ==
':')
227 scan_ulong(line.s+
len+1,&minmsgsize);
234 if (!stralloc_copys(&
mydtline,
"Delivered-To: command forwarder for "))
246 sender = env_get(
"SENDER");
259 if (!
dir) die_usage();
264 if (getln(&
bi,&line,&
match,
'\n') == -1)
271 if (line.len == 1)
break;
272 cp = line.s;
len = line.len;
273 if ((*
cp ==
' ' || *
cp ==
'\t')) {
284 if (!stralloc_catb(&
to,line.s + 3,line.len - 4))
die_nomem();
286 case_startb(
cp,
len,
"subject:")) {
289 }
else if (case_startb(
cp,
len,
"content-type:")) {
292 }
else if (case_startb(
cp,
len,
"precedence:")) {
297 if (!byte_diff(line.s,line.len,
mydtline.s))
304 if (
precd.len >= 4 &&
305 (!case_diffb(
precd.s +
precd.len - 4,4,
"junk") ||
306 !case_diffb(
precd.s +
precd.len - 4,4,
"bulk")))
313 while (
len && ((*
cp ==
' ') || (*
cp ==
'\t')))
318 if (
len > 9 && case_starts(
cp,
"subscribe") ||
319 len > 11 && case_starts(
cp,
"unsubscribe"))
326 case 6:
if (!case_diffb(
"(null)",6,
cp))
329 if (!case_diffb(
"(none)",6,
cp))
332 if (!case_diffb(
"remove",6,
cp))
352 if (seek_begin(0) == -1)
354 if (buffer_copy(&
bq,&
bj) != 0)
364 logmsg(
WHO,99,INFO,B(
"forward qp ",strnum));
373 while (
len && *
cp ==
' ' || *
cp ==
'\t') { ++
cp; --
len; }
379 while (
len && *
cp !=
' ' && *
cp !=
'\t' && *
cp !=
';') {
392 while ((
cp += byte_chr(
cp,cpafter-
cp,
';')) != cpafter) {
394 while (
cp < cpafter && (*
cp ==
' ') || (*
cp ==
'\t'))
396 if (case_startb(
cp,cpafter -
cp,
"boundary=")) {
398 if (
cp < cpafter && *
cp ==
'"') {
401 while (
cp < cpafter && *
cp !=
'"')
407 while (
cp < cpafter && *
cp !=
';' && *
cp !=
' ' && *
cp !=
'\t')
411 if (!stralloc_catb(&
boundary,cpstart,
cp-cpstart))
419 if (getln(&
bi,&line,&
match,
'\n') == -1)
427 }
else if (
flagcheck && case_startb(line.s,line.len,
"content-type:")) {
430 while (*
cp ==
' ' || *
cp ==
'\t')
435 while (
len && *
cp !=
'"')
438 while (
len && *
cp !=
' ' && *
cp !=
'\t' && *
cp !=
';') {
451 if (case_startb(line.s,line.len,
"subscribe") || case_startb(line.s,line.len,
"unsubscribe"))
455 if (maxmsgsize &&
msgsize > maxmsgsize) {
456 strnum[fmt_ulong(strnum,maxmsgsize)] = 0;
463 strnum[fmt_ulong(strnum,minmsgsize)] = 0;
const char auto_version[]
Error messages. If you translate these, I would urge you to keep the English version as well....
#define ERR_TMP_QMAIL_QUEUE
const char * qmail_close(struct qmail *)
void qmail_put(struct qmail *, const char *, int)
void qmail_from(struct qmail *, const char *)
void qmail_to(struct qmail *, const char *)
unsigned long qmail_qp(struct qmail *)
int qmail_open(struct qmail *, const stralloc *)
charset, outhost, outlocal and flagcd are shared
int getconf(stralloc *sa, const char *fn, int flagrequired, const char *dir)
int getconf_line(stralloc *sa, const char *fn, int flagrequired, const char *dir)
struct constmap mimerejectmap
struct constmap headerrejectmap
unsigned int findlocal(stralloc *sa, unsigned int n)
struct constmap mimeremovemap
ssize_t qqwrite(int fd, char *buf, unsigned int len)
unsigned int findhost(stralloc *sa, unsigned int n)
ssize_t qqwrite(int fd, char *buf, unsigned int len)
const char * logmsg(const char *dir, unsigned long num, unsigned long listno, unsigned long subs, int done)