summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/auto-gid.c19
-rw-r--r--src/auto-int.c12
-rw-r--r--src/auto-int8.c11
-rw-r--r--src/auto-str.c11
-rw-r--r--src/auto-uid.c19
-rw-r--r--src/base64.c69
-rw-r--r--src/bouncesaying.c29
-rw-r--r--src/chkshsgr.c4
-rw-r--r--src/chkspawn.c35
-rw-r--r--src/columnt.c53
-rw-r--r--src/commands.c22
-rw-r--r--src/condredirect.c77
-rw-r--r--src/constmap.c72
-rw-r--r--src/control.c84
-rw-r--r--src/date822fmt.c59
-rw-r--r--src/datetime.c56
-rw-r--r--src/datetime_un.c40
-rw-r--r--src/dkim.cpp145
-rw-r--r--src/dkimbase.cpp113
-rw-r--r--src/dkimsign.cpp607
-rw-r--r--src/dkimverify.cpp786
-rw-r--r--src/dns.c138
-rw-r--r--src/dns_tlsa.c37
-rw-r--r--src/dnscname.c22
-rw-r--r--src/dnsdoe.c10
-rw-r--r--src/dnsfq.c55
-rw-r--r--src/dnsip.c34
-rw-r--r--src/dnsmxip.c102
-rw-r--r--src/dnsptr.c33
-rw-r--r--src/dnstlsa.c82
-rw-r--r--src/dnstxt.c22
-rw-r--r--src/except.c25
-rw-r--r--src/fastforward.c220
-rw-r--r--src/fifo.c15
-rw-r--r--src/fmtqfn.c37
-rw-r--r--src/forward.c55
-rw-r--r--src/gfrom.c12
-rw-r--r--src/headerbody.c41
-rw-r--r--src/hfield.c94
-rw-r--r--src/hier.c282
-rw-r--r--src/hmac_md5.c75
-rw-r--r--src/hostname.c7
-rw-r--r--src/include/base64.h4
-rw-r--r--src/include/commands.h2
-rw-r--r--src/include/constmap.h6
-rw-r--r--src/include/control.h8
-rw-r--r--src/include/date822fmt.h2
-rw-r--r--src/include/datetime.h2
-rw-r--r--src/include/dkim.h172
-rw-r--r--src/include/dkimbase.h64
-rw-r--r--src/include/dkimsign.h54
-rw-r--r--src/include/dkimverify.h169
-rw-r--r--src/include/dns.h21
-rw-r--r--src/include/dnsgettxt.h4
-rw-r--r--src/include/extra.h2
-rw-r--r--src/include/fifo.h2
-rw-r--r--src/include/fmtqfn.h2
-rw-r--r--src/include/gfrom.h2
-rw-r--r--src/include/global.h45
-rw-r--r--src/include/hfield.h56
-rw-r--r--src/include/hier.h10
-rw-r--r--src/include/hmac_md5.h3
-rw-r--r--src/include/ipalloc.h7
-rw-r--r--src/include/ipme.h1
-rw-r--r--src/include/maildir.h5
-rw-r--r--src/include/md5.h13
-rw-r--r--src/include/mfrules.h2
-rw-r--r--src/include/prioq.h12
-rw-r--r--src/include/qlx.h18
-rw-r--r--src/include/qmail.h10
-rw-r--r--src/include/qsutil.h8
-rw-r--r--src/include/quote.h4
-rw-r--r--src/include/readsubdir.h6
-rw-r--r--src/include/received.h4
-rw-r--r--src/include/recipients.h2
-rw-r--r--src/include/sendtodo.h6
-rw-r--r--src/include/sha1.h3
-rw-r--r--src/include/sha256.h5
-rw-r--r--src/include/smtpdlog.h54
-rw-r--r--src/include/spf.h115
-rw-r--r--src/include/srs2.h88
-rw-r--r--src/include/strset.h26
-rw-r--r--src/include/tls_remote.h18
-rw-r--r--src/include/token822.h22
-rw-r--r--src/include/ucspitls.h49
-rw-r--r--src/include/wildmat.h2
-rw-r--r--src/install.c127
-rw-r--r--src/instcheck.c57
-rw-r--r--src/ipalloc.c9
-rw-r--r--src/ipme.c44
-rw-r--r--src/ipmeprint.c48
-rw-r--r--src/maildir.c62
-rw-r--r--src/maildir2mbox.c244
-rw-r--r--src/maildirmake.c21
-rw-r--r--src/maildirwatch.c103
-rw-r--r--src/matchup.c354
-rw-r--r--src/md5c.c288
-rw-r--r--src/mfrules.c71
-rw-r--r--src/myctime.c29
-rw-r--r--src/newaliases.c215
-rw-r--r--src/newfield.c75
-rw-r--r--src/newinclude.c223
-rw-r--r--src/now.c6
-rw-r--r--src/predate.c83
-rw-r--r--src/preline.c73
-rw-r--r--src/printforward.c69
-rw-r--r--src/printmaillist.c31
-rw-r--r--src/prioq.c15
-rw-r--r--src/prot.c14
-rw-r--r--src/qbiff.c111
-rw-r--r--src/qmail-authuser.c296
-rw-r--r--src/qmail-badloadertypes.c37
-rw-r--r--src/qmail-badmimetypes.c36
-rw-r--r--src/qmail-clean.c107
-rw-r--r--src/qmail-dkim.cpp297
-rw-r--r--src/qmail-dksign.c381
-rw-r--r--src/qmail-dkverify.c225
-rw-r--r--src/qmail-getpw.c51
-rw-r--r--src/qmail-inject.c539
-rw-r--r--src/qmail-local.c660
-rw-r--r--src/qmail-lspawn.c171
-rw-r--r--src/qmail-mfrules.c130
-rw-r--r--src/qmail-mrtg.c398
-rw-r--r--src/qmail-newmrh.c56
-rw-r--r--src/qmail-newu.c72
-rw-r--r--src/qmail-pop3d.c280
-rw-r--r--src/qmail-popup.c338
-rw-r--r--src/qmail-postgrey.c88
-rw-r--r--src/qmail-pw2u.c290
-rw-r--r--src/qmail-qmaint.c700
-rw-r--r--src/qmail-qmqpc.c163
-rw-r--r--src/qmail-qmqpd.c72
-rw-r--r--src/qmail-qmtpd.c240
-rw-r--r--src/qmail-qread.c189
-rw-r--r--src/qmail-queue.c280
-rw-r--r--src/qmail-recipients.c59
-rw-r--r--src/qmail-remote.c1275
-rw-r--r--src/qmail-rspawn.c82
-rw-r--r--src/qmail-send.c1111
-rw-r--r--src/qmail-showctl.c514
-rw-r--r--src/qmail-smtpam.c438
-rw-r--r--src/qmail-smtpd.c1437
-rw-r--r--src/qmail-start.c150
-rw-r--r--src/qmail-tcpok.c25
-rw-r--r--src/qmail-tcpto.c84
-rw-r--r--src/qmail-todo.c554
-rw-r--r--src/qmail-vmailuser.c106
-rw-r--r--src/qmail.c139
-rw-r--r--src/qreceipt.c157
-rw-r--r--src/qsutil.c73
-rw-r--r--src/quote.c47
-rw-r--r--src/rcpthosts.c52
-rw-r--r--src/readsubdir.c23
-rw-r--r--src/received.c224
-rw-r--r--src/recipients.c238
-rw-r--r--src/sendmail.c81
-rw-r--r--src/setforward.c108
-rw-r--r--src/setmaillist.c64
-rw-r--r--src/sha1.c201
-rw-r--r--src/sha256.c190
-rw-r--r--[-rwxr-xr-x]src/smtpdlog.c387
-rw-r--r--src/spawn.c297
-rw-r--r--src/spf.c551
-rw-r--r--src/spfdnsip.c276
-rw-r--r--src/spfquery.c99
-rw-r--r--src/splogger.c48
-rw-r--r--src/srs2.c916
-rw-r--r--src/srsforward.c153
-rw-r--r--src/srsreverse.c161
-rw-r--r--src/strset.c51
-rw-r--r--src/tai64nfrac.c37
-rw-r--r--src/tcpto.c116
-rw-r--r--src/tcpto_clean.c11
-rw-r--r--src/tls_errors.c208
-rw-r--r--src/tls_remote.c283
-rw-r--r--src/tls_start.c77
-rw-r--r--src/tls_timeoutio.c70
-rw-r--r--src/token822.c423
-rw-r--r--src/trigger.c24
-rw-r--r--src/triggerpull.c6
-rw-r--r--src/trycpp.c6
-rw-r--r--src/trydrent.c2
-rw-r--r--src/tryflock.c6
-rw-r--r--src/trymkffo.c4
-rw-r--r--src/trynpbg1.c13
-rw-r--r--src/trysalen.c6
-rw-r--r--src/trysgact.c2
-rw-r--r--src/trysgprm.c6
-rw-r--r--src/tryshsgr.c11
-rw-r--r--src/trysysel.c10
-rw-r--r--src/trysyslog.c6
-rw-r--r--src/tryulong32.c36
-rw-r--r--src/tryutmp.c3
-rw-r--r--src/trywaitp.c2
-rw-r--r--src/wildmat.c75
195 files changed, 13814 insertions, 11299 deletions
diff --git a/src/auto-gid.c b/src/auto-gid.c
index c5a39df..ba386c7 100644
--- a/src/auto-gid.c
+++ b/src/auto-gid.c
@@ -1,17 +1,18 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <grp.h>
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
#include "exit.h"
-#include "scan.h"
#include "fmt.h"
+#include "scan.h"
char inbuf[256];
-buffer b = BUFFER_INIT(write,1,inbuf,sizeof(inbuf));
+buffer b = BUFFER_INIT(write, 1, inbuf, sizeof(inbuf));
void outs(char *s)
{
- if (buffer_puts(&b,s) == -1) _exit(111);
+ if (buffer_puts(&b, s) == -1) _exit(111);
}
int main(int argc, char **argv)
@@ -28,14 +29,14 @@ int main(int argc, char **argv)
gr = getgrnam(value);
if (!gr) {
- buffer_puts(buffer_2,"fatal: unable to find group ");
- buffer_puts(buffer_2,value);
- buffer_puts(buffer_2,"\n");
+ buffer_puts(buffer_2, "fatal: unable to find group ");
+ buffer_puts(buffer_2, value);
+ buffer_puts(buffer_2, "\n");
buffer_flush(buffer_2);
_exit(111);
}
- strnum[fmt_ulong(strnum,(unsigned long) gr->gr_gid)] = 0;
+ strnum[fmt_ulong(strnum, (unsigned long)gr->gr_gid)] = 0;
outs("int ");
outs(name);
diff --git a/src/auto-int.c b/src/auto-int.c
index 58f44b2..e3a6d56 100644
--- a/src/auto-int.c
+++ b/src/auto-int.c
@@ -1,16 +1,16 @@
#include <unistd.h>
+
#include "buffer.h"
-#include <unistd.h>
#include "exit.h"
-#include "scan.h"
#include "fmt.h"
+#include "scan.h"
char inbuf[256];
-buffer b = BUFFER_INIT(write,1,inbuf,sizeof(inbuf));
+buffer b = BUFFER_INIT(write, 1, inbuf, sizeof(inbuf));
void out(char *s)
{
- if (buffer_puts(&b,s) == -1) _exit(111);
+ if (buffer_puts(&b, s) == -1) _exit(111);
}
int main(int argc, char **argv)
@@ -25,8 +25,8 @@ int main(int argc, char **argv)
value = argv[2];
if (!value) _exit(100);
- scan_ulong(value,&num);
- strnum[fmt_ulong(strnum,num)] = 0;
+ scan_ulong(value, &num);
+ strnum[fmt_ulong(strnum, num)] = 0;
out("int ");
out(name);
diff --git a/src/auto-int8.c b/src/auto-int8.c
index fd5ead6..aa0465c 100644
--- a/src/auto-int8.c
+++ b/src/auto-int8.c
@@ -1,15 +1,16 @@
#include <unistd.h>
+
#include "buffer.h"
#include "exit.h"
-#include "scan.h"
#include "fmt.h"
+#include "scan.h"
char inbuf[256];
-buffer b = BUFFER_INIT(write,1,inbuf,sizeof(inbuf));
+buffer b = BUFFER_INIT(write, 1, inbuf, sizeof(inbuf));
void out(char *s)
{
- if (buffer_puts(&b,s) == -1) _exit(111);
+ if (buffer_puts(&b, s) == -1) _exit(111);
}
int main(int argc, char **argv)
@@ -24,8 +25,8 @@ int main(int argc, char **argv)
value = argv[2];
if (!value) _exit(100);
- scan_8long(value,&num);
- strnum[fmt_ulong(strnum,num)] = 0;
+ scan_8long(value, &num);
+ strnum[fmt_ulong(strnum, num)] = 0;
out("int ");
out(name);
diff --git a/src/auto-str.c b/src/auto-str.c
index 72e93bd..cad14ce 100644
--- a/src/auto-str.c
+++ b/src/auto-str.c
@@ -1,13 +1,14 @@
#include <unistd.h>
+
#include "buffer.h"
#include "exit.h"
char inbuf[BUFFER_SMALL];
-buffer b = BUFFER_INIT(write,1,inbuf,sizeof(inbuf));
+buffer b = BUFFER_INIT(write, 1, inbuf, sizeof(inbuf));
void out(char *s)
{
- if (buffer_puts(&b,s) == -1) _exit(111);
+ if (buffer_puts(&b, s) == -1) _exit(111);
}
int main(int argc, char **argv)
@@ -29,8 +30,10 @@ int main(int argc, char **argv)
while ((ch = *value++)) {
out("\\");
octal[3] = 0;
- octal[2] = '0' + (ch & 7); ch >>= 3;
- octal[1] = '0' + (ch & 7); ch >>= 3;
+ octal[2] = '0' + (ch & 7);
+ ch >>= 3;
+ octal[1] = '0' + (ch & 7);
+ ch >>= 3;
octal[0] = '0' + (ch & 7);
out(octal);
}
diff --git a/src/auto-uid.c b/src/auto-uid.c
index 21f469b..4eaaa2d 100644
--- a/src/auto-uid.c
+++ b/src/auto-uid.c
@@ -1,17 +1,18 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <pwd.h>
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
#include "exit.h"
-#include "scan.h"
#include "fmt.h"
+#include "scan.h"
char inbuf[256];
-buffer b = BUFFER_INIT(write,1,inbuf,sizeof(inbuf));
+buffer b = BUFFER_INIT(write, 1, inbuf, sizeof(inbuf));
void outs(char *s) /* was named puts, but Solaris pwd.h includes stdio.h. dorks. */
{
- if (buffer_puts(&b,s) == -1) _exit(111);
+ if (buffer_puts(&b, s) == -1) _exit(111);
}
int main(int argc, char **argv)
@@ -28,14 +29,14 @@ int main(int argc, char **argv)
pw = getpwnam(value);
if (!pw) {
- buffer_puts(buffer_2,"fatal: unable to find user ");
- buffer_puts(buffer_2,value);
- buffer_puts(buffer_2,"\n");
+ buffer_puts(buffer_2, "fatal: unable to find user ");
+ buffer_puts(buffer_2, value);
+ buffer_puts(buffer_2, "\n");
buffer_flush(buffer_2);
_exit(111);
}
- strnum[fmt_ulong(strnum,(unsigned long) pw->pw_uid)] = 0;
+ strnum[fmt_ulong(strnum, (unsigned long)pw->pw_uid)] = 0;
outs("int ");
outs(name);
diff --git a/src/base64.c b/src/base64.c
index fd38fe3..fca31c9 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -1,13 +1,13 @@
#include "base64.h"
+
#include "str.h"
-static char *b64alpha =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static char *b64alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define B64PAD '='
/* returns 0 ok, 1 illegal, -1 problem */
-int b64decode(const unsigned char *in,int l,stralloc *out)
+int b64decode(const unsigned char *in, int l, stralloc *out)
/* stralloc *out => not null terminated */
{
int p = 0;
@@ -18,18 +18,18 @@ int b64decode(const unsigned char *in,int l,stralloc *out)
unsigned char b[3];
if (l == 0) {
- if (!stralloc_copys(out,"")) return -1;
+ if (!stralloc_copys(out, "")) return -1;
return 0;
}
- while (in[l-1] == B64PAD) {
- p ++;
+ while (in[l - 1] == B64PAD) {
+ p++;
l--;
}
n = (l + p) / 4;
i = (n * 3) - p;
- if (!stralloc_ready(out,i)) return -1;
+ if (!stralloc_ready(out, i)) return -1;
out->len = i;
s = out->s;
@@ -48,13 +48,18 @@ int b64decode(const unsigned char *in,int l,stralloc *out)
x = (x << 6) + 63;
else if (in[j] == '=')
x = (x << 6);
- else return 1;
+ else
+ return 1;
}
- s[2] = (unsigned char)(x & 255); x >>= 8;
- s[1] = (unsigned char)(x & 255); x >>= 8;
- s[0] = (unsigned char)(x & 255); x >>= 8;
- s += 3; in += 4;
+ s[2] = (unsigned char)(x & 255);
+ x >>= 8;
+ s[1] = (unsigned char)(x & 255);
+ x >>= 8;
+ s[0] = (unsigned char)(x & 255);
+ x >>= 8;
+ s += 3;
+ in += 4;
}
x = 0;
@@ -71,33 +76,35 @@ int b64decode(const unsigned char *in,int l,stralloc *out)
x = (x << 6) + 63;
else if (in[j] == '=')
x = (x << 6);
- else return 1;
+ else
+ return 1;
}
- b[2] = (unsigned char)(x & 255); x >>= 8;
- b[1] = (unsigned char)(x & 255); x >>= 8;
- b[0] = (unsigned char)(x & 255); x >>= 8;
+ b[2] = (unsigned char)(x & 255);
+ x >>= 8;
+ b[1] = (unsigned char)(x & 255);
+ x >>= 8;
+ b[0] = (unsigned char)(x & 255);
+ x >>= 8;
- for (i = 0; i < 3 - p; i++)
- s[i] = b[i];
+ for (i = 0; i < 3 - p; i++) s[i] = b[i];
return 0;
}
-int b64encode(stralloc *in,stralloc *out)
+int b64encode(stralloc *in, stralloc *out)
{
unsigned char a, b, c;
int i;
char *s;
- if (in->len == 0)
- {
- if (!stralloc_copys(out,"")) return -1;
+ if (in->len == 0) {
+ if (!stralloc_copys(out, "")) return -1;
return 0;
}
- i = in->len / 3 * 4 + 4;
- if (!stralloc_ready(out,i)) return -1;
+ i = in->len / 3 * 4 + 4;
+ if (!stralloc_ready(out, i)) return -1;
s = out->s;
for (i = 0; i < in->len; i += 3) {
@@ -106,13 +113,17 @@ int b64encode(stralloc *in,stralloc *out)
c = i + 2 < in->len ? in->s[i + 2] : 0;
*s++ = b64alpha[a >> 2];
- *s++ = b64alpha[((a & 3 ) << 4) | (b >> 4)];
+ *s++ = b64alpha[((a & 3) << 4) | (b >> 4)];
- if (i + 1 >= in->len) *s++ = B64PAD;
- else *s++ = b64alpha[((b & 0x0f) << 2) | (c >> 6)];
+ if (i + 1 >= in->len)
+ *s++ = B64PAD;
+ else
+ *s++ = b64alpha[((b & 0x0f) << 2) | (c >> 6)];
- if (i + 2 >= in->len) *s++ = B64PAD;
- else *s++ = b64alpha[c & 0x3f];
+ if (i + 2 >= in->len)
+ *s++ = B64PAD;
+ else
+ *s++ = b64alpha[c & 0x3f];
}
out->len = s - out->s;
return 0;
diff --git a/src/bouncesaying.c b/src/bouncesaying.c
index 416d76d..3d40b69 100644
--- a/src/bouncesaying.c
+++ b/src/bouncesaying.c
@@ -1,38 +1,35 @@
#include <unistd.h>
+
+#include "exit.h"
#include "logmsg.h"
-#include "wait.h"
#include "sig.h"
-#include "exit.h"
+#include "wait.h"
#define WHO "bouncesaying"
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int pid;
int wstat;
- if (!argv[1])
- logmsg(WHO,100,USAGE,"bouncesaying error [ program [ arg ... ] ]");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "bouncesaying error [ program [ arg ... ] ]");
if (argv[2]) {
pid = fork();
- if (pid == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
+ if (pid == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
if (pid == 0) {
- execvp(argv[2],argv + 2);
+ execvp(argv[2], argv + 2);
if (errno) _exit(111);
_exit(100);
}
- if (wait_pid(&wstat,pid) == -1)
- logmsg(WHO,111,FATAL,"wait failed");
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,"child crashed");
+ if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed");
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed");
switch (wait_exitcode(wstat)) {
- case 0: break;
- case 111: logmsg(WHO,111,FATAL,"temporary child error");
- default: _exit(0);
+ case 0: break;
+ case 111: logmsg(WHO, 111, FATAL, "temporary child error");
+ default: _exit(0);
}
}
- logmsg(WHO,100,LOG,argv[1]);
+ logmsg(WHO, 100, LOG, argv[1]);
}
diff --git a/src/chkshsgr.c b/src/chkshsgr.c
index fc752bd..a98089b 100644
--- a/src/chkshsgr.c
+++ b/src/chkshsgr.c
@@ -1,6 +1,7 @@
#include <grp.h>
#include <sys/types.h>
#include <unistd.h>
+
#include "exit.h"
int main()
@@ -8,6 +9,7 @@ int main()
short x[4];
x[0] = x[1] = 0;
- if (getgroups(1,x) == 0) if (setgroups(1,x) == -1) _exit(1);
+ if (getgroups(1, x) == 0)
+ if (setgroups(1, x) == -1) _exit(1);
_exit(0);
}
diff --git a/src/chkspawn.c b/src/chkspawn.c
index 511489a..2023a9e 100644
--- a/src/chkspawn.c
+++ b/src/chkspawn.c
@@ -1,9 +1,10 @@
#include "buffer.h"
+#include "exit.h"
#include "fmt.h"
#include "select.h"
-#include "exit.h"
+
#include "auto_spawn.h"
-#define MAXSPAWN 1000 /* Silent spawn limit increased to 1000 */
+#define MAXSPAWN 1000 /* Silent spawn limit increased to 1000 */
char num[FMT_ULONG];
fd_set fds;
@@ -12,35 +13,39 @@ int main()
{
unsigned long hiddenlimit;
unsigned long maxnumd;
-
+
hiddenlimit = sizeof(fds) * 8;
maxnumd = (hiddenlimit - 5) / 2;
-
+
if (auto_spawn < 1) {
- buffer_puts(buffer_2,"Oops. You have set conf-spawn lower than 1.\n");
+ buffer_puts(buffer_2, "Oops. You have set conf-spawn lower than 1.\n");
buffer_flush(buffer_2);
_exit(1);
}
if (auto_spawn > MAXSPAWN) {
- buffer_puts(buffer_2,"Oops. You have set conf-spawn higher than MAXSPAWN.\n");
+ buffer_puts(buffer_2, "Oops. You have set conf-spawn higher than MAXSPAWN.\n");
buffer_flush(buffer_2);
_exit(1);
}
if (auto_spawn > maxnumd) {
- buffer_puts(buffer_2,"Oops. Your system's FD_SET() has a hidden limit of ");
- buffer_put(buffer_2,num,fmt_ulong(num,hiddenlimit));
- buffer_puts(buffer_2," descriptors.\n\
+ buffer_puts(buffer_2, "Oops. Your system's FD_SET() has a hidden limit of ");
+ buffer_put(buffer_2, num, fmt_ulong(num, hiddenlimit));
+ buffer_puts(
+ buffer_2,
+ " descriptors.\n\
This means that the qmail daemons could crash if you set the run-time\n\
concurrency higher than ");
- buffer_put(buffer_2,num,fmt_ulong(num,maxnumd));
- buffer_puts(buffer_2,". So I'm going to insist that the concurrency\n\
+ buffer_put(buffer_2, num, fmt_ulong(num, maxnumd));
+ buffer_puts(
+ buffer_2,
+ ". So I'm going to insist that the concurrency\n\
limit in conf-spawn be at most ");
- buffer_put(buffer_2,num,fmt_ulong(num,maxnumd));
- buffer_puts(buffer_2,". Right now it's ");
- buffer_put(buffer_2,num,fmt_ulong(num,(unsigned long) auto_spawn));
- buffer_puts(buffer_2,".\n");
+ buffer_put(buffer_2, num, fmt_ulong(num, maxnumd));
+ buffer_puts(buffer_2, ". Right now it's ");
+ buffer_put(buffer_2, num, fmt_ulong(num, (unsigned long)auto_spawn));
+ buffer_puts(buffer_2, ".\n");
buffer_flush(buffer_2);
_exit(1);
}
diff --git a/src/columnt.c b/src/columnt.c
index 9e4cf0e..638c078 100644
--- a/src/columnt.c
+++ b/src/columnt.c
@@ -1,21 +1,31 @@
#include <unistd.h>
+
#include "alloc.h"
-#include "logmsg.h"
#include "buffer.h"
-#include "stralloc.h"
#include "exit.h"
+#include "logmsg.h"
#include "readclose.h"
+#include "stralloc.h"
#define WHO "columnt"
#define BSIZE 4096
char outbuf[BSIZE];
-buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(write, 1, outbuf, sizeof(outbuf));
-void nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
-void die_read() { logmsg(WHO,110,ERROR,"unable to read input: "); }
-void die_write() { logmsg(WHO,110,ERROR,"unable to write output: "); }
+void nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
+void die_read()
+{
+ logmsg(WHO, 110, ERROR, "unable to read input: ");
+}
+void die_write()
+{
+ logmsg(WHO, 110, ERROR, "unable to write output: ");
+}
stralloc file = {0};
int *width;
@@ -28,15 +38,15 @@ void nothing()
void printline()
{
- if (buffer_put(&bo,"\n",1) == -1) die_write();
+ if (buffer_put(&bo, "\n", 1) == -1) die_write();
}
-void maxfield_check(int fieldnum,char *buf,int len)
+void maxfield_check(int fieldnum, char *buf, int len)
{
if (fieldnum > maxfield) maxfield = fieldnum;
}
-void width_check(int fieldnum,char *buf,int len)
+void width_check(int fieldnum, char *buf, int len)
{
if (len > width[fieldnum]) width[fieldnum] = len;
}
@@ -45,24 +55,23 @@ void width_init()
{
int i;
- width = (int *) alloc((maxfield + 1) * sizeof(int));
+ width = (int *)alloc((maxfield + 1) * sizeof(int));
if (!width) nomem();
- for (i = 0; i <= maxfield; ++i)
- width[i] = 0;
+ for (i = 0; i <= maxfield; ++i) width[i] = 0;
}
-void printfield(int fieldnum,char *buf,int len)
+void printfield(int fieldnum, char *buf, int len)
{
int i;
if (fieldnum < maxfield)
for (i = len; i < width[fieldnum]; ++i)
- if (buffer_put(&bo," ",1) == -1) die_write();
+ if (buffer_put(&bo, " ", 1) == -1) die_write();
- if (buffer_put(&bo,buf,len) == -1) die_write();
+ if (buffer_put(&bo, buf, len) == -1) die_write();
if (fieldnum < maxfield)
- if (buffer_put(&bo," ",2) == -1) die_write();
+ if (buffer_put(&bo, " ", 2) == -1) die_write();
}
void split(void (*dofield)(), void (*doline)())
@@ -80,7 +89,7 @@ void split(void (*dofield)(), void (*doline)())
if (i == j) break;
fieldpos = i;
while ((file.s[i] != ' ') && (file.s[i] != '\t') && (file.s[i] != '\n')) ++i;
- dofield(fieldnum++,file.s + fieldpos,i - fieldpos);
+ dofield(fieldnum++, file.s + fieldpos, i - fieldpos);
}
doline();
i = j + 1;
@@ -89,15 +98,15 @@ void split(void (*dofield)(), void (*doline)())
int main()
{
- if (readclose_append(0,&file,BSIZE) == -1) die_read();
+ if (readclose_append(0, &file, BSIZE) == -1) die_read();
if (!file.len) _exit(0);
if (file.s[file.len - 1] != '\n')
- if (!stralloc_append(&file,"\n")) nomem();
+ if (!stralloc_append(&file, "\n")) nomem();
- split(maxfield_check,nothing);
+ split(maxfield_check, nothing);
width_init();
- split(width_check,nothing);
- split(printfield,printline);
+ split(width_check, nothing);
+ split(printfield, printline);
if (buffer_flush(&bo) == -1) die_write();
_exit(0);
diff --git a/src/commands.c b/src/commands.c
index 8602f7c..8cb81de 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -1,38 +1,40 @@
#include "commands.h"
+
#include "buffer.h"
-#include "stralloc.h"
-#include "str.h"
#include "case.h"
+#include "str.h"
+#include "stralloc.h"
static stralloc cmd = {0};
-int commands(buffer *b,struct commands *c)
+int commands(buffer *b, struct commands *c)
{
int i;
char *arg;
for (;;) {
- if (!stralloc_copys(&cmd,"")) return -1;
+ if (!stralloc_copys(&cmd, "")) return -1;
for (;;) {
- if (!stralloc_readyplus(&cmd,1)) return -1;
- i = buffer_get(b,cmd.s + cmd.len,1);
+ if (!stralloc_readyplus(&cmd, 1)) return -1;
+ i = buffer_get(b, cmd.s + cmd.len, 1);
if (i != 1) return i;
if (cmd.s[cmd.len] == '\n') break;
++cmd.len;
}
- if (cmd.len > 0) if (cmd.s[cmd.len - 1] == '\r') --cmd.len;
+ if (cmd.len > 0)
+ if (cmd.s[cmd.len - 1] == '\r') --cmd.len;
cmd.s[cmd.len] = 0;
- i = str_chr(cmd.s,' ');
+ i = str_chr(cmd.s, ' ');
arg = cmd.s + i;
while (*arg == ' ') ++arg;
cmd.s[i] = 0;
- for (i = 0; c[i].text; ++i)
- if (case_equals(c[i].text,cmd.s)) break;
+ for (i = 0; c[i].text; ++i)
+ if (case_equals(c[i].text, cmd.s)) break;
c[i].fun(arg);
if (c[i].flush) c[i].flush();
diff --git a/src/condredirect.c b/src/condredirect.c
index 6f2d89a..534dac7 100644
--- a/src/condredirect.c
+++ b/src/condredirect.c
@@ -1,81 +1,76 @@
#include <unistd.h>
-#include "sig.h"
-#include "exit.h"
+
+#include "buffer.h"
#include "env.h"
+#include "exit.h"
+#include "fmt.h"
#include "logmsg.h"
-#include "wait.h"
#include "seek.h"
+#include "sig.h"
+#include "wait.h"
+
#include "qmail.h"
-#include "buffer.h"
-#include "fmt.h"
#define WHO "condredirect"
struct qmail qqt;
-ssize_t mywrite(int fd,char *buf,int len)
+ssize_t mywrite(int fd, char *buf, int len)
{
- qmail_put(&qqt,buf,len);
+ qmail_put(&qqt, buf, len);
return len;
}
char inbuf[BUFFER_INSIZE];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
char outbuf[1];
-buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(mywrite, -1, outbuf, sizeof(outbuf));
char num[FMT_ULONG];
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
char *sender;
char *dtline;
int pid;
int wstat;
char *qqx;
-
- if (!argv[1] || !argv[2])
- logmsg(WHO,100,USAGE,"condredirect newaddress program [ arg ... ]");
-
+
+ if (!argv[1] || !argv[2]) logmsg(WHO, 100, USAGE, "condredirect newaddress program [ arg ... ]");
+
pid = fork();
- if (pid == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
+ if (pid == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
if (pid == 0) {
- execvp(argv[2],argv + 2);
+ execvp(argv[2], argv + 2);
if (errno) _exit(111);
_exit(100);
}
- if (wait_pid(&wstat,pid) == -1)
- logmsg(WHO,111,FATAL,"wait failed");
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,"child crashed");
+ if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed");
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed");
switch (wait_exitcode(wstat)) {
- case 0: break;
- case 111: logmsg(WHO,111,FATAL,"temporary child error");
- default: _exit(0);
+ case 0: break;
+ case 111: logmsg(WHO, 111, FATAL, "temporary child error");
+ default: _exit(0);
}
- if (seek_begin(0) == -1)
- logmsg(WHO,111,FATAL,"unable to rewind: ");
+ if (seek_begin(0) == -1) logmsg(WHO, 111, FATAL, "unable to rewind: ");
sig_pipeignore();
-
+
sender = env_get("SENDER");
- if (!sender) logmsg(WHO,100,ERROR,"SENDER not set");
+ if (!sender) logmsg(WHO, 100, ERROR, "SENDER not set");
dtline = env_get("DTLINE");
- if (!dtline) logmsg(WHO,100,ERROR,"DTLINE not set");
-
- if (qmail_open(&qqt) == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
- qmail_puts(&qqt,dtline);
- if (buffer_copy(&bo,&bi) != 0)
- logmsg(WHO,111,FATAL,"unable to read message: ");
+ if (!dtline) logmsg(WHO, 100, ERROR, "DTLINE not set");
+
+ if (qmail_open(&qqt) == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
+ qmail_puts(&qqt, dtline);
+ if (buffer_copy(&bo, &bi) != 0) logmsg(WHO, 111, FATAL, "unable to read message: ");
buffer_flush(&bo);
-
- num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
- qmail_from(&qqt,sender);
- qmail_to(&qqt,argv[1]);
+ num[fmt_ulong(num, qmail_qp(&qqt))] = 0;
+
+ qmail_from(&qqt, sender);
+ qmail_to(&qqt, argv[1]);
qqx = qmail_close(&qqt);
- if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
- logmsg(WHO,0,LOG,B("qp ",num));
+ if (*qqx) logmsg(WHO, *qqx == 'D' ? 100 : 111, FATAL, qqx + 1);
+ logmsg(WHO, 0, LOG, B("qp ", num));
}
diff --git a/src/constmap.c b/src/constmap.c
index ea153ea..decc42e 100644
--- a/src/constmap.c
+++ b/src/constmap.c
@@ -1,8 +1,9 @@
#include "constmap.h"
+
#include "alloc.h"
#include "case.h"
-static constmap_hash hash(char *s,int len)
+static constmap_hash hash(char *s, int len)
{
unsigned char ch;
constmap_hash h;
@@ -16,49 +17,48 @@ static constmap_hash hash(char *s,int len)
return h;
}
-char *constmap(struct constmap *cm,char *s,int len)
+char *constmap(struct constmap *cm, char *s, int len)
{
constmap_hash h;
int pos;
- h = hash(s,len);
+ h = hash(s, len);
pos = cm->first[h & cm->mask];
while (pos != -1) {
if (h == cm->hash[pos])
if (len == cm->inputlen[pos])
- if (!case_diffb(cm->input[pos],len,s))
- return cm->input[pos] + cm->inputlen[pos] + 1;
+ if (!case_diffb(cm->input[pos], len, s)) return cm->input[pos] + cm->inputlen[pos] + 1;
pos = cm->next[pos];
}
return 0;
}
-int constmap_init(struct constmap *cm,char *s,int len,int flagcolon)
+int constmap_init(struct constmap *cm, char *s, int len, int flagcolon)
{
int i;
int j;
int k;
int pos;
constmap_hash h;
-
+
cm->num = 0;
- for (j = 0; j < len; ++j) if (!s[j]) ++cm->num;
-
+ for (j = 0; j < len; ++j)
+ if (!s[j]) ++cm->num;
+
h = 64;
while (h && (h < cm->num)) h += h;
cm->mask = h - 1;
-
- cm->first = (int *) alloc(sizeof(int) * h);
+
+ cm->first = (int *)alloc(sizeof(int) * h);
if (cm->first) {
- cm->input = (char **) alloc(sizeof(char *) * cm->num);
+ cm->input = (char **)alloc(sizeof(char *) * cm->num);
if (cm->input) {
- cm->inputlen = (int *) alloc(sizeof(int) * cm->num);
+ cm->inputlen = (int *)alloc(sizeof(int) * cm->num);
if (cm->inputlen) {
- cm->hash = (constmap_hash *) alloc(sizeof(constmap_hash) * cm->num);
+ cm->hash = (constmap_hash *)alloc(sizeof(constmap_hash) * cm->num);
if (cm->hash) {
- cm->next = (int *) alloc(sizeof(int) * cm->num);
+ cm->next = (int *)alloc(sizeof(int) * cm->num);
if (cm->next) {
- for (h = 0; h <= cm->mask; ++h)
- cm->first[h] = -1;
+ for (h = 0; h <= cm->mask; ++h) cm->first[h] = -1;
pos = 0;
i = 0;
for (j = 0; j < len; ++j)
@@ -67,12 +67,15 @@ int constmap_init(struct constmap *cm,char *s,int len,int flagcolon)
if (flagcolon) {
for (k = i; k < j; ++k)
if (s[k] == ':') break;
- if (k >= j) { i = j + 1; continue; }
+ if (k >= j) {
+ i = j + 1;
+ continue;
+ }
k -= i;
}
cm->input[pos] = s + i;
cm->inputlen[pos] = k;
- h = hash(s + i,k);
+ h = hash(s + i, k);
cm->hash[pos] = h;
h &= cm->mask;
cm->next[pos] = cm->first[h];
@@ -93,7 +96,7 @@ int constmap_init(struct constmap *cm,char *s,int len,int flagcolon)
return 0;
}
-int constmap_init_char(struct constmap *cm,char *s,int len,int flagcolon,char flagchar)
+int constmap_init_char(struct constmap *cm, char *s, int len, int flagcolon, char flagchar)
{
int i;
int j;
@@ -106,24 +109,24 @@ int constmap_init_char(struct constmap *cm,char *s,int len,int flagcolon,char fl
}
cm->num = 0;
- for (j = 0; j < len; ++j) if (!s[j]) ++cm->num;
+ for (j = 0; j < len; ++j)
+ if (!s[j]) ++cm->num;
h = 64;
while (h && (h < cm->num)) h += h;
cm->mask = h - 1;
- cm->first = (int *) alloc(sizeof(int) * h);
+ cm->first = (int *)alloc(sizeof(int) * h);
if (cm->first) {
- cm->input = (char **) alloc(sizeof(char *) * cm->num);
+ cm->input = (char **)alloc(sizeof(char *) * cm->num);
if (cm->input) {
- cm->inputlen = (int *) alloc(sizeof(int) * cm->num);
+ cm->inputlen = (int *)alloc(sizeof(int) * cm->num);
if (cm->inputlen) {
- cm->hash = (constmap_hash *) alloc(sizeof(constmap_hash) * cm->num);
+ cm->hash = (constmap_hash *)alloc(sizeof(constmap_hash) * cm->num);
if (cm->hash) {
- cm->next = (int *) alloc(sizeof(int) * cm->num);
+ cm->next = (int *)alloc(sizeof(int) * cm->num);
if (cm->next) {
- for (h = 0; h <= cm->mask; ++h)
- cm->first[h] = -1;
+ for (h = 0; h <= cm->mask; ++h) cm->first[h] = -1;
pos = 0;
i = 0;
for (j = 0; j < len; ++j)
@@ -132,12 +135,15 @@ int constmap_init_char(struct constmap *cm,char *s,int len,int flagcolon,char fl
if (flagcolon) {
for (k = i; k < j; ++k)
if (s[k] == flagchar) break;
- if (k >= j) { i = j + 1; continue; }
+ if (k >= j) {
+ i = j + 1;
+ continue;
+ }
k -= i;
}
cm->input[pos] = s + i;
cm->inputlen[pos] = k;
- h = hash(s + i,k);
+ h = hash(s + i, k);
cm->hash[pos] = h;
h &= cm->mask;
cm->next[pos] = cm->first[h];
@@ -145,9 +151,9 @@ int constmap_init_char(struct constmap *cm,char *s,int len,int flagcolon,char fl
++pos;
i = j + 1;
}
- return 1;
- }
- alloc_free(cm->hash);
+ return 1;
+ }
+ alloc_free(cm->hash);
}
alloc_free(cm->inputlen);
}
diff --git a/src/control.c b/src/control.c
index 2558225..a40030d 100644
--- a/src/control.c
+++ b/src/control.c
@@ -1,13 +1,15 @@
+#include "control.h"
+
#include <unistd.h>
-#include "open.h"
-#include "getln.h"
-#include "stralloc.h"
+
+#include "alloc.h"
#include "buffer.h"
+#include "error.h"
+#include "getln.h"
#include "logmsg.h"
-#include "control.h"
-#include "alloc.h"
+#include "open.h"
#include "scan.h"
-#include "error.h"
+#include "stralloc.h"
static char inbuf[2048];
static stralloc line = {0};
@@ -19,13 +21,12 @@ static int meok = 0;
static void striptrailingwhitespace(stralloc *sa)
{
- while (sa->len > 0)
- switch (sa->s[sa->len - 1]) {
- case '\n': case ' ': case '\t':
- --sa->len;
- break;
- default:
- return;
+ while (sa->len > 0) switch (sa->s[sa->len - 1])
+ {
+ case '\n':
+ case ' ':
+ case '\t': --sa->len; break;
+ default: return;
}
}
@@ -33,34 +34,41 @@ int control_init(void)
{
int r;
- r = control_readline(&me,"control/me");
+ r = control_readline(&me, "control/me");
if (r == 1) meok = 1;
return r;
}
-int control_rldef(stralloc *sa,char *fn,int flagme,char *def)
+int control_rldef(stralloc *sa, char *fn, int flagme, char *def)
{
int r;
- r = control_readline(sa,fn);
+ r = control_readline(sa, fn);
if (r) return r;
- if (flagme) if (meok) return stralloc_copy(sa,&me) ? 1 : -1;
- if (def) return stralloc_copys(sa,def) ? 1 : -1;
+ if (flagme)
+ if (meok) return stralloc_copy(sa, &me) ? 1 : -1;
+ if (def) return stralloc_copys(sa, def) ? 1 : -1;
return r;
}
-int control_readline(stralloc *sa,char *fn)
+int control_readline(stralloc *sa, char *fn)
{
buffer b;
int fd;
int match;
fd = open_read(fn);
- if (fd == -1) { if (errno == ENOENT) return 0; return -1; }
-
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
+ if (fd == -1) {
+ if (errno == ENOENT) return 0;
+ return -1;
+ }
- if (getln(&b,sa,&match,'\n') == -1) { close(fd); return -1; }
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
+
+ if (getln(&b, sa, &match, '\n') == -1) {
+ close(fd);
+ return -1;
+ }
striptrailingwhitespace(sa);
@@ -68,34 +76,34 @@ int control_readline(stralloc *sa,char *fn)
return 1;
}
-int control_readint(int *i,char *fn)
+int control_readint(int *i, char *fn)
{
unsigned long u;
- switch (control_readline(&line,fn)) {
- case 0: return 0;
+ switch (control_readline(&line, fn)) {
+ case 0: return 0;
case -1: return -1;
}
if (!stralloc_0(&line)) return -1;
- if (!scan_ulong(line.s,&u)) return 0;
+ if (!scan_ulong(line.s, &u)) return 0;
*i = u;
return 1;
}
-int control_readfile(stralloc *sa,char *fn,int flagme)
+int control_readfile(stralloc *sa, char *fn, int flagme)
{
buffer b;
int fd;
int match;
- if (!stralloc_copys(sa,"")) return -1;
+ if (!stralloc_copys(sa, "")) return -1;
fd = open_read(fn);
if (fd == -1) {
if (errno == ENOENT) {
if (flagme && meok) {
- if (!stralloc_copy(sa,&me)) return -1;
+ if (!stralloc_copy(sa, &me)) return -1;
if (!stralloc_0(sa)) return -1;
return 1;
}
@@ -104,17 +112,23 @@ int control_readfile(stralloc *sa,char *fn,int flagme)
return -1;
}
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
for (;;) {
- if (getln(&b,&line,&match,'\n') == -1) break;
- if (!match && !line.len) { close(fd); return 1; }
+ if (getln(&b, &line, &match, '\n') == -1) break;
+ if (!match && !line.len) {
+ close(fd);
+ return 1;
+ }
striptrailingwhitespace(&line);
if (!stralloc_0(&line)) break;
if (line.s[0])
if (line.s[0] != '#')
- if (!stralloc_cat(sa,&line)) break;
- if (!match) { close(fd); return 1; }
+ if (!stralloc_cat(sa, &line)) break;
+ if (!match) {
+ close(fd);
+ return 1;
+ }
}
close(fd);
diff --git a/src/date822fmt.c b/src/date822fmt.c
index fc2d1f7..7e0333a 100644
--- a/src/date822fmt.c
+++ b/src/date822fmt.c
@@ -1,29 +1,54 @@
-#include "datetime.h"
-#include "fmt.h"
#include "date822fmt.h"
+#include "fmt.h"
+
+#include "datetime.h"
+
static char *montab[12] = {
-"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
-};
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-unsigned int date822fmt(char *s,struct datetime *dt)
+unsigned int date822fmt(char *s, struct datetime *dt)
{
unsigned int i;
unsigned int len;
len = 0;
- i = fmt_uint(s,dt->mday); len += i; if (s) s += i;
- i = fmt_str(s," "); len += i; if (s) s += i;
- i = fmt_str(s,montab[dt->mon]); len += i; if (s) s += i;
- i = fmt_str(s," "); len += i; if (s) s += i;
- i = fmt_uint(s,dt->year + 1900); len += i; if (s) s += i;
- i = fmt_str(s," "); len += i; if (s) s += i;
- i = fmt_uint0(s,dt->hour,2); len += i; if (s) s += i;
- i = fmt_str(s,":"); len += i; if (s) s += i;
- i = fmt_uint0(s,dt->min,2); len += i; if (s) s += i;
- i = fmt_str(s,":"); len += i; if (s) s += i;
- i = fmt_uint0(s,dt->sec,2); len += i; if (s) s += i;
- i = fmt_str(s," -0000\n"); len += i; if (s) s += i;
+ i = fmt_uint(s, dt->mday);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " ");
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, montab[dt->mon]);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " ");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint(s, dt->year + 1900);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " ");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt->hour, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ":");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt->min, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ":");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt->sec, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " -0000\n");
+ len += i;
+ if (s) s += i;
return len;
}
diff --git a/src/datetime.c b/src/datetime.c
index 3db5f7f..5f5d9bf 100644
--- a/src/datetime.c
+++ b/src/datetime.c
@@ -1,7 +1,7 @@
/* 19950925 */
#include "datetime.h"
-void datetime_tai(struct datetime *dt,datetime_sec t)
+void datetime_tai(struct datetime *dt, datetime_sec t)
{
int day;
int tod;
@@ -9,43 +9,67 @@ void datetime_tai(struct datetime *dt,datetime_sec t)
int yday;
int wday;
int mon;
-
+
tod = t % 86400;
day = t / 86400;
- if (tod < 0) { tod += 86400; --day; }
-
+ if (tod < 0) {
+ tod += 86400;
+ --day;
+ }
+
dt->hour = tod / 3600;
tod %= 3600;
dt->min = tod / 60;
dt->sec = tod % 60;
-
- wday = (day + 4) % 7; if (wday < 0) wday += 7;
+
+ wday = (day + 4) % 7;
+ if (wday < 0) wday += 7;
dt->wday = wday;
-
+
day -= 11017;
/* day 0 is march 1, 2000 */
year = 5 + day / 146097;
- day = day % 146097; if (day < 0) { day += 146097; --year; }
+ day = day % 146097;
+ if (day < 0) {
+ day += 146097;
+ --year;
+ }
/* from now on, day is nonnegative */
year *= 4;
- if (day == 146096) { year += 3; day = 36524; }
- else { year += day / 36524; day %= 36524; }
+ if (day == 146096) {
+ year += 3;
+ day = 36524;
+ } else {
+ year += day / 36524;
+ day %= 36524;
+ }
year *= 25;
year += day / 1461;
day %= 1461;
year *= 4;
yday = (day < 306);
- if (day == 1460) { year += 3; day = 365; }
- else { year += day / 365; day %= 365; }
+ if (day == 1460) {
+ year += 3;
+ day = 365;
+ } else {
+ year += day / 365;
+ day %= 365;
+ }
yday += day;
-
+
day *= 10;
mon = (day + 5) / 306;
day = day + 5 - 306 * mon;
day /= 10;
- if (mon >= 10) { yday -= 306; ++year; mon -= 10; }
- else { yday += 59; mon += 2; }
-
+ if (mon >= 10) {
+ yday -= 306;
+ ++year;
+ mon -= 10;
+ } else {
+ yday += 59;
+ mon += 2;
+ }
+
dt->yday = yday;
dt->year = year - 1900;
dt->mon = mon;
diff --git a/src/datetime_un.c b/src/datetime_un.c
index e84806d..f8d24f2 100644
--- a/src/datetime_un.c
+++ b/src/datetime_un.c
@@ -7,29 +7,41 @@ datetime_sec datetime_untai(struct datetime *dt)
int year;
int day;
int mon;
-
+
year = dt->year + 1900;
-
+
mon = dt->mon;
- if (mon >= 2) { mon -= 2; }
- else { mon += 10; --year; }
-
+ if (mon >= 2) {
+ mon -= 2;
+ } else {
+ mon += 10;
+ --year;
+ }
+
day = (dt->mday - 1) * 10 + 5 + 306 * mon;
day /= 10;
-
- if (day == 365) { year -= 3; day = 1460; }
- else { day += 365 * (year % 4); }
+
+ if (day == 365) {
+ year -= 3;
+ day = 1460;
+ } else {
+ day += 365 * (year % 4);
+ }
year /= 4;
-
+
day += 1461 * (year % 25);
year /= 25;
-
- if (day == 36524) { year -= 3; day = 146096; }
- else { day += 36524 * (year % 4); }
+
+ if (day == 36524) {
+ year -= 3;
+ day = 146096;
+ } else {
+ day += 36524 * (year % 4);
+ }
year /= 4;
-
+
day += 146097 * (year - 5);
day += 11017;
-
+
return ((day * 24 + dt->hour) * 60 + dt->min) * 60 + dt->sec;
}
diff --git a/src/dkim.cpp b/src/dkim.cpp
index 8f36644..1ce8eee 100644
--- a/src/dkim.cpp
+++ b/src/dkim.cpp
@@ -19,72 +19,78 @@
* Changes done by ¢feh@fehcom.de obeying the above license
*
*****************************************************************************/
-#include <string.h>
#include "dkim.h"
+
+#include <string.h>
+
#include "dkimsign.h"
#include "dkimverify.h"
-#define DKIMID ('D' | 'K'<<8 | 'I'<<16 | 'M'<<24)
+#define DKIMID ('D' | 'K' << 8 | 'I' << 16 | 'M' << 24)
/* taken from removed file "ressource.h" */
#ifdef VERSION
-#define VERSION_STRING VERSION
+ #define VERSION_STRING VERSION
#else
-#define VERSION_STRING "1.4.0"
+ #define VERSION_STRING "1.4.0"
#endif
-static void InitContext(DKIMContext* pContext,bool bSign,void* pObject)
+static void InitContext(DKIMContext *pContext, bool bSign, void *pObject)
{
pContext->reserved1 = DKIMID;
pContext->reserved2 = bSign ? 1 : 0;
pContext->reserved3 = pObject;
}
-static void* ValidateContext(DKIMContext* pContext,bool bSign)
+static void *ValidateContext(DKIMContext *pContext, bool bSign)
{
- if (pContext->reserved1 != DKIMID)
- return NULL;
+ if (pContext->reserved1 != DKIMID) return NULL;
- if (pContext->reserved2 != (unsigned int)(bSign ? 1 : 0))
- return NULL;
+ if (pContext->reserved2 != (unsigned int)(bSign ? 1 : 0)) return NULL;
return pContext->reserved3;
}
-int DKIM_CALL DKIMSignInit(DKIMContext* pSignContext,DKIMSignOptions* pOptions)
+int DKIM_CALL DKIMSignInit(DKIMContext *pSignContext, DKIMSignOptions *pOptions)
{
int nRet = DKIM_OUT_OF_MEMORY;
- CDKIMSign* pSign = new CDKIMSign;
+ CDKIMSign *pSign = new CDKIMSign;
if (pSign) {
nRet = pSign->Init(pOptions);
- if (nRet != DKIM_SUCCESS)
- delete pSign;
+ if (nRet != DKIM_SUCCESS) delete pSign;
}
- if (nRet == DKIM_SUCCESS) { InitContext(pSignContext,true,pSign); }
+ if (nRet == DKIM_SUCCESS) {
+ InitContext(pSignContext, true, pSign);
+ }
return nRet;
}
-int DKIM_CALL DKIMSignProcess(DKIMContext* pSignContext,char* szBuffer,int nBufLength)
+int DKIM_CALL DKIMSignProcess(DKIMContext *pSignContext, char *szBuffer, int nBufLength)
{
- CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true);
+ CDKIMSign *pSign = (CDKIMSign *)ValidateContext(pSignContext, true);
- if (pSign) { return pSign->Process(szBuffer,nBufLength,false); }
+ if (pSign) {
+ return pSign->Process(szBuffer, nBufLength, false);
+ }
return DKIM_INVALID_CONTEXT;
}
-int DKIM_CALL DKIMSignGetSig2(DKIMContext* pSignContext,char* szRSAPrivKey,char* szECCPrivKey,char** pszSignature)
+int DKIM_CALL DKIMSignGetSig2(
+ DKIMContext *pSignContext, char *szRSAPrivKey, char *szECCPrivKey, char **pszSignature)
{
- CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true);
+ CDKIMSign *pSign = (CDKIMSign *)ValidateContext(pSignContext, true);
- if (pSign) { return pSign->GetSig2(szRSAPrivKey,szECCPrivKey,pszSignature); }
+ if (pSign) {
+ return pSign->GetSig2(szRSAPrivKey, szECCPrivKey, pszSignature);
+ }
return DKIM_INVALID_CONTEXT;
}
-void DKIM_CALL DKIMSignFree(DKIMContext* pSignContext)
+void DKIM_CALL DKIMSignFree(DKIMContext *pSignContext)
{
- CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true);
+ CDKIMSign *pSign = (CDKIMSign *)ValidateContext(pSignContext, true);
if (pSign) {
delete pSign;
@@ -92,65 +98,65 @@ void DKIM_CALL DKIMSignFree(DKIMContext* pSignContext)
}
}
-int DKIM_CALL DKIMVerifyInit(DKIMContext* pVerifyContext,DKIMVerifyOptions* pOptions)
+int DKIM_CALL DKIMVerifyInit(DKIMContext *pVerifyContext, DKIMVerifyOptions *pOptions)
{
int nRet = DKIM_OUT_OF_MEMORY;
- CDKIMVerify* pVerify = new CDKIMVerify;
+ CDKIMVerify *pVerify = new CDKIMVerify;
if (pVerify) {
nRet = pVerify->Init(pOptions);
- if (nRet != DKIM_SUCCESS)
- delete pVerify;
+ if (nRet != DKIM_SUCCESS) delete pVerify;
}
if (nRet == DKIM_SUCCESS) {
- InitContext(pVerifyContext,false,pVerify);
+ InitContext(pVerifyContext, false, pVerify);
}
return nRet;
}
-int DKIM_CALL DKIMVerifyProcess(DKIMContext* pVerifyContext,const char* const szBuffer,int nBufLength)
+int DKIM_CALL DKIMVerifyProcess(DKIMContext *pVerifyContext, const char *const szBuffer, int nBufLength)
{
- CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false);
+ CDKIMVerify *pVerify = (CDKIMVerify *)ValidateContext(pVerifyContext, false);
if (pVerify) {
- return pVerify->Process(szBuffer,nBufLength,false);
+ return pVerify->Process(szBuffer, nBufLength, false);
}
-
+
return DKIM_INVALID_CONTEXT;
}
-int DKIM_CALL DKIMVerifyResults(DKIMContext* pVerifyContext)
+int DKIM_CALL DKIMVerifyResults(DKIMContext *pVerifyContext)
{
- CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false);
+ CDKIMVerify *pVerify = (CDKIMVerify *)ValidateContext(pVerifyContext, false);
- if (pVerify) {
- return pVerify->GetResults();
+ if (pVerify) {
+ return pVerify->GetResults();
}
return DKIM_INVALID_CONTEXT;
}
-int DKIM_CALL DKIMVerifyGetDetails(DKIMContext* pVerifyContext,int* nSigCount,DKIMVerifyDetails** pDetails,char* szPractices)
+int DKIM_CALL DKIMVerifyGetDetails(
+ DKIMContext *pVerifyContext, int *nSigCount, DKIMVerifyDetails **pDetails, char *szPractices)
{
szPractices[0] = '\0';
- CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false);
+ CDKIMVerify *pVerify = (CDKIMVerify *)ValidateContext(pVerifyContext, false);
if (pVerify) {
- strcpy(szPractices,pVerify->GetPractices());
- return pVerify->GetDetails(nSigCount,pDetails);
+ strcpy(szPractices, pVerify->GetPractices());
+ return pVerify->GetDetails(nSigCount, pDetails);
}
return DKIM_INVALID_CONTEXT;
}
-void DKIM_CALL DKIMVerifyFree(DKIMContext* pVerifyContext)
+void DKIM_CALL DKIMVerifyFree(DKIMContext *pVerifyContext)
{
- CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false);
+ CDKIMVerify *pVerify = (CDKIMVerify *)ValidateContext(pVerifyContext, false);
if (pVerify) {
delete pVerify;
@@ -158,40 +164,41 @@ void DKIM_CALL DKIMVerifyFree(DKIMContext* pVerifyContext)
}
}
-const char* DKIM_CALL DKIMVersion()
+const char *DKIM_CALL DKIMVersion()
{
return VERSION_STRING;
}
-static const char* DKIMErrorStrings[-1-DKIM_MAX_ERROR] = {
- "DKIM_FAIL",
- "DKIM_BAD_SYNTAX",
- "DKIM_SIGNATURE_BAD",
- "DKIM_SIGNATURE_BAD_BUT_TESTING",
- "DKIM_SIGNATURE_EXPIRED",
- "DKIM_SELECTOR_INVALID",
- "DKIM_SELECTOR_GRANULARITY_MISMATCH",
- "DKIM_SELECTOR_KEY_REVOKED",
- "DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG",
- "DKIM_SELECTOR_DNS_TEMP_FAILURE",
- "DKIM_SELECTOR_DNS_PERM_FAILURE",
- "DKIM_SELECTOR_PUBLIC_KEY_INVALID",
- "DKIM_NO_SIGNATURES",
- "DKIM_NO_VALID_SIGNATURES",
- "DKIM_BODY_HASH_MISMATCH",
- "DKIM_SELECTOR_ALGORITHM_MISMATCH",
- "DKIM_STAT_INCOMPAT",
- "DKIM_UNSIGNED_FROM",
- "DKIM_OUT_OF_MEMORY",
- "DKIM_INVALID_CONTEXT",
- "DKIM_NO_SENDER",
- "DKIM_BAD_PRIVATE_KEY",
- "DKIM_BUFFER_TOO_SMALL",
+static const char *DKIMErrorStrings[-1 - DKIM_MAX_ERROR] = {
+ "DKIM_FAIL",
+ "DKIM_BAD_SYNTAX",
+ "DKIM_SIGNATURE_BAD",
+ "DKIM_SIGNATURE_BAD_BUT_TESTING",
+ "DKIM_SIGNATURE_EXPIRED",
+ "DKIM_SELECTOR_INVALID",
+ "DKIM_SELECTOR_GRANULARITY_MISMATCH",
+ "DKIM_SELECTOR_KEY_REVOKED",
+ "DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG",
+ "DKIM_SELECTOR_DNS_TEMP_FAILURE",
+ "DKIM_SELECTOR_DNS_PERM_FAILURE",
+ "DKIM_SELECTOR_PUBLIC_KEY_INVALID",
+ "DKIM_NO_SIGNATURES",
+ "DKIM_NO_VALID_SIGNATURES",
+ "DKIM_BODY_HASH_MISMATCH",
+ "DKIM_SELECTOR_ALGORITHM_MISMATCH",
+ "DKIM_STAT_INCOMPAT",
+ "DKIM_UNSIGNED_FROM",
+ "DKIM_OUT_OF_MEMORY",
+ "DKIM_INVALID_CONTEXT",
+ "DKIM_NO_SENDER",
+ "DKIM_BAD_PRIVATE_KEY",
+ "DKIM_BUFFER_TOO_SMALL",
};
-const char* DKIM_CALL DKIMGetErrorString(int ErrorCode) {
+const char *DKIM_CALL DKIMGetErrorString(int ErrorCode)
+{
if (ErrorCode >= 0 || ErrorCode <= DKIM_MAX_ERROR)
return "Unknown";
else
- return DKIMErrorStrings[-1-ErrorCode];
+ return DKIMErrorStrings[-1 - ErrorCode];
}
diff --git a/src/dkimbase.cpp b/src/dkimbase.cpp
index f6abf45..c27e767 100644
--- a/src/dkimbase.cpp
+++ b/src/dkimbase.cpp
@@ -19,10 +19,13 @@
* Changes done by ¢feh@fehcom.de obeying the above license
*
*****************************************************************************/
+#include "dkimbase.h"
+
#include <string.h>
+
#include <algorithm>
+
#include "dkim.h"
-#include "dkimbase.h"
CDKIMBase::CDKIMBase()
@@ -52,11 +55,11 @@ int CDKIMBase::Init(void)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Alloc - allocate buffer
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMBase::Alloc(char*& szBuffer,int nRequiredSize)
+int CDKIMBase::Alloc(char *& szBuffer, int nRequiredSize)
{
szBuffer = new char[nRequiredSize];
@@ -64,25 +67,25 @@ int CDKIMBase::Alloc(char*& szBuffer,int nRequiredSize)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ReAlloc - extend buffer if necessary, leaving room for future expansion
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMBase::ReAlloc(char*& szBuffer,int& nBufferSize,int nRequiredSize)
+int CDKIMBase::ReAlloc(char *& szBuffer, int& nBufferSize, int nRequiredSize)
{
if (nRequiredSize > nBufferSize) {
- char* newp;
- int nNewSize = nRequiredSize + BUFFER_ALLOC_INCREMENT;
+ char *newp;
+ int nNewSize = nRequiredSize + BUFFER_ALLOC_INCREMENT;
- if (Alloc(newp,nNewSize) == DKIM_SUCCESS) {
+ if (Alloc(newp, nNewSize) == DKIM_SUCCESS) {
if (szBuffer != NULL && nBufferSize > 0) {
- memcpy(newp,szBuffer,nBufferSize);
+ memcpy(newp, szBuffer, nBufferSize);
delete[] szBuffer;
}
szBuffer = newp;
- nBufferSize = nNewSize;
+ nBufferSize = nNewSize;
} else {
- return DKIM_OUT_OF_MEMORY; // memory alloc error!
+ return DKIM_OUT_OF_MEMORY; // memory alloc error!
}
}
@@ -90,30 +93,30 @@ int CDKIMBase::ReAlloc(char*& szBuffer,int& nBufferSize,int nRequiredSize)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Process - split buffers into lines without any CRs or LFs at the end.
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMBase::Free(char* szBuffer)
+void CDKIMBase::Free(char *szBuffer)
{
- if (szBuffer)
- delete[] szBuffer;
+ if (szBuffer) delete[] szBuffer;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Process - split buffers into lines without any CRs or LFs at the end.
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMBase::Process(const char* szBuffer,int nBufLength,bool bEOF)
-{ const char* p = szBuffer;
- const char* e = szBuffer + nBufLength;
+int CDKIMBase::Process(const char *szBuffer, int nBufLength, bool bEOF)
+{
+ const char *p = szBuffer;
+ const char *e = szBuffer + nBufLength;
while (p < e) {
if (*p != '\n' || m_LinePos == 0 || m_Line[m_LinePos - 1] != '\r') {
// add char to line
if (m_LinePos >= m_LineSize) {
- int nRet = ReAlloc(m_Line,m_LineSize,m_LinePos + 1);
+ int nRet = ReAlloc(m_Line, m_LineSize, m_LinePos + 1);
if (nRet != DKIM_SUCCESS) return nRet;
}
m_Line[m_LinePos++] = *p;
@@ -126,16 +129,15 @@ int CDKIMBase::Process(const char* szBuffer,int nBufLength,bool bEOF)
if (m_LinePos == 0) {
m_InHeaders = false;
int Result = ProcessHeaders();
- if (Result != DKIM_SUCCESS)
- return Result;
+ if (Result != DKIM_SUCCESS) return Result;
} else {
// append the header to the headers list
if (m_Line[0] != ' ' && m_Line[0] != '\t') {
- HeaderList.push_back(string(m_Line,m_LinePos));
-// fprintf(stderr," dkimbase.cpp:Process:Input: %s \n",m_Line);
+ HeaderList.push_back(string(m_Line, m_LinePos));
+ // fprintf(stderr," dkimbase.cpp:Process:Input: %s \n",m_Line);
} else {
if (!HeaderList.empty()) {
- HeaderList.back().append("\r\n",2).append(m_Line,m_LinePos);
+ HeaderList.back().append("\r\n", 2).append(m_Line, m_LinePos);
} else {
// no header to append to...
}
@@ -143,7 +145,7 @@ int CDKIMBase::Process(const char* szBuffer,int nBufLength,bool bEOF)
}
} else {
// process body line
- int Result = ProcessBody(m_Line,m_LinePos,bEOF);
+ int Result = ProcessBody(m_Line, m_LinePos, bEOF);
if (Result != DKIM_SUCCESS) {
m_LinePos = 0;
return Result;
@@ -160,28 +162,28 @@ int CDKIMBase::Process(const char* szBuffer,int nBufLength,bool bEOF)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessFinal - process leftovers if stopping before the body or mid-line
//
////////////////////////////////////////////////////////////////////////////////
int CDKIMBase::ProcessFinal(void)
{
if (m_LinePos > 0) {
- Process("\r\n",2,true);
+ Process("\r\n", 2, true);
}
if (m_InHeaders) {
m_InHeaders = false;
ProcessHeaders();
/* type conversion should be safe as length is zero */
- ProcessBody((char *)"",0,true);
+ ProcessBody((char *)"", 0, true);
}
return DKIM_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessHeaders - process the headers (to be implemented by derived class)
//
////////////////////////////////////////////////////////////////////////////////
@@ -191,52 +193,54 @@ int CDKIMBase::ProcessHeaders()
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessBody - process body line (to be implemented by derived class)
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMBase::ProcessBody(char* szBuffer, int nBufLength, bool bEOF)
+int CDKIMBase::ProcessBody(char *szBuffer, int nBufLength, bool bEOF)
{
return DKIM_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// RemoveSWSP - remove streaming white space from buffer/string inline
//
////////////////////////////////////////////////////////////////////////////////
-struct isswsp
-{
- bool operator()(char ch) { return(ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'); }
+struct isswsp {
+ bool operator()(char ch)
+ {
+ return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n');
+ }
};
-void CDKIMBase::RemoveSWSP(char* szBuffer)
+void CDKIMBase::RemoveSWSP(char *szBuffer)
{
- *remove_if(szBuffer,szBuffer + strlen(szBuffer),isswsp()) = '\0';
+ *remove_if(szBuffer, szBuffer + strlen(szBuffer), isswsp()) = '\0';
}
-void CDKIMBase::RemoveSWSP(char* pBuffer,int& nBufLength)
+void CDKIMBase::RemoveSWSP(char *pBuffer, int& nBufLength)
{
- nBufLength = remove_if(pBuffer,pBuffer+nBufLength,isswsp()) - pBuffer;
+ nBufLength = remove_if(pBuffer, pBuffer + nBufLength, isswsp()) - pBuffer;
}
void CDKIMBase::RemoveSWSP(string& sBuffer)
{
- sBuffer.erase(remove_if(sBuffer.begin(),sBuffer.end(),isswsp()),sBuffer.end());
+ sBuffer.erase(remove_if(sBuffer.begin(), sBuffer.end(), isswsp()), sBuffer.end());
}
//////////////////////////////////////////////////////////////////////////////////////////
-//
+//
// CompressSWSP - compress streaming white space into single spaces from buffer/string inline
//
//////////////////////////////////////////////////////////////////////////////////////////
-void CDKIMBase::CompressSWSP(char* pBuffer,int& nBufLength)
+void CDKIMBase::CompressSWSP(char *pBuffer, int& nBufLength)
{
- char* pSrc = pBuffer;
- char* pDst = pBuffer;
- char* pEnd = pBuffer + nBufLength;
+ char *pSrc = pBuffer;
+ char *pDst = pBuffer;
+ char *pEnd = pBuffer + nBufLength;
while (pSrc != pEnd) {
if (isswsp()(*pSrc)) {
@@ -245,8 +249,7 @@ void CDKIMBase::CompressSWSP(char* pBuffer,int& nBufLength)
++pSrc;
} while (pSrc != pEnd && isswsp()(*pSrc));
- if (pSrc == pEnd)
- break;
+ if (pSrc == pEnd) break;
*pDst++ = ' ';
}
@@ -270,8 +273,7 @@ void CDKIMBase::CompressSWSP(string& sBuffer)
++iSrc;
} while (iSrc != iEnd && isswsp()(*iSrc));
- if (iSrc == iEnd)
- break;
+ if (iSrc == iEnd) break;
*iDst++ = ' ';
}
@@ -283,7 +285,7 @@ void CDKIMBase::CompressSWSP(string& sBuffer)
}
//////////////////////////////////////////////////////////////////////////////////////////
-//
+//
// RelaxHeader - relax a header field (lower case the name, remove swsp before and after :)
//
// modified 4/21/06 STB to remove white space before colon
@@ -303,17 +305,14 @@ string CDKIMBase::RelaxHeader(const string& sHeader)
} else {
// lower case the header field name
for (unsigned i = 0; i < cpos; i++) {
- if (sTemp[i] >= 'A' && sTemp[i] <= 'Z')
- sTemp[i] += 'a'-'A';
+ if (sTemp[i] >= 'A' && sTemp[i] <= 'Z') sTemp[i] += 'a' - 'A';
}
// remove the space after the :
- if (cpos + 1 < sTemp.length() && sTemp[cpos+1] == ' ')
- sTemp.erase(cpos + 1, 1);
+ if (cpos + 1 < sTemp.length() && sTemp[cpos + 1] == ' ') sTemp.erase(cpos + 1, 1);
// remove the space before the :
- if (cpos > 0 && sTemp[cpos - 1] == ' ')
- sTemp.erase(cpos - 1,1);
+ if (cpos > 0 && sTemp[cpos - 1] == ' ') sTemp.erase(cpos - 1, 1);
}
return sTemp;
diff --git a/src/dkimsign.cpp b/src/dkimsign.cpp
index 03b03e2..8be3fc6 100644
--- a/src/dkimsign.cpp
+++ b/src/dkimsign.cpp
@@ -21,15 +21,17 @@
*****************************************************************************/
#define _strnicmp strncasecmp
-#define _stricmp strcasecmp
+#define _stricmp strcasecmp
#define LOWORD(l) ((unsigned)(l) & 0xffff)
#define HIWORD(l) ((unsigned)(l) >> 16)
+#include "dkimsign.h"
+
#include <string.h>
+
#include <map>
#include "dkim.h"
-#include "dkimsign.h"
/*****************************************************************************
*
@@ -119,63 +121,67 @@ CDKIMSign::CDKIMSign()
m_EmptyLineCount = 0;
m_pfnHdrCallback = NULL;
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_SignInit(&m_Hdr_sha1ctx,EVP_sha1());
- EVP_SignInit(&m_Hdr_sha256ctx,EVP_sha256());
- EVP_DigestInit(&m_Bdy_sha1ctx,EVP_sha1());
- EVP_DigestInit(&m_Bdy_sha256ctx,EVP_sha256());
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_SignInit(&m_Hdr_sha1ctx, EVP_sha1());
+ EVP_SignInit(&m_Hdr_sha256ctx, EVP_sha256());
+ EVP_DigestInit(&m_Bdy_sha1ctx, EVP_sha1());
+ EVP_DigestInit(&m_Bdy_sha256ctx, EVP_sha256());
#else
m_Hdr_sha1ctx = EVP_MD_CTX_create();
- EVP_SignInit_ex(m_Hdr_sha1ctx,EVP_sha1(),NULL);
+ EVP_SignInit_ex(m_Hdr_sha1ctx, EVP_sha1(), NULL);
m_Hdr_sha256ctx = EVP_MD_CTX_create();
- EVP_SignInit_ex(m_Hdr_sha256ctx,EVP_sha256(),NULL);
+ EVP_SignInit_ex(m_Hdr_sha256ctx, EVP_sha256(), NULL);
m_Bdy_sha1ctx = EVP_MD_CTX_create();
- EVP_DigestInit_ex(m_Bdy_sha1ctx,EVP_sha1(),NULL);
+ EVP_DigestInit_ex(m_Bdy_sha1ctx, EVP_sha1(), NULL);
m_Bdy_sha256ctx = EVP_MD_CTX_create();
- EVP_DigestInit_ex(m_Bdy_sha256ctx,EVP_sha256(),NULL);
+ EVP_DigestInit_ex(m_Bdy_sha256ctx, EVP_sha256(), NULL);
m_Hdr_ed25519ctx = EVP_MD_CTX_create();
m_Edy_sha256ctx = EVP_MD_CTX_create();
- EVP_DigestInit_ex(m_Edy_sha256ctx,EVP_sha256(),NULL);
+ EVP_DigestInit_ex(m_Edy_sha256ctx, EVP_sha256(), NULL);
#endif
}
CDKIMSign::~CDKIMSign()
{
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_MD_CTX_cleanup(&m_Hdr_sha1ctx);
- EVP_MD_CTX_cleanup(&m_Hdr_sha256ctx);
- EVP_MD_CTX_cleanup(&m_Bdy_sha1ctx);
- EVP_MD_CTX_cleanup(&m_Bdy_sha256ctx);
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_MD_CTX_cleanup(&m_Hdr_sha1ctx);
+ EVP_MD_CTX_cleanup(&m_Hdr_sha256ctx);
+ EVP_MD_CTX_cleanup(&m_Bdy_sha1ctx);
+ EVP_MD_CTX_cleanup(&m_Bdy_sha256ctx);
#else
- EVP_MD_CTX_free(m_Hdr_sha1ctx);
- EVP_MD_CTX_free(m_Hdr_sha256ctx);
- EVP_MD_CTX_free(m_Hdr_ed25519ctx);
- EVP_MD_CTX_free(m_Bdy_sha1ctx);
- EVP_MD_CTX_free(m_Bdy_sha256ctx);
- EVP_MD_CTX_free(m_Edy_sha256ctx);
+ EVP_MD_CTX_free(m_Hdr_sha1ctx);
+ EVP_MD_CTX_free(m_Hdr_sha256ctx);
+ EVP_MD_CTX_free(m_Hdr_ed25519ctx);
+ EVP_MD_CTX_free(m_Bdy_sha1ctx);
+ EVP_MD_CTX_free(m_Bdy_sha256ctx);
+ EVP_MD_CTX_free(m_Edy_sha256ctx);
#endif
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Init - save the options
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMSign::Init(DKIMSignOptions* pOptions)
+int CDKIMSign::Init(DKIMSignOptions *pOptions)
{
int nRet = CDKIMBase::Init();
m_Canon = pOptions->nCanon;
// as of draft 01, these are the only allowed signing types:
- if ((m_Canon != DKIM_SIGN_SIMPLE_RELAXED) &&
- (m_Canon != DKIM_SIGN_RELAXED) &&
- (m_Canon != DKIM_SIGN_RELAXED_SIMPLE)) {
+ if ((m_Canon != DKIM_SIGN_SIMPLE_RELAXED) && (m_Canon != DKIM_SIGN_RELAXED)
+ && (m_Canon != DKIM_SIGN_RELAXED_SIMPLE))
+ {
m_Canon = DKIM_SIGN_SIMPLE;
}
@@ -203,8 +209,7 @@ int CDKIMSign::Init(DKIMSignOptions* pOptions)
//sRequiredHeaders.assign(pOptions->szRequiredHeaders);
//make sure there is a colon after the last header in the list
- if ((sRequiredHeaders.size() > 0) &&
- sRequiredHeaders.at(sRequiredHeaders.size() - 1) != ':') {
+ if ((sRequiredHeaders.size() > 0) && sRequiredHeaders.at(sRequiredHeaders.size() - 1) != ':') {
sRequiredHeaders.append(":");
}
@@ -222,11 +227,11 @@ int CDKIMSign::Init(DKIMSignOptions* pOptions)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Hash - update the hash
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMSign::Hash(const char *szBuffer,int nBufLength,bool bHdr)
+void CDKIMSign::Hash(const char *szBuffer, int nBufLength, bool bHdr)
{
/** START DEBUG CODE **
@@ -247,53 +252,56 @@ void CDKIMSign::Hash(const char *szBuffer,int nBufLength,bool bHdr)
** END DEBUG CODE **/
- if (bHdr) { /* Generate signature: b=... */
- if ((m_nHash == DKIM_HASH_SHA1) ||
- (m_nHash == DKIM_HASH_SHA1_AND_SHA256))
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_SignUpdate(&m_Hdr_sha1ctx,szBuffer,nBufLength);
-#else
- EVP_SignUpdate(m_Hdr_sha1ctx,szBuffer,nBufLength);
+ if (bHdr) { /* Generate signature: b=... */
+ if ((m_nHash == DKIM_HASH_SHA1) || (m_nHash == DKIM_HASH_SHA1_AND_SHA256))
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_SignUpdate(&m_Hdr_sha1ctx, szBuffer, nBufLength);
+#else
+ EVP_SignUpdate(m_Hdr_sha1ctx, szBuffer, nBufLength);
#endif
- if ((m_nHash == DKIM_HASH_SHA256) ||
- (m_nHash == DKIM_HASH_SHA1_AND_SHA256) ||
- (m_nHash == DKIM_HASH_RSA256_AND_ED25519))
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_SignUpdate(&m_Hdr_sha256ctx,szBuffer,nBufLength);
-#else
- EVP_SignUpdate(m_Hdr_sha256ctx,szBuffer,nBufLength);
+ if ((m_nHash == DKIM_HASH_SHA256) || (m_nHash == DKIM_HASH_SHA1_AND_SHA256)
+ || (m_nHash == DKIM_HASH_RSA256_AND_ED25519))
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_SignUpdate(&m_Hdr_sha256ctx, szBuffer, nBufLength);
+#else
+ EVP_SignUpdate(m_Hdr_sha256ctx, szBuffer, nBufLength);
#endif
#if ((OPENSSL_VERSION_NUMBER > 0x10101000L))
- if ((m_nHash == DKIM_HASH_ED25519) ||
- (m_nHash == DKIM_HASH_RSA256_AND_ED25519)) {
- SigHdrs.append(szBuffer,nBufLength);
+ if ((m_nHash == DKIM_HASH_ED25519) || (m_nHash == DKIM_HASH_RSA256_AND_ED25519)) {
+ SigHdrs.append(szBuffer, nBufLength);
m_SigHdrs += nBufLength;
}
#endif
- } else { /* lets go for body hash values: bh=... (either SHA1 or SHA256) */
- if ((m_nHash == DKIM_HASH_SHA1) ||
- (m_nHash == DKIM_HASH_SHA1_AND_SHA256))
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_DigestUpdate(&m_Bdy_sha1ctx,szBuffer,nBufLength);
-#else
- EVP_DigestUpdate(m_Bdy_sha1ctx,szBuffer,nBufLength);
+ } else { /* lets go for body hash values: bh=... (either SHA1 or SHA256) */
+ if ((m_nHash == DKIM_HASH_SHA1) || (m_nHash == DKIM_HASH_SHA1_AND_SHA256))
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_DigestUpdate(&m_Bdy_sha1ctx, szBuffer, nBufLength);
+#else
+ EVP_DigestUpdate(m_Bdy_sha1ctx, szBuffer, nBufLength);
#endif
if (m_nHash != DKIM_HASH_SHA1)
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_DigestUpdate(&m_Bdy_sha256ctx,szBuffer,nBufLength);
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_DigestUpdate(&m_Bdy_sha256ctx, szBuffer, nBufLength);
#else
- EVP_DigestUpdate(m_Bdy_sha256ctx,szBuffer,nBufLength);
+ EVP_DigestUpdate(m_Bdy_sha256ctx, szBuffer, nBufLength);
#endif
#if ((OPENSSL_VERSION_NUMBER > 0x10101000L))
- if ((m_nHash == DKIM_HASH_ED25519) ||
- (m_nHash == DKIM_HASH_RSA256_AND_ED25519))
- EVP_DigestUpdate(m_Edy_sha256ctx,szBuffer,nBufLength);
+ if ((m_nHash == DKIM_HASH_ED25519) || (m_nHash == DKIM_HASH_RSA256_AND_ED25519))
+ EVP_DigestUpdate(m_Edy_sha256ctx, szBuffer, nBufLength);
#endif
}
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// SignThisTag - return boolean whether or not to sign this tag
//
////////////////////////////////////////////////////////////////////////////////
@@ -301,25 +309,25 @@ bool CDKIMSign::SignThisTag(const string& sTag)
{
bool bRet = true;
- if (_strnicmp(sTag.c_str(),"X-",2) == 0 ||
- _stricmp(sTag.c_str(),"Authentication-Results:") == 0 ||
- _stricmp(sTag.c_str(),"Return-Path:") == 0) {
+ if (_strnicmp(sTag.c_str(), "X-", 2) == 0 || _stricmp(sTag.c_str(), "Authentication-Results:") == 0
+ || _stricmp(sTag.c_str(), "Return-Path:") == 0)
+ {
bRet = false;
}
return bRet;
}
-bool ConvertHeaderToQuotedPrintable(const char* source, char* dest)
+bool ConvertHeaderToQuotedPrintable(const char *source, char *dest)
{
bool bConvert = false;
// do quoted printable
- static unsigned char hexchars[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+ static unsigned char hexchars[16] = {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
- unsigned char *d = (unsigned char*)dest;
- for (const unsigned char *s = (const unsigned char *)source; *s != '\0'; s++)
- {
+ unsigned char *d = (unsigned char *)dest;
+ for (const unsigned char *s = (const unsigned char *)source; *s != '\0'; s++) {
if (*s >= 33 && *s <= 126 && *s != '=' && *s != ':' && *s != ';' && *s != '|') {
*d++ = *s;
} else {
@@ -335,15 +343,19 @@ bool ConvertHeaderToQuotedPrintable(const char* source, char* dest)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// GetHeaderParams - Extract any needed header parameters
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMSign::GetHeaderParams(const string &sHdr)
+void CDKIMSign::GetHeaderParams(const string& sHdr)
{
- if (_strnicmp(sHdr.c_str(),"X",1) == 0) return;
- if (_strnicmp(sHdr.c_str(),"From:",5) == 0) { sFrom.assign(sHdr.c_str() + 5); }
- if (_strnicmp(sHdr.c_str(),"Sender:",7) == 0) { sSender.assign(sHdr.c_str() + 7); }
+ if (_strnicmp(sHdr.c_str(), "X", 1) == 0) return;
+ if (_strnicmp(sHdr.c_str(), "From:", 5) == 0) {
+ sFrom.assign(sHdr.c_str() + 5);
+ }
+ if (_strnicmp(sHdr.c_str(), "Sender:", 7) == 0) {
+ sSender.assign(sHdr.c_str() + 7);
+ }
if (m_nIncludeCopiedHeaders) {
string::size_type pos = sHdr.find(':');
@@ -352,13 +364,16 @@ void CDKIMSign::GetHeaderParams(const string &sHdr)
string sTag, sValue;
char *workBuffer = new char[sHdr.size() * 3 + 1];
- sTag.assign(sHdr.substr(0,pos));
- sValue.assign(sHdr.substr(pos + 1,string::npos));
+ sTag.assign(sHdr.substr(0, pos));
+ sValue.assign(sHdr.substr(pos + 1, string::npos));
- ConvertHeaderToQuotedPrintable(sTag.c_str(),workBuffer);
- if (!m_sCopiedHeaders.empty()) { m_sCopiedHeaders.append("|"); }
- m_sCopiedHeaders.append(workBuffer); m_sCopiedHeaders.append(":");
- ConvertHeaderToQuotedPrintable(sValue.c_str(),workBuffer);
+ ConvertHeaderToQuotedPrintable(sTag.c_str(), workBuffer);
+ if (!m_sCopiedHeaders.empty()) {
+ m_sCopiedHeaders.append("|");
+ }
+ m_sCopiedHeaders.append(workBuffer);
+ m_sCopiedHeaders.append(":");
+ ConvertHeaderToQuotedPrintable(sValue.c_str(), workBuffer);
m_sCopiedHeaders.append(workBuffer);
delete[] workBuffer;
@@ -367,14 +382,14 @@ void CDKIMSign::GetHeaderParams(const string &sHdr)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessHeaders - sign headers and save needed parameters (this is a lie)
//
////////////////////////////////////////////////////////////////////////////////
int CDKIMSign::ProcessHeaders(void)
{
- map<string,list<string>::reverse_iterator> IterMap;
- map<string,list<string>::reverse_iterator>::iterator IterMapIter;
+ map<string, list<string>::reverse_iterator> IterMap;
+ map<string, list<string>::reverse_iterator>::iterator IterMapIter;
list<string>::reverse_iterator riter;
list<string>::iterator iter;
string sTag;
@@ -391,20 +406,20 @@ int CDKIMSign::ProcessHeaders(void)
int nSignThisTag = 1;
// hack off anything past the colon
- sTag.erase(pos + 1,string::npos);
+ sTag.erase(pos + 1, string::npos);
// is this the From: header?
- if (_stricmp(sTag.c_str(),"From:") == 0) {
+ if (_stricmp(sTag.c_str(), "From:") == 0) {
bFromHeaderFound = true;
nSignThisTag = 1;
IsRequiredHeader(sTag); // remove from required header list
}
// is this in the list of headers that must be signed?
- else if (IsRequiredHeader(sTag)) {
+ else if (IsRequiredHeader(sTag))
+ {
nSignThisTag = 1;
- }
- else {
- if(m_pfnHdrCallback) {
+ } else {
+ if (m_pfnHdrCallback) {
nSignThisTag = m_pfnHdrCallback(iter->c_str());
} else {
nSignThisTag = SignThisTag(sTag) ? 1 : 0;
@@ -424,7 +439,7 @@ int CDKIMSign::ProcessHeaders(void)
// walk the list in reverse looking for the last instance of this header
while (riter != HeaderList.rend()) {
- if (_strnicmp(riter->c_str(),sTag.c_str(),sTag.size()) == 0) {
+ if (_strnicmp(riter->c_str(), sTag.c_str(), sTag.size()) == 0) {
ProcessHeader(*riter);
// save the reverse iterator position for this tag
@@ -433,106 +448,102 @@ int CDKIMSign::ProcessHeaders(void)
break;
}
riter++;
- }
+ }
}
}
}
- if(!bFromHeaderFound) {
+ if (!bFromHeaderFound) {
string sFrom("From:");
hParam.append(sFrom);
- IsRequiredHeader(sFrom); // remove from required header list
-// Hash("\r\n",2);
+ IsRequiredHeader(sFrom); // remove from required header list
+ // Hash("\r\n",2);
}
hParam.append(sRequiredHeaders);
-// string::size_type end = sRequiredHeaders.find(':');
-// while (end != string::npos)
-// {
-// Hash("\r\n",2);
-// end = sRequiredHeaders.find(':', end+1);
-// }
+ // string::size_type end = sRequiredHeaders.find(':');
+ // while (end != string::npos)
+ // {
+ // Hash("\r\n",2);
+ // end = sRequiredHeaders.find(':', end+1);
+ // }
// remove the last colon from h=
- if (hParam.at(hParam.size() - 1) == ':')
- hParam.erase(hParam.size() - 1,string::npos);
+ if (hParam.at(hParam.size() - 1) == ':') hParam.erase(hParam.size() - 1, string::npos);
return DKIM_SUCCESS;
}
-void CDKIMSign::ProcessHeader(const string &sHdr)
+void CDKIMSign::ProcessHeader(const string& sHdr)
{
switch (HIWORD(m_Canon)) {
case DKIM_CANON_SIMPLE:
- Hash(sHdr.c_str(),sHdr.size(),true);
- Hash("\r\n",2,true);
+ Hash(sHdr.c_str(), sHdr.size(), true);
+ Hash("\r\n", 2, true);
break;
- case DKIM_CANON_NOWSP: {
+ case DKIM_CANON_NOWSP: {
string sTemp = sHdr;
RemoveSWSP(sTemp);
// convert characters before ':' to lower case
- for (char *s = (char*)sTemp.c_str(); *s != '\0' && *s != ':'; s++) {
- if (*s >= 'A' && *s <= 'Z')
- *s += 'a' - 'A';
+ for (char *s = (char *)sTemp.c_str(); *s != '\0' && *s != ':'; s++) {
+ if (*s >= 'A' && *s <= 'Z') *s += 'a' - 'A';
}
- Hash(sTemp.c_str(),sTemp.size(),true);
- Hash("\r\n",2,true);
- }
- break;
+ Hash(sTemp.c_str(), sTemp.size(), true);
+ Hash("\r\n", 2, true);
+ } break;
- case DKIM_CANON_RELAXED: {
+ case DKIM_CANON_RELAXED: {
string sTemp = RelaxHeader(sHdr);
- Hash(sTemp.c_str(),sTemp.length(),true);
- Hash("\r\n",2,true);
- }
- break;
+ Hash(sTemp.c_str(), sTemp.length(), true);
+ Hash("\r\n", 2, true);
+ } break;
}
}
-int CDKIMSign::ProcessBody(char *szBuffer,int nBufLength,bool bEOF)
+int CDKIMSign::ProcessBody(char *szBuffer, int nBufLength, bool bEOF)
{
- switch(LOWORD(m_Canon)) {
+ switch (LOWORD(m_Canon)) {
case DKIM_CANON_SIMPLE:
if (nBufLength > 0) {
while (m_EmptyLineCount > 0) {
- Hash("\r\n",2,false);
+ Hash("\r\n", 2, false);
m_nBodyLength += 2;
m_EmptyLineCount--;
}
- Hash(szBuffer,nBufLength,false);
- Hash("\r\n",2,false);
+ Hash(szBuffer, nBufLength, false);
+ Hash("\r\n", 2, false);
m_nBodyLength += nBufLength + 2;
} else {
m_EmptyLineCount++;
if (bEOF) {
- Hash("\r\n",2,false);
+ Hash("\r\n", 2, false);
m_nBodyLength += 2;
}
}
break;
case DKIM_CANON_NOWSP:
- RemoveSWSP(szBuffer,nBufLength);
+ RemoveSWSP(szBuffer, nBufLength);
if (nBufLength > 0) {
- Hash(szBuffer,nBufLength,false);
+ Hash(szBuffer, nBufLength, false);
m_nBodyLength += nBufLength;
}
break;
case DKIM_CANON_RELAXED:
- CompressSWSP(szBuffer,nBufLength);
+ CompressSWSP(szBuffer, nBufLength);
if (nBufLength > 0) {
while (m_EmptyLineCount > 0) {
- Hash("\r\n",2,false);
+ Hash("\r\n", 2, false);
m_nBodyLength += 2;
m_EmptyLineCount--;
}
- Hash(szBuffer,nBufLength,false);
+ Hash(szBuffer, nBufLength, false);
m_nBodyLength += nBufLength;
if (!bEOF) {
- Hash("\r\n",2,false);
+ Hash("\r\n", 2, false);
m_nBodyLength += 2;
}
} else
@@ -560,21 +571,18 @@ bool CDKIMSign::ParseFromAddress(void)
// remove '<' and anything before it
pos = sAddress.find('<');
- if(pos != string::npos)
- sAddress.erase(0,pos);
+ if (pos != string::npos) sAddress.erase(0, pos);
// remove '>' and anything after it
pos = sAddress.find('>');
- if (pos != string::npos)
- sAddress.erase(pos,string::npos);
+ if (pos != string::npos) sAddress.erase(pos, string::npos);
// look for '@' symbol
pos = sAddress.find('@');
- if (pos == string::npos)
- return false;
+ if (pos == string::npos) return false;
if (sDomain.empty()) {
- sDomain.assign (sAddress.c_str() + pos + 1);
+ sDomain.assign(sAddress.c_str() + pos + 1);
RemoveSWSP(sDomain);
}
@@ -582,7 +590,7 @@ bool CDKIMSign::ParseFromAddress(void)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// InitSig - initialize signature folding algorithm
//
////////////////////////////////////////////////////////////////////////////////
@@ -594,12 +602,12 @@ void CDKIMSign::InitSig(void)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// AddTagToSig - add tag and value to signature folding if necessary
// if bFold, fold at cbrk char
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMSign::AddTagToSig(const char* const Tag,const string &sValue,char cbrk,bool bFold)
+void CDKIMSign::AddTagToSig(const char *const Tag, const string& sValue, char cbrk, bool bFold)
{
int nTagLen = strlen(Tag);
@@ -613,35 +621,35 @@ void CDKIMSign::AddTagToSig(const char* const Tag,const string &sValue,char cbrk
m_sSig.append(sValue);
m_nSigPos += sValue.size();
} else {
- AddFoldedValueToSig(sValue,cbrk);
+ AddFoldedValueToSig(sValue, cbrk);
}
m_sSig.append(";");
m_nSigPos++;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// AddTagToSig - add tag and numeric value to signature folding if necessary
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMSign::AddTagToSig(const char* const Tag,unsigned long nValue)
+void CDKIMSign::AddTagToSig(const char *const Tag, unsigned long nValue)
{
char szValue[64];
- sprintf(szValue,"%lu",nValue);
- AddTagToSig(Tag,szValue,0,false);
+ sprintf(szValue, "%lu", nValue);
+ AddTagToSig(Tag, szValue, 0, false);
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// AddInterTagSpace - add space or fold here
//
////////////////////////////////////////////////////////////////////////////////
void CDKIMSign::AddInterTagSpace(int nSizeOfNextTag)
{
if (m_nSigPos + nSizeOfNextTag + 1 > OptimalHeaderLineLength) {
-// m_sSig.append("\r\n\t");
- m_sSig.append("\r\n "); /* s/qmail style */
- m_nSigPos = 1;
+ // m_sSig.append("\r\n\t");
+ m_sSig.append("\r\n "); /* s/qmail style */
+ m_nSigPos = 1;
} else {
m_sSig.append(" ");
m_nSigPos++;
@@ -649,12 +657,12 @@ void CDKIMSign::AddInterTagSpace(int nSizeOfNextTag)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// AddTagToSig - add value to signature folding if necessary
// if cbrk == 0 fold anywhere, otherwise fold only at cbrk
//
////////////////////////////////////////////////////////////////////////////////
-void CDKIMSign::AddFoldedValueToSig(const string &sValue,char cbrk)
+void CDKIMSign::AddFoldedValueToSig(const string& sValue, char cbrk)
{
string::size_type pos = 0;
@@ -662,15 +670,14 @@ void CDKIMSign::AddFoldedValueToSig(const string &sValue,char cbrk)
// fold anywhere
while (pos < sValue.size()) {
string::size_type len = OptimalHeaderLineLength - m_nSigPos;
- if (len > sValue.size() - pos)
- len = sValue.size() - pos;
- m_sSig.append(sValue.substr(pos,len));
+ if (len > sValue.size() - pos) len = sValue.size() - pos;
+ m_sSig.append(sValue.substr(pos, len));
m_nSigPos += len;
pos += len;
if (pos < sValue.size()) {
-// m_sSig.append("\r\n\t");
- m_sSig.append("\r\n "); /* s/qmail style */
+ // m_sSig.append("\r\n\t");
+ m_sSig.append("\r\n "); /* s/qmail style */
m_nSigPos = 1;
}
}
@@ -683,11 +690,11 @@ void CDKIMSign::AddFoldedValueToSig(const string &sValue,char cbrk)
if (sValue.size() - pos < len) {
brkpos = sValue.size();
} else {
- brkpos = sValue.rfind(cbrk,pos + len);
+ brkpos = sValue.rfind(cbrk, pos + len);
}
if (brkpos == string::npos || brkpos < pos) {
- brkpos = sValue.find(cbrk,pos);
+ brkpos = sValue.find(cbrk, pos);
if (brkpos == string::npos) {
brkpos = sValue.size();
}
@@ -695,14 +702,14 @@ void CDKIMSign::AddFoldedValueToSig(const string &sValue,char cbrk)
len = brkpos - pos + 1;
- m_sSig.append(sValue.substr(pos,len));
+ m_sSig.append(sValue.substr(pos, len));
m_nSigPos += len;
pos += len;
if (pos < sValue.size()) {
-// m_sSig.append("\r\n\t");
- m_sSig.append("\r\n "); /* s/qmail style */
+ // m_sSig.append("\r\n\t");
+ m_sSig.append("\r\n "); /* s/qmail style */
m_nSigPos = 1;
}
}
@@ -710,11 +717,11 @@ void CDKIMSign::AddFoldedValueToSig(const string &sValue,char cbrk)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// GetSig - compute hash and return signature header in szSignature
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMSign::GetSig2(char* szRSAKey,char* szECCKey,char** pszSignature)
+int CDKIMSign::GetSig2(char *szRSAKey, char *szECCKey, char **pszSignature)
{
if (szRSAKey == NULL && szECCKey == NULL) {
return DKIM_BAD_PRIVATE_KEY;
@@ -724,19 +731,18 @@ int CDKIMSign::GetSig2(char* szRSAKey,char* szECCKey,char** pszSignature)
return DKIM_BUFFER_TOO_SMALL;
}
- int nRet = AssembleReturnedSig(szRSAKey,szECCKey);
+ int nRet = AssembleReturnedSig(szRSAKey, szECCKey);
- if (nRet != DKIM_SUCCESS)
- return nRet;
+ if (nRet != DKIM_SUCCESS) return nRet;
- *pszSignature = (char*)m_sReturnedSig.c_str();
+ *pszSignature = (char *)m_sReturnedSig.c_str();
return DKIM_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// IsRequiredHeader - Check if header in required list. If so, delete
// header from list.
//
@@ -748,118 +754,132 @@ bool CDKIMSign::IsRequiredHeader(const string& sTag)
while (end != string::npos) {
// check for a zero-length header
- if(start == end) {
- sRequiredHeaders.erase(start,1);
+ if (start == end) {
+ sRequiredHeaders.erase(start, 1);
} else {
- if (_stricmp(sTag.c_str(),sRequiredHeaders.substr(start,end - start + 1).c_str()) == 0) {
- sRequiredHeaders.erase(start,end - start + 1);
+ if (_stricmp(sTag.c_str(), sRequiredHeaders.substr(start, end - start + 1).c_str()) == 0) {
+ sRequiredHeaders.erase(start, end - start + 1);
return true;
} else {
start = end + 1;
}
}
- end = sRequiredHeaders.find(':',start);
+ end = sRequiredHeaders.find(':', start);
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ConstructSignature
//
// Here, we don't construct the 'signature' but rather the DKIM header
// multiply and indidually crafted for each distinct nSigAlg method
-//
+//
// nSigAlg: DKIM_HASH_SHA1, DKIM_HASH_SHA256, DKIM_HASH_ED25519
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
+int CDKIMSign::ConstructSignature(char *szPrivKey, int nSigAlg)
{
string sSignedSig;
- unsigned char* sig;
+ unsigned char *sig;
EVP_PKEY *pkey = 0;
BIO *bio, *b64;
unsigned int siglen;
int size;
int len;
- char* buf;
+ char *buf;
int nSignRet;
/* construct the DKIM-Signature: header and add to hash */
InitSig();
- AddTagToSig("v","1",0,false);
+ AddTagToSig("v", "1", 0, false);
switch (nSigAlg) {
- case DKIM_HASH_SHA1:
- AddTagToSig("a","rsa-sha1",0,false); break;
- case DKIM_HASH_SHA256:
- AddTagToSig("a","rsa-sha256",0,false); break;
- case DKIM_HASH_ED25519:
- AddTagToSig("a","ed25519-sha256",0,false); break;
+ case DKIM_HASH_SHA1: AddTagToSig("a", "rsa-sha1", 0, false); break;
+ case DKIM_HASH_SHA256: AddTagToSig("a", "rsa-sha256", 0, false); break;
+ case DKIM_HASH_ED25519: AddTagToSig("a", "ed25519-sha256", 0, false); break;
}
switch (m_Canon) {
- case DKIM_SIGN_SIMPLE:
- AddTagToSig("c","simple/simple",0,false); break;
- case DKIM_SIGN_SIMPLE_RELAXED:
- AddTagToSig("c","simple/relaxed",0,false); break;
- case DKIM_SIGN_RELAXED:
- AddTagToSig("c","relaxed/relaxed",0,false); break;
- case DKIM_SIGN_RELAXED_SIMPLE:
- AddTagToSig("c","relaxed/simple",0,false); break;
+ case DKIM_SIGN_SIMPLE: AddTagToSig("c", "simple/simple", 0, false); break;
+ case DKIM_SIGN_SIMPLE_RELAXED: AddTagToSig("c", "simple/relaxed", 0, false); break;
+ case DKIM_SIGN_RELAXED: AddTagToSig("c", "relaxed/relaxed", 0, false); break;
+ case DKIM_SIGN_RELAXED_SIMPLE: AddTagToSig("c", "relaxed/simple", 0, false); break;
}
- AddTagToSig("d",sDomain,0,false);
+ AddTagToSig("d", sDomain, 0, false);
if (nSigAlg == DKIM_HASH_ED25519)
- AddTagToSig("s",eSelector,0,false);
+ AddTagToSig("s", eSelector, 0, false);
else
- AddTagToSig("s",sSelector,0,false);
- if (m_IncludeBodyLengthTag) { AddTagToSig("l",m_nBodyLength); }
- if (m_nIncludeTimeStamp != 0) { time_t t; time(&t); AddTagToSig("t",t); }
- if (m_ExpireTime != 0) { AddTagToSig("x",m_ExpireTime); }
- if (!sIdentity.empty()) { AddTagToSig("i",sIdentity,0,false); }
- if (m_nIncludeQueryMethod) { AddTagToSig("q","dns/txt",0,false); }
+ AddTagToSig("s", sSelector, 0, false);
+ if (m_IncludeBodyLengthTag) {
+ AddTagToSig("l", m_nBodyLength);
+ }
+ if (m_nIncludeTimeStamp != 0) {
+ time_t t;
+ time(&t);
+ AddTagToSig("t", t);
+ }
+ if (m_ExpireTime != 0) {
+ AddTagToSig("x", m_ExpireTime);
+ }
+ if (!sIdentity.empty()) {
+ AddTagToSig("i", sIdentity, 0, false);
+ }
+ if (m_nIncludeQueryMethod) {
+ AddTagToSig("q", "dns/txt", 0, false);
+ }
- AddTagToSig("h",hParam,':',true); // copied headers follow the ':'
- if (m_nIncludeCopiedHeaders) { AddTagToSig("z",m_sCopiedHeaders,0,true); }
+ AddTagToSig("h", hParam, ':', true); // copied headers follow the ':'
+ if (m_nIncludeCopiedHeaders) {
+ AddTagToSig("z", m_sCopiedHeaders, 0, true);
+ }
/* Set up context for (body) hash */
-
+
unsigned char Hash[4096];
unsigned int nHashLen = 0;
switch (nSigAlg) {
- case DKIM_HASH_SHA1:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_DigestFinal(&m_Bdy_sha1ctx,Hash,&nHashLen); break;
+ case DKIM_HASH_SHA1:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_DigestFinal(&m_Bdy_sha1ctx, Hash, &nHashLen);
+ break;
#else
- EVP_DigestFinal_ex(m_Bdy_sha1ctx,Hash,&nHashLen); break;
+ EVP_DigestFinal_ex(m_Bdy_sha1ctx, Hash, &nHashLen);
+ break;
#endif
- case DKIM_HASH_SHA256:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_DigestFinal(&m_Bdy_sha256ctx,Hash,&nHashLen); break;
+ case DKIM_HASH_SHA256:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_DigestFinal(&m_Bdy_sha256ctx, Hash, &nHashLen);
+ break;
#else
- EVP_DigestFinal_ex(m_Bdy_sha256ctx,Hash,&nHashLen); break;
+ EVP_DigestFinal_ex(m_Bdy_sha256ctx, Hash, &nHashLen);
+ break;
#endif
-#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
- case DKIM_HASH_ED25519:
- EVP_DigestFinal_ex(m_Edy_sha256ctx,Hash,&nHashLen); break;
+#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
+ case DKIM_HASH_ED25519: EVP_DigestFinal_ex(m_Edy_sha256ctx, Hash, &nHashLen); break;
#endif
}
bio = BIO_new(BIO_s_mem());
- if (!bio) return DKIM_OUT_OF_MEMORY;
-
+ if (!bio) return DKIM_OUT_OF_MEMORY;
+
b64 = BIO_new(BIO_f_base64());
if (!b64) {
BIO_free(bio);
return DKIM_OUT_OF_MEMORY;
}
- BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
- BIO_push(b64,bio);
- if (BIO_write(b64,Hash,nHashLen) < (int)nHashLen) {
+ BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+ BIO_push(b64, bio);
+ if (BIO_write(b64, Hash, nHashLen) < (int)nHashLen) {
BIO_free_all(b64);
return DKIM_OUT_OF_MEMORY;
}
@@ -873,17 +893,17 @@ int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
return DKIM_OUT_OF_MEMORY;
}
- size = BIO_read(bio,buf,len);
+ size = BIO_read(bio, buf, len);
BIO_free_all(b64);
// this should never happen
if (size >= len) {
- delete[] buf;
- return DKIM_OUT_OF_MEMORY;
+ delete[] buf;
+ return DKIM_OUT_OF_MEMORY;
}
buf[size] = '\0';
- AddTagToSig("bh",buf,0,true);
+ AddTagToSig("bh", buf, 0, true);
delete[] buf;
AddInterTagSpace(3);
@@ -908,35 +928,46 @@ int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
/* Update streaming signatures */
switch (nSigAlg) {
- case DKIM_HASH_SHA1:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_SignUpdate(&m_Hdr_sha1ctx,sTemp.c_str(),sTemp.size()); break;
+ case DKIM_HASH_SHA1:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_SignUpdate(&m_Hdr_sha1ctx, sTemp.c_str(), sTemp.size());
+ break;
#else
- EVP_SignUpdate(m_Hdr_sha1ctx,sTemp.c_str(),sTemp.size()); break;
+ EVP_SignUpdate(m_Hdr_sha1ctx, sTemp.c_str(), sTemp.size());
+ break;
#endif
- case DKIM_HASH_SHA256:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_SignUpdate(&m_Hdr_sha256ctx,sTemp.c_str(),sTemp.size()); break;
+ case DKIM_HASH_SHA256:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_SignUpdate(&m_Hdr_sha256ctx, sTemp.c_str(), sTemp.size());
+ break;
#else
- EVP_SignUpdate(m_Hdr_sha256ctx,sTemp.c_str(),sTemp.size()); break;
+ EVP_SignUpdate(m_Hdr_sha256ctx, sTemp.c_str(), sTemp.size());
+ break;
#endif
#if ((OPENSSL_VERSION_NUMBER > 0x10101000L))
- case DKIM_HASH_ED25519:
- SigHdrs.append(sTemp.c_str(),sTemp.size());
- m_SigHdrs += sTemp.size(); break;
+ case DKIM_HASH_ED25519:
+ SigHdrs.append(sTemp.c_str(), sTemp.size());
+ m_SigHdrs += sTemp.size();
+ break;
#endif
}
bio = BIO_new_mem_buf(szPrivKey, -1);
if (bio == NULL) return DKIM_OUT_OF_MEMORY;
- pkey = PEM_read_bio_PrivateKey(bio,NULL,NULL,NULL); // FIXME - done
+ pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL); // FIXME - done
BIO_free(bio);
- if (!pkey) { return DKIM_BAD_PRIVATE_KEY; }
+ if (!pkey) {
+ return DKIM_BAD_PRIVATE_KEY;
+ }
siglen = EVP_PKEY_size(pkey);
- sig = (unsigned char*) OPENSSL_malloc(siglen);
+ sig = (unsigned char *)OPENSSL_malloc(siglen);
if (sig == NULL) {
EVP_PKEY_free(pkey);
return DKIM_OUT_OF_MEMORY;
@@ -945,41 +976,50 @@ int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
/* Finish streaming signature and potentially go for Ed25519 signatures */
size_t sig_len;
- unsigned char* SignMsg;
+ unsigned char *SignMsg;
switch (nSigAlg) {
- case DKIM_HASH_SHA1:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- nSignRet = EVP_SignFinal(&m_Hdr_sha1ctx,sig,&siglen,pkey); break;
+ case DKIM_HASH_SHA1:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ nSignRet = EVP_SignFinal(&m_Hdr_sha1ctx, sig, &siglen, pkey);
+ break;
#else
- nSignRet = EVP_SignFinal(m_Hdr_sha1ctx,sig,&siglen,pkey); break;
+ nSignRet = EVP_SignFinal(m_Hdr_sha1ctx, sig, &siglen, pkey);
+ break;
#endif
- case DKIM_HASH_SHA256:
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- nSignRet = EVP_SignFinal(&m_Hdr_sha256ctx,sig,&siglen,pkey); break;
+ case DKIM_HASH_SHA256:
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ nSignRet = EVP_SignFinal(&m_Hdr_sha256ctx, sig, &siglen, pkey);
+ break;
#else
- nSignRet = EVP_SignFinal(m_Hdr_sha256ctx,sig,&siglen,pkey); break;
+ nSignRet = EVP_SignFinal(m_Hdr_sha256ctx, sig, &siglen, pkey);
+ break;
#endif
-#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
- case DKIM_HASH_ED25519:
- EVP_DigestSignInit(m_Hdr_ed25519ctx,NULL,NULL,NULL,pkey);
- SignMsg = (unsigned char*) SigHdrs.c_str();
- EVP_DigestSign(m_Hdr_ed25519ctx,NULL,&sig_len,SignMsg,m_SigHdrs);
- sig = (unsigned char*) OPENSSL_malloc(sig_len);
- nSignRet = EVP_DigestSign(m_Hdr_ed25519ctx,sig,&sig_len,SignMsg,m_SigHdrs);
- siglen = (unsigned int) sig_len; break;
+#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
+ case DKIM_HASH_ED25519:
+ EVP_DigestSignInit(m_Hdr_ed25519ctx, NULL, NULL, NULL, pkey);
+ SignMsg = (unsigned char *)SigHdrs.c_str();
+ EVP_DigestSign(m_Hdr_ed25519ctx, NULL, &sig_len, SignMsg, m_SigHdrs);
+ sig = (unsigned char *)OPENSSL_malloc(sig_len);
+ nSignRet = EVP_DigestSign(m_Hdr_ed25519ctx, sig, &sig_len, SignMsg, m_SigHdrs);
+ siglen = (unsigned int)sig_len;
+ break;
#endif
}
EVP_PKEY_free(pkey);
if (!nSignRet) {
OPENSSL_free(sig);
- return DKIM_BAD_PRIVATE_KEY; // key too small
+ return DKIM_BAD_PRIVATE_KEY; // key too small
}
bio = BIO_new(BIO_s_mem());
if (!bio) {
- return DKIM_OUT_OF_MEMORY;
+ return DKIM_OUT_OF_MEMORY;
}
b64 = BIO_new(BIO_f_base64());
@@ -988,10 +1028,10 @@ int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
return DKIM_OUT_OF_MEMORY;
}
- BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
- BIO_push(b64,bio);
+ BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+ BIO_push(b64, bio);
- if (BIO_write(b64,sig,siglen) < (int) siglen) {
+ if (BIO_write(b64, sig, siglen) < (int)siglen) {
OPENSSL_free(sig);
BIO_free_all(b64);
return DKIM_OUT_OF_MEMORY;
@@ -1007,35 +1047,34 @@ int CDKIMSign::ConstructSignature(char* szPrivKey,int nSigAlg)
return DKIM_OUT_OF_MEMORY;
}
- size = BIO_read(bio,buf,len);
+ size = BIO_read(bio, buf, len);
BIO_free_all(b64);
// this should never happen
if (size >= len) {
delete[] buf;
- return DKIM_OUT_OF_MEMORY;
+ return DKIM_OUT_OF_MEMORY;
}
buf[size] = '\0';
- AddFoldedValueToSig(buf,0);
+ AddFoldedValueToSig(buf, 0);
delete[] buf;
return DKIM_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// AssembleReturnSig
//
-// calls ConstructSignature
+// calls ConstructSignature
// for all different hashes and signature key files
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMSign::AssembleReturnedSig(char* szRSAKey,char* szECCKey)
+int CDKIMSign::AssembleReturnedSig(char *szRSAKey, char *szECCKey)
{
int nRet;
- if (m_bReturnedSigAssembled)
- return DKIM_SUCCESS;
+ if (m_bReturnedSigAssembled) return DKIM_SUCCESS;
ProcessFinal();
@@ -1045,30 +1084,28 @@ int CDKIMSign::AssembleReturnedSig(char* szRSAKey,char* szECCKey)
string ed25519Sig, sha256Sig, sha1Sig;
- if ((m_nHash == DKIM_HASH_ED25519) ||
- (m_nHash == DKIM_HASH_RSA256_AND_ED25519)) {
- nRet = ConstructSignature(szECCKey,DKIM_HASH_ED25519);
+ if ((m_nHash == DKIM_HASH_ED25519) || (m_nHash == DKIM_HASH_RSA256_AND_ED25519)) {
+ nRet = ConstructSignature(szECCKey, DKIM_HASH_ED25519);
if (nRet == DKIM_SUCCESS) {
ed25519Sig.assign(m_sSig);
} else {
return nRet;
- }
+ }
}
- if ((m_nHash == DKIM_HASH_SHA256) ||
- (m_nHash == DKIM_HASH_SHA1_AND_SHA256) ||
- (m_nHash == DKIM_HASH_RSA256_AND_ED25519)) {
- nRet = ConstructSignature(szRSAKey,DKIM_HASH_SHA256);
+ if ((m_nHash == DKIM_HASH_SHA256) || (m_nHash == DKIM_HASH_SHA1_AND_SHA256)
+ || (m_nHash == DKIM_HASH_RSA256_AND_ED25519))
+ {
+ nRet = ConstructSignature(szRSAKey, DKIM_HASH_SHA256);
if (nRet == DKIM_SUCCESS) {
sha256Sig.assign(m_sSig);
} else {
return nRet;
- }
+ }
}
- if ((m_nHash == DKIM_HASH_SHA1) ||
- (m_nHash == DKIM_HASH_SHA1_AND_SHA256)) {
- nRet = ConstructSignature(szRSAKey,DKIM_HASH_SHA1);
+ if ((m_nHash == DKIM_HASH_SHA1) || (m_nHash == DKIM_HASH_SHA1_AND_SHA256)) {
+ nRet = ConstructSignature(szRSAKey, DKIM_HASH_SHA1);
if (nRet == DKIM_SUCCESS) {
sha1Sig.assign(m_sSig);
} else {
@@ -1076,11 +1113,11 @@ int CDKIMSign::AssembleReturnedSig(char* szRSAKey,char* szECCKey)
}
}
-// fclose(fpdebug);
-// fpdebug = NULL;
+ // fclose(fpdebug);
+ // fpdebug = NULL;
if (!ed25519Sig.empty()) {
-/* if (!m_sReturnedSig.empty()) {
+ /* if (!m_sReturnedSig.empty()) {
m_sReturnedSig.append("\r\n");
}
*/
diff --git a/src/dkimverify.cpp b/src/dkimverify.cpp
index c9f1003..6693d8e 100644
--- a/src/dkimverify.cpp
+++ b/src/dkimverify.cpp
@@ -18,17 +18,21 @@
* Changes done by ¢feh@fehcom.de obeying the above license
*
*****************************************************************************/
-#include <string.h>
-#include <ctype.h>
+#include "dkimverify.h"
+
#include <assert.h>
-#include <vector>
+#include <ctype.h>
+#include <string.h>
+
#include <algorithm>
+#include <vector>
+
#include "dkim.h"
-#include "dkimverify.h"
#include "dnsgettxt.h"
-extern "C" {
-#include "dns.h"
+extern "C" {
#include "stralloc.h"
+
+#include "dns.h"
}
/*****************************************************************************
@@ -49,17 +53,17 @@ extern "C" {
*
*****************************************************************************/
-#define _strnicmp strncasecmp
-#define _stricmp strcasecmp
-#define MAX_SIGNATURES 10 // maximum number of DKIM signatures to process/message
-#define FDLOG stderr /* writing to another FD requires a method */
+#define _strnicmp strncasecmp
+#define _stricmp strcasecmp
+#define MAX_SIGNATURES 10 // maximum number of DKIM signatures to process/message
+#define FDLOG stderr /* writing to another FD requires a method */
string SigHdr;
size_t m_SigHdr;
-extern "C" int stralloc_copys(stralloc *,char const *);
+extern "C" int stralloc_copys(stralloc *, const char *);
-int dig_ascii(char *digascii,unsigned const char *digest,const int len)
+int dig_ascii(char *digascii, const unsigned char *digest, const int len)
{
static const char hextab[] = "0123456789abcdef";
int j;
@@ -74,81 +78,70 @@ int dig_ascii(char *digascii,unsigned const char *digest,const int len)
}
-int _DNSGetTXT(const char *szFQDN,char *Buffer,int nBufLen)
+int _DNSGetTXT(const char *szFQDN, char *Buffer, int nBufLen)
{
- stralloc out = {0};
- stralloc sa = {0};
- Buffer[0] = '\0'; // need to be initialized
-
- if (!stralloc_copys(&sa,szFQDN)) return -1;
-
- DNS_INIT
-
- switch (dns_txt(&out,&sa)) {
- case -1: return -1;
- case 0: return 0;
- }
-
- if (nBufLen < out.len)
- return -2;
-
- if (!stralloc_0(&out)) return -1;
- memcpy(Buffer,out.s,out.len); // Return-by-value; sigh
-
- return out.len;
+ stralloc out = {0};
+ stralloc sa = {0};
+ Buffer[0] = '\0'; // need to be initialized
+
+ if (!stralloc_copys(&sa, szFQDN)) return -1;
+
+ DNS_INIT
+
+ switch (dns_txt(&out, &sa)) {
+ case -1: return -1;
+ case 0: return 0;
+ }
+
+ if (nBufLen < out.len) return -2;
+
+ if (!stralloc_0(&out)) return -1;
+ memcpy(Buffer, out.s, out.len); // Return-by-value; sigh
+
+ return out.len;
}
-int _DKIM_ReportResult(const char* ResFile,const char* result,const char* reason)
+int _DKIM_ReportResult(const char *ResFile, const char *result, const char *reason)
{
int len = 0;
- FILE* out = fopen(ResFile,"wb+");
+ FILE *out = fopen(ResFile, "wb+");
if (out == NULL) return -1;
if (result) {
len = strlen(result);
- fwrite(result,1,len,out);
- fwrite("\r",1,1,out);
+ fwrite(result, 1, len, out);
+ fwrite("\r", 1, 1, out);
}
if (reason) {
- fwrite(reason,1,strlen(reason),out);
- fwrite("\r",1,1,out);
+ fwrite(reason, 1, strlen(reason), out);
+ fwrite("\r", 1, 1, out);
}
fclose(out);
return len;
}
-const char* DKIM_ErrorResult(const int res)
+const char *DKIM_ErrorResult(const int res)
{
- const char* errormsg = "";
+ const char *errormsg = "";
switch (res) {
- case DKIM_FAIL:
- errormsg = " (verify error: message is suspicious)";
- break;
- case DKIM_BAD_SYNTAX:
- errormsg = " (signature error: could not parse or has bad tags/values)";
- break;
- case DKIM_SIGNATURE_BAD:
- errormsg = " (signature error: RSA/ED25519 verify failed)";
- break;
+ case DKIM_FAIL: errormsg = " (verify error: message is suspicious)"; break;
+ case DKIM_BAD_SYNTAX: errormsg = " (signature error: could not parse or has bad tags/values)"; break;
+ case DKIM_SIGNATURE_BAD: errormsg = " (signature error: RSA/ED25519 verify failed)"; break;
case DKIM_SIGNATURE_BAD_BUT_TESTING:
errormsg = " (signature error: RSA/ED25519 verify failed but testing)";
break;
- case DKIM_SIGNATURE_EXPIRED:
- errormsg = " (signature error: signature x= value expired)";
- break;
+ case DKIM_SIGNATURE_EXPIRED: errormsg = " (signature error: signature x= value expired)"; break;
case DKIM_SELECTOR_INVALID:
errormsg = " (signature error: selector doesn't parse or contains invalid values)";
break;
case DKIM_SELECTOR_GRANULARITY_MISMATCH:
errormsg = " (signature error: selector g= doesn't match i=)";
break;
- case DKIM_SELECTOR_KEY_REVOKED:
- errormsg = " (signature error: revoked p= empty)";
- break;
+ case DKIM_SELECTOR_KEY_REVOKED: errormsg = " (signature error: revoked p= empty)"; break;
case DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG:
errormsg = " (dns error: selector domain name too long to request)";
break;
@@ -161,36 +154,26 @@ const char* DKIM_ErrorResult(const int res)
case DKIM_SELECTOR_PUBLIC_KEY_INVALID:
errormsg = " (signature error: selector p= value invalid or wrong format)";
break;
- case DKIM_NO_SIGNATURES:
- errormsg = " (process error: no signatures)";
- break;
- case DKIM_NO_VALID_SIGNATURES:
- errormsg = " (process error: no valid signatures)";
- break;
+ case DKIM_NO_SIGNATURES: errormsg = " (process error: no signatures)"; break;
+ case DKIM_NO_VALID_SIGNATURES: errormsg = " (process error: no valid signatures)"; break;
case DKIM_BODY_HASH_MISMATCH:
errormsg = " (signature verify error: message body does not hash to bh= value)";
break;
case DKIM_SELECTOR_ALGORITHM_MISMATCH:
errormsg = " (signature error: selector h= doesn't match signature a=)";
break;
- case DKIM_STAT_INCOMPAT:
- errormsg = " (signature error: incompatible v= value)";
- break;
+ case DKIM_STAT_INCOMPAT: errormsg = " (signature error: incompatible v= value)"; break;
case DKIM_UNSIGNED_FROM:
errormsg = " (signature error: not all message's From headers in signature)";
break;
- case DKIM_OUT_OF_MEMORY:
- errormsg = " (internal error: memory allocation failed)";
- break;
+ case DKIM_OUT_OF_MEMORY: errormsg = " (internal error: memory allocation failed)"; break;
case DKIM_INVALID_CONTEXT:
errormsg = " (internal error: DKIMContext structure invalid for this operation)";
break;
case DKIM_NO_SENDER:
errormsg = " (signing error: Could not find From: or Sender: header in message)";
break;
- case DKIM_BAD_PRIVATE_KEY:
- errormsg = " (signing error: Could not parse private key)";
- break;
+ case DKIM_BAD_PRIVATE_KEY: errormsg = " (signing error: Could not parse private key)"; break;
case DKIM_BUFFER_TOO_SMALL:
errormsg = " (signing error: Buffer passed in is not large enough)";
break;
@@ -204,7 +187,9 @@ SignatureInfo::SignatureInfo(bool s)
VerifiedBodyCount = 0;
UnverifiedBodyCount = 0;
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
EVP_MD_CTX_init(&m_Hdr_ctx);
EVP_MD_CTX_init(&m_Bdy_ctx);
#else
@@ -223,12 +208,14 @@ SignatureInfo::SignatureInfo(bool s)
SignatureInfo::~SignatureInfo()
{
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
EVP_MD_CTX_cleanup(&m_Hdr_ctx);
EVP_MD_CTX_cleanup(&m_Bdy_ctx);
#else
/** FIXME: No free but reset ! **/
- EVP_MD_CTX_reset(m_Hdr_ctx);
+ EVP_MD_CTX_reset(m_Hdr_ctx);
EVP_MD_CTX_reset(m_Bdy_ctx);
#endif
#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
@@ -242,26 +229,23 @@ inline bool isswsp(char ch)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Parse a DKIM tag-list. Returns true for success
//
////////////////////////////////////////////////////////////////////////////////
-bool ParseTagValueList(char *tagvaluelist,const char *wanted[],char *values[])
+bool ParseTagValueList(char *tagvaluelist, const char *wanted[], char *values[])
{
char *s = tagvaluelist;
for (;;) {
// skip whitespace
- while (isswsp(*s))
- s++;
+ while (isswsp(*s)) s++;
// if at the end of the string, return success. Note: this allows a list with no entries
- if (*s == '\0')
- return true;
+ if (*s == '\0') return true;
// get tag name
- if (!isalpha(*s))
- return false;
+ if (!isalpha(*s)) return false;
char *tag = s;
do {
@@ -271,26 +255,22 @@ bool ParseTagValueList(char *tagvaluelist,const char *wanted[],char *values[])
char *endtag = s;
// skip whitespace before equals
- while (isswsp(*s))
- s++;
+ while (isswsp(*s)) s++;
// next character must be equals
- if (*s != '=')
- return false;
+ if (*s != '=') return false;
s++;
// null-terminate tag name
*endtag = '\0';
// skip whitespace after equals
- while (isswsp(*s))
- s++;
+ while (isswsp(*s)) s++;
// get tag value
char *value = s;
- while (*s != ';' && ((*s == '\t' || *s == '\r' || *s == '\n') || (*s >= ' ' && *s <= '~')))
- s++;
+ while (*s != ';' && ((*s == '\t' || *s == '\r' || *s == '\n') || (*s >= ' ' && *s <= '~'))) s++;
char *e = s;
@@ -299,31 +279,27 @@ bool ParseTagValueList(char *tagvaluelist,const char *wanted[],char *values[])
if (*s == '\0')
done = true;
else {
- if (*s != ';')
- return false;
+ if (*s != ';') return false;
s++;
}
// skip backwards past any trailing whitespace
- while (e > value && isswsp(e[-1]))
- e--;
+ while (e > value && isswsp(e[-1])) e--;
// null-terminate tag value
*e = '\0';
// check to see if we want this tag
for (unsigned i = 0; wanted[i] != NULL; i++) {
- if (strcmp(wanted[i],tag) == 0) {
+ if (strcmp(wanted[i], tag) == 0) {
// return failure if we already have a value for this tag (duplicates not allowed)
- if (values[i] != NULL)
- return false;
+ if (values[i] != NULL) return false;
values[i] = value;
break;
}
}
- if (done)
- return true;
+ if (done) return true;
}
}
////////////////////////////////////////////////////////////////////////////////
@@ -345,18 +321,16 @@ char Tohex(char ch)
}
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Decode quoted printable string in-place
//
////////////////////////////////////////////////////////////////////////////////
-void DecodeQuotedPrintable(char* ptr)
+void DecodeQuotedPrintable(char *ptr)
{
char *s = ptr;
- while (*s != '\0' && *s != '=')
- s++;
+ while (*s != '\0' && *s != '=') s++;
- if (*s == '\0')
- return;
+ if (*s == '\0') return;
char *d = s;
do {
@@ -370,30 +344,33 @@ void DecodeQuotedPrintable(char* ptr)
*d = '\0';
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Decode base64 string in-place, returns number of bytes output
//
////////////////////////////////////////////////////////////////////////////////
unsigned DecodeBase64(char *ptr)
{
static const char base64_table[256] = {
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
- -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
-
- unsigned char* s = (unsigned char* )ptr;
- unsigned char* d = (unsigned char* )ptr;
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
+ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+
+ unsigned char *s = (unsigned char *)ptr;
+ unsigned char *d = (unsigned char *)ptr;
unsigned b64accum = 0;
unsigned char b64shift = 0;
while (*s != '\0') {
unsigned char value = base64_table[*s++];
- if ((signed char) value >= 0) {
+ if ((signed char)value >= 0) {
b64accum = (b64accum << 6) | value;
b64shift += 6;
if (b64shift >= 8) {
@@ -403,11 +380,11 @@ unsigned DecodeBase64(char *ptr)
}
}
- return (char* )d-ptr;
+ return (char *)d - ptr;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Match a string with a pattern (used for g= value)
// Supports a single, optional "*" wildcard character.
//
@@ -415,35 +392,34 @@ unsigned DecodeBase64(char *ptr)
bool WildcardMatch(const char *p, const char *s)
{
// special case: An empty "g=" value never matches any addresses
- if (*p == '\0')
- return false;
+ if (*p == '\0') return false;
- const char* wildcard = strchr(p,'*');
+ const char *wildcard = strchr(p, '*');
if (wildcard == NULL) {
return strcmp(s, p) == 0;
} else {
unsigned beforewildcardlen = wildcard - p;
unsigned afterwildcardlen = strlen(wildcard + 1);
unsigned slen = strlen(s);
- return (slen >= beforewildcardlen + afterwildcardlen) &&
- (strncmp(s,p,beforewildcardlen) == 0) && strcmp(s + slen - afterwildcardlen,wildcard + 1) == 0;
+ return (slen >= beforewildcardlen + afterwildcardlen) && (strncmp(s, p, beforewildcardlen) == 0)
+ && strcmp(s + slen - afterwildcardlen, wildcard + 1) == 0;
}
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Parse addresses from a string. Returns true if at least one address found
//
////////////////////////////////////////////////////////////////////////////////
-bool ParseAddresses(string str,vector<string> &Addresses)
+bool ParseAddresses(string str, vector<string>& Addresses)
{
- char* s = (char* )str.c_str();
+ char *s = (char *)str.c_str();
while (*s != '\0') {
- char* start = s;
- char* from = s;
- char* to = s;
- char* lt = NULL; // pointer to less than character (<) which starts the address if found
+ char *start = s;
+ char *from = s;
+ char *to = s;
+ char *lt = NULL; // pointer to less than character (<) which starts the address if found
while (*from != '\0') {
if (*from == '(') {
@@ -459,16 +435,14 @@ bool ParseAddresses(string str,vector<string> &Addresses)
else if (*from == '\\' && from[1] != '\0')
from++;
}
- }
- else if (*from == ')') {
+ } else if (*from == ')') {
// ignore closing parenthesis outside of comment
from++;
} else if (*from == ',' || *from == ';') {
// comma/semicolon ends the address
from++;
break;
- }
- else if (*from == ' ' || *from == '\t' || *from == '\r' || *from == '\n') {
+ } else if (*from == ' ' || *from == '\t' || *from == '\r' || *from == '\n') {
// ignore whitespace
from++;
} else if (*from == '"') {
@@ -490,8 +464,7 @@ bool ParseAddresses(string str,vector<string> &Addresses)
// copy any other char
*to = *from++;
// save pointer to '<' for later...
- if (*to == '<')
- lt = to;
+ if (*to == '<') lt = to;
to++;
}
}
@@ -500,22 +473,20 @@ bool ParseAddresses(string str,vector<string> &Addresses)
// if there's < > get what's inside
if (lt != NULL) {
- start = lt+1;
+ start = lt + 1;
char *gt = strchr(start, '>');
- if (gt != NULL)
- *gt = '\0';
+ if (gt != NULL) *gt = '\0';
} else {
// look for and strip group name
char *colon = strchr(start, ':');
if (colon != NULL) {
char *at = strchr(start, '@');
- if (at == NULL || colon < at)
- start = colon+1;
+ if (at == NULL || colon < at) start = colon + 1;
}
}
if (*start != '\0' && strchr(start, '@') != NULL) {
- Addresses.push_back(start); // save address
+ Addresses.push_back(start); // save address
}
s = from;
@@ -529,24 +500,24 @@ bool ParseAddresses(string str,vector<string> &Addresses)
CDKIMVerify::CDKIMVerify()
{
m_pfnSelectorCallback = NULL;
-// m_pfnPracticesCallback = NULL;
+ // m_pfnPracticesCallback = NULL;
m_HonorBodyLengthTag = false;
m_CheckPractices = false;
-// Kai:
-// m_SubjectIsRequired = true;
+ // Kai:
+ // m_SubjectIsRequired = true;
m_SubjectIsRequired = false;
m_SaveCanonicalizedData = false;
m_AllowUnsignedFromHeaders = false;
}
-CDKIMVerify::~CDKIMVerify() {} // Destructor
+CDKIMVerify::~CDKIMVerify() {} // Destructor
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Init - save the options
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMVerify::Init(DKIMVerifyOptions* pOptions)
+int CDKIMVerify::Init(DKIMVerifyOptions *pOptions)
{
int nRet = CDKIMBase::Init();
@@ -555,8 +526,8 @@ int CDKIMVerify::Init(DKIMVerifyOptions* pOptions)
m_HonorBodyLengthTag = pOptions->nHonorBodyLengthTag != 0;
m_CheckPractices = pOptions->nCheckPractices != 0;
-// Kai:
-// m_SubjectIsRequired = pOptions->nSubjectRequired == 0;
+ // Kai:
+ // m_SubjectIsRequired = pOptions->nSubjectRequired == 0;
m_SubjectIsRequired = pOptions->nSubjectRequired == 1;
m_SaveCanonicalizedData = pOptions->nSaveCanonicalizedData != 0;
m_AllowUnsignedFromHeaders = pOptions->nAllowUnsignedFromHeaders != 0;
@@ -565,7 +536,7 @@ int CDKIMVerify::Init(DKIMVerifyOptions* pOptions)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// GetResults - return the pass/fail/neutral verification result
//
////////////////////////////////////////////////////////////////////////////////
@@ -573,7 +544,7 @@ int CDKIMVerify::GetResults(void)
{
// char mdi[128];
// char digi[128];
-
+
ProcessFinal();
unsigned char *SignMsg;
@@ -590,16 +561,18 @@ int CDKIMVerify::GetResults(void)
unsigned char md[EVP_MAX_MD_SIZE];
unsigned len = 0;
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- res = EVP_DigestFinal(&i->m_Bdy_ctx,md,&len);
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ res = EVP_DigestFinal(&i->m_Bdy_ctx, md, &len);
#else
- res = EVP_DigestFinal_ex(i->m_Bdy_ctx,md,&len);
+ res = EVP_DigestFinal_ex(i->m_Bdy_ctx, md, &len);
EVP_MD_CTX_reset(i->m_Bdy_ctx);
#endif
// dig_ascii(digi,md,32);
// dig_ascii(mdi,(unsigned const char *)i->BodyHashData.data(),32);
- if (!res || len != i->BodyHashData.length() || memcmp(i->BodyHashData.data(),md,len) != 0) {
+ if (!res || len != i->BodyHashData.length() || memcmp(i->BodyHashData.data(), md, len) != 0) {
// body hash mismatch
// if the selector is in testing mode...
@@ -614,7 +587,7 @@ int CDKIMVerify::GetResults(void)
}
} else {
// hash CRLF separating the body from the signature
- i->Hash("\r\n",2);
+ i->Hash("\r\n", 2);
}
// SECOND: Fetch the signature
@@ -622,39 +595,53 @@ int CDKIMVerify::GetResults(void)
string sSignedSig = i->Header;
string sSigValue = sSignedSig.substr(sSignedSig.find(':') + 1);
- static const char* tags[] = {"b",NULL};
- char* values[sizeof(tags)/sizeof(tags[0])] = {NULL};
+ static const char *tags[] = {"b", NULL};
+ char *values[sizeof(tags) / sizeof(tags[0])] = {NULL};
- char* pSigValue = (char* ) sSigValue.c_str(); // our signature
- if (ParseTagValueList(pSigValue,tags,values) && values[0] != NULL) {
- sSignedSig.erase(15 + values[0] - pSigValue,strlen(values[0]));
+ char *pSigValue = (char *)sSigValue.c_str(); // our signature
+ if (ParseTagValueList(pSigValue, tags, values) && values[0] != NULL) {
+ sSignedSig.erase(15 + values[0] - pSigValue, strlen(values[0]));
}
if (i->HeaderCanonicalization == DKIM_CANON_RELAXED) {
sSignedSig = RelaxHeader(sSignedSig);
- }
- else if (i->HeaderCanonicalization == DKIM_CANON_NOWSP) {
+ } else if (i->HeaderCanonicalization == DKIM_CANON_NOWSP) {
RemoveSWSP(sSignedSig);
// convert "DKIM-Signature" to lower case
- sSignedSig.replace(0,14,"dkim-signature",14);
+ sSignedSig.replace(0, 14, "dkim-signature", 14);
}
- i->Hash(sSignedSig.c_str(),sSignedSig.length()); // include generated DKIM signature header
+ i->Hash(sSignedSig.c_str(), sSignedSig.length()); // include generated DKIM signature header
assert(i->m_pSelector != NULL);
- if (EVP_PKEY_base_id(i->m_pSelector->PublicKey) != EVP_PKEY_ED25519)
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- res = EVP_VerifyFinal(&i->m_Hdr_ctx,(unsigned char *)i->SignatureData.data(),i->SignatureData.length(),i->m_pSelector->PublicKey);
+ if (EVP_PKEY_base_id(i->m_pSelector->PublicKey) != EVP_PKEY_ED25519)
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ res = EVP_VerifyFinal(
+ &i->m_Hdr_ctx,
+ (unsigned char *)i->SignatureData.data(),
+ i->SignatureData.length(),
+ i->m_pSelector->PublicKey);
#else
- res = EVP_VerifyFinal(i->m_Hdr_ctx,(unsigned char *)i->SignatureData.data(),i->SignatureData.length(),i->m_pSelector->PublicKey);
+ res = EVP_VerifyFinal(
+ i->m_Hdr_ctx,
+ (unsigned char *)i->SignatureData.data(),
+ i->SignatureData.length(),
+ i->m_pSelector->PublicKey);
#endif
#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
else if (EVP_PKEY_base_id(i->m_pSelector->PublicKey) == EVP_PKEY_ED25519) {
- EVP_DigestVerifyInit(i->m_Msg_ctx,NULL,NULL,NULL,i->m_pSelector->PublicKey); // late initialization
-
- SignMsg = (unsigned char *) SigHdr.data();
- res = EVP_DigestVerify(i->m_Msg_ctx,(unsigned char *)i->SignatureData.data(),(size_t)i->SignatureData.length(),
- SignMsg,m_SigHdr);
+ EVP_DigestVerifyInit(
+ i->m_Msg_ctx, NULL, NULL, NULL, i->m_pSelector->PublicKey); // late initialization
+
+ SignMsg = (unsigned char *)SigHdr.data();
+ res = EVP_DigestVerify(
+ i->m_Msg_ctx,
+ (unsigned char *)i->SignatureData.data(),
+ (size_t)i->SignatureData.length(),
+ SignMsg,
+ m_SigHdr);
}
#endif
@@ -675,25 +662,25 @@ int CDKIMVerify::GetResults(void)
RealFailures++;
}
}
- } else if (i->Status == DKIM_SELECTOR_GRANULARITY_MISMATCH ||
- i->Status == DKIM_SELECTOR_ALGORITHM_MISMATCH ||
- i->Status == DKIM_SELECTOR_KEY_REVOKED) {
+ } else if (
+ i->Status == DKIM_SELECTOR_GRANULARITY_MISMATCH || i->Status == DKIM_SELECTOR_ALGORITHM_MISMATCH
+ || i->Status == DKIM_SELECTOR_KEY_REVOKED)
+ {
// treat these as failures
// todo: maybe see if the selector is in testing mode?
RealFailures++;
}
- } // loop over signature infos done
+ } // loop over signature infos done
// get the From address's domain if we might need it
string sFromDomain;
if (SuccessCount > 0 || m_CheckPractices) {
for (list<string>::iterator i = HeaderList.begin(); i != HeaderList.end(); ++i) {
- if (_strnicmp(i->c_str(),"From",4) == 0) {
+ if (_strnicmp(i->c_str(), "From", 4) == 0) {
// skip over whitespace between the header name and :
- const char* s = i->c_str() + 4;
- while (*s == ' ' || *s == '\t')
- s++;
+ const char *s = i->c_str() + 4;
+ while (*s == ' ' || *s == '\t') s++;
if (*s == ':') {
vector<string> Addresses;
if (ParseAddresses(s + 1, Addresses)) {
@@ -705,17 +692,17 @@ int CDKIMVerify::GetResults(void)
}
}
}
-
+
// if a signature from the From domain verified successfully, return success now
// without checking the author domain signing practices
if (SuccessCount > 0 && !sFromDomain.empty()) {
for (list<string>::iterator i = SuccessfulDomains.begin(); i != SuccessfulDomains.end(); ++i) {
// see if the successful domain is the same as or a parent of the From domain
- if (i->length() > sFromDomain.length())
- continue;
- if (_stricmp(i->c_str(),sFromDomain.c_str() + sFromDomain.length() - i->length()) != 0)
- continue;
- if (i->length() == sFromDomain.length() || sFromDomain.c_str()[sFromDomain.length() - i->length() - 1] == '.') {
+ if (i->length() > sFromDomain.length()) continue;
+ if (_stricmp(i->c_str(), sFromDomain.c_str() + sFromDomain.length() - i->length()) != 0) continue;
+ if (i->length() == sFromDomain.length()
+ || sFromDomain.c_str()[sFromDomain.length() - i->length() - 1] == '.')
+ {
return SuccessCount == Signatures.size() ? DKIM_SUCCESS : DKIM_PARTIAL_SUCCESS;
}
}
@@ -728,11 +715,11 @@ int CDKIMVerify::GetResults(void)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Hash - update the hash or update the Ed25519 signature input
//
////////////////////////////////////////////////////////////////////////////////
-void SignatureInfo::Hash(const char* szBuffer,unsigned nBufLength,bool IsBody)
+void SignatureInfo::Hash(const char *szBuffer, unsigned nBufLength, bool IsBody)
{
#if 0
/** START DEBUG CODE **/
@@ -748,7 +735,7 @@ void SignatureInfo::Hash(const char* szBuffer,unsigned nBufLength,bool IsBody)
/** END DEBUG CODE **/
#endif
- if (IsBody && BodyLength != (unsigned) -1) { // trick: 2's complement
+ if (IsBody && BodyLength != (unsigned)-1) { // trick: 2's complement
VerifiedBodyCount += nBufLength;
if (VerifiedBodyCount > BodyLength) {
nBufLength = BodyLength - (VerifiedBodyCount - nBufLength);
@@ -759,29 +746,31 @@ void SignatureInfo::Hash(const char* szBuffer,unsigned nBufLength,bool IsBody)
}
if (IsBody && !BodyHashData.empty()) {
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_DigestUpdate(&m_Bdy_ctx,szBuffer,nBufLength);
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_DigestUpdate(&m_Bdy_ctx, szBuffer, nBufLength);
} else {
- EVP_VerifyUpdate(&m_Hdr_ctx,szBuffer,nBufLength);
+ EVP_VerifyUpdate(&m_Hdr_ctx, szBuffer, nBufLength);
#else
- EVP_DigestUpdate(m_Bdy_ctx,szBuffer,nBufLength);
+ EVP_DigestUpdate(m_Bdy_ctx, szBuffer, nBufLength);
} else {
- EVP_VerifyUpdate(m_Hdr_ctx,szBuffer,nBufLength);
+ EVP_VerifyUpdate(m_Hdr_ctx, szBuffer, nBufLength);
#endif
#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
- SigHdr.append(szBuffer,nBufLength);
+ SigHdr.append(szBuffer, nBufLength);
m_SigHdr += nBufLength;
#endif
}
if (m_SaveCanonicalizedData) {
- CanonicalizedData.append(szBuffer,nBufLength);
+ CanonicalizedData.append(szBuffer, nBufLength);
}
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessHeaders - Look for DKIM-Signatures and start processing them
// look for DKIM-Signature header(s)
//
@@ -789,49 +778,46 @@ void SignatureInfo::Hash(const char* szBuffer,unsigned nBufLength,bool IsBody)
int CDKIMVerify::ProcessHeaders(void)
{
for (list<string>::iterator i = HeaderList.begin(); i != HeaderList.end(); ++i) {
- if (strlen(i->c_str()) < 14) continue; // too short
- if (_strnicmp(i->c_str(),"DKIM-Signature",14) == 0) {
+ if (strlen(i->c_str()) < 14) continue; // too short
+ if (_strnicmp(i->c_str(), "DKIM-Signature", 14) == 0) {
// skip over whitespace between the header name and :
const char *s = i->c_str() + 14;
- while (*s == ' ' || *s == '\t')
- s++;
+ while (*s == ' ' || *s == '\t') s++;
if (*s == ':') {
// found
SignatureInfo sig(m_SaveCanonicalizedData);
- sig.Status = ParseDKIMSignature(*i,sig);
- Signatures.push_back(sig); // save signature
+ sig.Status = ParseDKIMSignature(*i, sig);
+ Signatures.push_back(sig); // save signature
- if (Signatures.size() >= MAX_SIGNATURES)
- break;
+ if (Signatures.size() >= MAX_SIGNATURES) break;
}
}
}
- if (Signatures.empty())
- return DKIM_NO_SIGNATURES;
+ if (Signatures.empty()) return DKIM_NO_SIGNATURES;
bool ValidSigFound = false;
for (list<SignatureInfo>::iterator s = Signatures.begin(); s != Signatures.end(); ++s) {
- SignatureInfo &sig = *s;
+ SignatureInfo& sig = *s;
if (sig.Status != DKIM_SUCCESS) continue;
- SelectorInfo &sel = GetSelector(sig.Selector,sig.Domain);
+ SelectorInfo& sel = GetSelector(sig.Selector, sig.Domain);
sig.m_pSelector = &sel;
if (sel.Status != DKIM_SUCCESS) {
sig.Status = sel.Status;
} else {
// check the granularity
- if (!WildcardMatch(sel.Granularity.c_str(),sig.IdentityLocalPart.c_str()))
- sig.Status = DKIM_SELECTOR_GRANULARITY_MISMATCH; // this error causes the signature to fail
+ if (!WildcardMatch(sel.Granularity.c_str(), sig.IdentityLocalPart.c_str()))
+ sig.Status = DKIM_SELECTOR_GRANULARITY_MISMATCH; // this error causes the signature to fail
// check the hash algorithm
- if ((sig.m_nHash == DKIM_HASH_SHA1 && !sel.AllowSHA1) ||
- (sig.m_nHash == DKIM_HASH_SHA256 && !sel.AllowSHA256))
- sig.Status = DKIM_SELECTOR_ALGORITHM_MISMATCH; // causes signature to fail
+ if ((sig.m_nHash == DKIM_HASH_SHA1 && !sel.AllowSHA1)
+ || (sig.m_nHash == DKIM_HASH_SHA256 && !sel.AllowSHA256))
+ sig.Status = DKIM_SELECTOR_ALGORITHM_MISMATCH; // causes signature to fail
// check for same domain
- if (sel.SameDomain && _stricmp(sig.Domain.c_str(),sig.IdentityDomain.c_str()) != 0)
+ if (sel.SameDomain && _stricmp(sig.Domain.c_str(), sig.IdentityDomain.c_str()) != 0)
sig.Status = DKIM_BAD_SYNTAX;
}
@@ -839,23 +825,27 @@ int CDKIMVerify::ProcessHeaders(void)
// initialize the hashes
if (sig.m_nHash == DKIM_HASH_SHA1) {
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_VerifyInit(&sig.m_Hdr_ctx,EVP_sha1());
- EVP_DigestInit(&sig.m_Bdy_ctx,EVP_sha1());
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_VerifyInit(&sig.m_Hdr_ctx, EVP_sha1());
+ EVP_DigestInit(&sig.m_Bdy_ctx, EVP_sha1());
#else
- EVP_VerifyInit_ex(sig.m_Hdr_ctx,EVP_sha1(),NULL);
- EVP_DigestInit_ex(sig.m_Bdy_ctx,EVP_sha1(),NULL);
+ EVP_VerifyInit_ex(sig.m_Hdr_ctx, EVP_sha1(), NULL);
+ EVP_DigestInit_ex(sig.m_Bdy_ctx, EVP_sha1(), NULL);
#endif
}
if (sig.m_nHash == DKIM_HASH_SHA256) {
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_VerifyInit(&sig.m_Hdr_ctx,EVP_sha256());
- EVP_DigestInit(&sig.m_Bdy_ctx,EVP_sha256());
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_VerifyInit(&sig.m_Hdr_ctx, EVP_sha256());
+ EVP_DigestInit(&sig.m_Bdy_ctx, EVP_sha256());
#else
- EVP_VerifyInit_ex(sig.m_Hdr_ctx,EVP_sha256(),NULL);
- EVP_DigestInit_ex(sig.m_Bdy_ctx,EVP_sha256(),NULL);
+ EVP_VerifyInit_ex(sig.m_Hdr_ctx, EVP_sha256(), NULL);
+ EVP_DigestInit_ex(sig.m_Bdy_ctx, EVP_sha256(), NULL);
#endif
-#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
+#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
SigHdr.assign("");
m_SigHdr = 0;
}
@@ -867,13 +857,11 @@ int CDKIMVerify::ProcessHeaders(void)
for (vector<string>::iterator x = sig.SignedHeaders.begin(); x != sig.SignedHeaders.end(); ++x) {
list<string>::reverse_iterator i;
for (i = HeaderList.rbegin(); i != HeaderList.rend(); ++i) {
- if (_strnicmp(i->c_str(),x->c_str(),x->length()) == 0) {
+ if (_strnicmp(i->c_str(), x->c_str(), x->length()) == 0) {
// skip over whitespace between the header name and :
- const char* s = i->c_str()+x->length();
- while (*s == ' ' || *s == '\t')
- s++;
- if (*s == ':' && find(used.begin(),used.end(),i) == used.end())
- break;
+ const char *s = i->c_str() + x->length();
+ while (*s == ' ' || *s == '\t') s++;
+ if (*s == ':' && find(used.begin(), used.end(), i) == used.end()) break;
}
}
@@ -882,41 +870,39 @@ int CDKIMVerify::ProcessHeaders(void)
// hash this header
if (sig.HeaderCanonicalization == DKIM_CANON_SIMPLE) {
- sig.Hash(i->c_str(),i->length());
+ sig.Hash(i->c_str(), i->length());
} else if (sig.HeaderCanonicalization == DKIM_CANON_RELAXED) {
string sTemp = RelaxHeader(*i);
- sig.Hash(sTemp.c_str(),sTemp.length());
+ sig.Hash(sTemp.c_str(), sTemp.length());
} else if (sig.HeaderCanonicalization == DKIM_CANON_NOWSP) {
string sTemp = *i;
RemoveSWSP(sTemp);
// convert characters before ':' to lower case
- for (char* s = (char*)sTemp.c_str(); *s != '\0' && *s != ':'; s++) {
- if (*s >= 'A' && *s <= 'Z')
- *s += 'a' - 'A';
+ for (char *s = (char *)sTemp.c_str(); *s != '\0' && *s != ':'; s++) {
+ if (*s >= 'A' && *s <= 'Z') *s += 'a' - 'A';
}
- sig.Hash(sTemp.c_str(),sTemp.length());
+ sig.Hash(sTemp.c_str(), sTemp.length());
}
- sig.Hash("\r\n",2);
+ sig.Hash("\r\n", 2);
}
}
if (sig.BodyHashData.empty()) {
// hash CRLF separating headers from body
- sig.Hash("\r\n",2);
+ sig.Hash("\r\n", 2);
}
if (!m_AllowUnsignedFromHeaders) {
// make sure the message has no unsigned From headers
list<string>::reverse_iterator i;
for (i = HeaderList.rbegin(); i != HeaderList.rend(); ++i) {
- if (_strnicmp(i->c_str(),"From",4) == 0) {
+ if (_strnicmp(i->c_str(), "From", 4) == 0) {
// skip over whitespace between the header name and :
const char *s = i->c_str() + 4;
- while (*s == ' ' || *s == '\t')
- s++;
+ while (*s == ' ' || *s == '\t') s++;
if (*s == ':') {
- if (find(used.begin(),used.end(),i) == used.end()) {
+ if (find(used.begin(), used.end(), i) == used.end()) {
// this From header was not signed
break;
}
@@ -933,8 +919,7 @@ int CDKIMVerify::ProcessHeaders(void)
ValidSigFound = true;
}
- if (!ValidSigFound)
- return DKIM_NO_VALID_SIGNATURES;
+ if (!ValidSigFound) return DKIM_NO_VALID_SIGNATURES;
return DKIM_SUCCESS;
}
@@ -952,12 +937,10 @@ bool ParseUnsigned(const char *s, unsigned *result)
bool overflowed = false;
do {
- if (*s < '0' || *s > '9')
- return false; // returns false for an initial '\0'
+ if (*s < '0' || *s > '9') return false; // returns false for an initial '\0'
temp = temp * 10 + (*s - '0');
- if (temp < last)
- overflowed = true;
+ if (temp < last) overflowed = true;
last = temp;
s++;
@@ -969,11 +952,11 @@ bool ParseUnsigned(const char *s, unsigned *result)
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ParseDKIMSignature - Parse a DKIM-Signature header field
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMVerify::ParseDKIMSignature(const string& sHeader,SignatureInfo &sig)
+int CDKIMVerify::ParseDKIMSignature(const string& sHeader, SignatureInfo& sig)
{
// for strtok_r()
char *saveptr;
@@ -983,77 +966,72 @@ int CDKIMVerify::ParseDKIMSignature(const string& sHeader,SignatureInfo &sig)
string sValue = sHeader.substr(sHeader.find(':') + 1);
- static const char *tags[] = {"v","a","b","d","h","s","c","i","l","q","t","x","bh",NULL};
- char *values[sizeof(tags)/sizeof(tags[0])] = {NULL};
+ static const char *tags[] = {"v", "a", "b", "d", "h", "s", "c", "i", "l", "q", "t", "x", "bh", NULL};
+ char *values[sizeof(tags) / sizeof(tags[0])] = {NULL};
- if (!ParseTagValueList((char*) sValue.c_str(),tags,values))
- return DKIM_BAD_SYNTAX;
+ if (!ParseTagValueList((char *)sValue.c_str(), tags, values)) return DKIM_BAD_SYNTAX;
// check signature version
if (values[0] == NULL) return DKIM_BAD_SYNTAX;
-
+
// signature MUST have a=, b=, d=, h=, s=
- if (values[1] == NULL || values[2] == NULL || values[3] == NULL || values[4] == NULL || values[5] == NULL)
+ if (values[1] == NULL || values[2] == NULL || values[3] == NULL || values[4] == NULL
+ || values[5] == NULL)
return DKIM_BAD_SYNTAX;
// algorithm ('a=') can be "rsa-sha1" or "rsa-sha256" or "ed25519"
- if (strcmp(values[1],"rsa-sha1") == 0) {
+ if (strcmp(values[1], "rsa-sha1") == 0) {
sig.m_nHash = DKIM_HASH_SHA1;
- } else if (strcmp(values[1],"rsa-sha256") == 0) {
+ } else if (strcmp(values[1], "rsa-sha256") == 0) {
sig.m_nHash = DKIM_HASH_SHA256;
-#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
- } else if (strcmp(values[1],"ed25519-sha256") == 0) {
+#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
+ } else if (strcmp(values[1], "ed25519-sha256") == 0) {
sig.m_nHash = DKIM_HASH_SHA256;
#endif
} else {
- return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for unknown algorithm
+ return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for unknown algorithm
}
// make sure the signature data is not empty: b=[...]
unsigned SigDataLen = DecodeBase64(values[2]);
- if (SigDataLen == 0)
- return DKIM_BAD_SYNTAX;
+ if (SigDataLen == 0) return DKIM_BAD_SYNTAX;
- sig.SignatureData.assign(values[2],SigDataLen);
+ sig.SignatureData.assign(values[2], SigDataLen);
// check for body hash in DKIM header: bh=[...];
unsigned BodyHashLen = DecodeBase64(values[12]);
if (BodyHashLen == 0) return DKIM_BAD_SYNTAX;
- sig.BodyHashData.assign(values[12],BodyHashLen);
+ sig.BodyHashData.assign(values[12], BodyHashLen);
// domain must not be empty
- if (*values[3] == '\0')
- return DKIM_BAD_SYNTAX;
+ if (*values[3] == '\0') return DKIM_BAD_SYNTAX;
sig.Domain = values[3];
// signed headers must not be empty (more verification is done later)
- if (*values[4] == '\0')
- return DKIM_BAD_SYNTAX;
+ if (*values[4] == '\0') return DKIM_BAD_SYNTAX;
// selector must not be empty
- if (*values[5] == '\0')
- return DKIM_BAD_SYNTAX;
+ if (*values[5] == '\0') return DKIM_BAD_SYNTAX;
sig.Selector = values[5];
// canonicalization
if (values[6] == NULL) {
sig.HeaderCanonicalization = sig.BodyCanonicalization = DKIM_CANON_SIMPLE;
} else {
- char* slash = strchr(values[6],'/');
- if (slash != NULL)
- *slash = '\0';
+ char *slash = strchr(values[6], '/');
+ if (slash != NULL) *slash = '\0';
- if (strcmp(values[6],"simple") == 0)
+ if (strcmp(values[6], "simple") == 0)
sig.HeaderCanonicalization = DKIM_CANON_SIMPLE;
- else if (strcmp(values[6],"relaxed") == 0)
+ else if (strcmp(values[6], "relaxed") == 0)
sig.HeaderCanonicalization = DKIM_CANON_RELAXED;
else
return DKIM_BAD_SYNTAX;
- if (slash == NULL || strcmp(slash + 1,"simple") == 0)
+ if (slash == NULL || strcmp(slash + 1, "simple") == 0)
sig.BodyCanonicalization = DKIM_CANON_SIMPLE;
- else if (strcmp(slash + 1,"relaxed") == 0)
+ else if (strcmp(slash + 1, "relaxed") == 0)
sig.BodyCanonicalization = DKIM_CANON_RELAXED;
else
return DKIM_BAD_SYNTAX;
@@ -1068,25 +1046,21 @@ int CDKIMVerify::ParseDKIMSignature(const string& sHeader,SignatureInfo &sig)
DecodeQuotedPrintable(values[7]);
// must have a '@' separating the local part from the domain
- char* at = strchr(values[7],'@');
- if (at == NULL)
- return DKIM_BAD_SYNTAX;
+ char *at = strchr(values[7], '@');
+ if (at == NULL) return DKIM_BAD_SYNTAX;
*at = '\0';
- char* ilocalpart = values[7];
- char* idomain = at + 1;
+ char *ilocalpart = values[7];
+ char *idomain = at + 1;
// i= domain must be the same as or a subdomain of the d= domain
int idomainlen = strlen(idomain);
int ddomainlen = strlen(values[3]);
// todo: maybe create a new error code for invalid identity domain
- if (idomainlen < ddomainlen)
- return DKIM_BAD_SYNTAX;
- if (_stricmp(idomain + idomainlen - ddomainlen,values[3]) != 0)
- return DKIM_BAD_SYNTAX;
- if (idomainlen > ddomainlen && idomain[idomainlen - ddomainlen - 1] != '.')
- return DKIM_BAD_SYNTAX;
+ if (idomainlen < ddomainlen) return DKIM_BAD_SYNTAX;
+ if (_stricmp(idomain + idomainlen - ddomainlen, values[3]) != 0) return DKIM_BAD_SYNTAX;
+ if (idomainlen > ddomainlen && idomain[idomainlen - ddomainlen - 1] != '.') return DKIM_BAD_SYNTAX;
sig.IdentityLocalPart = ilocalpart;
sig.IdentityDomain = idomain;
@@ -1094,83 +1068,76 @@ int CDKIMVerify::ParseDKIMSignature(const string& sHeader,SignatureInfo &sig)
// body count
if (values[8] == NULL || !m_HonorBodyLengthTag) {
- sig.BodyLength = (unsigned) -1;
+ sig.BodyLength = (unsigned)-1;
} else {
- if (!ParseUnsigned(values[8],&sig.BodyLength))
- return DKIM_BAD_SYNTAX;
+ if (!ParseUnsigned(values[8], &sig.BodyLength)) return DKIM_BAD_SYNTAX;
}
// query methods
if (values[9] != NULL) {
// make sure "dns" is in the list
bool HasDNS = false;
- char* s = strtok_r(values[9],":",&saveptr);
+ char *s = strtok_r(values[9], ":", &saveptr);
while (s != NULL) {
- if (strncmp(s,"dns",3) == 0 && (s[3] == '\0' || s[3] == '/')) {
+ if (strncmp(s, "dns", 3) == 0 && (s[3] == '\0' || s[3] == '/')) {
HasDNS = true;
break;
}
- s = strtok_r(NULL,": \t",&saveptr); /* FIXME */
-// s = strtok_r(NULL,": ",&saveptr); /* FIXME */
+ s = strtok_r(NULL, ": \t", &saveptr); /* FIXME */
+ // s = strtok_r(NULL,": ",&saveptr); /* FIXME */
}
- if (!HasDNS)
- return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for unknown query method
+ if (!HasDNS) return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for unknown query method
}
// signature time
unsigned SignedTime = -1;
if (values[10] != NULL) {
- if (!ParseUnsigned(values[10],&SignedTime))
- return DKIM_BAD_SYNTAX;
+ if (!ParseUnsigned(values[10], &SignedTime)) return DKIM_BAD_SYNTAX;
}
// expiration time
if (values[11] == NULL) {
- sig.ExpireTime = (unsigned) -1; // common trick; feh
+ sig.ExpireTime = (unsigned)-1; // common trick; feh
} else {
- if (!ParseUnsigned(values[11],&sig.ExpireTime))
- return DKIM_BAD_SYNTAX;
+ if (!ParseUnsigned(values[11], &sig.ExpireTime)) return DKIM_BAD_SYNTAX;
- if (sig.ExpireTime != (unsigned) -1) {
+ if (sig.ExpireTime != (unsigned)-1) {
// the value of x= MUST be greater than the value of t= if both are present
- if (SignedTime != (unsigned) -1 && sig.ExpireTime <= SignedTime)
- return DKIM_BAD_SYNTAX;
+ if (SignedTime != (unsigned)-1 && sig.ExpireTime <= SignedTime) return DKIM_BAD_SYNTAX;
// todo: if possible, use the received date/time instead of the current time
unsigned curtime = time(NULL);
- if (curtime > sig.ExpireTime)
- return DKIM_SIGNATURE_EXPIRED;
+ if (curtime > sig.ExpireTime) return DKIM_SIGNATURE_EXPIRED;
}
}
// parse the signed headers list
bool HasFrom = false, HasSubject = false;
- RemoveSWSP(values[4]); // header names shouldn't have spaces in them so this should be ok...
- char* s = strtok_r(values[4],":",&saveptr);
+ RemoveSWSP(values[4]); // header names shouldn't have spaces in them so this should be ok...
+ char *s = strtok_r(values[4], ":", &saveptr);
while (s != NULL) {
- if (_stricmp(s,"From") == 0)
+ if (_stricmp(s, "From") == 0)
HasFrom = true;
- else if (_stricmp(s,"Subject") == 0)
+ else if (_stricmp(s, "Subject") == 0)
HasSubject = true;
sig.SignedHeaders.push_back(s);
- s = strtok_r(NULL,":",&saveptr);
+ s = strtok_r(NULL, ":", &saveptr);
}
- if (!HasFrom)
- return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for h= missing From
+ if (!HasFrom) return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for h= missing From
if (m_SubjectIsRequired && !HasSubject)
- return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for h= missing Subject
+ return DKIM_BAD_SYNTAX; // todo: maybe create a new error code for h= missing Subject
return DKIM_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// ProcessBody - Process message body data
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMVerify::ProcessBody(char* szBuffer,int nBufLength,bool bEOF)
+int CDKIMVerify::ProcessBody(char *szBuffer, int nBufLength, bool bEOF)
{
bool MoreBodyNeeded = false;
@@ -1179,44 +1146,43 @@ int CDKIMVerify::ProcessBody(char* szBuffer,int nBufLength,bool bEOF)
if (i->BodyCanonicalization == DKIM_CANON_SIMPLE) {
if (nBufLength > 0) {
while (i->EmptyLineCount > 0) {
- i->Hash("\r\n",2,true);
+ i->Hash("\r\n", 2, true);
i->EmptyLineCount--;
}
- i->Hash(szBuffer,nBufLength,true);
- i->Hash("\r\n",2,true);
+ i->Hash(szBuffer, nBufLength, true);
+ i->Hash("\r\n", 2, true);
} else {
i->EmptyLineCount++;
- if (bEOF)
- i->Hash("\r\n",2,true);
+ if (bEOF) i->Hash("\r\n", 2, true);
}
} else if (i->BodyCanonicalization == DKIM_CANON_RELAXED) {
CompressSWSP(szBuffer, nBufLength);
if (nBufLength > 0) {
while (i->EmptyLineCount > 0) {
- i->Hash("\r\n",2,true);
+ i->Hash("\r\n", 2, true);
i->EmptyLineCount--;
}
- i->Hash(szBuffer,nBufLength,true);
- if (!bEOF)
- i->Hash("\r\n",2,true);
- } else i->EmptyLineCount++;
+ i->Hash(szBuffer, nBufLength, true);
+ if (!bEOF) i->Hash("\r\n", 2, true);
+ } else
+ i->EmptyLineCount++;
} else if (i->BodyCanonicalization == DKIM_CANON_NOWSP) {
- RemoveSWSP(szBuffer,nBufLength);
- i->Hash(szBuffer,nBufLength,true);
+ RemoveSWSP(szBuffer, nBufLength);
+ i->Hash(szBuffer, nBufLength, true);
}
- if (i->UnverifiedBodyCount == 0)
- MoreBodyNeeded = true;
+ if (i->UnverifiedBodyCount == 0) MoreBodyNeeded = true;
}
}
- if (!MoreBodyNeeded)
- return DKIM_FINISHED_BODY;
+ if (!MoreBodyNeeded) return DKIM_FINISHED_BODY;
return DKIM_SUCCESS;
}
-SelectorInfo::SelectorInfo(const string &sSelector,const string &sDomain) : Domain(sDomain),Selector(sSelector)
+SelectorInfo::SelectorInfo(const string& sSelector, const string& sDomain) :
+ Domain(sDomain),
+ Selector(sSelector)
{
AllowSHA1 = true;
AllowSHA256 = true;
@@ -1234,30 +1200,30 @@ SelectorInfo::~SelectorInfo()
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// Parse - Parse a DKIM selector from DNS data
//
////////////////////////////////////////////////////////////////////////////////
-int SelectorInfo::Parse(char* Buffer)
+int SelectorInfo::Parse(char *Buffer)
{
// for strtok_r()
char *saveptr;
char *PubKeyBase64; /*- public key Base64 encoded */
char ed25519PubKey[61];
- static const char *tags[] = {"v","g","h","k","p","s","t","n",NULL}; // 0, 1, 2, 3, 4
- char *values[sizeof(tags)/sizeof(tags[0])] = {NULL};
+ static const char *tags[] = {"v", "g", "h", "k", "p", "s", "t", "n", NULL}; // 0, 1, 2, 3, 4
+ char *values[sizeof(tags) / sizeof(tags[0])] = {NULL};
+
+ ParseTagValueList(Buffer, tags, values);
- ParseTagValueList(Buffer,tags,values);
-
// return DKIM_SELECTOR_INVALID;
if (values[0] != NULL) {
// make sure the version is "DKIM1"
- if (strcmp(values[0],"DKIM1") != 0)
- return DKIM_SELECTOR_INVALID; // todo: maybe create a new error code for unsupported selector version
+ if (strcmp(values[0], "DKIM1") != 0)
+ return DKIM_SELECTOR_INVALID; // todo: maybe create a new error code for unsupported selector version
// make sure v= is the first tag in the response // todo: maybe don't enforce this, it seems unnecessary
- for (unsigned j = 1; j < sizeof(values)/sizeof(values[0]); j++) {
+ for (unsigned j = 1; j < sizeof(values) / sizeof(values[0]); j++) {
if (values[j] != NULL && values[j] < values[0]) {
return DKIM_SELECTOR_INVALID;
}
@@ -1265,10 +1231,9 @@ int SelectorInfo::Parse(char* Buffer)
}
// selector MUST have p= tag
- if (values[4] == NULL)
- return DKIM_SELECTOR_INVALID;
+ if (values[4] == NULL) return DKIM_SELECTOR_INVALID;
- PubKeyBase64 = values[4]; // gotcha
+ PubKeyBase64 = values[4]; // gotcha
// granularity -- [g= ... ]
if (values[1] == NULL)
@@ -1282,13 +1247,16 @@ int SelectorInfo::Parse(char* Buffer)
AllowSHA256 = true;
} else {
// MUST include "sha1" or "sha256"
- char* s = strtok_r(values[2],":",&saveptr);
+ char *s = strtok_r(values[2], ":", &saveptr);
while (s != NULL) {
- if (strcmp(s,"sha1") == 0)
- { AllowSHA1 = true; AllowSHA256 = false; }
- else if (strcmp(s,"sha256") == 0)
- { AllowSHA256 = true; AllowSHA1 = false; }
- s = strtok_r(NULL,":",&saveptr);
+ if (strcmp(s, "sha1") == 0) {
+ AllowSHA1 = true;
+ AllowSHA256 = false;
+ } else if (strcmp(s, "sha256") == 0) {
+ AllowSHA256 = true;
+ AllowSHA1 = false;
+ }
+ s = strtok_r(NULL, ":", &saveptr);
}
if (!(AllowSHA1 || AllowSHA256))
return DKIM_SELECTOR_INVALID; // todo: maybe create a new error code for unsupported hash algorithm
@@ -1297,50 +1265,48 @@ int SelectorInfo::Parse(char* Buffer)
// key type -- [k=rsa|ed25519] (not required)
if (values[3] != NULL) {
// key type MUST be "rsa" or "ed25519"
- if (strcmp(values[3],"rsa") != 0 && strcmp(values[3],"ed25519") != 0) // none of either
+ if (strcmp(values[3], "rsa") != 0 && strcmp(values[3], "ed25519") != 0) // none of either
return DKIM_SELECTOR_INVALID;
- if (strcmp(values[3],"ed25519") == 0) {
- AllowSHA1 = false;
- AllowSHA256 = true;
- strcpy(ed25519PubKey,"MCowBQYDK2VwAyEA");
+ if (strcmp(values[3], "ed25519") == 0) {
+ AllowSHA1 = false;
+ AllowSHA256 = true;
+ strcpy(ed25519PubKey, "MCowBQYDK2VwAyEA");
/*
* rfc8463
* since Ed25519 public keys are 256 bits long,
* the base64-encoded key is only 44 octets
*/
- if (strlen(values[4]) > 44)
- return DKIM_SELECTOR_PUBLIC_KEY_INVALID;
- strcat(ed25519PubKey,values[4]);
+ if (strlen(values[4]) > 44) return DKIM_SELECTOR_PUBLIC_KEY_INVALID;
+ strcat(ed25519PubKey, values[4]);
PubKeyBase64 = ed25519PubKey;
- }
+ }
}
// service type -- [s= ...] (not required)
if (values[5] != NULL) {
// make sure "*" or "email" is in the list
bool ServiceTypeMatch = false;
- char* s = strtok_r(values[5],":",&saveptr);
+ char *s = strtok_r(values[5], ":", &saveptr);
while (s != NULL) {
- if (strcmp(s, "*") == 0 || strcmp(s,"email") == 0) {
+ if (strcmp(s, "*") == 0 || strcmp(s, "email") == 0) {
ServiceTypeMatch = true;
break;
}
- s = strtok_r(NULL,":",&saveptr);
+ s = strtok_r(NULL, ":", &saveptr);
}
- if (!ServiceTypeMatch)
- return DKIM_SELECTOR_INVALID;
+ if (!ServiceTypeMatch) return DKIM_SELECTOR_INVALID;
}
// flags -- [t= ...] (not required)
if (values[6] != NULL) {
- char *s = strtok_r(values[6],":",&saveptr);
+ char *s = strtok_r(values[6], ":", &saveptr);
while (s != NULL) {
- if (strcmp(s,"y") == 0) {
+ if (strcmp(s, "y") == 0) {
Testing = true;
- } else if (strcmp(s,"s") == 0) {
+ } else if (strcmp(s, "s") == 0) {
SameDomain = true;
}
- s = strtok_r(NULL,":",&saveptr);
+ s = strtok_r(NULL, ":", &saveptr);
}
}
@@ -1350,20 +1316,22 @@ int SelectorInfo::Parse(char* Buffer)
if (PublicKeyLen == 0) {
return DKIM_SELECTOR_KEY_REVOKED; // this error causes the signature to fail
} else {
- const unsigned char *PublicKeyData = (unsigned char* )PubKeyBase64; // 0-terminated
+ const unsigned char *PublicKeyData = (unsigned char *)PubKeyBase64; // 0-terminated
- EVP_PKEY *pkey = d2i_PUBKEY(NULL,&PublicKeyData,PublicKeyLen); /* retrieve and return PubKey from data */
+ EVP_PKEY *pkey =
+ d2i_PUBKEY(NULL, &PublicKeyData, PublicKeyLen); /* retrieve and return PubKey from data */
- if (pkey == NULL)
- return DKIM_SELECTOR_PUBLIC_KEY_INVALID;
+ if (pkey == NULL) return DKIM_SELECTOR_PUBLIC_KEY_INVALID;
- // make sure public key is the correct type (we only support rsa & ed25519)
-#if ((OPENSSL_VERSION_NUMBER < 0x10101000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ // make sure public key is the correct type (we only support rsa & ed25519)
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10101000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
if (pkey->type == EVP_PKEY_RSA || pkey->type == EVP_PKEY_RSA2) {
#else
- if ((EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA) ||
- (EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA2) ||
- (EVP_PKEY_base_id(pkey) == EVP_PKEY_ED25519)) {
+ if ((EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA) || (EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA2)
+ || (EVP_PKEY_base_id(pkey) == EVP_PKEY_ED25519))
+ {
#endif
PublicKey = pkey;
} else {
@@ -1376,62 +1344,68 @@ int SelectorInfo::Parse(char* Buffer)
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// GetSelector - Get a DKIM selector for a domain
//
////////////////////////////////////////////////////////////////////////////////
-SelectorInfo& CDKIMVerify::GetSelector(const string &sSelector,const string &sDomain)
+SelectorInfo& CDKIMVerify::GetSelector(const string& sSelector, const string& sDomain)
{
// see if we already have this selector
for (list<SelectorInfo>::iterator i = Selectors.begin(); i != Selectors.end(); ++i) {
- if (_stricmp(i->Selector.c_str(),sSelector.c_str()) == 0 && _stricmp(i->Domain.c_str(),sDomain.c_str()) == 0) {
+ if (_stricmp(i->Selector.c_str(), sSelector.c_str()) == 0
+ && _stricmp(i->Domain.c_str(), sDomain.c_str()) == 0)
+ {
return *i;
}
}
- Selectors.push_back(SelectorInfo(sSelector,sDomain));
+ Selectors.push_back(SelectorInfo(sSelector, sDomain));
SelectorInfo& sel = Selectors.back();
string sFQDN = sSelector;
sFQDN += "._domainkey.";
sFQDN += sDomain;
- int BufLen = 1024;
+ int BufLen = 1024;
char Buffer[BufLen];
int DNSResult;
- if (m_pfnSelectorCallback) {
- DNSResult = m_pfnSelectorCallback(sFQDN.c_str(),Buffer,BufLen);
+ if (m_pfnSelectorCallback) {
+ DNSResult = m_pfnSelectorCallback(sFQDN.c_str(), Buffer, BufLen);
} else
- DNSResult = _DNSGetTXT(sFQDN.c_str(),Buffer,BufLen);
+ DNSResult = _DNSGetTXT(sFQDN.c_str(), Buffer, BufLen);
-// Buffer++; BufLen--;
+ // Buffer++; BufLen--;
switch (DNSResult) {
- case -1: case -2: case -3: case -5: sel.Status = DKIM_SELECTOR_DNS_TEMP_FAILURE; break;
- case 0: case -6: sel.Status = DKIM_SELECTOR_DNS_PERM_FAILURE; break;
+ case -1:
+ case -2:
+ case -3:
+ case -5: sel.Status = DKIM_SELECTOR_DNS_TEMP_FAILURE; break;
+ case 0:
+ case -6: sel.Status = DKIM_SELECTOR_DNS_PERM_FAILURE; break;
default: sel.Status = sel.Parse(Buffer);
- }
+ }
return sel;
}
////////////////////////////////////////////////////////////////////////////////
-//
+//
// GetDetails - Get DKIM verification details (per signature)
//
////////////////////////////////////////////////////////////////////////////////
-int CDKIMVerify::GetDetails(int* nSigCount,DKIMVerifyDetails** pDetails)
+int CDKIMVerify::GetDetails(int *nSigCount, DKIMVerifyDetails **pDetails)
{
Details.clear();
- for (list < SignatureInfo>::iterator i = Signatures.begin(); i != Signatures.end(); ++i) {
+ for (list<SignatureInfo>::iterator i = Signatures.begin(); i != Signatures.end(); ++i) {
DKIMVerifyDetails d;
- d.szSignature = (char* )i->Header.c_str();
- d.szSignatureDomain = (char* )i->Domain.c_str();
- d.szIdentityDomain = (char* )i->IdentityDomain.c_str();
- d.szCanonicalizedData = (char* )i->CanonicalizedData.c_str();
+ d.szSignature = (char *)i->Header.c_str();
+ d.szSignatureDomain = (char *)i->Domain.c_str();
+ d.szIdentityDomain = (char *)i->IdentityDomain.c_str();
+ d.szCanonicalizedData = (char *)i->CanonicalizedData.c_str();
d.nResult = i->Status;
Details.push_back(d);
}
diff --git a/src/dns.c b/src/dns.c
index 3f1154b..c49b633 100644
--- a/src/dns.c
+++ b/src/dns.c
@@ -1,20 +1,25 @@
+#include "dns.h"
+
+#include <arpa/nameser.h>
+
#include <netdb.h>
-#include <string.h>
-#include <sys/types.h>
#include <netinet/in.h>
-#include <arpa/nameser.h>
#include <sys/socket.h>
-#include "ip.h"
-#include "ipalloc.h"
-#include "fmt.h"
+#include <sys/types.h>
+
+#include <string.h>
+
#include "alloc.h"
-#include "str.h"
-#include "stralloc.h"
-#include "dnsresolv.h"
-#include "case.h"
-#include "dns.h"
#include "buffer.h"
+#include "case.h"
+#include "dnsresolv.h"
#include "exit.h"
+#include "fmt.h"
+#include "ip.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "ipalloc.h"
/**
@file dns.c
@@ -24,86 +29,96 @@
static stralloc glue = {0};
static stralloc ip = {0};
-static int dns_ipplus(ipalloc *ia,stralloc *sa,int pref)
+static int dns_ipplus(ipalloc *ia, stralloc *sa, int pref)
{
struct ip_mx ix;
int error = 0;
char ip4[4];
char ip6[16];
- int i;
+ int i;
/* Case 1: sa is just IPv4 */
- if (ip4_scanbracket(sa->s,ip4)) {
- if (!stralloc_copys(&glue,sa->s)) return DNS_MEM;
+ if (ip4_scanbracket(sa->s, ip4)) {
+ if (!stralloc_copys(&glue, sa->s)) return DNS_MEM;
if (!stralloc_0(&glue)) return DNS_MEM;
if (glue.s[0]) {
ix.pref = 0;
ix.af = AF_INET;
- byte_copy(&ix.addr,4,ip4); // = ip; //cp
- if (!ipalloc_append(ia,&ix)) return DNS_MEM;
+ byte_copy(&ix.addr, 4, ip4); // = ip; //cp
+ if (!ipalloc_append(ia, &ix)) return DNS_MEM;
return 0;
}
}
/* Case 2: sa is just IPv6 */
- if (ip6_scanbracket(sa->s,ip6)) {
- if (!stralloc_copys(&glue,sa->s)) return DNS_MEM;
+ if (ip6_scanbracket(sa->s, ip6)) {
+ if (!stralloc_copys(&glue, sa->s)) return DNS_MEM;
if (!stralloc_0(&glue)) return DNS_MEM;
if (glue.s[0]) {
ix.pref = 0;
ix.af = AF_INET6;
- byte_copy(&ix.addr,16,ip6); // = ip; //cp
- if (!ipalloc_append(ia,&ix)) return DNS_MEM;
+ byte_copy(&ix.addr, 16, ip6); // = ip; //cp
+ if (!ipalloc_append(ia, &ix)) return DNS_MEM;
return 0;
}
}
/* Case 3: sa is fqdn and looking for IPv6 */
- if (dns_ip6(&ip,sa) > 0) {
+ if (dns_ip6(&ip, sa) > 0) {
for (i = 0; i + 16 <= ip.len; i += 16) {
if (ip6_isv4mapped(ip.s + i)) continue;
- ix.af = AF_INET6;
- ix.pref = pref;
- byte_copy(&ix.addr,16,ip.s + i); // = ip; //cp
- str_copy(ix.mxh,sa->s); // mx hostname
- if (!ipalloc_append(ia,&ix)) { error = DNS_MEM; break; }
- error = 0;
+ ix.af = AF_INET6;
+ ix.pref = pref;
+ byte_copy(&ix.addr, 16, ip.s + i); // = ip; //cp
+ str_copy(ix.mxh, sa->s); // mx hostname
+ if (!ipalloc_append(ia, &ix)) {
+ error = DNS_MEM;
+ break;
}
+ error = 0;
+ }
} else
error = 1;
/* Case 4: sa is fqdn and looking for IPv4 */
- if (dns_ip4(&ip,sa) > 0) {
+ if (dns_ip4(&ip, sa) > 0) {
for (i = 0; i + 4 <= ip.len; i += 4) {
ix.af = AF_INET;
ix.pref = pref;
- byte_copy(&ix.addr,4,ip.s + i); // = ip; //cp
- str_copy(ix.mxh,sa->s); // mx hostname
- if (!ipalloc_append(ia,&ix)) { error = DNS_MEM; break; }
+ byte_copy(&ix.addr, 4, ip.s + i); // = ip; //cp
+ str_copy(ix.mxh, sa->s); // mx hostname
+ if (!ipalloc_append(ia, &ix)) {
+ error = DNS_MEM;
+ break;
+ }
error = 0;
}
} else
- error += 2;
+ error += 2;
return error;
}
-int dns_ipalloc(ipalloc *ia,stralloc *sa)
+int dns_ipalloc(ipalloc *ia, stralloc *sa)
{
- if (!ipalloc_readyplus(ia,0)) return DNS_MEM;
+ if (!ipalloc_readyplus(ia, 0)) return DNS_MEM;
ia->len = 0;
- return dns_ipplus(ia,sa,0);
+ return dns_ipplus(ia, sa, 0);
}
/* dns_mxip */
-int dns_mxip(ipalloc *ia,stralloc *sa,unsigned long random) {
- struct mx { stralloc sa; unsigned short p; } *mx;
+int dns_mxip(ipalloc *ia, stralloc *sa, unsigned long random)
+{
+ struct mx {
+ stralloc sa;
+ unsigned short p;
+ } *mx;
struct ip_mx ix;
int nummx;
int i;
@@ -114,23 +129,25 @@ int dns_mxip(ipalloc *ia,stralloc *sa,unsigned long random) {
/* Case 1: sa is just IPv4 or IPv6 */
- if (!ipalloc_readyplus(ia,0)) return DNS_MEM;
+ if (!ipalloc_readyplus(ia, 0)) return DNS_MEM;
ia->len = 0;
- if (!stralloc_copys(&glue,sa->s)) return DNS_MEM;
+ if (!stralloc_copys(&glue, sa->s)) return DNS_MEM;
if (!stralloc_0(&glue)) return DNS_MEM;
if (glue.s[0]) {
ix.pref = 0;
- if (!glue.s[ip4_scan(glue.s,(char *)&ix.addr.ip4)] || \
- !glue.s[ip4_scanbracket(glue.s,(char *)&ix.addr.ip4)]) {
+ if (!glue.s[ip4_scan(glue.s, (char *)&ix.addr.ip4)]
+ || !glue.s[ip4_scanbracket(glue.s, (char *)&ix.addr.ip4)])
+ {
ix.af = AF_INET;
- if (!ipalloc_append(ia,&ix)) return DNS_MEM;
+ if (!ipalloc_append(ia, &ix)) return DNS_MEM;
return 0;
}
- if (!glue.s[ip6_scan(glue.s,(char *)&ix.addr.ip6)] || \
- !glue.s[ip6_scanbracket(glue.s,(char *)&ix.addr.ip6)]) {
+ if (!glue.s[ip6_scan(glue.s, (char *)&ix.addr.ip6)]
+ || !glue.s[ip6_scanbracket(glue.s, (char *)&ix.addr.ip6)])
+ {
ix.af = AF_INET6;
- if (!ipalloc_append(ia,&ix)) return DNS_MEM;
+ if (!ipalloc_append(ia, &ix)) return DNS_MEM;
return 0;
}
}
@@ -140,26 +157,27 @@ int dns_mxip(ipalloc *ia,stralloc *sa,unsigned long random) {
DNS_INIT
nummx = 0;
len = 0;
- i = dns_mx(&ip,sa);
- mx = (struct mx *) alloc(i * sizeof(struct mx));
+ i = dns_mx(&ip, sa);
+ mx = (struct mx *)alloc(i * sizeof(struct mx));
if (!mx) return DNS_MEM;
if (i) {
do {
- j = str_chr(ip.s + len + 2,'\0'); /* several answers */
+ j = str_chr(ip.s + len + 2, '\0'); /* several answers */
mx[nummx].sa.s = 0;
- if (!stralloc_copys(&mx[nummx].sa,ip.s + len + 2)) { /* mxhost name */
- alloc_free(mx); return DNS_MEM;
+ if (!stralloc_copys(&mx[nummx].sa, ip.s + len + 2)) { /* mxhost name */
+ alloc_free(mx);
+ return DNS_MEM;
}
ip.s[len + 3] = '\0';
- uint16_unpack_big(ip.s + len,&pref);
+ uint16_unpack_big(ip.s + len, &pref);
mx[nummx].p = pref;
len += j + 3;
++nummx;
} while (len < ip.len);
}
- if (!nummx) return dns_ipalloc(ia,sa); /* e.g., CNAME -> A */
+ if (!nummx) return dns_ipalloc(ia, sa); /* e.g., CNAME -> A */
flagsoft = 0;
while (nummx > 0) {
@@ -170,17 +188,17 @@ int dns_mxip(ipalloc *ia,stralloc *sa,unsigned long random) {
if (mx[j].p < mx[i].p) {
i = j;
numsame = 1;
- }
- else if (mx[j].p == mx[i].p) {
+ } else if (mx[j].p == mx[i].p) {
++numsame;
random = random * 69069 + 1;
if ((random / 2) < (2147483647 / numsame)) i = j;
}
}
- switch (dns_ipplus(ia,&mx[i].sa,mx[i].p)) {
+ switch (dns_ipplus(ia, &mx[i].sa, mx[i].p)) {
case -1: return DNS_MEM;
- case -2: case -3: flagsoft = -5; break;
+ case -2:
+ case -3: flagsoft = -5; break;
}
alloc_free(mx[i].sa.s);
@@ -191,11 +209,11 @@ int dns_mxip(ipalloc *ia,stralloc *sa,unsigned long random) {
return flagsoft;
}
-int dns_ip(ipalloc *ia,stralloc *sa)
+int dns_ip(ipalloc *ia, stralloc *sa)
{
- if (!ipalloc_readyplus(ia,0)) return DNS_MEM;
+ if (!ipalloc_readyplus(ia, 0)) return DNS_MEM;
ia->len = 0;
- return dns_ipplus(ia,sa,0);
+ return dns_ipplus(ia, sa, 0);
}
diff --git a/src/dns_tlsa.c b/src/dns_tlsa.c
index 4b674c1..52f7d83 100644
--- a/src/dns_tlsa.c
+++ b/src/dns_tlsa.c
@@ -1,12 +1,13 @@
#include "byte.h"
+#include "logmsg.h"
#include "stralloc.h"
#include "uint_t.h"
+
#include "dns.h"
-#include "logmsg.h"
static char *q = 0;
-int dns_tlsa_packet(stralloc *out,const char *buf,unsigned int len)
+int dns_tlsa_packet(stralloc *out, const char *buf, unsigned int len)
{
unsigned int pos;
char header[12];
@@ -14,21 +15,25 @@ int dns_tlsa_packet(stralloc *out,const char *buf,unsigned int len)
uint16 numanswers;
int ranswers = 0;
- if (!stralloc_copys(out,"")) return DNS_MEM;
+ if (!stralloc_copys(out, "")) return DNS_MEM;
- pos = dns_packet_copy(buf,len,0,header,12); if (!pos) return DNS_ERR;
- uint16_unpack_big(header + 6,&numanswers);
- pos = dns_packet_skipname(buf,len,pos); if (!pos) return DNS_ERR;
+ pos = dns_packet_copy(buf, len, 0, header, 12);
+ if (!pos) return DNS_ERR;
+ uint16_unpack_big(header + 6, &numanswers);
+ pos = dns_packet_skipname(buf, len, pos);
+ if (!pos) return DNS_ERR;
pos += 4;
while (numanswers--) {
- pos = dns_packet_skipname(buf,len,pos); if (!pos) return DNS_ERR;
- pos = dns_packet_copy(buf,len,pos,header,10); if (!pos) return DNS_ERR;
- uint16_unpack_big(header + 8,&datalen);
- if (byte_equal(header,2,DNS_T_TLSA))
- if (byte_equal(header + 2,2,DNS_C_IN)) {
+ pos = dns_packet_skipname(buf, len, pos);
+ if (!pos) return DNS_ERR;
+ pos = dns_packet_copy(buf, len, pos, header, 10);
+ if (!pos) return DNS_ERR;
+ uint16_unpack_big(header + 8, &datalen);
+ if (byte_equal(header, 2, DNS_T_TLSA))
+ if (byte_equal(header + 2, 2, DNS_C_IN)) {
if (pos + datalen > len) return DNS_ERR;
- if (!stralloc_catb(out,buf + pos,datalen)) return DNS_MEM;
+ if (!stralloc_catb(out, buf + pos, datalen)) return DNS_MEM;
}
pos += datalen;
++ranswers;
@@ -38,13 +43,13 @@ int dns_tlsa_packet(stralloc *out,const char *buf,unsigned int len)
return ranswers;
}
-int dns_tlsa(stralloc *out,const stralloc *fqdn)
+int dns_tlsa(stralloc *out, const stralloc *fqdn)
{
int rc = 0;
- if (dns_domain_fromdot(&q,fqdn->s,fqdn->len) <= 0) return DNS_ERR;
- if (dns_resolve(q,DNS_T_TLSA) >= 0) {
- if ((rc = dns_tlsa_packet(out,dns_resolve_tx.packet,dns_resolve_tx.packetlen)) < 0) return DNS_ERR;
+ if (dns_domain_fromdot(&q, fqdn->s, fqdn->len) <= 0) return DNS_ERR;
+ if (dns_resolve(q, DNS_T_TLSA) >= 0) {
+ if ((rc = dns_tlsa_packet(out, dns_resolve_tx.packet, dns_resolve_tx.packetlen)) < 0) return DNS_ERR;
dns_transmit_free(&dns_resolve_tx);
dns_domain_free(&q);
}
diff --git a/src/dnscname.c b/src/dnscname.c
index 546d273..17265d3 100644
--- a/src/dnscname.c
+++ b/src/dnscname.c
@@ -1,31 +1,31 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
#include "dnsresolv.h"
#include "exit.h"
-#include "dns.h"
#include "logmsg.h"
+#include "stralloc.h"
+
+#include "dns.h"
#define WHO "dnscname"
stralloc sa = {0};
stralloc out = {0};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
- int r;
+ int r;
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnscname fqdn");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnscname fqdn");
- if (!stralloc_copys(&sa,argv[1]))
- logmsg(WHO,111,FATAL,"out of memory");
+ if (!stralloc_copys(&sa, argv[1])) logmsg(WHO, 111, FATAL, "out of memory");
DNS_INIT
- if ((r = dns_cname(&out,&sa)) < 0) _exit(1);
+ if ((r = dns_cname(&out, &sa)) < 0) _exit(1);
if (r > 0) {
- buffer_putflush(buffer_1,out.s,out.len);
- buffer_putsflush(buffer_1,"\n");
+ buffer_putflush(buffer_1, out.s, out.len);
+ buffer_putsflush(buffer_1, "\n");
}
_exit(0);
diff --git a/src/dnsdoe.c b/src/dnsdoe.c
index ad6b253..579eb04 100644
--- a/src/dnsdoe.c
+++ b/src/dnsdoe.c
@@ -1,14 +1,16 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "exit.h"
#include "dnsresolv.h"
+#include "exit.h"
+
#include "dns.h"
void dnsdoe(int r)
{
switch (r) {
- case DNS_HARD: buffer_putsflush(buffer_2,"hard error\n"); _exit(100);
- case DNS_SOFT: buffer_putsflush(buffer_2,"soft error\n"); _exit(111);
- case DNS_MEM: buffer_putsflush(buffer_2,"out of memory\n"); _exit(111);
+ case DNS_HARD: buffer_putsflush(buffer_2, "hard error\n"); _exit(100);
+ case DNS_SOFT: buffer_putsflush(buffer_2, "soft error\n"); _exit(111);
+ case DNS_MEM: buffer_putsflush(buffer_2, "out of memory\n"); _exit(111);
}
}
diff --git a/src/dnsfq.c b/src/dnsfq.c
index a174541..65c49fe 100644
--- a/src/dnsfq.c
+++ b/src/dnsfq.c
@@ -1,61 +1,60 @@
-#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
#include "dnsresolv.h"
-#include "dns.h"
-#include "ip.h"
#include "exit.h"
+#include "ip.h"
#include "logmsg.h"
+#include "stralloc.h"
+
+#include "dns.h"
-#define WHO "dnsfq"
+#define WHO "dnsfq"
#define MAXCNAME 10
stralloc ca = {0};
stralloc sa = {0};
stralloc ia = {0};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int i, r;
char ip4str[IP4_FMT];
char ip6str[IP6_FMT];
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnsfq fqdn");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnsfq fqdn");
- if (!stralloc_copys(&sa,argv[1]))
- logmsg(WHO,111,FATAL,"out of memory");
+ if (!stralloc_copys(&sa, argv[1])) logmsg(WHO, 111, FATAL, "out of memory");
DNS_INIT
- buffer_put(buffer_1,sa.s,sa.len);
- buffer_puts(buffer_1," ");
+ buffer_put(buffer_1, sa.s, sa.len);
+ buffer_puts(buffer_1, " ");
for (i = 0; i <= MAXCNAME; i++) {
- if ((r = dns_cname(&ca,&sa)) < 0) _exit(1);
+ if ((r = dns_cname(&ca, &sa)) < 0) _exit(1);
if (r > 0) {
- if (!stralloc_copy(&sa,&ca))
- logmsg(WHO,111,FATAL,"out of memory");
- buffer_puts(buffer_1,"-> ");
- buffer_put(buffer_1,sa.s,sa.len);
- buffer_puts(buffer_1," ");
- }
- else break;
+ if (!stralloc_copy(&sa, &ca)) logmsg(WHO, 111, FATAL, "out of memory");
+ buffer_puts(buffer_1, "-> ");
+ buffer_put(buffer_1, sa.s, sa.len);
+ buffer_puts(buffer_1, " ");
+ } else
+ break;
}
- buffer_putsflush(buffer_1,"\n");
+ buffer_putsflush(buffer_1, "\n");
- if ((i = dns_ip6(&ia,&sa)) > 0) {
+ if ((i = dns_ip6(&ia, &sa)) > 0) {
for (i = 0; i + 16 <= ia.len; i += 16) {
if (ip6_isv4mapped(ia.s + i)) continue;
- buffer_put(buffer_1,ip6str,ip6_fmt(ip6str,ia.s + i));
- buffer_puts(buffer_1,"\n");
+ buffer_put(buffer_1, ip6str, ip6_fmt(ip6str, ia.s + i));
+ buffer_puts(buffer_1, "\n");
}
}
- if ((i = dns_ip4(&ia,&sa)) > 0) {
- for (i = 0; i + 4 <= ia.len;i += 4) {
- buffer_put(buffer_1,ip4str,ip4_fmt(ip4str,ia.s + i));
- buffer_puts(buffer_1,"\n");
+ if ((i = dns_ip4(&ia, &sa)) > 0) {
+ for (i = 0; i + 4 <= ia.len; i += 4) {
+ buffer_put(buffer_1, ip4str, ip4_fmt(ip4str, ia.s + i));
+ buffer_puts(buffer_1, "\n");
}
}
buffer_flush(buffer_1);
diff --git a/src/dnsip.c b/src/dnsip.c
index 2c84d04..bbb2557 100644
--- a/src/dnsip.c
+++ b/src/dnsip.c
@@ -1,14 +1,16 @@
-#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
#include "dnsresolv.h"
-#include "ip.h"
#include "exit.h"
#include "fmt.h"
-#include "dns.h"
+#include "ip.h"
#include "logmsg.h"
+#include "stralloc.h"
+
+#include "dns.h"
#define WHO "dnsip"
@@ -21,26 +23,24 @@ int main(int argc, char **argv)
char ip4str[IP4_FMT];
char ip6str[IP6_FMT];
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnsip fqdn");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnsip fqdn");
- if (!stralloc_copys(&sa,argv[1]))
- logmsg(WHO,111,FATAL,"out of memory");
+ if (!stralloc_copys(&sa, argv[1])) logmsg(WHO, 111, FATAL, "out of memory");
DNS_INIT
- if (dns_ip6(&out,&sa) > 0) /* IPv6 first */
+ if (dns_ip6(&out, &sa) > 0) /* IPv6 first */
for (i = 0; i + 16 <= out.len; i += 16) {
- if (ip6_isv4mapped(out.s + i)) continue;
- buffer_put(buffer_1,ip6str,ip6_fmt(ip6str,out.s + i));
- buffer_puts(buffer_1,"\n");
+ if (ip6_isv4mapped(out.s + i)) continue;
+ buffer_put(buffer_1, ip6str, ip6_fmt(ip6str, out.s + i));
+ buffer_puts(buffer_1, "\n");
}
- if (dns_ip4(&out,&sa) > 0)
- for (i = 0; i + 4 <= out.len;i += 4) {
- buffer_put(buffer_1,ip4str,ip4_fmt(ip4str,out.s + i));
- buffer_puts(buffer_1,"\n");
+ if (dns_ip4(&out, &sa) > 0)
+ for (i = 0; i + 4 <= out.len; i += 4) {
+ buffer_put(buffer_1, ip4str, ip4_fmt(ip4str, out.s + i));
+ buffer_puts(buffer_1, "\n");
}
- buffer_putsflush(buffer_1,"");
+ buffer_putsflush(buffer_1, "");
_exit(0);
}
diff --git a/src/dnsmxip.c b/src/dnsmxip.c
index de3bb7c..9148bdc 100644
--- a/src/dnsmxip.c
+++ b/src/dnsmxip.c
@@ -1,25 +1,27 @@
-#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
-#include "fmt.h"
#include "dnsresolv.h"
-#include "ip.h"
-#include "now.h"
#include "exit.h"
-#include "dns.h"
+#include "fmt.h"
+#include "ip.h"
#include "logmsg.h"
#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
+#include "now.h"
#define WHO "dnsmxip"
static stralloc sa = {0};
-static stralloc ia = {0};
+static stralloc ia = {0};
static stralloc out = {0};
-static stralloc ipaddr = {0};
+static stralloc ipaddr = {0};
-int dns_ia(stralloc *ip,char *s)
+int dns_ia(stralloc *ip, char *s)
{
int i;
int j = 0;
@@ -27,79 +29,77 @@ int dns_ia(stralloc *ip,char *s)
char ip4str[IP4_FMT];
char ip6str[IP6_FMT];
- if (!stralloc_copys(&sa,s)) return -1;
- if (sa.s[sa.len-1] != '.')
- if (!stralloc_append(&sa,".")) return -1;
- if (!stralloc_copys(ip,"")) return -1;
-
- DNS_INIT
- if (dns_ip6(&ia,&sa) > 0) {
+ if (!stralloc_copys(&sa, s)) return -1;
+ if (sa.s[sa.len - 1] != '.')
+ if (!stralloc_append(&sa, ".")) return -1;
+ if (!stralloc_copys(ip, "")) return -1;
+
+ DNS_INIT
+ if (dns_ip6(&ia, &sa) > 0) {
for (i = 0; i + 16 <= ia.len; i += 16) {
- if (ip6_isv4mapped(ia.s + i)) continue;
- j = ip6_fmt(ip6str,ia.s + i);
+ if (ip6_isv4mapped(ia.s + i)) continue;
+ j = ip6_fmt(ip6str, ia.s + i);
r += j;
- if (!stralloc_catb(ip,ip6str,j)) return -1;
- if (!stralloc_cats(ip," ")) return -1;
+ if (!stralloc_catb(ip, ip6str, j)) return -1;
+ if (!stralloc_cats(ip, " ")) return -1;
r++;
}
}
- if (dns_ip4(&ia,&sa) > 0) {
+ if (dns_ip4(&ia, &sa) > 0) {
for (i = 0; i + 4 <= ia.len; i += 4) {
- j = ip4_fmt(ip4str,ia.s + i);
+ j = ip4_fmt(ip4str, ia.s + i);
r += j;
- if (!stralloc_catb(ip,ip4str,j)) return -1;
- if (!stralloc_cats(ip," ")) return -1;
+ if (!stralloc_catb(ip, ip4str, j)) return -1;
+ if (!stralloc_cats(ip, " ")) return -1;
r++;
}
}
if (!stralloc_0(ip)) return -1;
- return r?r-1:0;
+ return r ? r - 1 : 0;
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int j, k, r;
uint16 u;
int len;
char num[FMT_ULONG];
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnsmx fqdn");
- if (!stralloc_copys(&sa,argv[1]))
- logmsg(WHO,111,FATAL,"out of memory");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnsmx fqdn");
+ if (!stralloc_copys(&sa, argv[1])) logmsg(WHO, 111, FATAL, "out of memory");
- DNS_INIT
- if ((r = dns_mx(&out,&sa)) < 0) _exit(1);
+ DNS_INIT
+ if ((r = dns_mx(&out, &sa)) < 0) _exit(1);
if (r > 0) {
j = len = 0;
do {
- j = str_chr(out.s + len + 2,'\0');
- k = dns_ia(&ipaddr,out.s + len + 2); /* IP */
+ j = str_chr(out.s + len + 2, '\0');
+ k = dns_ia(&ipaddr, out.s + len + 2); /* IP */
if (k) {
- buffer_put(buffer_1,out.s + len + 2,j); /* MX */
- buffer_puts(buffer_1,": ");
+ buffer_put(buffer_1, out.s + len + 2, j); /* MX */
+ buffer_puts(buffer_1, ": ");
out.s[len + 3] = '\0';
- uint16_unpack_big(out.s + len,&u);
- buffer_put(buffer_1,num,fmt_ulong(num,u)) ;
- buffer_puts(buffer_1," [");
- buffer_put(buffer_1,ipaddr.s,k);
- buffer_puts(buffer_1,"]");
+ uint16_unpack_big(out.s + len, &u);
+ buffer_put(buffer_1, num, fmt_ulong(num, u));
+ buffer_puts(buffer_1, " [");
+ buffer_put(buffer_1, ipaddr.s, k);
+ buffer_puts(buffer_1, "]");
}
- buffer_putsflush(buffer_1,"\n");
+ buffer_putsflush(buffer_1, "\n");
len += j + 3;
} while (len < out.len);
- } else { /* A/AAAA */
- k = dns_ia(&ipaddr,argv[1]); /* IP */
+ } else { /* A/AAAA */
+ k = dns_ia(&ipaddr, argv[1]); /* IP */
if (k) {
- buffer_puts(buffer_1,argv[1]);
- buffer_puts(buffer_1,": -");
- buffer_puts(buffer_1," [");
- buffer_put(buffer_1,ipaddr.s,k);
- buffer_puts(buffer_1,"]");
- buffer_putsflush(buffer_1,"\n");
- }
+ buffer_puts(buffer_1, argv[1]);
+ buffer_puts(buffer_1, ": -");
+ buffer_puts(buffer_1, " [");
+ buffer_put(buffer_1, ipaddr.s, k);
+ buffer_puts(buffer_1, "]");
+ buffer_putsflush(buffer_1, "\n");
+ }
}
_exit(0);
diff --git a/src/dnsptr.c b/src/dnsptr.c
index 25a4731..dd88922 100644
--- a/src/dnsptr.c
+++ b/src/dnsptr.c
@@ -1,37 +1,34 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
-#include "str.h"
#include "dnsresolv.h"
-#include "dns.h"
-#include "ip.h"
#include "exit.h"
+#include "ip.h"
#include "logmsg.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
#define WHO "dnsptr"
stralloc out = {0};
char ip4[4];
char ip6[16];
-
-int main(int argc,char **argv)
+
+int main(int argc, char **argv)
{
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnsptr ipv4 || ipv6 (compactified)");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnsptr ipv4 || ipv6 (compactified)");
DNS_INIT
- if (str_chr(argv[1],':') < str_len(argv[1])) {
- if (!ip6_scan(argv[1],ip6))
- logmsg(WHO,111,FATAL,"wrong IPv6 format");
- if (dns_name6(&out,ip6) > 0)
- buffer_put(buffer_1,out.s,out.len);
+ if (str_chr(argv[1], ':') < str_len(argv[1])) {
+ if (!ip6_scan(argv[1], ip6)) logmsg(WHO, 111, FATAL, "wrong IPv6 format");
+ if (dns_name6(&out, ip6) > 0) buffer_put(buffer_1, out.s, out.len);
} else {
- if (!ip4_scan(argv[1],ip4))
- logmsg(WHO,111,FATAL,"wrong IPv4 format");
- if (dns_name4(&out,ip4) > 0)
- buffer_put(buffer_1,out.s,out.len);
+ if (!ip4_scan(argv[1], ip4)) logmsg(WHO, 111, FATAL, "wrong IPv4 format");
+ if (dns_name4(&out, ip4) > 0) buffer_put(buffer_1, out.s, out.len);
}
- buffer_putsflush(buffer_1,"\n");
+ buffer_putsflush(buffer_1, "\n");
_exit(0);
}
diff --git a/src/dnstlsa.c b/src/dnstlsa.c
index 9871fff..284f7d1 100644
--- a/src/dnstlsa.c
+++ b/src/dnstlsa.c
@@ -1,13 +1,15 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
+#include "byte.h"
#include "dnsresolv.h"
-#include "dns.h"
#include "exit.h"
-#include "logmsg.h"
#include "getoptb.h"
+#include "logmsg.h"
#include "str.h"
-#include "byte.h"
+#include "stralloc.h"
+
+#include "dns.h"
#define WHO "dnstlsa"
@@ -15,7 +17,7 @@ static stralloc cn = {0};
static stralloc sa = {0};
static stralloc out = {0};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int r;
uint16 usage;
@@ -29,68 +31,68 @@ int main(int argc,char **argv)
int i, j, k;
int verbose = 0;
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnstlsa [-v] [-p port] [-u(dp)|-t(cp)] host (tcp on port 25 is default)" );
+ if (!argv[1])
+ logmsg(WHO, 100, USAGE, "dnstlsa [-v] [-p port] [-u(dp)|-t(cp)] host (tcp on port 25 is default)");
- while ((opt = getopt(argc,argv,"vutp:")) != opteof) {
+ while ((opt = getopt(argc, argv, "vutp:")) != opteof) {
switch (opt) {
case 'p': port = optarg; break;
case 't': break;
- case 'u': str_copy(proto,"._udp."); break;
+ case 'u': str_copy(proto, "._udp."); break;
case 'v': verbose = 1;
}
}
- if (optind < argc)
- host = argv[optind++];
+ if (optind < argc) host = argv[optind++];
- if (!stralloc_copyb(&sa, "_",1)) logmsg(WHO,111,FATAL,"out of memory");
- if (!stralloc_cats(&sa,port)) logmsg(WHO,111,FATAL,"out of memory");
- if (!stralloc_cats(&sa,proto)) logmsg(WHO,111,FATAL,"out of memory");
- if (!stralloc_cats(&sa,host)) logmsg(WHO,111,FATAL,"out of memory");
+ if (!stralloc_copyb(&sa, "_", 1)) logmsg(WHO, 111, FATAL, "out of memory");
+ if (!stralloc_cats(&sa, port)) logmsg(WHO, 111, FATAL, "out of memory");
+ if (!stralloc_cats(&sa, proto)) logmsg(WHO, 111, FATAL, "out of memory");
+ if (!stralloc_cats(&sa, host)) logmsg(WHO, 111, FATAL, "out of memory");
DNS_INIT
- if (dns_cname(&cn,&sa) > 0)
- { if ((r = dns_tlsa(&out,&cn)) < 0) _exit(1); }
- else
- if ((r = dns_tlsa(&out,&sa)) < 0) _exit(1);
- if (!stralloc_0(&sa)) logmsg(WHO,111,FATAL,"out of memory");
- if (verbose) logmsg(WHO,0,INFO,B("checking for TLSA records: ",sa.s,"\n"));
+ if (dns_cname(&cn, &sa) > 0) {
+ if ((r = dns_tlsa(&out, &cn)) < 0) _exit(1);
+ } else if ((r = dns_tlsa(&out, &sa)) < 0)
+ _exit(1);
+ if (!stralloc_0(&sa)) logmsg(WHO, 111, FATAL, "out of memory");
+ if (verbose) logmsg(WHO, 0, INFO, B("checking for TLSA records: ", sa.s, "\n"));
if (r > 0 && out.len > 4) {
for (i = 0; i <= out.len; i++) {
- usage = (unsigned char) out.s[i];
- selector = (unsigned char) out.s[i + 1];
- type = (unsigned char) out.s[i + 2];
+ usage = (unsigned char)out.s[i];
+ selector = (unsigned char)out.s[i + 1];
+ type = (unsigned char)out.s[i + 2];
- if (usage == 0) buffer_puts(buffer_1,"Usage: [0], ");
- if (usage == 1) buffer_puts(buffer_1,"Usage: [1], ");
- if (usage == 2) buffer_puts(buffer_1,"Usage: [2], ");
- if (usage == 3) buffer_puts(buffer_1,"Usage: [3], ");
+ if (usage == 0) buffer_puts(buffer_1, "Usage: [0], ");
+ if (usage == 1) buffer_puts(buffer_1, "Usage: [1], ");
+ if (usage == 2) buffer_puts(buffer_1, "Usage: [2], ");
+ if (usage == 3) buffer_puts(buffer_1, "Usage: [3], ");
- if (selector == 0) buffer_puts(buffer_1,"Selector: [0], ");
- if (selector == 1) buffer_puts(buffer_1,"Selector: [1], ");
+ if (selector == 0) buffer_puts(buffer_1, "Selector: [0], ");
+ if (selector == 1) buffer_puts(buffer_1, "Selector: [1], ");
- if (type == 0) buffer_puts(buffer_1,"Type: [0] "); // full cert
- if (type == 1) buffer_puts(buffer_1,"Type: [1] "); // sha256
- if (type == 2) buffer_puts(buffer_1,"Type: [2] "); // sha512
+ if (type == 0) buffer_puts(buffer_1, "Type: [0] "); // full cert
+ if (type == 1) buffer_puts(buffer_1, "Type: [1] "); // sha256
+ if (type == 2) buffer_puts(buffer_1, "Type: [2] "); // sha512
/* Staff of Ra
"(is) six kadams high." However, the builder (h)as
to subtract one kadam out of respect for the Hebrew God. */
for (j = i + 3, k = 0; j <= out.len; ++j) {
- ch = (unsigned char) out.s[j];
+ ch = (unsigned char)out.s[j];
if ((type == 1 && k == 32) || (type == 2 && k == 64)) {
- buffer_putsflush(buffer_1,"\n");
- i = j - 1; break;
- } else {
- buffer_put(buffer_1,"0123456789abcdef" + (ch >> 4),1);
- buffer_put(buffer_1,"0123456789abcdef" + (ch & 0x0f),1);
+ buffer_putsflush(buffer_1, "\n");
+ i = j - 1;
+ break;
+ } else {
+ buffer_put(buffer_1, "0123456789abcdef" + (ch >> 4), 1);
+ buffer_put(buffer_1, "0123456789abcdef" + (ch & 0x0f), 1);
k++;
}
}
}
}
-
+
_exit(0);
}
diff --git a/src/dnstxt.c b/src/dnstxt.c
index 385928e..a838d64 100644
--- a/src/dnstxt.c
+++ b/src/dnstxt.c
@@ -1,32 +1,32 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "stralloc.h"
#include "dnsresolv.h"
-#include "dns.h"
#include "exit.h"
#include "logmsg.h"
+#include "stralloc.h"
+
+#include "dns.h"
#define WHO "dnstext"
stralloc sa = {0};
stralloc out = {0};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int r;
- if (!argv[1])
- logmsg(WHO,100,USAGE,"dnstxt fqdn");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "dnstxt fqdn");
- if (!stralloc_copys(&sa,argv[1]))
- logmsg(WHO,111,FATAL,"out of memory");
+ if (!stralloc_copys(&sa, argv[1])) logmsg(WHO, 111, FATAL, "out of memory");
DNS_INIT
- if ((r = dns_txt(&out,&sa)) < 0) _exit(1);
+ if ((r = dns_txt(&out, &sa)) < 0) _exit(1);
if (r > 0) {
- buffer_put(buffer_1,out.s,out.len);
- buffer_putsflush(buffer_1,"\n");
+ buffer_put(buffer_1, out.s, out.len);
+ buffer_putsflush(buffer_1, "\n");
}
-
+
_exit(0);
}
diff --git a/src/except.c b/src/except.c
index edee976..2d2df4a 100644
--- a/src/except.c
+++ b/src/except.c
@@ -1,7 +1,8 @@
#include <unistd.h>
-#include "wait.h"
-#include "logmsg.h"
+
#include "exit.h"
+#include "logmsg.h"
+#include "wait.h"
#define WHO "except"
@@ -10,25 +11,21 @@ int main(int argc, char **argv)
int pid;
int wstat;
- if (!argv[1])
- logmsg(WHO,100,USAGE,"except program [ arg ... ]");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "except program [ arg ... ]");
pid = fork();
- if (pid == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
+ if (pid == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
if (pid == 0) {
- execvp(argv[1],argv + 1);
+ execvp(argv[1], argv + 1);
if (errno) _exit(111);
_exit(100);
}
- if (wait_pid(&wstat,pid) == -1)
- logmsg(WHO,111,FATAL,"wait failed");
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,"child crashed");
+ if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed");
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed");
switch (wait_exitcode(wstat)) {
- case 0: _exit(100);
- case 111: logmsg(WHO,111,FATAL,"temporary child error");
- default: _exit(0);
+ case 0: _exit(100);
+ case 111: logmsg(WHO, 111, FATAL, "temporary child error");
+ default: _exit(0);
}
}
diff --git a/src/fastforward.c b/src/fastforward.c
index 52e2e12..a702d41 100644
--- a/src/fastforward.c
+++ b/src/fastforward.c
@@ -1,42 +1,44 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "readclose.h"
-#include "stralloc.h"
+
+#include "alloc.h"
#include "buffer.h"
-#include "strset.h"
-#include "getoptb.h"
-#include "exit.h"
-#include "logmsg.h"
+#include "byte.h"
+#include "case.h"
+#include "cdbread.h"
#include "env.h"
-#include "sig.h"
-#include "qmail.h"
+#include "exit.h"
#include "fmt.h"
-#include "case.h"
-#include "alloc.h"
+#include "getoptb.h"
+#include "logmsg.h"
+#include "open.h"
+#include "readclose.h"
#include "seek.h"
-#include "wait.h"
-#include "byte.h"
+#include "sig.h"
#include "str.h"
-#include "open.h"
-#include "cdbread.h"
+#include "stralloc.h"
+#include "wait.h"
+
+#include "qmail.h"
+#include "strset.h"
#define WHO "fastforward"
static void usage()
{
- logmsg(WHO,100,USAGE,"fastforward [ -nNpP ] data.cdb");
+ logmsg(WHO, 100, USAGE, "fastforward [ -nNpP ] data.cdb");
}
static void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory");
+ logmsg(WHO, 111, FATAL, "out of memory");
}
static void print(char *s)
{
char ch;
while ((ch = *s++)) {
- buffer_put(buffer_2,&ch,1);
+ buffer_put(buffer_2, &ch, 1);
}
}
@@ -45,7 +47,7 @@ static void printsafe(char *s)
char ch;
while ((ch = *s++)) {
if (ch < 32) ch = '_';
- buffer_put(buffer_2,&ch,1);
+ buffer_put(buffer_2, &ch, 1);
}
}
@@ -53,16 +55,16 @@ struct qmail qq;
char qp[FMT_ULONG];
char qqbuf[1];
-ssize_t qqwrite(int fd,char *buf,int len)
+ssize_t qqwrite(int fd, char *buf, int len)
{
- qmail_put(&qq,buf,len);
+ qmail_put(&qq, buf, len);
return len;
}
-buffer bufq = BUFFER_INIT(qqwrite,-1,qqbuf,sizeof(qqbuf));
+buffer bufq = BUFFER_INIT(qqwrite, -1, qqbuf, sizeof(qqbuf));
char messbuf[4096];
-buffer mess = BUFFER_INIT(read,0,messbuf,sizeof(messbuf));
+buffer mess = BUFFER_INIT(read, 0, messbuf, sizeof(messbuf));
int flagdeliver = 1;
int flagpassthrough = 0;
@@ -84,27 +86,22 @@ void dofile(char *fn)
int i;
int j;
- if (!stralloc_copys(&mailinglist,"")) nomem();
+ if (!stralloc_copys(&mailinglist, "")) nomem();
fd = open_read(fn);
- if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to read: ",fn));
- if (fstat(fd,&st) == -1)
- logmsg(WHO,111,FATAL,B("unable to read: ",fn));
- if ((st.st_mode & 0444) != 0444)
- logmsg(WHO,111,FATAL,B(fn," is not world-readable"));
- if (readclose_append(fd,&mailinglist,1024) == -1)
- logmsg(WHO,111,FATAL,B("unable to read: ",fn));
+ if (fd == -1) logmsg(WHO, 111, FATAL, B("unable to read: ", fn));
+ if (fstat(fd, &st) == -1) logmsg(WHO, 111, FATAL, B("unable to read: ", fn));
+ if ((st.st_mode & 0444) != 0444) logmsg(WHO, 111, FATAL, B(fn, " is not world-readable"));
+ if (readclose_append(fd, &mailinglist, 1024) == -1) logmsg(WHO, 111, FATAL, B("unable to read: ", fn));
i = 0;
for (j = 0; j < mailinglist.len; ++j)
if (!mailinglist.s[j]) {
if ((mailinglist.s[i] == '.') || (mailinglist.s[i] == '/')) {
- if (!stralloc_cats(&todo,mailinglist.s + i)) nomem();
+ if (!stralloc_cats(&todo, mailinglist.s + i)) nomem();
if (!stralloc_0(&todo)) nomem();
- }
- else if ((mailinglist.s[i] == '&') && (j - i < 900)) {
- if (!stralloc_cats(&todo,mailinglist.s + i)) nomem();
+ } else if ((mailinglist.s[i] == '&') && (j - i < 900)) {
+ if (!stralloc_cats(&todo, mailinglist.s + i)) nomem();
if (!stralloc_0(&todo)) nomem();
}
i = j + 1;
@@ -120,53 +117,52 @@ struct cdb cdb;
void cdbreaderror()
{
- logmsg(WHO,111,FATAL,B("unable to read: ",fncdb));
+ logmsg(WHO, 111, FATAL, B("unable to read: ", fncdb));
}
-int findtarget(int flagwild,char *prepend,char *addr)
+int findtarget(int flagwild, char *prepend, char *addr)
{
int r;
int at;
- if (!stralloc_copys(&key,prepend)) nomem();
- if (!stralloc_cats(&key,addr)) nomem();
- case_lowerb(key.s,key.len);
+ if (!stralloc_copys(&key, prepend)) nomem();
+ if (!stralloc_cats(&key, addr)) nomem();
+ case_lowerb(key.s, key.len);
- r = cdb_find(&cdb,key.s,key.len);
+ r = cdb_find(&cdb, key.s, key.len);
if (r == -1) cdbreaderror();
- if (r) return 1;
+ if (r) return 1;
if (!flagwild) return 0;
- at = str_rchr(addr,'@');
+ at = str_rchr(addr, '@');
if (!addr[at]) return 0;
- if (!stralloc_copys(&key,prepend)) nomem();
- if (!stralloc_cats(&key,addr + at)) nomem();
- case_lowerb(key.s,key.len);
+ if (!stralloc_copys(&key, prepend)) nomem();
+ if (!stralloc_cats(&key, addr + at)) nomem();
+ case_lowerb(key.s, key.len);
- r = cdb_find(&cdb,key.s,key.len);
+ r = cdb_find(&cdb, key.s, key.len);
if (r == -1) cdbreaderror();
- if (r) return 1;
+ if (r) return 1;
- if (!stralloc_copys(&key,prepend)) nomem();
- if (!stralloc_catb(&key,addr,at + 1)) nomem();
- case_lowerb(key.s,key.len);
+ if (!stralloc_copys(&key, prepend)) nomem();
+ if (!stralloc_catb(&key, addr, at + 1)) nomem();
+ case_lowerb(key.s, key.len);
- r = cdb_find(&cdb,key.s,key.len);
+ r = cdb_find(&cdb, key.s, key.len);
if (r == -1) cdbreaderror();
if (r) return 1;
return 0;
}
-int gettarget(int flagwild,char *prepend,char *addr)
+int gettarget(int flagwild, char *prepend, char *addr)
{
- if (!findtarget(flagwild,prepend,addr)) return 0;
+ if (!findtarget(flagwild, prepend, addr)) return 0;
dlen = cdb_datalen(&cdb);
- if (!stralloc_ready(&data,(unsigned int) dlen)) nomem();
+ if (!stralloc_ready(&data, (unsigned int)dlen)) nomem();
data.len = dlen;
- if (cdb_read(&cdb,data.s,data.len,cdb_datapos(&cdb)) == -1)
- cdbreaderror();
+ if (cdb_read(&cdb, data.s, data.len, cdb_datapos(&cdb)) == -1) cdbreaderror();
return 1;
}
@@ -191,8 +187,7 @@ void doprogram(char *arg)
args[2] = "-c";
args[3] = arg + 1;
args[4] = 0;
- }
- else {
+ } else {
args[0] = "sh";
args[1] = "-c";
args[2] = arg + 1;
@@ -200,27 +195,30 @@ void doprogram(char *arg)
}
switch (child = vfork()) {
- case -1:
- logmsg(WHO,111,FATAL,"unable to fork: ");
+ case -1: logmsg(WHO, 111, FATAL, "unable to fork: ");
case 0:
sig_pipedefault();
- execvp(*args,args);
- logmsg(WHO,111,FATAL,B("unable to run: ",arg));
+ execvp(*args, args);
+ logmsg(WHO, 111, FATAL, B("unable to run: ", arg));
}
- wait_pid(&wstat,child);
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,B("child crashed in: ",arg));
+ wait_pid(&wstat, child);
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, B("child crashed in: ", arg));
switch (wait_exitcode(wstat)) {
- case 64: case 65: case 70: case 76: case 77: case 78: case 112:
+ case 64:
+ case 65:
+ case 70:
+ case 76:
+ case 77:
+ case 78:
+ case 112:
case 100: _exit(100);
- case 0: break;
- default: _exit(111);
+ case 0: break;
+ default: _exit(111);
}
- if (seek_begin(0) == -1)
- logmsg(WHO,111,FATAL,"unable to rewind input: ");
+ if (seek_begin(0) == -1) logmsg(WHO, 111, FATAL, "unable to rewind input: ");
}
void dodata()
@@ -234,11 +232,10 @@ void dodata()
if ((data.s[i] == '|') || (data.s[i] == '!'))
doprogram(data.s + i);
else if ((data.s[i] == '.') || (data.s[i] == '/')) {
- if (!stralloc_cats(&todo,data.s + i)) nomem();
+ if (!stralloc_cats(&todo, data.s + i)) nomem();
if (!stralloc_0(&todo)) nomem();
- }
- else if ((data.s[i] == '&') && (j - i < 900)) {
- if (!stralloc_cats(&todo,data.s + i)) nomem();
+ } else if ((data.s[i] == '&') && (j - i < 900)) {
+ if (!stralloc_cats(&todo, data.s + i)) nomem();
if (!stralloc_0(&todo)) nomem();
}
i = j + 1;
@@ -248,33 +245,33 @@ void dodata()
void dorecip(char *addr)
{
- if (!findtarget(0,"?",addr))
- if (gettarget(0,":",addr)) {
+ if (!findtarget(0, "?", addr))
+ if (gettarget(0, ":", addr)) {
dodata();
return;
}
- if (!stralloc_cats(&forward,addr)) nomem();
+ if (!stralloc_cats(&forward, addr)) nomem();
if (!stralloc_0(&forward)) nomem();
}
void doorigrecip(char *addr)
{
if (sender.len)
- if ((sender.len != 4) || byte_diff(sender.s,4,"#@[]"))
- if (gettarget(1,"?",addr))
- if (!stralloc_copy(&sender,&data)) nomem();
- if (!gettarget(1,":",addr))
+ if ((sender.len != 4) || byte_diff(sender.s, 4, "#@[]"))
+ if (gettarget(1, "?", addr))
+ if (!stralloc_copy(&sender, &data)) nomem();
+ if (!gettarget(1, ":", addr))
if (flagpassthrough)
_exit(0);
else
- logmsg(WHO,100,ERROR,"Sorry, no mailbox here by that name. (#5.1.1)");
+ logmsg(WHO, 100, ERROR, "Sorry, no mailbox here by that name. (#5.1.1)");
dodata();
}
stralloc recipient = {0};
int flagdefault = 0;
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int opt;
char *x;
@@ -287,20 +284,20 @@ int main(int argc,char **argv)
x = env_get("SENDER");
if (!x) x = "original envelope sender";
- if (!stralloc_copys(&sender,x)) nomem();
+ if (!stralloc_copys(&sender, x)) nomem();
- if (!stralloc_copys(&forward,"")) nomem();
+ if (!stralloc_copys(&forward, "")) nomem();
if (!strset_init(&done)) nomem();
- while ((opt = getopt(argc,argv,"nNpPdD")) != opteof)
- switch (opt) {
+ while ((opt = getopt(argc, argv, "nNpPdD")) != opteof) switch (opt)
+ {
case 'n': flagdeliver = 0; break;
case 'N': flagdeliver = 1; break;
case 'p': flagpassthrough = 1; break;
case 'P': flagpassthrough = 0; break;
case 'd': flagdefault = 1; break;
case 'D': flagdefault = 0; break;
- default: usage();
+ default: usage();
}
argv += optind;
@@ -308,25 +305,24 @@ int main(int argc,char **argv)
if (!fncdb) usage();
fdcdb = open_read(fncdb);
if (fdcdb == -1) cdbreaderror();
- cdb_init(&cdb,fdcdb);
+ cdb_init(&cdb, fdcdb);
if (flagdefault) {
x = env_get("DEFAULT");
if (!x) x = env_get("EXT");
- if (!x) logmsg(WHO,100,FATAL,"$DEFAULT or $EXT must be set");
- if (!stralloc_copys(&recipient,x)) nomem();
- if (!stralloc_cats(&recipient,"@")) nomem();
+ if (!x) logmsg(WHO, 100, FATAL, "$DEFAULT or $EXT must be set");
+ if (!stralloc_copys(&recipient, x)) nomem();
+ if (!stralloc_cats(&recipient, "@")) nomem();
x = env_get("HOST");
- if (!x) logmsg(WHO,100,FATAL,"$HOST must be set");
- if (!stralloc_cats(&recipient,x)) nomem();
+ if (!x) logmsg(WHO, 100, FATAL, "$HOST must be set");
+ if (!stralloc_cats(&recipient, x)) nomem();
if (!stralloc_0(&recipient)) nomem();
x = recipient.s;
- }
- else {
+ } else {
x = env_get("RECIPIENT");
- if (!x) logmsg(WHO,100,FATAL,"$RECIPIENT must be set");
+ if (!x) logmsg(WHO, 100, FATAL, "$RECIPIENT must be set");
}
- if (!strset_add(&done,x)) nomem();
+ if (!strset_add(&done, x)) nomem();
doorigrecip(x);
while (todo.len) {
@@ -334,12 +330,12 @@ int main(int argc,char **argv)
while ((i > 0) && todo.s[i - 1]) --i;
todo.len = i;
- if (strset_in(&done,todo.s + i)) continue;
+ if (strset_in(&done, todo.s + i)) continue;
x = alloc(str_len(todo.s + i) + 1);
if (!x) nomem();
- str_copy(x,todo.s + i);
- if (!strset_add(&done,x)) nomem();
+ str_copy(x, todo.s + i);
+ if (!strset_add(&done, x)) nomem();
x = todo.s + i;
if (*x == 0)
@@ -376,24 +372,22 @@ int main(int argc,char **argv)
_exit(flagpassthrough ? 99 : 0);
}
- if (qmail_open(&qq) == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
- qmail_puts(&qq,dtline);
- if (buffer_copy(&bufq,&mess) != 0)
- logmsg(WHO,111,FATAL,"unable to read message: ");
+ if (qmail_open(&qq) == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
+ qmail_puts(&qq, dtline);
+ if (buffer_copy(&bufq, &mess) != 0) logmsg(WHO, 111, FATAL, "unable to read message: ");
buffer_flush(&bufq);
- qp[fmt_ulong(qp,qmail_qp(&qq))] = 0;
+ qp[fmt_ulong(qp, qmail_qp(&qq))] = 0;
- qmail_from(&qq,sender.s);
+ qmail_from(&qq, sender.s);
while (forward.len) {
i = forward.len - 1;
while ((i > 0) && forward.s[i - 1]) --i;
forward.len = i;
- qmail_to(&qq,forward.s + i);
+ qmail_to(&qq, forward.s + i);
}
x = qmail_close(&qq);
- if (*x) logmsg(WHO,*x == 'D' ? 100 : 111,FATAL,x + 1);
- logmsg(WHO,flagpassthrough ? 99 : 0,LOG,B("qp ",qp));
+ if (*x) logmsg(WHO, *x == 'D' ? 100 : 111, FATAL, x + 1);
+ logmsg(WHO, flagpassthrough ? 99 : 0, LOG, B("qp ", qp));
}
diff --git a/src/fifo.c b/src/fifo.c
index 5547294..f2da11e 100644
--- a/src/fifo.c
+++ b/src/fifo.c
@@ -1,9 +1,16 @@
-#include <sys/types.h>
-#include <sys/stat.h>
#include "fifo.h"
+#include <sys/stat.h>
+#include <sys/types.h>
+
#ifdef HASMKFIFO
-int fifo_make(char *fn, int mode) { return mkfifo(fn,mode); }
+int fifo_make(char *fn, int mode)
+{
+ return mkfifo(fn, mode);
+}
#else
-int fifo_make(char *fn, int mode) { return mknod(fn,S_IFIFO | mode,0); }
+int fifo_make(char *fn, int mode)
+{
+ return mknod(fn, S_IFIFO | mode, 0);
+}
#endif
diff --git a/src/fmtqfn.c b/src/fmtqfn.c
index 139cccf..8cb8644 100644
--- a/src/fmtqfn.c
+++ b/src/fmtqfn.c
@@ -1,22 +1,33 @@
#include "fmtqfn.h"
+
#include "fmt.h"
+
#include "auto_split.h"
-unsigned int fmtqfn(char *s,char *dirslash,unsigned long id,int flagsplit)
+unsigned int fmtqfn(char *s, char *dirslash, unsigned long id, int flagsplit)
{
- unsigned int len;
- unsigned int i;
+ unsigned int len;
+ unsigned int i;
+
+ len = 0;
+ i = fmt_str(s, dirslash);
+ len += i;
+ if (s) s += i;
- len = 0;
- i = fmt_str(s,dirslash); len += i; if (s) s += i;
+ if (flagsplit) {
+ i = fmt_ulong(s, id % auto_split);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, "/");
+ len += i;
+ if (s) s += i;
+ }
- if (flagsplit) {
- i = fmt_ulong(s,id % auto_split); len += i; if (s) s += i;
- i = fmt_str(s,"/"); len += i; if (s) s += i;
- }
+ i = fmt_ulong(s, id);
+ len += i;
+ if (s) s += i;
+ if (s) *s++ = 0;
+ ++len;
- i = fmt_ulong(s,id); len += i; if (s) s += i;
- if (s) *s++ = 0; ++len;
-
- return len;
+ return len;
}
diff --git a/src/forward.c b/src/forward.c
index 7cc8e53..e8c7eb0 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -1,28 +1,33 @@
#include <unistd.h>
-#include "sig.h"
-#include "exit.h"
-#include "env.h"
-#include "qmail.h"
-#include "logmsg.h"
+
#include "buffer.h"
+#include "env.h"
+#include "exit.h"
#include "fmt.h"
+#include "logmsg.h"
+#include "sig.h"
+
+#include "qmail.h"
#define WHO "forward"
-void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
+void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
struct qmail qqt;
ssize_t mywrite(int fd, char *buf, int len)
{
- qmail_put(&qqt,buf,len);
+ qmail_put(&qqt, buf, len);
return len;
}
char inbuf[BUFFER_INSIZE];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
char outbuf[1];
-buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(mywrite, -1, outbuf, sizeof(outbuf));
char num[FMT_ULONG];
@@ -31,28 +36,24 @@ int main(int argc, char **argv)
char *sender;
char *dtline;
char *qqx;
-
+
sig_pipeignore();
-
+
sender = env_get("NEWSENDER");
- if (!sender)
- logmsg(WHO,100,FATAL,"NEWSENDER not set");
+ if (!sender) logmsg(WHO, 100, FATAL, "NEWSENDER not set");
dtline = env_get("DTLINE");
- if (!dtline)
- logmsg(WHO,100,FATAL,"DTLINE not set");
-
- if (qmail_open(&qqt) == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
- qmail_puts(&qqt,dtline);
- if (buffer_copy(&bo,&bi) != 0)
- logmsg(WHO,111,FATAL,"unable to read message: ");
+ if (!dtline) logmsg(WHO, 100, FATAL, "DTLINE not set");
+
+ if (qmail_open(&qqt) == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
+ qmail_puts(&qqt, dtline);
+ if (buffer_copy(&bo, &bi) != 0) logmsg(WHO, 111, FATAL, "unable to read message: ");
buffer_flush(&bo);
- num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
-
- qmail_from(&qqt,sender);
- while (*++argv) qmail_to(&qqt,*argv);
+ num[fmt_ulong(num, qmail_qp(&qqt))] = 0;
+
+ qmail_from(&qqt, sender);
+ while (*++argv) qmail_to(&qqt, *argv);
qqx = qmail_close(&qqt);
- if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
- logmsg(WHO,0,LOG,B("qp ",num));
+ if (*qqx) logmsg(WHO, *qqx == 'D' ? 100 : 111, FATAL, qqx + 1);
+ logmsg(WHO, 0, LOG, B("qp ", num));
}
diff --git a/src/gfrom.c b/src/gfrom.c
index c04b65f..09eaa80 100644
--- a/src/gfrom.c
+++ b/src/gfrom.c
@@ -1,8 +1,12 @@
-#include "str.h"
#include "gfrom.h"
-int gfrom(char *s,int len)
+#include "str.h"
+
+int gfrom(char *s, int len)
{
- while ((len > 0) && (*s == '>')) { ++s; --len; }
- return (len >= 5) && !str_diffn(s,"From ",5);
+ while ((len > 0) && (*s == '>')) {
+ ++s;
+ --len;
+ }
+ return (len >= 5) && !str_diffn(s, "From ", 5);
}
diff --git a/src/headerbody.c b/src/headerbody.c
index 82c5684..4173824 100644
--- a/src/headerbody.c
+++ b/src/headerbody.c
@@ -1,16 +1,18 @@
-#include "stralloc.h"
+#include "headerbody.h"
+
#include "buffer.h"
#include "getln.h"
+#include "stralloc.h"
+
#include "hfield.h"
-#include "headerbody.h"
-static int getsa(buffer *b,stralloc *sa,int *match)
+static int getsa(buffer *b, stralloc *sa, int *match)
{
if (!*match) return 0;
- if (getln(b,sa,match,'\n') == -1) return -1;
+ if (getln(b, sa, match, '\n') == -1) return -1;
if (*match) return 1;
if (!sa->len) return 0;
- if (!stralloc_append(sa,"\n")) return -1;
+ if (!stralloc_append(sa, "\n")) return -1;
return 1;
}
@@ -18,7 +20,7 @@ static int getsa(buffer *b,stralloc *sa,int *match)
static stralloc line = {0};
static stralloc nextline = {0};
-int headerbody(b,dohf,hdone,dobl)
+int headerbody(b, dohf, hdone, dobl)
buffer *b;
void (*dohf)();
void (*hdone)();
@@ -30,9 +32,8 @@ void (*dobl)();
flaglineok = 0;
for (;;) {
- switch (getsa(b,&nextline,&match)) {
- case -1:
- return -1;
+ switch (getsa(b, &nextline, &match)) {
+ case -1: return -1;
case 0:
if (flaglineok) dohf(&line);
hdone();
@@ -42,7 +43,7 @@ void (*dobl)();
if (flaglineok) {
if ((nextline.s[0] == ' ') || (nextline.s[0] == '\t')) {
- if (!stralloc_cat(&line,&nextline)) return -1;
+ if (!stralloc_cat(&line, &nextline)) return -1;
continue;
}
dohf(&line);
@@ -54,14 +55,14 @@ void (*dobl)();
break;
}
- if (stralloc_starts(&nextline,"From ")) {
- if (!stralloc_copys(&line,"MBOX-Line: ")) return -1;
- if (!stralloc_cat(&line,&nextline)) return -1;
- } else if (hfield_valid(nextline.s,nextline.len)) {
- if (!stralloc_copy(&line,&nextline)) return -1;
+ if (stralloc_starts(&nextline, "From ")) {
+ if (!stralloc_copys(&line, "MBOX-Line: ")) return -1;
+ if (!stralloc_cat(&line, &nextline)) return -1;
+ } else if (hfield_valid(nextline.s, nextline.len)) {
+ if (!stralloc_copy(&line, &nextline)) return -1;
} else {
hdone();
- if (!stralloc_copys(&line,"\n")) return -1;
+ if (!stralloc_copys(&line, "\n")) return -1;
dobl(&line);
dobl(&nextline);
break;
@@ -69,10 +70,10 @@ void (*dobl)();
flaglineok = 1;
}
- for (;;)
- switch (getsa(b,&nextline,&match)) {
+ for (;;) switch (getsa(b, &nextline, &match))
+ {
case -1: return -1;
- case 0: return 0;
- case 1: dobl(&nextline);
+ case 0: return 0;
+ case 1: dobl(&nextline);
}
}
diff --git a/src/hfield.c b/src/hfield.c
index 2376e1f..3043327 100644
--- a/src/hfield.c
+++ b/src/hfield.c
@@ -1,39 +1,38 @@
#include "hfield.h"
static char *(hname[]) = {
- "unknown-header"
-, "sender"
-, "from"
-, "reply-to"
-, "to"
-, "cc"
-, "bcc"
-, "date"
-, "message-id"
-, "subject"
-, "resent-sender"
-, "resent-from"
-, "resent-reply-to"
-, "resent-to"
-, "resent-cc"
-, "resent-bcc"
-, "resent-date"
-, "resent-message-id"
-, "return-receipt-to"
-, "errors-to"
-, "apparently-to"
-, "received"
-, "return-path"
-, "delivered-to"
-, "content-length"
-, "content-type"
-, "content-transfer-encoding"
-, "notice-requested-upon-delivery-to"
-, "mail-followup-to"
-, 0
-};
+ "unknown-header",
+ "sender",
+ "from",
+ "reply-to",
+ "to",
+ "cc",
+ "bcc",
+ "date",
+ "message-id",
+ "subject",
+ "resent-sender",
+ "resent-from",
+ "resent-reply-to",
+ "resent-to",
+ "resent-cc",
+ "resent-bcc",
+ "resent-date",
+ "resent-message-id",
+ "return-receipt-to",
+ "errors-to",
+ "apparently-to",
+ "received",
+ "return-path",
+ "delivered-to",
+ "content-length",
+ "content-type",
+ "content-transfer-encoding",
+ "notice-requested-upon-delivery-to",
+ "mail-followup-to",
+ 0};
-static int hmatch( char *s,int len,char *t)
+static int hmatch(char *s, int len, char *t)
{
int i;
char ch;
@@ -54,19 +53,18 @@ static int hmatch( char *s,int len,char *t)
}
}
-int hfield_known(char *s,int len)
+int hfield_known(char *s, int len)
{
int i;
char *t;
for (i = 1; (t = hname[i]); ++i)
- if (hmatch(s,len,t))
- return i;
-
- return 0;
+ if (hmatch(s, len, t)) return i;
+
+ return 0;
}
-int hfield_valid(char *s,int len)
+int hfield_valid(char *s, int len)
{
int i;
int j;
@@ -76,11 +74,10 @@ int hfield_valid(char *s,int len)
if (s[j] == ':') break;
if (j >= len) return 0;
-
+
while (j) {
ch = s[j - 1];
- if ((ch != ' ') && (ch != '\t'))
- break;
+ if ((ch != ' ') && (ch != '\t')) break;
--j;
}
if (!j) return 0;
@@ -89,11 +86,11 @@ int hfield_valid(char *s,int len)
ch = s[i];
if (ch <= 32) return 0;
if (ch >= 127) return 0;
- }
+ }
return 1;
}
-unsigned int hfield_skipname(char *s,int len)
+unsigned int hfield_skipname(char *s, int len)
{
int i;
char ch;
@@ -102,12 +99,11 @@ unsigned int hfield_skipname(char *s,int len)
if (s[i] == ':') break;
if (i < len) ++i;
- while (i < len) {
- ch = s[i];
- if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' '))
- break;
- ++i;
- }
+ while (i < len) {
+ ch = s[i];
+ if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' ')) break;
+ ++i;
+ }
return i;
}
diff --git a/src/hier.c b/src/hier.c
index d5d5b38..9be2f25 100644
--- a/src/hier.c
+++ b/src/hier.c
@@ -1,163 +1,165 @@
+#include "hier.h"
+
+#include "fifo.h"
+#include "fmt.h"
+
#include "auto_qmail.h"
#include "auto_split.h"
#include "auto_uids.h"
-#include "fmt.h"
-#include "fifo.h"
#include "ipalloc.h"
#include "tcpto.h"
-#include "hier.h"
char buf[100 + FMT_ULONG];
-void dsplit(char *base,int uid,int mode) /* base must be under 100 bytes */
+void dsplit(char *base, int uid, int mode) /* base must be under 100 bytes */
{
char *x;
unsigned long i;
- d(auto_qmail,base,uid,auto_gidq,mode);
+ d(auto_qmail, base, uid, auto_gidq, mode);
for (i = 0; i < auto_split; ++i) {
x = buf;
- x += fmt_str(x,base);
- x += fmt_str(x,"/");
- x += fmt_ulong(x,i);
+ x += fmt_str(x, base);
+ x += fmt_str(x, "/");
+ x += fmt_ulong(x, i);
*x = 0;
- d(auto_qmail,buf,uid,auto_gidq,mode);
+ d(auto_qmail, buf, uid, auto_gidq, mode);
}
}
void hier()
{
- h(auto_qmail,auto_uido,auto_gidq,0755);
-
- d(auto_qmail,"control",auto_uido,auto_gidq,0755);
- d(auto_qmail,"users",auto_uido,auto_gidq,0755);
- d(auto_qmail,"bin",auto_uido,auto_gidq,0755);
- d(auto_qmail,"alias",auto_uida,auto_gidq,02755);
-
- d(auto_qmail,"queue",auto_uidq,auto_gidq,0750);
- d(auto_qmail,"queue/pid",auto_uidq,auto_gidq,0700);
- d(auto_qmail,"queue/bounce",auto_uids,auto_gidq,0700);
-
- dsplit("queue/dkim",auto_uidq,0750);
- dsplit("queue/mess",auto_uidq,0750);
- dsplit("queue/todo",auto_uidq,0750);
- dsplit("queue/intd",auto_uidq,0700);
- dsplit("queue/info",auto_uids,0700);
- dsplit("queue/local",auto_uids,0700);
- dsplit("queue/remote",auto_uids,0700);
-
- d(auto_qmail,"queue/lock",auto_uidq,auto_gidq,0750);
- z(auto_qmail,"queue/lock/tcpto",TCPTO_BUFSIZ,auto_uidr,auto_gidq,0644);
- z(auto_qmail,"queue/lock/sendmutex",0,auto_uids,auto_gidq,0600);
- p(auto_qmail,"queue/lock/trigger",auto_uids,auto_gidq,0622);
-
- c(auto_qmail,"bin","qmail-queue",auto_uidq,auto_gidq,04711);
- c(auto_qmail,"bin","qmail-qmaint",auto_uidq,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-lspawn",auto_uido,auto_gidq,0700);
- c(auto_qmail,"bin","qmail-start",auto_uido,auto_gidq,0700);
- c(auto_qmail,"bin","qmail-getpw",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-local",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-remote",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-smtpam",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-rspawn",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-clean",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-send",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-todo",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","splogger",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-newu",auto_uido,auto_gidq,0700);
- c(auto_qmail,"bin","qmail-newmrh",auto_uido,auto_gidq,0700);
-
- c(auto_qmail,"bin","qmail-dkim",auto_uidq,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-dksign",auto_uidq,auto_gidq,04711);
- c(auto_qmail,"bin","qmail-dkverify",auto_uidq,auto_gidq,04711);
-
- c(auto_qmail,"bin","qmail-authuser",auto_uido,auto_gidq,06711);
- c(auto_qmail,"bin","qmail-vmailuser",auto_uido,auto_gidq,06711);
- c(auto_qmail,"bin","qmail-postgrey",auto_uido,auto_gidq,06711);
- c(auto_qmail,"bin","qmail-badloadertypes",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-badmimetypes",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-recipients",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-mfrules",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-mrtg",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-mrtg-queue",auto_uido,auto_gidq,0755);
-
- c(auto_qmail,"bin","qmail-pw2u",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-inject",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-showctl",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-qread",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-qstat",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-tcpto",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-tcpok",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-pop3d",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-popup",auto_uido,auto_gidq,0711);
- c(auto_qmail,"bin","qmail-qmqpc",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-qmqpd",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-qmtpd",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qmail-smtpd",auto_uido,auto_gidq,0755);
-
- c(auto_qmail,"bin","predate",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","datemail",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","mailsubj",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","sendmail",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qreceipt",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","qbiff",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","forward",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","preline",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","condredirect",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","bouncesaying",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","except",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","maildirmake",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","maildir2mbox",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","maildirwatch",auto_uido,auto_gidq,0755);
-
- c(auto_qmail,"bin","fastforward",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","printforward",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","setforward",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","newaliases",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","printmaillist",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","setmaillist",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","newinclude",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","srsforward",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","srsreverse",auto_uido,auto_gidq,0755);
-
- c(auto_qmail,"bin","ipmeprint",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","spfquery",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnscname",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnsfq",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnsip",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnsmxip",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnsptr",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnstlsa",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","dnstxt",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","hostname",auto_uido,auto_gidq,0755);
-
- c(auto_qmail,"bin","columnt",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","ddist",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","deferrals",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","failures",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","matchup",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","recipients",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","rhosts",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","rxdelay",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","senders",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","successes",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","suids",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","tai64nfrac",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","xqp",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","xrecipient",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","xsender",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zddist",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zdeferrals",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zfailures",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zfailures",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zoverall",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zrecipients",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zrhosts",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zrxdelay",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zsenders",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zsendmail",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zsuccesses",auto_uido,auto_gidq,0755);
- c(auto_qmail,"bin","zsuids",auto_uido,auto_gidq,0755);
+ h(auto_qmail, auto_uido, auto_gidq, 0755);
+
+ d(auto_qmail, "control", auto_uido, auto_gidq, 0755);
+ d(auto_qmail, "users", auto_uido, auto_gidq, 0755);
+ d(auto_qmail, "bin", auto_uido, auto_gidq, 0755);
+ d(auto_qmail, "alias", auto_uida, auto_gidq, 02755);
+
+ d(auto_qmail, "queue", auto_uidq, auto_gidq, 0750);
+ d(auto_qmail, "queue/pid", auto_uidq, auto_gidq, 0700);
+ d(auto_qmail, "queue/bounce", auto_uids, auto_gidq, 0700);
+
+ dsplit("queue/dkim", auto_uidq, 0750);
+ dsplit("queue/mess", auto_uidq, 0750);
+ dsplit("queue/todo", auto_uidq, 0750);
+ dsplit("queue/intd", auto_uidq, 0700);
+ dsplit("queue/info", auto_uids, 0700);
+ dsplit("queue/local", auto_uids, 0700);
+ dsplit("queue/remote", auto_uids, 0700);
+
+ d(auto_qmail, "queue/lock", auto_uidq, auto_gidq, 0750);
+ z(auto_qmail, "queue/lock/tcpto", TCPTO_BUFSIZ, auto_uidr, auto_gidq, 0644);
+ z(auto_qmail, "queue/lock/sendmutex", 0, auto_uids, auto_gidq, 0600);
+ p(auto_qmail, "queue/lock/trigger", auto_uids, auto_gidq, 0622);
+
+ c(auto_qmail, "bin", "qmail-queue", auto_uidq, auto_gidq, 04711);
+ c(auto_qmail, "bin", "qmail-qmaint", auto_uidq, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-lspawn", auto_uido, auto_gidq, 0700);
+ c(auto_qmail, "bin", "qmail-start", auto_uido, auto_gidq, 0700);
+ c(auto_qmail, "bin", "qmail-getpw", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-local", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-remote", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-smtpam", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-rspawn", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-clean", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-send", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-todo", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "splogger", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-newu", auto_uido, auto_gidq, 0700);
+ c(auto_qmail, "bin", "qmail-newmrh", auto_uido, auto_gidq, 0700);
+
+ c(auto_qmail, "bin", "qmail-dkim", auto_uidq, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-dksign", auto_uidq, auto_gidq, 04711);
+ c(auto_qmail, "bin", "qmail-dkverify", auto_uidq, auto_gidq, 04711);
+
+ c(auto_qmail, "bin", "qmail-authuser", auto_uido, auto_gidq, 06711);
+ c(auto_qmail, "bin", "qmail-vmailuser", auto_uido, auto_gidq, 06711);
+ c(auto_qmail, "bin", "qmail-postgrey", auto_uido, auto_gidq, 06711);
+ c(auto_qmail, "bin", "qmail-badloadertypes", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-badmimetypes", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-recipients", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-mfrules", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-mrtg", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-mrtg-queue", auto_uido, auto_gidq, 0755);
+
+ c(auto_qmail, "bin", "qmail-pw2u", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-inject", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-showctl", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-qread", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-qstat", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-tcpto", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-tcpok", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-pop3d", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-popup", auto_uido, auto_gidq, 0711);
+ c(auto_qmail, "bin", "qmail-qmqpc", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-qmqpd", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-qmtpd", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qmail-smtpd", auto_uido, auto_gidq, 0755);
+
+ c(auto_qmail, "bin", "predate", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "datemail", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "mailsubj", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "sendmail", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qreceipt", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "qbiff", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "forward", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "preline", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "condredirect", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "bouncesaying", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "except", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "maildirmake", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "maildir2mbox", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "maildirwatch", auto_uido, auto_gidq, 0755);
+
+ c(auto_qmail, "bin", "fastforward", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "printforward", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "setforward", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "newaliases", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "printmaillist", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "setmaillist", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "newinclude", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "srsforward", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "srsreverse", auto_uido, auto_gidq, 0755);
+
+ c(auto_qmail, "bin", "ipmeprint", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "spfquery", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnscname", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnsfq", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnsip", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnsmxip", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnsptr", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnstlsa", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "dnstxt", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "hostname", auto_uido, auto_gidq, 0755);
+
+ c(auto_qmail, "bin", "columnt", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "ddist", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "deferrals", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "failures", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "matchup", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "recipients", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "rhosts", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "rxdelay", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "senders", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "successes", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "suids", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "tai64nfrac", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "xqp", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "xrecipient", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "xsender", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zddist", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zdeferrals", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zfailures", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zfailures", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zoverall", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zrecipients", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zrhosts", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zrxdelay", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zsenders", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zsendmail", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zsuccesses", auto_uido, auto_gidq, 0755);
+ c(auto_qmail, "bin", "zsuids", auto_uido, auto_gidq, 0755);
}
diff --git a/src/hmac_md5.c b/src/hmac_md5.c
index 310f0ef..5c46653 100644
--- a/src/hmac_md5.c
+++ b/src/hmac_md5.c
@@ -1,7 +1,8 @@
+#include "byte.h"
+#include "str.h"
+
#include "global.h"
#include "md5.h"
-#include "str.h"
-#include "byte.h"
/**
@file hmac_md5
@@ -13,40 +14,40 @@
output: unsigned char *digest: pointer to calculated digest
*/
-void hmac_md5(unsigned char *text,int text_len,unsigned char * key,int key_len,unsigned char *digest)
+void hmac_md5(unsigned char *text, int text_len, unsigned char *key, int key_len, unsigned char *digest)
{
- MD5_CTX context;
- unsigned char k_ipad[65]; /* inner padding - key XORd with ipad */
- unsigned char k_opad[65]; /* outer padding - key XORd with opad */
- unsigned char tk[16];
- int i;
-
- if (key_len > 64) {
- MD5_CTX tctx;
- MD5Init(&tctx);
- MD5Update(&tctx,key,key_len);
- MD5Final(tk,&tctx);
- key = tk;
- key_len = 16;
- }
-
- byte_zero(k_ipad,sizeof(k_ipad));
- byte_zero(k_opad,sizeof(k_opad));
- byte_copy(k_ipad,key_len,key);
- byte_copy(k_opad,key_len,key);
-
- for (i = 0; i < 64; i++) {
- k_ipad[i] ^= 0x36;
- k_opad[i] ^= 0x5c;
- }
-
- MD5Init(&context); /* init context for 1st pass */
- MD5Update(&context,k_ipad,64); /* start with inner pad */
- MD5Update(&context,text,text_len); /* then text of datagram */
- MD5Final(digest,&context); /* finish up 1st pass */
-
- MD5Init(&context); /* init context for 2nd pass */
- MD5Update(&context,k_opad,64); /* start with outer pad */
- MD5Update(&context,digest,16); /* then results of 1st hash */
- MD5Final(digest,&context); /* finish up 2nd pass */
+ MD5_CTX context;
+ unsigned char k_ipad[65]; /* inner padding - key XORd with ipad */
+ unsigned char k_opad[65]; /* outer padding - key XORd with opad */
+ unsigned char tk[16];
+ int i;
+
+ if (key_len > 64) {
+ MD5_CTX tctx;
+ MD5Init(&tctx);
+ MD5Update(&tctx, key, key_len);
+ MD5Final(tk, &tctx);
+ key = tk;
+ key_len = 16;
+ }
+
+ byte_zero(k_ipad, sizeof(k_ipad));
+ byte_zero(k_opad, sizeof(k_opad));
+ byte_copy(k_ipad, key_len, key);
+ byte_copy(k_opad, key_len, key);
+
+ for (i = 0; i < 64; i++) {
+ k_ipad[i] ^= 0x36;
+ k_opad[i] ^= 0x5c;
+ }
+
+ MD5Init(&context); /* init context for 1st pass */
+ MD5Update(&context, k_ipad, 64); /* start with inner pad */
+ MD5Update(&context, text, text_len); /* then text of datagram */
+ MD5Final(digest, &context); /* finish up 1st pass */
+
+ MD5Init(&context); /* init context for 2nd pass */
+ MD5Update(&context, k_opad, 64); /* start with outer pad */
+ MD5Update(&context, digest, 16); /* then results of 1st hash */
+ MD5Final(digest, &context); /* finish up 2nd pass */
}
diff --git a/src/hostname.c b/src/hostname.c
index 6a55309..2794102 100644
--- a/src/hostname.c
+++ b/src/hostname.c
@@ -1,4 +1,5 @@
#include <unistd.h>
+
#include "buffer.h"
#include "exit.h"
@@ -7,10 +8,10 @@ char host[256];
int main()
{
host[0] = 0; /* sigh */
- gethostname(host,sizeof(host));
+ gethostname(host, sizeof(host));
host[sizeof(host) - 1] = 0;
- buffer_puts(buffer_1small,host);
- buffer_puts(buffer_1small,"\n");
+ buffer_puts(buffer_1small, host);
+ buffer_puts(buffer_1small, "\n");
buffer_flush(buffer_1small);
_exit(0);
}
diff --git a/src/include/base64.h b/src/include/base64.h
index 9384411..88c8543 100644
--- a/src/include/base64.h
+++ b/src/include/base64.h
@@ -3,7 +3,7 @@
#include "stralloc.h"
-extern int b64decode(const unsigned char *,int,stralloc *);
-extern int b64encode(stralloc *,stralloc *);
+extern int b64decode(const unsigned char *, int, stralloc *);
+extern int b64encode(stralloc *, stralloc *);
#endif
diff --git a/src/include/commands.h b/src/include/commands.h
index 3fd2cb8..fed35e7 100644
--- a/src/include/commands.h
+++ b/src/include/commands.h
@@ -5,7 +5,7 @@ struct commands {
char *text;
void (*fun)();
void (*flush)();
-} ;
+};
int commands();
diff --git a/src/include/constmap.h b/src/include/constmap.h
index 750702e..0a43e98 100644
--- a/src/include/constmap.h
+++ b/src/include/constmap.h
@@ -11,10 +11,10 @@ struct constmap {
int *next;
char **input;
int *inputlen;
-} ;
+};
-int constmap_init(struct constmap *,char *,int,int);
-int constmap_init_char(struct constmap *,char *,int,int,char);
+int constmap_init(struct constmap *, char *, int, int);
+int constmap_init_char(struct constmap *, char *, int, int, char);
void constmap_free();
char *constmap();
diff --git a/src/include/control.h b/src/include/control.h
index 732042c..fdd72b3 100644
--- a/src/include/control.h
+++ b/src/include/control.h
@@ -4,9 +4,9 @@
#include "stralloc.h"
int control_init(void);
-int control_readline(stralloc *,char *);
-int control_rldef(stralloc *,char *,int,char *);
-int control_readint(int *,char *);
-int control_readfile(stralloc *,char *,int);
+int control_readline(stralloc *, char *);
+int control_rldef(stralloc *, char *, int, char *);
+int control_readint(int *, char *);
+int control_readfile(stralloc *, char *, int);
#endif
diff --git a/src/include/date822fmt.h b/src/include/date822fmt.h
index a2f1432..fc721a0 100644
--- a/src/include/date822fmt.h
+++ b/src/include/date822fmt.h
@@ -1,7 +1,7 @@
#ifndef DATE822FMT_H
#define DATE822FMT_H
-unsigned int date822fmt(char *,struct datetime *);
+unsigned int date822fmt(char *, struct datetime *);
#define DATE822FMT 60
#endif
diff --git a/src/include/datetime.h b/src/include/datetime.h
index 68d1618..eb8abc6 100644
--- a/src/include/datetime.h
+++ b/src/include/datetime.h
@@ -10,7 +10,7 @@ struct datetime {
int yday;
int mon;
int year;
-} ;
+};
typedef long datetime_sec;
diff --git a/src/include/dkim.h b/src/include/dkim.h
index 508b2df..dd2a70d 100644
--- a/src/include/dkim.h
+++ b/src/include/dkim.h
@@ -20,110 +20,108 @@
*
*****************************************************************************/
#define DKIM_CALL
-#define MAKELONG(a,b) ((long)(((unsigned)(a) & 0xffff) | (((unsigned)(b) & 0xffff) << 16)))
+#define MAKELONG(a, b) ((long)(((unsigned)(a) & 0xffff) | (((unsigned)(b) & 0xffff) << 16)))
#ifdef __cplusplus
extern "C" {
#endif
// DKIM hash algorithms
-#define DKIM_HASH_SHA1 1
-#define DKIM_HASH_SHA256 2
-#define DKIM_HASH_SHA1_AND_SHA256 3
-#define DKIM_HASH_ED25519 4
-#define DKIM_HASH_RSA256_AND_ED25519 5
+#define DKIM_HASH_SHA1 1
+#define DKIM_HASH_SHA256 2
+#define DKIM_HASH_SHA1_AND_SHA256 3
+#define DKIM_HASH_ED25519 4
+#define DKIM_HASH_RSA256_AND_ED25519 5
// DKIM canonicalization methods
-#define DKIM_CANON_SIMPLE 1
-#define DKIM_CANON_NOWSP 2
-#define DKIM_CANON_RELAXED 3
+#define DKIM_CANON_SIMPLE 1
+#define DKIM_CANON_NOWSP 2
+#define DKIM_CANON_RELAXED 3
-#define DKIM_SIGN_SIMPLE MAKELONG(DKIM_CANON_SIMPLE,DKIM_CANON_SIMPLE)
-#define DKIM_SIGN_SIMPLE_RELAXED MAKELONG(DKIM_CANON_RELAXED,DKIM_CANON_SIMPLE)
-#define DKIM_SIGN_RELAXED MAKELONG(DKIM_CANON_RELAXED,DKIM_CANON_RELAXED)
-#define DKIM_SIGN_RELAXED_SIMPLE MAKELONG(DKIM_CANON_SIMPLE,DKIM_CANON_RELAXED)
+#define DKIM_SIGN_SIMPLE MAKELONG(DKIM_CANON_SIMPLE, DKIM_CANON_SIMPLE)
+#define DKIM_SIGN_SIMPLE_RELAXED MAKELONG(DKIM_CANON_RELAXED, DKIM_CANON_SIMPLE)
+#define DKIM_SIGN_RELAXED MAKELONG(DKIM_CANON_RELAXED, DKIM_CANON_RELAXED)
+#define DKIM_SIGN_RELAXED_SIMPLE MAKELONG(DKIM_CANON_SIMPLE, DKIM_CANON_RELAXED)
// DKIM Error codes
-#define DKIM_SUCCESS 0 // operation successful
-#define DKIM_FAIL -1 // verify error: message is suspicious
-#define DKIM_BAD_SYNTAX -2 // signature error: DKIM-Signature could not parse or has bad tags/values
-#define DKIM_SIGNATURE_BAD -3 // signature error: RSA/ED25519 verify failed
-#define DKIM_SIGNATURE_BAD_BUT_TESTING -4 // signature error: RSA/ED25519 verify failed but testing
-#define DKIM_SIGNATURE_EXPIRED -5 // signature error: x= is old
-#define DKIM_SELECTOR_INVALID -6 // signature error: selector doesn't parse or contains invalid values
-#define DKIM_SELECTOR_GRANULARITY_MISMATCH -7 // signature error: selector g= doesn't match i=
-#define DKIM_SELECTOR_KEY_REVOKED -8 // signature error: selector p= empty
-#define DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG -9 // signature error: selector domain name too long to request
-#define DKIM_SELECTOR_DNS_TEMP_FAILURE -10 // signature error: temporary dns failure requesting selector
-#define DKIM_SELECTOR_DNS_PERM_FAILURE -11 // signature error: permanent dns failure requesting selector
-#define DKIM_SELECTOR_PUBLIC_KEY_INVALID -12 // signature error: selector p= value invalid or wrong format
-#define DKIM_NO_SIGNATURES -13 // process error, no sigs
-#define DKIM_NO_VALID_SIGNATURES -14 // process error, no valid sigs
-#define DKIM_BODY_HASH_MISMATCH -15 // sigature verify error: message body does not hash to bh value
-#define DKIM_SELECTOR_ALGORITHM_MISMATCH -16 // signature error: selector h= doesn't match signature a=
-#define DKIM_STAT_INCOMPAT -17 // signature error: incompatible v=
-#define DKIM_UNSIGNED_FROM -18 // signature error: not all message's From headers in signature
-#define DKIM_OUT_OF_MEMORY -20 // memory allocation failed
-#define DKIM_INVALID_CONTEXT -21 // DKIMContext structure invalid for this operation
-#define DKIM_NO_SENDER -22 // signing error: Could not find From: or Sender: header in message
-#define DKIM_BAD_PRIVATE_KEY -23 // signing error: Could not parse private key
-#define DKIM_BUFFER_TOO_SMALL -24 // signing error: Buffer passed in is not large enough
-#define DKIM_MAX_ERROR -25 // set this to 1 greater than the highest error code (but negative)
+#define DKIM_SUCCESS 0 // operation successful
+#define DKIM_FAIL -1 // verify error: message is suspicious
+#define DKIM_BAD_SYNTAX -2 // signature error: DKIM-Signature could not parse or has bad tags/values
+#define DKIM_SIGNATURE_BAD -3 // signature error: RSA/ED25519 verify failed
+#define DKIM_SIGNATURE_BAD_BUT_TESTING -4 // signature error: RSA/ED25519 verify failed but testing
+#define DKIM_SIGNATURE_EXPIRED -5 // signature error: x= is old
+#define DKIM_SELECTOR_INVALID -6 // signature error: selector doesn't parse or contains invalid values
+#define DKIM_SELECTOR_GRANULARITY_MISMATCH -7 // signature error: selector g= doesn't match i=
+#define DKIM_SELECTOR_KEY_REVOKED -8 // signature error: selector p= empty
+#define DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG \
+ -9 // signature error: selector domain name too long to request
+#define DKIM_SELECTOR_DNS_TEMP_FAILURE -10 // signature error: temporary dns failure requesting selector
+#define DKIM_SELECTOR_DNS_PERM_FAILURE -11 // signature error: permanent dns failure requesting selector
+#define DKIM_SELECTOR_PUBLIC_KEY_INVALID \
+ -12 // signature error: selector p= value invalid or wrong format
+#define DKIM_NO_SIGNATURES -13 // process error, no sigs
+#define DKIM_NO_VALID_SIGNATURES -14 // process error, no valid sigs
+#define DKIM_BODY_HASH_MISMATCH -15 // sigature verify error: message body does not hash to bh value
+#define DKIM_SELECTOR_ALGORITHM_MISMATCH -16 // signature error: selector h= doesn't match signature a=
+#define DKIM_STAT_INCOMPAT -17 // signature error: incompatible v=
+#define DKIM_UNSIGNED_FROM -18 // signature error: not all message's From headers in signature
+#define DKIM_OUT_OF_MEMORY -20 // memory allocation failed
+#define DKIM_INVALID_CONTEXT -21 // DKIMContext structure invalid for this operation
+#define DKIM_NO_SENDER -22 // signing error: Could not find From: or Sender: header in message
+#define DKIM_BAD_PRIVATE_KEY -23 // signing error: Could not parse private key
+#define DKIM_BUFFER_TOO_SMALL -24 // signing error: Buffer passed in is not large enough
+#define DKIM_MAX_ERROR -25 // set this to 1 greater than the highest error code (but negative)
// DKIM_SUCCESS // verify result: all signatures verified
- // signature result: signature verified
-#define DKIM_FINISHED_BODY 1 // process result: no more message body is needed
-#define DKIM_PARTIAL_SUCCESS 2 // verify result: at least one but not all signatures verified
-#define DKIM_NEUTRAL 3 // verify result: no signatures verified but message is not suspicous
-#define DKIM_SUCCESS_BUT_EXTRA 4 // signature result: signature verified but it did not include all of the body
-
+// signature result: signature verified
+#define DKIM_FINISHED_BODY 1 // process result: no more message body is needed
+#define DKIM_PARTIAL_SUCCESS 2 // verify result: at least one but not all signatures verified
+#define DKIM_NEUTRAL 3 // verify result: no signatures verified but message is not suspicous
+#define DKIM_SUCCESS_BUT_EXTRA \
+ 4 // signature result: signature verified but it did not include all of the body
// This function is called once for each header in the message
// return 1 to include this header in the signature and 0 to exclude.
-typedef int (DKIM_CALL *DKIMHEADERCALLBACK)(const char* szHeader);
+typedef int(DKIM_CALL *DKIMHEADERCALLBACK)(const char *szHeader);
// This function is called to retrieve a TXT record from DNS
-typedef int (DKIM_CALL *DKIMDNSCALLBACK)(const char* szFQDN,char* szBuffer,int nBufLen);
+typedef int(DKIM_CALL *DKIMDNSCALLBACK)(const char *szFQDN, char *szBuffer, int nBufLen);
-typedef struct DKIMContext_t
-{
+typedef struct DKIMContext_t {
unsigned int reserved1;
unsigned int reserved2;
- void* reserved3;
+ void *reserved3;
} DKIMContext;
-typedef struct DKIMSignOptions_t
-{
- int nCanon; // canonization
- int nIncludeBodyLengthTag; // 0 = don't include l= tag, 1 = include l= tag
- int nIncludeTimeStamp; // 0 = don't include t= tag, 1 = include t= tag
- int nIncludeQueryMethod; // 0 = don't include q= tag, 1 = include q= tag
- char szSelector[64]; // selector - required
- char szSelectorE[64]; // 2nd selector - optional
- char szDomain[256]; // domain - optional - if empty, domain is computed from sender
- char szIdentity[256]; // for i= tag, if empty tag will not be included in sig
- unsigned long expireTime; // for x= tag, if 0 tag will not be included in sig
- DKIMHEADERCALLBACK pfnHeaderCallback; // header callback
- char szRequiredHeaders[256]; // colon-separated list of headers that must be signed
- int nHash; // use one of the DKIM_HASH_xx constants here
- // even if not present in the message
- int nIncludeCopiedHeaders; // 0 = don't include z= tag, 1 = include z= tag
+typedef struct DKIMSignOptions_t {
+ int nCanon; // canonization
+ int nIncludeBodyLengthTag; // 0 = don't include l= tag, 1 = include l= tag
+ int nIncludeTimeStamp; // 0 = don't include t= tag, 1 = include t= tag
+ int nIncludeQueryMethod; // 0 = don't include q= tag, 1 = include q= tag
+ char szSelector[64]; // selector - required
+ char szSelectorE[64]; // 2nd selector - optional
+ char szDomain[256]; // domain - optional - if empty, domain is computed from sender
+ char szIdentity[256]; // for i= tag, if empty tag will not be included in sig
+ unsigned long expireTime; // for x= tag, if 0 tag will not be included in sig
+ DKIMHEADERCALLBACK pfnHeaderCallback; // header callback
+ char szRequiredHeaders[256]; // colon-separated list of headers that must be signed
+ int nHash; // use one of the DKIM_HASH_xx constants here
+ // even if not present in the message
+ int nIncludeCopiedHeaders; // 0 = don't include z= tag, 1 = include z= tag
} DKIMSignOptions;
-typedef struct DKIMVerifyOptions_t
-{
- DKIMDNSCALLBACK pfnSelectorCallback; // selector record callback
- DKIMDNSCALLBACK pfnPracticesCallback; // ADSP record callback
- int nHonorBodyLengthTag; // 0 = ignore l= tag, 1 = use l= tag to limit the amount of body verified
- int nCheckPractices; // 0 = use default (unknown) practices, 1 = request and use author domain signing practices
- int nSubjectRequired; // 0 = subject is required to be signed, 1 = not required
- int nSaveCanonicalizedData; // 0 = canonicalized data is not saved, 1 = canonicalized data is saved
- int nAllowUnsignedFromHeaders; // 0 = From headers not included in the signature are not allowed, 1 = allowed
+typedef struct DKIMVerifyOptions_t {
+ DKIMDNSCALLBACK pfnSelectorCallback; // selector record callback
+ DKIMDNSCALLBACK pfnPracticesCallback; // ADSP record callback
+ int nHonorBodyLengthTag; // 0 = ignore l= tag, 1 = use l= tag to limit the amount of body verified
+ int nCheckPractices; // 0 = use default (unknown) practices, 1 = request and use author domain signing practices
+ int nSubjectRequired; // 0 = subject is required to be signed, 1 = not required
+ int nSaveCanonicalizedData; // 0 = canonicalized data is not saved, 1 = canonicalized data is saved
+ int nAllowUnsignedFromHeaders; // 0 = From headers not included in the signature are not allowed, 1 = allowed
} DKIMVerifyOptions;
-typedef struct DKIMVerifyDetails_t
-{
+typedef struct DKIMVerifyDetails_t {
char *szSignature;
char *szSignatureDomain;
char *szIdentityDomain;
@@ -131,22 +129,24 @@ typedef struct DKIMVerifyDetails_t
int nResult;
} DKIMVerifyDetails;
-int DKIM_CALL DKIMSignInit(DKIMContext* pSignContext,DKIMSignOptions* pOptions);
-int DKIM_CALL DKIMSignProcess(DKIMContext* pSignContext,char* szBuffer,int nBufLength);
-int DKIM_CALL DKIMSignGetSig2(DKIMContext* pSignContext,char* szRSAPrivKey,char *szECCPrivKey,char** pszSignature);
-void DKIM_CALL DKIMSignFree(DKIMContext* pSignContext);
+int DKIM_CALL DKIMSignInit(DKIMContext *pSignContext, DKIMSignOptions *pOptions);
+int DKIM_CALL DKIMSignProcess(DKIMContext *pSignContext, char *szBuffer, int nBufLength);
+int DKIM_CALL DKIMSignGetSig2(
+ DKIMContext *pSignContext, char *szRSAPrivKey, char *szECCPrivKey, char **pszSignature);
+void DKIM_CALL DKIMSignFree(DKIMContext *pSignContext);
-int DKIM_CALL DKIMVerifyInit(DKIMContext* pVerifyContext,DKIMVerifyOptions* pOptions);
-int DKIM_CALL DKIMVerifyProcess(DKIMContext* pVerifyContext,const char* szBuffer,int nBufLength);
-int DKIM_CALL DKIMVerifyResults(DKIMContext* pVerifyContext);
-int DKIM_CALL DKIMVerifyGetDetails(DKIMContext* pVerifyContext,int* nSigCount,DKIMVerifyDetails** pDetails,char* szPractices);
-void DKIM_CALL DKIMVerifyFree(DKIMContext* pVerifyContext);
+int DKIM_CALL DKIMVerifyInit(DKIMContext *pVerifyContext, DKIMVerifyOptions *pOptions);
+int DKIM_CALL DKIMVerifyProcess(DKIMContext *pVerifyContext, const char *szBuffer, int nBufLength);
+int DKIM_CALL DKIMVerifyResults(DKIMContext *pVerifyContext);
+int DKIM_CALL DKIMVerifyGetDetails(
+ DKIMContext *pVerifyContext, int *nSigCount, DKIMVerifyDetails **pDetails, char *szPractices);
+void DKIM_CALL DKIMVerifyFree(DKIMContext *pVerifyContext);
// const char *DKIM_CALL DKIMVersion();
const char *DKIM_CALL DKIMGetErrorString(int ErrorCode);
-int _DKIM_ReportResult(char const *,char const *,char const *);
+int _DKIM_ReportResult(const char *, const char *, const char *);
const char *DKIM_ErrorResult(const int);
#ifdef __cplusplus
diff --git a/src/include/dkimbase.h b/src/include/dkimbase.h
index 25aac02..bfecb5d 100644
--- a/src/include/dkimbase.h
+++ b/src/include/dkimbase.h
@@ -22,58 +22,56 @@
#ifndef DKIMBASE_H
#define DKIMBASE_H
+#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
-#include <openssl/err.h>
#define BUFFER_ALLOC_INCREMENT 256
-#include <string>
#include <list>
+#include <string>
using namespace std;
-class CDKIMBase
-{
+class CDKIMBase {
public:
+ CDKIMBase();
+ ~CDKIMBase();
- CDKIMBase();
- ~CDKIMBase();
-
- int Init(void);
+ int Init(void);
- int Process(const char* szBuffer,int nBufLength,bool bEOF);
- int ProcessFinal(void);
+ int Process(const char *szBuffer, int nBufLength, bool bEOF);
+ int ProcessFinal(void);
- int Alloc(char*& szBuffer,int nRequiredSize);
- int ReAlloc(char*& szBuffer,int& nBufferLength,int nRequiredSize);
- void Free(char* szBuffer);
+ int Alloc(char *& szBuffer, int nRequiredSize);
+ int ReAlloc(char *& szBuffer, int& nBufferLength, int nRequiredSize);
+ void Free(char *szBuffer);
- static void RemoveSWSP(char* szBuffer);
- static void RemoveSWSP(char* pBuffer,int& nBufLength);
- static void RemoveSWSP(string& sBuffer);
+ static void RemoveSWSP(char *szBuffer);
+ static void RemoveSWSP(char *pBuffer, int& nBufLength);
+ static void RemoveSWSP(string& sBuffer);
- static void CompressSWSP(char* pBuffer,int& nBufLength);
- static void CompressSWSP(string& sBuffer);
+ static void CompressSWSP(char *pBuffer, int& nBufLength);
+ static void CompressSWSP(string& sBuffer);
- static string RelaxHeader(const string& sHeader);
+ static string RelaxHeader(const string& sHeader);
- virtual int ProcessHeaders(void);
- virtual int ProcessBody(char* szBuffer,int nBufLength,bool bEOF);
+ virtual int ProcessHeaders(void);
+ virtual int ProcessBody(char *szBuffer, int nBufLength, bool bEOF);
protected:
- char* m_From;
- char* m_Sender;
- char* m_hTag;
- int m_hTagSize;
- int m_hTagPos;
- char* m_Line;
- int m_LineSize;
- int m_LinePos;
- bool m_InHeaders;
-
- list<string> HeaderList;
+ char *m_From;
+ char *m_Sender;
+ char *m_hTag;
+ int m_hTagSize;
+ int m_hTagPos;
+ char *m_Line;
+ int m_LineSize;
+ int m_LinePos;
+ bool m_InHeaders;
+
+ list<string> HeaderList;
};
-#endif // DKIMBASE_H
+#endif // DKIMBASE_H
diff --git a/src/include/dkimsign.h b/src/include/dkimsign.h
index 150a0b8..af1dd70 100644
--- a/src/include/dkimsign.h
+++ b/src/include/dkimsign.h
@@ -24,58 +24,60 @@
#include "dkimbase.h"
-class CDKIMSign : public CDKIMBase
-{
+class CDKIMSign : public CDKIMBase {
public:
CDKIMSign();
~CDKIMSign();
//int Init() = delete;
- int Init(DKIMSignOptions* pOptions);
- int GetSig2(char* szRSAPrivKey,char* szECCPrivKey,char** pszSignature);
+ int Init(DKIMSignOptions *pOptions);
+ int GetSig2(char *szRSAPrivKey, char *szECCPrivKey, char **pszSignature);
virtual int ProcessHeaders(void) override;
- virtual int ProcessBody(char* szBuffer,int nBufLength,bool bEOF) override;
+ virtual int ProcessBody(char *szBuffer, int nBufLength, bool bEOF) override;
- enum CKDKIMConstants { OptimalHeaderLineLength = 65 };
+ enum CKDKIMConstants {
+ OptimalHeaderLineLength = 65
+ };
- void Hash(const char* szBuffer,int nBufLength,bool bHdr);
+ void Hash(const char *szBuffer, int nBufLength, bool bHdr);
protected:
-
bool SignThisTag(const string& sTag);
void GetHeaderParams(const string& sHdr);
void ProcessHeader(const string& sHdr);
bool ParseFromAddress(void);
void InitSig(void);
- void AddTagToSig(const char* const Tag,const string &sValue,char cbrk,bool bFold);
- void AddTagToSig(const char* const Tag,unsigned long nValue);
+ void AddTagToSig(const char *const Tag, const string& sValue, char cbrk, bool bFold);
+ void AddTagToSig(const char *const Tag, unsigned long nValue);
void AddInterTagSpace(int nSizeOfNextTag);
- void AddFoldedValueToSig(const string &sValue,char cbrk);
+ void AddFoldedValueToSig(const string& sValue, char cbrk);
bool IsRequiredHeader(const string& sTag);
- int ConstructSignature(char* szSignKey,int nSigAlg);
+ int ConstructSignature(char *szSignKey, int nSigAlg);
- int AssembleReturnedSig(char* szRSAPrivKey,char* szECCPrivKey);
+ int AssembleReturnedSig(char *szRSAPrivKey, char *szECCPrivKey);
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_MD_CTX m_Hdr_sha1ctx; /* the RSA SHA1 signature */
- EVP_MD_CTX m_Hdr_sha256ctx; /* the RSA SHA256 signature */
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_MD_CTX m_Hdr_sha1ctx; /* the RSA SHA1 signature */
+ EVP_MD_CTX m_Hdr_sha256ctx; /* the RSA SHA256 signature */
- EVP_MD_CTX m_Bdy_sha1ctx; /* the SHA1 digest */
- EVP_MD_CTX m_Bdy_sha256ctx; /* the SHA256 digest */
+ EVP_MD_CTX m_Bdy_sha1ctx; /* the SHA1 digest */
+ EVP_MD_CTX m_Bdy_sha256ctx; /* the SHA256 digest */
#else
EVP_MD_CTX *m_Hdr_sha1ctx; /* the RSA SHA1 signature */
EVP_MD_CTX *m_Hdr_sha256ctx; /* the RSA SHA256 signature */
EVP_MD_CTX *m_Hdr_ed25519ctx; /* the PureEd25519 signature */
- EVP_MD_CTX *m_Bdy_sha1ctx; /* the SHA1 digest */
- EVP_MD_CTX *m_Bdy_sha256ctx; /* the SHA256 digest for RSA */
- EVP_MD_CTX *m_Edy_sha256ctx; /* the SHA256 digest for Ed25519 */
+ EVP_MD_CTX *m_Bdy_sha1ctx; /* the SHA1 digest */
+ EVP_MD_CTX *m_Bdy_sha256ctx; /* the SHA256 digest for RSA */
+ EVP_MD_CTX *m_Edy_sha256ctx; /* the SHA256 digest for Ed25519 */
#endif
- int m_Canon; /* canonization method */
+ int m_Canon; /* canonization method */
int m_EmptyLineCount;
@@ -83,9 +85,9 @@ protected:
string sFrom;
string sSender;
string sSelector;
- string eSelector; /* Used for Ed25519 signatures */
+ string eSelector; /* Used for Ed25519 signatures */
string sDomain;
- string sIdentity; /* for i= tag, if empty tag will not be included in sig */
+ string sIdentity; /* for i= tag, if empty tag will not be included in sig */
string sRequiredHeaders;
bool m_IncludeBodyLengthTag;
@@ -98,7 +100,7 @@ protected:
DKIMHEADERCALLBACK m_pfnHdrCallback;
- string m_sSig; // DKIM-Signature ....
+ string m_sSig; // DKIM-Signature ....
int m_nSigPos;
string m_sReturnedSig;
@@ -110,4 +112,4 @@ protected:
int m_SigHdrs;
};
-#endif // DKIMSIGN_H
+#endif // DKIMSIGN_H
diff --git a/src/include/dkimverify.h b/src/include/dkimverify.h
index 64de2a1..685426b 100644
--- a/src/include/dkimverify.h
+++ b/src/include/dkimverify.h
@@ -22,131 +22,132 @@
#ifndef DKIMVERIFY_H
#define DKIMVERIFY_H
-#include "dkimbase.h"
#include <vector>
+#include "dkimbase.h"
+
/* not used anymore
#define DKIM_ADSP_UNKNOWN 1
#define DKIM_ADSP_ALL 2
#define DKIM_ADSP_DISCARDABLE 3
*/
-#define DKIM_POLICY_DOMAIN_NAME_TOO_LONG -50 // internal error
-#define DKIM_POLICY_DNS_TEMP_FAILURE -51 // internal error
-#define DKIM_POLICY_DNS_PERM_FAILURE -52 // internal error
-#define DKIM_POLICY_INVALID -53 // internal error
+#define DKIM_POLICY_DOMAIN_NAME_TOO_LONG -50 // internal error
+#define DKIM_POLICY_DNS_TEMP_FAILURE -51 // internal error
+#define DKIM_POLICY_DNS_PERM_FAILURE -52 // internal error
+#define DKIM_POLICY_INVALID -53 // internal error
/* dito
#define DKIM_SIG_VERSION_PRE_02 0
#define DKIM_SIG_VERSION_02_PLUS 1
*/
-class SelectorInfo
-{
+class SelectorInfo {
public:
- SelectorInfo(const string &sSelector,const string &sDomain);
- ~SelectorInfo();
+ SelectorInfo(const string& sSelector, const string& sDomain);
+ ~SelectorInfo();
- string Domain;
- string Selector;
- string Granularity;
- bool AllowSHA1;
- bool AllowSHA256;
- EVP_PKEY *PublicKey; /* the public key */
- bool Testing;
- bool SameDomain;
+ string Domain;
+ string Selector;
+ string Granularity;
+ bool AllowSHA1;
+ bool AllowSHA256;
+ EVP_PKEY *PublicKey; /* the public key */
+ bool Testing;
+ bool SameDomain;
- int Status;
+ int Status;
- int Parse(char* Buffer);
+ int Parse(char *Buffer);
};
-class SignatureInfo
-{
+class SignatureInfo {
public:
- SignatureInfo(bool SaveCanonicalizedData);
- ~SignatureInfo();
-
- void Hash(const char* szBuffer,unsigned nBufLength,bool IsBody=false);
-
- string Header;
- unsigned Version;
- string Domain;
- string Selector;
- string SignatureData;
- string BodyHashData;
- string IdentityLocalPart;
- string IdentityDomain;
- string CanonicalizedData;
- vector<string> SignedHeaders;
- unsigned BodyLength;
- unsigned HeaderCanonicalization;
- unsigned BodyCanonicalization;
- unsigned ExpireTime;
-
- unsigned VerifiedBodyCount;
- unsigned UnverifiedBodyCount;
-
-#if ((OPENSSL_VERSION_NUMBER < 0x10100000L) || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
- EVP_MD_CTX m_Hdr_ctx;
- EVP_MD_CTX m_Bdy_ctx;
+ SignatureInfo(bool SaveCanonicalizedData);
+ ~SignatureInfo();
+
+ void Hash(const char *szBuffer, unsigned nBufLength, bool IsBody = false);
+
+ string Header;
+ unsigned Version;
+ string Domain;
+ string Selector;
+ string SignatureData;
+ string BodyHashData;
+ string IdentityLocalPart;
+ string IdentityDomain;
+ string CanonicalizedData;
+ vector<string> SignedHeaders;
+ unsigned BodyLength;
+ unsigned HeaderCanonicalization;
+ unsigned BodyCanonicalization;
+ unsigned ExpireTime;
+
+ unsigned VerifiedBodyCount;
+ unsigned UnverifiedBodyCount;
+
+#if ( \
+ (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ || (LIBRESSL_VERSION_NUMBER > 0 && LIBRESSL_VERSION_NUMBER < 0x20700000L))
+ EVP_MD_CTX m_Hdr_ctx;
+ EVP_MD_CTX m_Bdy_ctx;
#else
- EVP_MD_CTX *m_Hdr_ctx;
- EVP_MD_CTX *m_Bdy_ctx;
+ EVP_MD_CTX *m_Hdr_ctx;
+ EVP_MD_CTX *m_Bdy_ctx;
#endif
#if (OPENSSL_VERSION_NUMBER > 0x10101000L)
- EVP_MD_CTX *m_Msg_ctx;
+ EVP_MD_CTX *m_Msg_ctx;
#endif
- SelectorInfo *m_pSelector;
+ SelectorInfo *m_pSelector;
- int Status;
- int m_nHash; // use one of the DKIM_HASH_xxx constants here
- unsigned EmptyLineCount;
- bool m_SaveCanonicalizedData;
+ int Status;
+ int m_nHash; // use one of the DKIM_HASH_xxx constants here
+ unsigned EmptyLineCount;
+ bool m_SaveCanonicalizedData;
};
-class CDKIMVerify : public CDKIMBase
-{
+class CDKIMVerify : public CDKIMBase {
public:
+ CDKIMVerify();
+ ~CDKIMVerify();
+ // virtual ~CDKIMVerify() = 0;
- CDKIMVerify();
- ~CDKIMVerify();
-// virtual ~CDKIMVerify() = 0;
+ int Init(DKIMVerifyOptions *pOptions);
- int Init(DKIMVerifyOptions* pOptions);
+ int GetResults(void);
+ int GetDetails(int *nSigCount, DKIMVerifyDetails **pDetails);
+ // int _DNSGetTXT(const char* szFQDN,char* Buffer,int nBufLen);
- int GetResults(void);
- int GetDetails(int* nSigCount,DKIMVerifyDetails** pDetails);
-// int _DNSGetTXT(const char* szFQDN,char* Buffer,int nBufLen);
+ virtual int ProcessHeaders(void);
+ virtual int ProcessBody(char *szBuffer, int nBufLength, bool bEOF);
- virtual int ProcessHeaders(void);
- virtual int ProcessBody(char* szBuffer,int nBufLength,bool bEOF);
-
- const char* GetPractices() { return Practices.c_str(); }
+ const char *GetPractices()
+ {
+ return Practices.c_str();
+ }
protected:
+ int ParseDKIMSignature(const string& sHeader, SignatureInfo& sig);
- int ParseDKIMSignature(const string& sHeader,SignatureInfo &sig);
-
- SelectorInfo& GetSelector(const string &sSelector,const string &sDomain);
+ SelectorInfo& GetSelector(const string& sSelector, const string& sDomain);
-// int GetADSP(const string &sDomain,int &iADSP);
+ // int GetADSP(const string &sDomain,int &iADSP);
- list<SignatureInfo> Signatures;
- list<SelectorInfo> Selectors;
+ list<SignatureInfo> Signatures;
+ list<SelectorInfo> Selectors;
- DKIMDNSCALLBACK m_pfnSelectorCallback; // selector record callback
-// DKIMDNSCALLBACK m_pfnPracticesCallback; // ADSP record callback
+ DKIMDNSCALLBACK m_pfnSelectorCallback; // selector record callback
+ // DKIMDNSCALLBACK m_pfnPracticesCallback; // ADSP record callback
- bool m_HonorBodyLengthTag;
- bool m_CheckPractices;
- bool m_SubjectIsRequired;
- bool m_SaveCanonicalizedData;
- bool m_AllowUnsignedFromHeaders;
+ bool m_HonorBodyLengthTag;
+ bool m_CheckPractices;
+ bool m_SubjectIsRequired;
+ bool m_SaveCanonicalizedData;
+ bool m_AllowUnsignedFromHeaders;
- vector<DKIMVerifyDetails> Details;
- string Practices;
+ vector<DKIMVerifyDetails> Details;
+ string Practices;
};
-#endif //DKIMVERIFY_H
+#endif //DKIMVERIFY_H
diff --git a/src/include/dns.h b/src/include/dns.h
index 6293478..e914cda 100644
--- a/src/include/dns.h
+++ b/src/include/dns.h
@@ -6,19 +6,22 @@ extern "C" {
#endif
#include "dnsresolv.h"
-#include "ipalloc.h"
#include "stralloc.h"
-#define DNS_INIT static char seed[128]; dns_random_init(seed);
-#define DNS_NXD 0
-#define DNS_SOFT -5
-#define DNS_HARD -6
+#include "ipalloc.h"
+
+#define DNS_INIT \
+ static char seed[128]; \
+ dns_random_init(seed);
+#define DNS_NXD 0
+#define DNS_SOFT -5
+#define DNS_HARD -6
void dns_init(int);
-int dns_ip(ipalloc *,stralloc *);
-int dns_mxip(ipalloc *,stralloc *,unsigned long);
-int dns_tlsa(stralloc *,const stralloc *);
-int dns_mxhost(stralloc *,const stralloc *);
+int dns_ip(ipalloc *, stralloc *);
+int dns_mxip(ipalloc *, stralloc *, unsigned long);
+int dns_tlsa(stralloc *, const stralloc *);
+int dns_mxhost(stralloc *, const stralloc *);
#ifdef __cplusplus
}
diff --git a/src/include/dnsgettxt.h b/src/include/dnsgettxt.h
index 6d6b8ea..3158fe0 100644
--- a/src/include/dnsgettxt.h
+++ b/src/include/dnsgettxt.h
@@ -1,7 +1,7 @@
#ifdef cplusplus
extern "C" {
-int DNSGetTXT(const char* szFQDN,char* Buffer,int nBufLen);
-extern void dns_random_init(const char [12]);
+int DNSGetTXT(const char *szFQDN, char *Buffer, int nBufLen);
+extern void dns_random_init(const char[12]);
#endif
diff --git a/src/include/extra.h b/src/include/extra.h
index c598175..df43a26 100644
--- a/src/include/extra.h
+++ b/src/include/extra.h
@@ -1,7 +1,7 @@
#ifndef EXTRA_H
#define EXTRA_H
-#define QUEUE_EXTRA ""
+#define QUEUE_EXTRA ""
#define QUEUE_EXTRALEN 0
#endif
diff --git a/src/include/fifo.h b/src/include/fifo.h
index f48c863..cfaa801 100644
--- a/src/include/fifo.h
+++ b/src/include/fifo.h
@@ -1,6 +1,6 @@
#ifndef FIFO_H
#define FIFO_H
-int fifo_make(char *,int);
+int fifo_make(char *, int);
#endif
diff --git a/src/include/fmtqfn.h b/src/include/fmtqfn.h
index e11e51e..11f48d3 100644
--- a/src/include/fmtqfn.h
+++ b/src/include/fmtqfn.h
@@ -1,7 +1,7 @@
#ifndef FMTQFN_H
#define FMTQFN_H
-unsigned int fmtqfn(char *,char *,unsigned long,int);
+unsigned int fmtqfn(char *, char *, unsigned long, int);
#define FMTQFN 40 /* maximum space needed, if len(dirslash) <= 10 */
diff --git a/src/include/gfrom.h b/src/include/gfrom.h
index 121ff6d..40fb769 100644
--- a/src/include/gfrom.h
+++ b/src/include/gfrom.h
@@ -1,6 +1,6 @@
#ifndef GFROM_H
#define GFROM_H
-int gfrom(char *,int);
+int gfrom(char *, int);
#endif
diff --git a/src/include/global.h b/src/include/global.h
index 2d8ccf4..7e9b673 100644
--- a/src/include/global.h
+++ b/src/include/global.h
@@ -1,6 +1,7 @@
/* GLOBAL.H - RSAREF types and constants */
#include <string.h>
+
#include "uint_t.h"
/* Copyright (C) RSA Laboratories, a division of RSA Data Security,
@@ -8,16 +9,16 @@
*/
#ifndef _GLOBAL_H_
-#define _GLOBAL_H_ 1
+ #define _GLOBAL_H_ 1
-/* PROTOTYPES should be set to one if and only if the compiler supports
+ /* PROTOTYPES should be set to one if and only if the compiler supports
function argument prototyping.
The following makes PROTOTYPES default to 1 if it has not already been
defined as 0 with C compiler flags.
*/
-#ifndef PROTOTYPES
-#define PROTOTYPES 1
-#endif
+ #ifndef PROTOTYPES
+ #define PROTOTYPES 1
+ #endif
/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;
@@ -25,29 +26,29 @@ typedef unsigned char *POINTER;
/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;
-/* UINT4 defines a four byte word */
-#ifdef UINT32_H
-#define UINT4 uint32
-#else
+ /* UINT4 defines a four byte word */
+ #ifdef UINT32_H
+ #define UINT4 uint32
+ #else
typedef unsigned long int UINT4;
-#endif
+ #endif
-#ifndef NULL_PTR
-#define NULL_PTR ((POINTER)0)
-#endif
+ #ifndef NULL_PTR
+ #define NULL_PTR ((POINTER)0)
+ #endif
-#ifndef UNUSED_ARG
-#define UNUSED_ARG(x) x = *(&x);
-#endif
+ #ifndef UNUSED_ARG
+ #define UNUSED_ARG(x) x = *(&x);
+ #endif
-/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
+ /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
returns an empty list.
*/
-#if PROTOTYPES
-#define PROTO_LIST(list) list
-#else
-#define PROTO_LIST(list) ()
-#endif
+ #if PROTOTYPES
+ #define PROTO_LIST(list) list
+ #else
+ #define PROTO_LIST(list) ()
+ #endif
#endif /* end _GLOBAL_H_ */
diff --git a/src/include/hfield.h b/src/include/hfield.h
index ab367f4..f2110b5 100644
--- a/src/include/hfield.h
+++ b/src/include/hfield.h
@@ -5,34 +5,34 @@ unsigned int hfield_skipname();
int hfield_known();
int hfield_valid();
-#define H_SENDER 1
-#define H_FROM 2
-#define H_REPLYTO 3
-#define H_TO 4
-#define H_CC 5
-#define H_BCC 6
-#define H_DATE 7
-#define H_MESSAGEID 8
-#define H_SUBJECT 9
-#define H_R_SENDER 10
-#define H_R_FROM 11
-#define H_R_REPLYTO 12
-#define H_R_TO 13
-#define H_R_CC 14
-#define H_R_BCC 15
-#define H_R_DATE 16
-#define H_R_MESSAGEID 17
-#define H_RETURNRECEIPTTO 18
-#define H_ERRORSTO 19
-#define H_APPARENTLYTO 20
-#define H_RECEIVED 21
-#define H_RETURNPATH 22
-#define H_DELIVEREDTO 23
-#define H_CONTENTLENGTH 24
-#define H_CONTENTTYPE 25
-#define H_CONTENTTRANSFERENCODING 26
+#define H_SENDER 1
+#define H_FROM 2
+#define H_REPLYTO 3
+#define H_TO 4
+#define H_CC 5
+#define H_BCC 6
+#define H_DATE 7
+#define H_MESSAGEID 8
+#define H_SUBJECT 9
+#define H_R_SENDER 10
+#define H_R_FROM 11
+#define H_R_REPLYTO 12
+#define H_R_TO 13
+#define H_R_CC 14
+#define H_R_BCC 15
+#define H_R_DATE 16
+#define H_R_MESSAGEID 17
+#define H_RETURNRECEIPTTO 18
+#define H_ERRORSTO 19
+#define H_APPARENTLYTO 20
+#define H_RECEIVED 21
+#define H_RETURNPATH 22
+#define H_DELIVEREDTO 23
+#define H_CONTENTLENGTH 24
+#define H_CONTENTTYPE 25
+#define H_CONTENTTRANSFERENCODING 26
#define H_NOTICEREQUESTEDUPONDELIVERYTO 27
-#define H_MAILFOLLOWUPTO 28
-#define H_NUM 29
+#define H_MAILFOLLOWUPTO 28
+#define H_NUM 29
#endif
diff --git a/src/include/hier.h b/src/include/hier.h
index f040e79..21413cc 100644
--- a/src/include/hier.h
+++ b/src/include/hier.h
@@ -1,10 +1,10 @@
#ifndef HIER_H
#define HIER_H
-void c(char *,char *,char *,int,int,int);
-void h(char *,int,int,int);
-void d(char *,char *,int,int,int);
-void p(char *,char *,int,int,int);
-void z(char *,char *,int,int,int,int);
+void c(char *, char *, char *, int, int, int);
+void h(char *, int, int, int);
+void d(char *, char *, int, int, int);
+void p(char *, char *, int, int, int);
+void z(char *, char *, int, int, int, int);
#endif
diff --git a/src/include/hmac_md5.h b/src/include/hmac_md5.h
index 87a2c37..aa8c00d 100644
--- a/src/include/hmac_md5.h
+++ b/src/include/hmac_md5.h
@@ -1,7 +1,6 @@
#ifndef HMAC_MD5_H
#define HMAC_MD5_H
-void hmac_md5(unsigned char *,int,unsigned char *,int,unsigned char *);
+void hmac_md5(unsigned char *, int, unsigned char *, int, unsigned char *);
#endif
-
diff --git a/src/include/ipalloc.h b/src/include/ipalloc.h
index 0f58e92..6626ecc 100644
--- a/src/include/ipalloc.h
+++ b/src/include/ipalloc.h
@@ -1,8 +1,8 @@
#ifndef IPALLOC_H
#define IPALLOC_H
-#include "ip.h"
#include "genalloc.h"
+#include "ip.h"
#define NAME_LEN 256
struct ip_mx {
@@ -10,13 +10,12 @@ struct ip_mx {
union {
struct ip4_address ip4;
struct ip6_address ip6;
- } addr;
+ } addr;
int pref;
char mxh[NAME_LEN];
};
-GEN_ALLOC_typedef(ipalloc,struct ip_mx,ix,len,a)
-int ipalloc_readyplus();
+GEN_ALLOC_typedef(ipalloc, struct ip_mx, ix, len, a) int ipalloc_readyplus();
int ipalloc_append();
#endif
diff --git a/src/include/ipme.h b/src/include/ipme.h
index 9705f45..f9dff4e 100644
--- a/src/include/ipme.h
+++ b/src/include/ipme.h
@@ -2,6 +2,7 @@
#define IPME_H
#include "ip.h"
+
#include "ipalloc.h"
extern ipalloc ipme;
diff --git a/src/include/maildir.h b/src/include/maildir.h
index 5e48822..69e679b 100644
--- a/src/include/maildir.h
+++ b/src/include/maildir.h
@@ -2,12 +2,13 @@
#define MAILDIR_H
#include "logmsg.h"
-#include "prioq.h"
+
+#include "prioq.h"
extern struct strerr maildir_chdir_err;
extern struct strerr maildir_scan_err;
int maildir_chdir(void);
void maildir_clean(stralloc *);
-int maildir_scan(prioq *,stralloc *,int,int);
+int maildir_scan(prioq *, stralloc *, int, int);
#endif
diff --git a/src/include/md5.h b/src/include/md5.h
index 94774ba..bb12b74 100644
--- a/src/include/md5.h
+++ b/src/include/md5.h
@@ -32,15 +32,14 @@ extern "C" {
/* MD5 context. */
typedef struct {
- UINT4 state[4]; /* state (ABCD) */
- UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
+ UINT4 state[4]; /* state (ABCD) */
+ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
} MD5_CTX;
-void MD5Init PROTO_LIST ((MD5_CTX *));
-void MD5Update PROTO_LIST
- ((MD5_CTX *, unsigned char *, unsigned int));
-void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
+void MD5Init PROTO_LIST((MD5_CTX *));
+void MD5Update PROTO_LIST((MD5_CTX *, unsigned char *, unsigned int));
+void MD5Final PROTO_LIST((unsigned char[16], MD5_CTX *));
#ifdef __cplusplus
}
diff --git a/src/include/mfrules.h b/src/include/mfrules.h
index b79f338..68e678b 100644
--- a/src/include/mfrules.h
+++ b/src/include/mfrules.h
@@ -4,6 +4,6 @@
#include "stralloc.h"
extern stralloc key;
-int mfrules(int,char *,char *,char *,char *);
+int mfrules(int, char *, char *, char *, char *);
#endif
diff --git a/src/include/prioq.h b/src/include/prioq.h
index 3547b1c..cbddd9b 100644
--- a/src/include/prioq.h
+++ b/src/include/prioq.h
@@ -1,14 +1,18 @@
#ifndef PRIOQ_H
#define PRIOQ_H
-#include "datetime.h"
#include "genalloc.h"
-struct prioq_elt { datetime_sec dt; unsigned long id; } ;
+#include "datetime.h"
+
+struct prioq_elt {
+ datetime_sec dt;
+ unsigned long id;
+};
-GEN_ALLOC_typedef(prioq,struct prioq_elt,p,len,a)
+GEN_ALLOC_typedef(prioq, struct prioq_elt, p, len, a)
-int prioq_insert();
+ int prioq_insert();
int prioq_min();
void prioq_delmin();
diff --git a/src/include/qlx.h b/src/include/qlx.h
index 713946d..9008b31 100644
--- a/src/include/qlx.h
+++ b/src/include/qlx.h
@@ -3,16 +3,16 @@
/* 0, 111, 100 are qmail-local success, soft, hard */
-#define QLX_USAGE 112
-#define QLX_BUG 101
-#define QLX_ROOT 113
-#define QLX_NFS 115
-#define QLX_NOALIAS 116
-#define QLX_CDB 117
-#define QLX_SYS 118
-#define QLX_NOMEM 119
+#define QLX_USAGE 112
+#define QLX_BUG 101
+#define QLX_ROOT 113
+#define QLX_NFS 115
+#define QLX_NOALIAS 116
+#define QLX_CDB 117
+#define QLX_SYS 118
+#define QLX_NOMEM 119
#define QLX_EXECSOFT 120
-#define QLX_EXECPW 121
+#define QLX_EXECPW 121
#define QLX_EXECHARD 126
#endif
diff --git a/src/include/qmail.h b/src/include/qmail.h
index 7db214d..8e0ad3d 100644
--- a/src/include/qmail.h
+++ b/src/include/qmail.h
@@ -10,13 +10,13 @@ struct qmail {
int fde;
buffer ss;
char buf[1024];
-} ;
+};
extern int qmail_open(struct qmail *);
-extern void qmail_put(struct qmail *,char *, int);
-extern void qmail_puts(struct qmail *,char *);
-extern void qmail_from(struct qmail *,char *);
-extern void qmail_to(struct qmail *,char *);
+extern void qmail_put(struct qmail *, char *, int);
+extern void qmail_puts(struct qmail *, char *);
+extern void qmail_from(struct qmail *, char *);
+extern void qmail_to(struct qmail *, char *);
extern void qmail_fail(struct qmail *);
extern char *qmail_close(struct qmail *);
extern unsigned long qmail_qp(struct qmail *);
diff --git a/src/include/qsutil.h b/src/include/qsutil.h
index a77a3f8..7ef8ec1 100644
--- a/src/include/qsutil.h
+++ b/src/include/qsutil.h
@@ -4,10 +4,10 @@
#include "stralloc.h"
void log1s(char *);
-void log2s(char *,char *);
-void log3s(char *,char *,char *);
-void log4s(char *,char *,char *,char *);
-void log5s(char *,char *,char *,char *,char *);
+void log2s(char *, char *);
+void log3s(char *, char *, char *);
+void log4s(char *, char *, char *, char *);
+void log5s(char *, char *, char *, char *, char *);
void logsa(stralloc *);
void nomem();
void pausedir(char *);
diff --git a/src/include/quote.h b/src/include/quote.h
index 4afbc94..4f1c467 100644
--- a/src/include/quote.h
+++ b/src/include/quote.h
@@ -3,8 +3,8 @@
#include "stralloc.h"
-int quote_need(char *,unsigned int);
+int quote_need(char *, unsigned int);
int quote(stralloc *, stralloc *);
-int quote2(stralloc *,char *);
+int quote2(stralloc *, char *);
#endif
diff --git a/src/include/readsubdir.h b/src/include/readsubdir.h
index e612fac..3910693 100644
--- a/src/include/readsubdir.h
+++ b/src/include/readsubdir.h
@@ -3,14 +3,12 @@
#include "direntry.h"
-typedef struct readsubdir
-{
+typedef struct readsubdir {
DIR *dir;
int pos;
char *name;
void (*pause)();
-}
-readsubdir;
+} readsubdir;
void readsubdir_init();
int readsubdir_next();
diff --git a/src/include/received.h b/src/include/received.h
index 2b2ce75..eac017f 100644
--- a/src/include/received.h
+++ b/src/include/received.h
@@ -3,7 +3,7 @@
#include "qmail.h"
-void received(struct qmail *,char *,char *,char *,char *,char *,char *,char *,char *);
-void spfheader(struct qmail *,char *,char *,char *,char *,char *);
+void received(struct qmail *, char *, char *, char *, char *, char *, char *, char *, char *);
+void spfheader(struct qmail *, char *, char *, char *, char *, char *);
#endif
diff --git a/src/include/recipients.h b/src/include/recipients.h
index b73f37e..e666bd1 100644
--- a/src/include/recipients.h
+++ b/src/include/recipients.h
@@ -2,7 +2,7 @@
#define RECIPIENTS_H
int recipients_init(void);
-int recipients(char *,int);
+int recipients(char *, int);
ssize_t safewrite();
#endif
diff --git a/src/include/sendtodo.h b/src/include/sendtodo.h
index 86b4434..c2c6819 100644
--- a/src/include/sendtodo.h
+++ b/src/include/sendtodo.h
@@ -4,11 +4,11 @@
/* critical timing feature #1: if not triggered, do not busy-loop */
/* critical timing feature #2: if triggered, respond within fixed time */
/* important timing feature: when triggered, respond instantly */
-#define SLEEP_TODO 1500 /* check todo/ every 25 minutes in any case */
-#define SLEEP_FUZZ 1 /* slop a bit on sleeps to avoid zeno effect */
+#define SLEEP_TODO 1500 /* check todo/ every 25 minutes in any case */
+#define SLEEP_FUZZ 1 /* slop a bit on sleeps to avoid zeno effect */
#define SLEEP_FOREVER 86400 /* absolute maximum time spent in select() */
#define SLEEP_CLEANUP 76431 /* time between cleanups */
#define SLEEP_SYSFAIL 123
-#define OSSIFIED 129600 /* 36 hours; _must_ exceed q-q's DEATH (24 hours) */
+#define OSSIFIED 129600 /* 36 hours; _must_ exceed q-q's DEATH (24 hours) */
#endif
diff --git a/src/include/sha1.h b/src/include/sha1.h
index 43d141d..3d35750 100644
--- a/src/include/sha1.h
+++ b/src/include/sha1.h
@@ -15,8 +15,7 @@
#define SHA1_BLOCKSIZE 64
#define SHA1_DIGESTSIZE 20
-typedef struct
-{
+typedef struct {
uint32_t state[5];
uint32_t count[2];
uint8_t buffer[SHA1_BLOCKSIZE];
diff --git a/src/include/sha256.h b/src/include/sha256.h
index e8979c5..8c920b1 100644
--- a/src/include/sha256.h
+++ b/src/include/sha256.h
@@ -1,8 +1,7 @@
#ifndef SHA256_H
#define SHA256_H
-typedef struct
-{
+typedef struct {
uint8_t data[64];
uint32_t datalen;
uint32_t bitlen[2];
@@ -13,6 +12,6 @@ static void sha256_init(sha256_ctx *ctx);
static void sha256_transform(sha256_ctx *ctx, uint8_t *data);
static void sha256_update(sha256_ctx *ctx, uint8_t *data, uint32_t len);
static void sha256_final(uint8_t *hash, sha256_ctx *ctx);
-extern void sha256_hash(char *hash,const char *data, size_t len);
+extern void sha256_hash(char *hash, const char *data, size_t len);
#endif
diff --git a/src/include/smtpdlog.h b/src/include/smtpdlog.h
index 0feb126..9b305c5 100644
--- a/src/include/smtpdlog.h
+++ b/src/include/smtpdlog.h
@@ -6,12 +6,12 @@ void flush();
void out();
void smtpdlog_init(void);
-void smtp_loga(char *,char *,char *,char *,char *,char *,char *,char *,char *);
-void smtp_logb(char *,char *,char *,char *,char *,char *,char *);
-void smtp_logg(char *,char *,char *,char *,char *,char *,char *);
-void smtp_logh(char *,char *,char *,char *,char *);
-void smtp_logi(char *,char *,char *,char *,char *,char *,char *,char *);
-void smtp_logr(char *,char *,char *,char *,char *,char *,char *,char *);
+void smtp_loga(char *, char *, char *, char *, char *, char *, char *, char *, char *);
+void smtp_logb(char *, char *, char *, char *, char *, char *, char *);
+void smtp_logg(char *, char *, char *, char *, char *, char *, char *);
+void smtp_logh(char *, char *, char *, char *, char *);
+void smtp_logi(char *, char *, char *, char *, char *, char *, char *, char *);
+void smtp_logr(char *, char *, char *, char *, char *, char *, char *, char *);
void die_read(void);
void die_alarm(void);
@@ -34,40 +34,40 @@ int err_fork(void);
int err_pipe(void);
int err_write(void);
int err_starttls(void);
-void err_tlsreq(char *,char *,char *,char *,char *);
+void err_tlsreq(char *, char *, char *, char *, char *);
-void err_helo(char *,char *,char *,char *,char *,char *,char *,char *);
-void err_spf(char *,char *,char *,char *,char *,char *,char *,char *);
+void err_helo(char *, char *, char *, char *, char *, char *, char *, char *);
+void err_spf(char *, char *, char *, char *, char *, char *, char *, char *);
-void err_authsetup(char *,char *,char *,char *,char *);
+void err_authsetup(char *, char *, char *, char *, char *);
void err_authd(void);
-void err_authmail(void);
-void err_authfail(char *,char *,char *,char *,char *,char *,char *);
-void err_authinvalid(char *,char *,char *,char *,char *);
+void err_authmail(void);
+void err_authfail(char *, char *, char *, char *, char *, char *, char *);
+void err_authinvalid(char *, char *, char *, char *, char *);
void err_authabrt(void);
-void err_authreq(char *,char *,char *,char *,char *);
-void err_submission(char *,char *,char *,char *,char *);
+void err_authreq(char *, char *, char *, char *, char *);
+void err_submission(char *, char *, char *, char *, char *);
int err_authabort(void);
-int err_authinput(void);
+int err_authinput(void);
int err_noauth(void);
void err_wantmail(void);
-void err_mav(char *,char *,char *,char *,char *,char *,char *);
-void err_bmf(char *,char *,char *,char *,char *,char *,char *,char *);
-void err_mfdns(char *,char *,char *,char *,char *,char *,char *);
+void err_mav(char *, char *, char *, char *, char *, char *, char *);
+void err_bmf(char *, char *, char *, char *, char *, char *, char *, char *);
+void err_mfdns(char *, char *, char *, char *, char *, char *, char *);
-void err_nogateway(char *,char *,char *,char *,char *,char *,char *);
-void err_brt(char *,char *,char *,char *,char *,char *,char *);
-void err_rcpts(char *,char *,char *,char *,char *,char *,char *);
-void err_recipient(char *,char *,char *,char *,char *,char *,char *);
+void err_nogateway(char *, char *, char *, char *, char *, char *, char *);
+void err_brt(char *, char *, char *, char *, char *, char *, char *);
+void err_rcpts(char *, char *, char *, char *, char *, char *, char *);
+void err_recipient(char *, char *, char *, char *, char *, char *, char *);
-void straynewline(void);
+void straynewline(void);
void err_notorious(void);
-void err_size(char *,char *,char *,char *,char *,char *,char *);
-void err_data(char *,char *,char *,char *,char *,char *,char *,char *);
+void err_size(char *, char *, char *, char *, char *, char *, char *);
+void err_data(char *, char *, char *, char *, char *, char *, char *, char *);
int err_postgl(void);
int err_forkgl(void);
-void postgrey(char *,char *,char *,char *,char *,char *,char *);
+void postgrey(char *, char *, char *, char *, char *, char *, char *);
#endif
diff --git a/src/include/spf.h b/src/include/spf.h
index ca20418..0b8b0fc 100644
--- a/src/include/spf.h
+++ b/src/include/spf.h
@@ -2,12 +2,13 @@
#define SPF_H
#include "stralloc.h"
+
#include "ipalloc.h"
/* (Internal) Processing codes */
#define SPF_INIT -1
-#define SPF_EXT -2 /* x */
+#define SPF_EXT -2 /* x */
#define SPF_ME -3
#define SPF_EXHAUST -4
#define SPF_LOOP -5
@@ -15,23 +16,23 @@
#define SPF_LOCAL -7
#define SPF_ERROR -8
#define SPF_NOMEM -9
-#define SPF_SYNTAX -10 /* Setup problem */
+#define SPF_SYNTAX -10 /* Setup problem */
/* (External) Resulting codes */
-#define SPF_OK 0 /* + Pass */
-#define SPF_NONE 1 /* o None */
-#define SPF_UNKNOWN 2 /* u Unknown method */
-#define SPF_NEUTRAL 3 /* ? Neutral */
-#define SPF_SOFTFAIL 4 /* ~ Softfail */
-#define SPF_FAIL 5 /* - Not Permitted */
-#define SPF_DNSSOFT 6 /* d From DNS; not used */
+#define SPF_OK 0 /* + Pass */
+#define SPF_NONE 1 /* o None */
+#define SPF_UNKNOWN 2 /* u Unknown method */
+#define SPF_NEUTRAL 3 /* ? Neutral */
+#define SPF_SOFTFAIL 4 /* ~ Softfail */
+#define SPF_FAIL 5 /* - Not Permitted */
+#define SPF_DNSSOFT 6 /* d From DNS; not used */
#define LOOKUP_LIMIT 10
/* spfinfo: S=remoteip|O=mailfrom|C=identity/domain|H=helo|M(echanism)=query|D=redirect|I=domain|P=problem|R:result */
-#define SPF_DEFEXP "See http://%{d}/why.html?sender=%{s}&ip=%{i}&receiver=%{r}"
+#define SPF_DEFEXP "See http://%{d}/why.html?sender=%{s}&ip=%{i}&receiver=%{r}"
extern int flagip6;
extern stralloc spfmf;
@@ -48,64 +49,60 @@ extern stralloc spfexpmsg;
/* this table and macro came from wget more or less */
/* and was in turn stolen by me++ from libspf as is :) */
-const static unsigned char urlchr_table[256] =
-{
- 1, 1, 1, 1, 1, 1, 1, 1, /* NUL SOH STX ETX EOT ENQ ACK BEL */
- 1, 1, 1, 1, 1, 1, 1, 1, /* BS HT LF VT FF CR SO SI */
- 1, 1, 1, 1, 1, 1, 1, 1, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
- 1, 1, 1, 1, 1, 1, 1, 1, /* CAN EM SUB ESC FS GS RS US */
- 1, 0, 1, 1, 0, 1, 1, 0, /* SP ! " # $ % & ' */
- 0, 0, 0, 1, 0, 0, 0, 1, /* ( ) * + , - . / */
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
- 0, 0, 1, 1, 1, 1, 1, 1, /* 8 9 : ; < = > ? */
- 1, 0, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */
- 0, 0, 0, 0, 0, 0, 0, 0, /* H I J K L M N O */
- 0, 0, 0, 0, 0, 0, 0, 0, /* P Q R S T U V W */
- 0, 0, 0, 1, 1, 1, 1, 0, /* X Y Z [ \ ] ^ _ */
- 1, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
- 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
- 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
- 0, 0, 0, 1, 1, 1, 1, 1, /* x y z { | } ~ DEL */
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+const static unsigned char urlchr_table[256] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, /* NUL SOH STX ETX EOT ENQ ACK BEL */
+ 1, 1, 1, 1, 1, 1, 1, 1, /* BS HT LF VT FF CR SO SI */
+ 1, 1, 1, 1, 1, 1, 1, 1, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
+ 1, 1, 1, 1, 1, 1, 1, 1, /* CAN EM SUB ESC FS GS RS US */
+ 1, 0, 1, 1, 0, 1, 1, 0, /* SP ! " # $ % & ' */
+ 0, 0, 0, 1, 0, 0, 0, 1, /* ( ) * + , - . / */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
+ 0, 0, 1, 1, 1, 1, 1, 1, /* 8 9 : ; < = > ? */
+ 1, 0, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* H I J K L M N O */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* P Q R S T U V W */
+ 0, 0, 0, 1, 1, 1, 1, 0, /* X Y Z [ \ ] ^ _ */
+ 1, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
+ 0, 0, 0, 1, 1, 1, 1, 1, /* x y z { | } ~ DEL */
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
-#define WSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n')
-#define NXTOK(b, p, a) do { (b) = (p); \
- while((p) < (a)->len && !WSPACE((a)->s[(p)])) ++(p); \
- while((p) < (a)->len && WSPACE((a)->s[(p)])) (a)->s[(p)++] = 0; \
- } while(0)
+#define WSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n')
+#define NXTOK(b, p, a) \
+ do { \
+ (b) = (p); \
+ while ((p) < (a)->len && !WSPACE((a)->s[(p)])) ++(p); \
+ while ((p) < (a)->len && WSPACE((a)->s[(p)])) (a)->s[(p)++] = 0; \
+ } while (0)
/* spfdnsip.c */
-int match_ip4(unsigned char [4],int,char [4]);
-int match_ip6(unsigned char [16],int,char [16]);
+int match_ip4(unsigned char[4], int, char[4]);
+int match_ip6(unsigned char[16], int, char[16]);
int get_prefix(char *);
-int spf_records(stralloc *,stralloc *);
-int spf_include(char *,char *);
-int spf_a(char *,char *);
-int spf_mx(char *,char *);
-int spf_ptr(char *,char *);
-int spf_ip4(char *,char *);
-int spf_ip6(char *,char *);
-int spf_exists(char *,char *);
+int spf_records(stralloc *, stralloc *);
+int spf_include(char *, char *);
+int spf_a(char *, char *);
+int spf_mx(char *, char *);
+int spf_ptr(char *, char *);
+int spf_ip4(char *, char *);
+int spf_ip6(char *, char *);
+int spf_exists(char *, char *);
/* spf.c */
-int spf_query(const char *,const char *,const char *,const char *,const int);
+int spf_query(const char *, const char *, const char *, const char *, const int);
int spf_lookup(stralloc *);
-int spf_mechanism(char *,char *,char *,char *);
-int spf_parse(stralloc *,char *,char *);
-int spf_macros(stralloc *,char *,char *);
-int spf_info(char *,const char *);
+int spf_mechanism(char *, char *, char *, char *);
+int spf_parse(stralloc *, char *, char *);
+int spf_macros(stralloc *, char *, char *);
+int spf_info(char *, const char *);
#endif
-
diff --git a/src/include/srs2.h b/src/include/srs2.h
index e993928..9856636 100644
--- a/src/include/srs2.h
+++ b/src/include/srs2.h
@@ -19,12 +19,12 @@
*/
/* This is ugly, but reasonably safe. */
-#undef TRUE
+#undef TRUE
#define TRUE 1
-#undef FALSE
+#undef FALSE
#define FALSE 0
-#define SRSSEP '='
+#define SRSSEP '='
#define SRS0TAG "SRS0"
#define SRS1TAG "SRS1"
@@ -37,15 +37,15 @@
#define SRS_ERRTYPE_SYNTAX 0x4000
#define SRS_ERRTYPE_SRS 0x8000
-#define SRS_SUCCESS (0)
-#define SRS_ENOTSRSADDRESS (1)
-#define SRS_ENOTREWRITTEN (2)
+#define SRS_SUCCESS (0)
+#define SRS_ENOTSRSADDRESS (1)
+#define SRS_ENOTREWRITTEN (2)
#define SRS_ENOSECRETS (SRS_ERRTYPE_CONFIG | 1)
#define SRS_ESEPARATORINVALID (SRS_ERRTYPE_CONFIG | 2)
-#define SRS_ENOSENDERATSIGN (SRS_ERRTYPE_INPUT | 1)
-#define SRS_EBUFTOOSMALL (SRS_ERRTYPE_INPUT | 2)
+#define SRS_ENOSENDERATSIGN (SRS_ERRTYPE_INPUT | 1)
+#define SRS_EBUFTOOSMALL (SRS_ERRTYPE_INPUT | 2)
#define SRS_ENOSRS0HOST (SRS_ERRTYPE_SYNTAX | 1)
#define SRS_ENOSRS0USER (SRS_ERRTYPE_SYNTAX | 2)
@@ -58,69 +58,67 @@
#define SRS_EHASHTOOSHORT (SRS_ERRTYPE_SYNTAX | 9)
#define SRS_ETIMESTAMPOUTOFDATE (SRS_ERRTYPE_SRS | 1)
-#define SRS_EHASHINVALID (SRS_ERRTYPE_SRS | 2)
+#define SRS_EHASHINVALID (SRS_ERRTYPE_SRS | 2)
#define SRS_ERROR_TYPE(x) ((x) & SRS_ERRTYPE_MASK)
/* SRS implementation */
-#define SRS_IS_SRS_ADDRESS(x) ( \
- (strncasecmp((x),"SRS",3) == 0) && \
- (strchr("01", (x)[3]) != NULL) && \
- (strchr("-+=", (x)[4]) != NULL) \
-)
+#define SRS_IS_SRS_ADDRESS(x) \
+ ((strncasecmp((x), "SRS", 3) == 0) && (strchr("01", (x)[3]) != NULL) \
+ && (strchr("-+=", (x)[4]) != NULL))
typedef void *(*srs_malloc_t)(size_t);
-typedef void *(*srs_realloc_t)(void *,size_t);
+typedef void *(*srs_realloc_t)(void *, size_t);
typedef void (*srs_free_t)(void *);
typedef int srs_bool;
typedef struct _srs_t {
/* Rewriting parameters */
-// stralloc cookies;
+ // stralloc cookies;
char **secrets;
int numsecrets;
char separator;
/* Security parameters */
- int maxage; /* Maximum allowed age in seconds */
+ int maxage; /* Maximum allowed age in seconds */
int hashlen;
int hashmin;
/* Behaviour parameters */
- srs_bool alwaysrewrite; /* Rewrite even into same domain? */
- srs_bool noforward; /* Never perform forwards rewriting */
- srs_bool noreverse; /* Never perform reverse rewriting */
- char **neverrewrite; /* A list of non-rewritten domains */
+ srs_bool alwaysrewrite; /* Rewrite even into same domain? */
+ srs_bool noforward; /* Never perform forwards rewriting */
+ srs_bool noreverse; /* Never perform reverse rewriting */
+ char **neverrewrite; /* A list of non-rewritten domains */
} srs_t;
/* Interface */
-int srs_set_malloc(srs_malloc_t m,srs_realloc_t r,srs_free_t f);
+int srs_set_malloc(srs_malloc_t m, srs_realloc_t r, srs_free_t f);
srs_t *srs_new();
void srs_init(srs_t *);
void srs_free(srs_t *);
-int srs_forward(srs_t *,char *,int,const char *,const char *);
-int srs_forward_alloc(srs_t *,char **,const char *,const char *);
-int srs_reverse(srs_t *,char *,int, const char *);
-int srs_reverse_alloc(srs_t *,char **,const char *);
+int srs_forward(srs_t *, char *, int, const char *, const char *);
+int srs_forward_alloc(srs_t *, char **, const char *, const char *);
+int srs_reverse(srs_t *, char *, int, const char *);
+int srs_reverse_alloc(srs_t *, char **, const char *);
const char *srs_strerror(int);
-int srs_add_secret(srs_t *,const char *);
-const char * srs_get_secret(srs_t *,int);
- /* You probably shouldn't call these. */
-int srs_timestamp_create(srs_t *,char *,time_t);
-int srs_timestamp_check(srs_t *,const char *);
-
-#define SRS_PARAM_DECLARE(n, t) \
- int srs_set_ ## n (srs_t *srs, t value); \
- t srs_get_ ## n (srs_t *srs);
-
-SRS_PARAM_DECLARE(alwaysrewrite,srs_bool)
-SRS_PARAM_DECLARE(separator,char)
-SRS_PARAM_DECLARE(maxage,int)
-SRS_PARAM_DECLARE(hashlen,int)
-SRS_PARAM_DECLARE(hashmin,int)
-SRS_PARAM_DECLARE(noforward,srs_bool)
-SRS_PARAM_DECLARE(noreverse,srs_bool)
-
-#endif /* SRS2_H */
+int srs_add_secret(srs_t *, const char *);
+const char *srs_get_secret(srs_t *, int);
+/* You probably shouldn't call these. */
+int srs_timestamp_create(srs_t *, char *, time_t);
+int srs_timestamp_check(srs_t *, const char *);
+
+#define SRS_PARAM_DECLARE(n, t) \
+ int srs_set_##n(srs_t *srs, t value); \
+ t srs_get_##n(srs_t *srs);
+
+SRS_PARAM_DECLARE(alwaysrewrite, srs_bool)
+SRS_PARAM_DECLARE(separator, char)
+SRS_PARAM_DECLARE(maxage, int)
+SRS_PARAM_DECLARE(hashlen, int)
+SRS_PARAM_DECLARE(hashmin, int)
+SRS_PARAM_DECLARE(noforward, srs_bool)
+SRS_PARAM_DECLARE(noreverse, srs_bool)
+
+#endif /* SRS2_H */
diff --git a/src/include/strset.h b/src/include/strset.h
index 4a5703e..e3a2e88 100644
--- a/src/include/strset.h
+++ b/src/include/strset.h
@@ -3,27 +3,23 @@
#include "uint_t.h"
-typedef struct strset_list
-{
+typedef struct strset_list {
uint32 h;
int next;
-}
-strset_list;
+} strset_list;
-typedef struct
-{
- int mask; /* mask + 1 is power of 2, size of hash table */
- int n; /* number of entries used in list and x */
- int a; /* number of entries allocated in list and x */
- int *first; /* first[h] is front of hash list h */
+typedef struct {
+ int mask; /* mask + 1 is power of 2, size of hash table */
+ int n; /* number of entries used in list and x */
+ int a; /* number of entries allocated in list and x */
+ int *first; /* first[h] is front of hash list h */
strset_list *p; /* p[i].next is next; p[i].h is hash of x[i] */
- char **x; /* x[i] is entry i */
-}
-strset;
+ char **x; /* x[i] is entry i */
+} strset;
extern uint32 strset_hash(char *);
extern int strset_init(strset *);
-extern char *strset_in(strset *,char *);
-extern int strset_add(strset *,char *);
+extern char *strset_in(strset *, char *);
+extern int strset_add(strset *, char *);
#endif
diff --git a/src/include/tls_remote.h b/src/include/tls_remote.h
index c3c7933..7df0776 100644
--- a/src/include/tls_remote.h
+++ b/src/include/tls_remote.h
@@ -5,7 +5,7 @@
/* the version is like this: 0xMNNFFPPS: major minor fix patch status */
#if OPENSSL_VERSION_NUMBER < 0x00908000L
-# error "Need OpenSSL version at least 0.9.8"
+ #error "Need OpenSSL version at least 0.9.8"
#endif
extern char *tlsdestinfo;
@@ -16,17 +16,17 @@ extern stralloc ciphers;
int tls_domaincerts(const stralloc);
int tls_destination(const stralloc);
-int tlsa_check(const STACK_OF(X509) *,const stralloc,const unsigned long);
-int tls_fingerprint(X509 *,const char *,const int);
-int tls_chainfile(SSL_CTX *,const char *);
-int tls_certkey(SSL_CTX *,const char *,const char *,char *);
-int tls_conn(SSL *,int);
-int tls_setup(int,char *,char *);
-int tls_checkpeer(SSL *,X509 *,const stralloc,const int,const int);
+int tlsa_check(const STACK_OF(X509) *, const stralloc, const unsigned long);
+int tls_fingerprint(X509 *, const char *, const int);
+int tls_chainfile(SSL_CTX *, const char *);
+int tls_certkey(SSL_CTX *, const char *, const char *, char *);
+int tls_conn(SSL *, int);
+int tls_setup(int, char *, char *);
+int tls_checkpeer(SSL *, X509 *, const stralloc, const int, const int);
int tls_checkcrl(SSL *);
int tls_error(void);
int tls_exit(SSL *);
-int utf8string(unsigned char *,int);
+int utf8string(unsigned char *, int);
#endif
diff --git a/src/include/token822.h b/src/include/token822.h
index 42c909f..e1cef4a 100644
--- a/src/include/token822.h
+++ b/src/include/token822.h
@@ -9,9 +9,9 @@ struct token822 {
int slen;
};
-GEN_ALLOC_typedef(token822_alloc,struct token822,t,len,a)
+GEN_ALLOC_typedef(token822_alloc, struct token822, t, len, a)
-int token822_parse();
+ int token822_parse();
int token822_addrlist();
int token822_unquote();
int token822_unparse();
@@ -21,16 +21,16 @@ int token822_ready();
int token822_readyplus();
int token822_append();
-#define TOKEN822_ATOM 1
-#define TOKEN822_QUOTE 2
+#define TOKEN822_ATOM 1
+#define TOKEN822_QUOTE 2
#define TOKEN822_LITERAL 3
#define TOKEN822_COMMENT 4
-#define TOKEN822_LEFT 5
-#define TOKEN822_RIGHT 6
-#define TOKEN822_AT 7
-#define TOKEN822_COMMA 8
-#define TOKEN822_SEMI 9
-#define TOKEN822_COLON 10
-#define TOKEN822_DOT 11
+#define TOKEN822_LEFT 5
+#define TOKEN822_RIGHT 6
+#define TOKEN822_AT 7
+#define TOKEN822_COMMA 8
+#define TOKEN822_SEMI 9
+#define TOKEN822_COLON 10
+#define TOKEN822_DOT 11
#endif
diff --git a/src/include/ucspitls.h b/src/include/ucspitls.h
index 40f8a81..f0505c7 100644
--- a/src/include/ucspitls.h
+++ b/src/include/ucspitls.h
@@ -1,45 +1,46 @@
#ifndef UCSPITLS_H
#define UCSPITLS_H
-#include <openssl/ssl.h>
-#include <openssl/opensslv.h>
#include <openssl/ec.h>
+#include <openssl/opensslv.h>
+#include <openssl/ssl.h>
+
#include "stralloc.h"
-#define SSL_NAME_LEN 256
+#define SSL_NAME_LEN 256
#define OPENSSL_VERSION_NUMBER 0x101010100L
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
-#define ssl_client() (ssl_context(SSLv23_client_method()))
-#define ssl_server() (ssl_context(SSLv23_server_method()))
+ #define ssl_client() (ssl_context(SSLv23_client_method()))
+ #define ssl_server() (ssl_context(SSLv23_server_method()))
#else
-#define ssl_client() (ssl_context(TLS_client_method()))
-#define ssl_server() (ssl_context(TLS_server_method()))
+ #define ssl_client() (ssl_context(TLS_client_method()))
+ #define ssl_server() (ssl_context(TLS_server_method()))
#endif
extern int ssl_errno;
-int ssl_io(SSL *,int,int,unsigned int);
+int ssl_io(SSL *, int, int, unsigned int);
SSL_CTX *ssl_context(SSL_METHOD *);
-int ssl_timeoutconn(SSL *,unsigned int);
-int ssl_timeoutaccept(SSL *,unsigned int);
-SSL *ssl_new(SSL_CTX *,int);
-int ssl_certkey(SSL_CTX *,const char *,const char *,pem_password_cb *);
-int ssl_ca(SSL_CTX *,const char *,const char *,int);
-int ssl_cca(SSL_CTX *,const char *);
-int ssl_ciphers(SSL_CTX *,const char *);
-int ssl_verify(SSL *,const char *);
-int ssl_params(SSL_CTX *,const char *,int);
-int ssl_server_env(SSL *,stralloc *);
-int ssl_client_env(SSL *,stralloc *);
+int ssl_timeoutconn(SSL *, unsigned int);
+int ssl_timeoutaccept(SSL *, unsigned int);
+SSL *ssl_new(SSL_CTX *, int);
+int ssl_certkey(SSL_CTX *, const char *, const char *, pem_password_cb *);
+int ssl_ca(SSL_CTX *, const char *, const char *, int);
+int ssl_cca(SSL_CTX *, const char *);
+int ssl_ciphers(SSL_CTX *, const char *);
+int ssl_verify(SSL *, const char *);
+int ssl_params(SSL_CTX *, const char *, int);
+int ssl_server_env(SSL *, stralloc *);
+int ssl_client_env(SSL *, stralloc *);
char *ssl_error_str(int);
-#define ssl_errstr() (SSL_load_error_strings())
-#define ssl_free(ssl) (SSL_free((ssl)))
+#define ssl_errstr() (SSL_load_error_strings())
+#define ssl_free(ssl) (SSL_free((ssl)))
#define ssl_close(ssl) (close(SSL_get_fd((ssl))))
-#define ssl_pending(ssl) (SSL_pending((ssl)))
-#define ssl_shutdown(ssl) (SSL_shutdown((ssl)))
+#define ssl_pending(ssl) (SSL_pending((ssl)))
+#define ssl_shutdown(ssl) (SSL_shutdown((ssl)))
#define ssl_shutdown_pending(ssl) (SSL_get_shutdown((ssl)) & SSL_RECEIVED_SHUTDOWN)
-#define ssl_shutdown_sent(ssl) (SSL_get_shutdown((ssl)) & SSL_SENT_SHUTDOWN)
+#define ssl_shutdown_sent(ssl) (SSL_get_shutdown((ssl)) & SSL_SENT_SHUTDOWN)
#endif
diff --git a/src/include/wildmat.h b/src/include/wildmat.h
index 501b7e4..99b275b 100644
--- a/src/include/wildmat.h
+++ b/src/include/wildmat.h
@@ -1,6 +1,6 @@
#ifndef WILDMAT_H
#define WILDMAT_H
-extern int wildmat(char *,char *);
+extern int wildmat(char *, char *);
#endif
diff --git a/src/install.c b/src/install.c
index c738fb7..e6f95a9 100644
--- a/src/install.c
+++ b/src/install.c
@@ -1,10 +1,11 @@
-#include <unistd.h>
#include <sys/stat.h>
+#include <unistd.h>
+
#include "buffer.h"
-#include "logmsg.h"
-#include "open.h"
#include "exit.h"
#include "fifo.h"
+#include "logmsg.h"
+#include "open.h"
extern void hier();
@@ -12,41 +13,30 @@ extern void hier();
int fdsourcedir = -1;
-void h(char *home,int uid,int gid,int mode)
+void h(char *home, int uid, int gid, int mode)
{
- if (mkdir(home,0700) == -1)
- if (errno != EEXIST)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",home));
- if (chown(home,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown: ",home));
- if (chmod(home,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod: ",home));
+ if (mkdir(home, 0700) == -1)
+ if (errno != EEXIST) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", home));
+ if (chown(home, uid, gid) == -1) logmsg(WHO, 111, FATAL, B("unable to chown: ", home));
+ if (chmod(home, mode) == -1) logmsg(WHO, 111, FATAL, B("unable to chmod: ", home));
}
-void d(char *home,char *subdir,int uid,int gid,int mode)
+void d(char *home, char *subdir, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
- if (mkdir(subdir,0700) == -1)
- if (errno != EEXIST)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",home,"/",subdir));
- if (chown(subdir,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",subdir));
- if (chmod(subdir,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",subdir));
+ if (chdir(home) == -1) logmsg(WHO, 110, FATAL, B("unable to switch to: ", home));
+ if (mkdir(subdir, 0700) == -1)
+ if (errno != EEXIST) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", home, "/", subdir));
+ if (chown(subdir, uid, gid) == -1) logmsg(WHO, 111, FATAL, B("unable to chown: ", home, "/", subdir));
+ if (chmod(subdir, mode) == -1) logmsg(WHO, 111, FATAL, B("unable to chmod: ", home, "/", subdir));
}
-void p(char *home,char *fifo,int uid,int gid,int mode)
+void p(char *home, char *fifo, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
- if (fifo_make(fifo,0700) == -1)
- if (errno != EEXIST)
- logmsg(WHO,111,FATAL,B("unable to mkfifo: ",home,"/",fifo));
- if (chown(fifo,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",fifo));
- if (chmod(fifo,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",fifo));
+ if (chdir(home) == -1) logmsg(WHO, 110, FATAL, B("unable to switch to: ", home));
+ if (fifo_make(fifo, 0700) == -1)
+ if (errno != EEXIST) logmsg(WHO, 111, FATAL, B("unable to mkfifo: ", home, "/", fifo));
+ if (chown(fifo, uid, gid) == -1) logmsg(WHO, 111, FATAL, B("unable to chown: ", home, "/", fifo));
+ if (chmod(fifo, mode) == -1) logmsg(WHO, 111, FATAL, B("unable to chmod: ", home, "/", fifo));
}
char inbuf[BUFFER_INSIZE];
@@ -54,84 +44,65 @@ buffer bi;
char outbuf[BUFFER_OUTSIZE];
buffer bo;
-void c(char *home,char *subdir,char *file,int uid,int gid,int mode)
+void c(char *home, char *subdir, char *file, int uid, int gid, int mode)
{
int fdin;
int fdout;
- if (fchdir(fdsourcedir) == -1)
- logmsg(WHO,110,FATAL,"unable to switch back to source directory: ");
+ if (fchdir(fdsourcedir) == -1) logmsg(WHO, 110, FATAL, "unable to switch back to source directory: ");
fdin = open_read(file);
- if (fdin == -1)
- logmsg(WHO,111,FATAL,B("unable to read: ",file));
- buffer_init(&bi,read,fdin,inbuf,sizeof(inbuf));
+ if (fdin == -1) logmsg(WHO, 111, FATAL, B("unable to read: ", file));
+ buffer_init(&bi, read, fdin, inbuf, sizeof(inbuf));
- if (chdir(home) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
- if (chdir(subdir) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home,"/",subdir));
+ if (chdir(home) == -1) logmsg(WHO, 110, FATAL, B("unable to switch to: ", home));
+ if (chdir(subdir) == -1) logmsg(WHO, 110, FATAL, B("unable to switch to: ", home, "/", subdir));
fdout = open_trunc(file);
- if (fdout == -1)
- logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
- buffer_init(&bo,write,fdout,outbuf,sizeof(outbuf));
-
- switch (buffer_copy(&bo,&bi)) {
- case -2:
- logmsg(WHO,111,FATAL,B("unable to read: ",file));
- case -3:
- logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
+ if (fdout == -1) logmsg(WHO, 111, FATAL, B("unable to write .../", subdir, "/", file));
+ buffer_init(&bo, write, fdout, outbuf, sizeof(outbuf));
+
+ switch (buffer_copy(&bo, &bi)) {
+ case -2: logmsg(WHO, 111, FATAL, B("unable to read: ", file));
+ case -3: logmsg(WHO, 111, FATAL, B("unable to write .../", subdir, "/", file));
}
close(fdin);
- if (buffer_flush(&bo) == -1)
- logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
- if (fsync(fdout) == -1)
- logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
+ if (buffer_flush(&bo) == -1) logmsg(WHO, 111, FATAL, B("unable to write .../", subdir, "/", file));
+ if (fsync(fdout) == -1) logmsg(WHO, 111, FATAL, B("unable to write .../", subdir, "/", file));
if (close(fdout) == -1) /* NFS silliness */
- logmsg(WHO,111,FATAL,B("unable to write .../",subdir,"/",file));
+ logmsg(WHO, 111, FATAL, B("unable to write .../", subdir, "/", file));
- if (chown(file,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown .../",subdir,"/",file));
- if (chmod(file,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod .../",subdir,"/",file));
+ if (chown(file, uid, gid) == -1) logmsg(WHO, 111, FATAL, B("unable to chown .../", subdir, "/", file));
+ if (chmod(file, mode) == -1) logmsg(WHO, 111, FATAL, B("unable to chmod .../", subdir, "/", file));
}
-void z(char *home,char *file,int len,int uid,int gid,int mode)
+void z(char *home, char *file, int len, int uid, int gid, int mode)
{
int fdout;
- if (chdir(home) == -1)
- logmsg(WHO,110,FATAL,B("unable to switch to: ",home));
+ if (chdir(home) == -1) logmsg(WHO, 110, FATAL, B("unable to switch to: ", home));
fdout = open_trunc(file);
- if (fdout == -1)
- logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
- buffer_init(&bo,write,fdout,outbuf,sizeof(outbuf));
+ if (fdout == -1) logmsg(WHO, 111, FATAL, B("unable to write: ", home, "/", file));
+ buffer_init(&bo, write, fdout, outbuf, sizeof(outbuf));
while (len-- > 0)
- if (buffer_put(&bo,"",1) == -1)
- logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
+ if (buffer_put(&bo, "", 1) == -1) logmsg(WHO, 111, FATAL, B("unable to write: ", home, "/", file));
- if (buffer_flush(&bo) == -1)
- logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
- if (fsync(fdout) == -1)
- logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
+ if (buffer_flush(&bo) == -1) logmsg(WHO, 111, FATAL, B("unable to write: ", home, "/", file));
+ if (fsync(fdout) == -1) logmsg(WHO, 111, FATAL, B("unable to write: ", home, "/", file));
if (close(fdout) == -1) /* NFS silliness */
- logmsg(WHO,111,FATAL,B("unable to write: ",home,"/",file));
+ logmsg(WHO, 111, FATAL, B("unable to write: ", home, "/", file));
- if (chown(file,uid,gid) == -1)
- logmsg(WHO,111,FATAL,B("unable to chown: ",home,"/",file));
- if (chmod(file,mode) == -1)
- logmsg(WHO,111,FATAL,B("unable to chmod: ",home,"/",file));
+ if (chown(file, uid, gid) == -1) logmsg(WHO, 111, FATAL, B("unable to chown: ", home, "/", file));
+ if (chmod(file, mode) == -1) logmsg(WHO, 111, FATAL, B("unable to chmod: ", home, "/", file));
}
int main()
{
fdsourcedir = open_read(".");
- if (fdsourcedir == -1)
- logmsg(WHO,110,FATAL,"unable to open current directory: ");
+ if (fdsourcedir == -1) logmsg(WHO, 110, FATAL, "unable to open current directory: ");
umask(077);
hier();
diff --git a/src/instcheck.c b/src/instcheck.c
index e47da87..126ad11 100644
--- a/src/instcheck.c
+++ b/src/instcheck.c
@@ -1,69 +1,66 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "logmsg.h"
+
#include "exit.h"
+#include "logmsg.h"
+
#include "hier.h"
extern void hier();
#define WHO "instcheck"
-void perm(char *prefix1,char *prefix2,char *prefix3,char *file,int type,int uid,int gid,int mode)
+void perm(char *prefix1, char *prefix2, char *prefix3, char *file, int type, int uid, int gid, int mode)
{
struct stat st;
- if (stat(file,&st) == -1) {
+ if (stat(file, &st) == -1) {
if (errno == ENOENT)
- logmsg(WHO,0,WARN,B("file does nost exist:",prefix1,prefix2,prefix3,file));
+ logmsg(WHO, 0, WARN, B("file does nost exist:", prefix1, prefix2, prefix3, file));
else
- logmsg(WHO,errno,WARN,B("unable to stat: ../",file));
+ logmsg(WHO, errno, WARN, B("unable to stat: ../", file));
return;
}
if ((uid != -1) && (st.st_uid != uid))
- logmsg(WHO,0,WARN,B("file has wrong owner: ",prefix1,prefix2,prefix3,file));
+ logmsg(WHO, 0, WARN, B("file has wrong owner: ", prefix1, prefix2, prefix3, file));
if ((gid != -1) && (st.st_gid != gid))
- logmsg(WHO,0,WARN,B("file has wrong group: ",prefix1,prefix2,prefix3,file));
+ logmsg(WHO, 0, WARN, B("file has wrong group: ", prefix1, prefix2, prefix3, file));
if ((st.st_mode & 07777) != mode)
- logmsg(WHO,0,WARN,B("file has wrong permissions: ",prefix1,prefix2,prefix3,file));
+ logmsg(WHO, 0, WARN, B("file has wrong permissions: ", prefix1, prefix2, prefix3, file));
if ((st.st_mode & S_IFMT) != type)
- logmsg(WHO,0,WARN,B("file has wrong type: ",prefix1,prefix2,prefix3,file));
+ logmsg(WHO, 0, WARN, B("file has wrong type: ", prefix1, prefix2, prefix3, file));
}
-void h(char *home,int uid,int gid,int mode)
+void h(char *home, int uid, int gid, int mode)
{
- perm("","","",home,S_IFDIR,uid,gid,mode);
+ perm("", "", "", home, S_IFDIR, uid, gid, mode);
}
-void d(char *home,char *subdir,int uid,int gid,int mode)
+void d(char *home, char *subdir, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,111,FATAL,B("unable to switch to: ",home));
- perm("",home,"/",subdir,S_IFDIR,uid,gid,mode);
+ if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home));
+ perm("", home, "/", subdir, S_IFDIR, uid, gid, mode);
}
-void p(char *home,char *fifo,int uid,int gid,int mode)
+void p(char *home, char *fifo, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,111,FATAL,B("unable to switch to: ",home));
- perm("",home,"/",fifo,S_IFIFO,uid,gid,mode);
+ if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home));
+ perm("", home, "/", fifo, S_IFIFO, uid, gid, mode);
}
-void c(char *home,char *subdir,char *file,int uid,int gid,int mode)
+void c(char *home, char *subdir, char *file, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,111,FATAL,B("unable to switch to: ",home));
- if (chdir(subdir) == -1)
- logmsg(WHO,111,FATAL,B("unable to switch to: ",home,"/",subdir));
- perm(".../",subdir,"/",file,S_IFREG,uid,gid,mode);
+ if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home));
+ if (chdir(subdir) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home, "/", subdir));
+ perm(".../", subdir, "/", file, S_IFREG, uid, gid, mode);
}
-void z(char *home,char *file,int len,int uid,int gid,int mode)
+void z(char *home, char *file, int len, int uid, int gid, int mode)
{
- if (chdir(home) == -1)
- logmsg(WHO,111,FATAL,B("unable to switch to: ",home));
- perm("",home,"/",file,S_IFREG,uid,gid,mode);
+ if (chdir(home) == -1) logmsg(WHO, 111, FATAL, B("unable to switch to: ", home));
+ perm("", home, "/", file, S_IFREG, uid, gid, mode);
}
int main()
diff --git a/src/ipalloc.c b/src/ipalloc.c
index 390bd7b..c90a1d3 100644
--- a/src/ipalloc.c
+++ b/src/ipalloc.c
@@ -1,7 +1,8 @@
-#include "alloc.h"
-#include "ip.h"
#include "ipalloc.h"
+
+#include "alloc.h"
#include "genalloc.h"
+#include "ip.h"
-GEN_ALLOC_readyplus(ipalloc,struct ip_mx,ix,len,a,i,n,x,22,ipalloc_readyplus)
-GEN_ALLOC_append(ipalloc,struct ip_mx,ix,len,a,i,n,x,22,ipalloc_readyplus,ipalloc_append)
+GEN_ALLOC_readyplus(ipalloc, struct ip_mx, ix, len, a, i, n, x, 22, ipalloc_readyplus)
+ GEN_ALLOC_append(ipalloc, struct ip_mx, ix, len, a, i, n, x, 22, ipalloc_readyplus, ipalloc_append)
diff --git a/src/ipme.c b/src/ipme.c
index ba19722..de217cb 100644
--- a/src/ipme.c
+++ b/src/ipme.c
@@ -1,19 +1,21 @@
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
+#include <ifaddrs.h>
+
#include <net/if.h>
#include <netinet/in.h>
-#include <ifaddrs.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
#ifndef SIOCGIFCONF /* whatever works */
-#include <sys/sockio.h>
+ #include <sys/sockio.h>
#endif
-#include "hassalen.h"
#include "byte.h"
#include "ip.h"
-#include "ipalloc.h"
#include "stralloc.h"
+
+#include "hassalen.h"
+#include "ipalloc.h"
#include "ipme.h"
/** @file ipme.c
@@ -30,8 +32,7 @@ int ipme_is4(struct ip4_address *ip)
if (ipme_init() != 1) return -1;
for (i = 0; i < ipme.len; ++i)
- if (ipme.ix[i].af == AF_INET && byte_equal(&ipme.ix[i].addr,4,ip))
- return 1;
+ if (ipme.ix[i].af == AF_INET && byte_equal(&ipme.ix[i].addr, 4, ip)) return 1;
return 0;
}
@@ -42,8 +43,7 @@ int ipme_is6(struct ip6_address *ip)
if (ipme_init() != 1) return -1;
for (i = 0; i < ipme.len; ++i)
- if (ipme.ix[i].af == AF_INET6 && byte_equal(&ipme.ix[i].addr,16,ip))
- return 1;
+ if (ipme.ix[i].af == AF_INET6 && byte_equal(&ipme.ix[i].addr, 16, ip)) return 1;
return 0;
}
@@ -66,26 +66,26 @@ int ipme_init()
struct ip_mx ix;
if (ipmeok) return 1;
- if (!ipalloc_readyplus(&ipme,0)) return 0;
+ if (!ipalloc_readyplus(&ipme, 0)) return 0;
ipme.len = 0;
ix.pref = 0;
if (getifaddrs(&ifap)) return 0;
- for (ifa = ifap; ifa; ifa = ifa->ifa_next)
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next)
if (ifa->ifa_addr) {
if (ifa->ifa_addr->sa_family == AF_INET) {
- sin = (struct sockaddr_in *) ifa->ifa_addr;
- byte_copy(&ix.addr.ip4,4,&sin->sin_addr);
+ sin = (struct sockaddr_in *)ifa->ifa_addr;
+ byte_copy(&ix.addr.ip4, 4, &sin->sin_addr);
ix.af = AF_INET;
- if (!ipalloc_append(&ipme,&ix)) return 0;
+ if (!ipalloc_append(&ipme, &ix)) return 0;
}
if (ifa->ifa_addr->sa_family == AF_INET6) {
- sin6 = (struct sockaddr_in6 *) ifa->ifa_addr;
- byte_copy(&ix.addr.ip6,16,&sin6->sin6_addr);
+ sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+ byte_copy(&ix.addr.ip6, 16, &sin6->sin6_addr);
ix.af = AF_INET6;
- if (!ipalloc_append(&ipme,&ix)) return 0;
- }
+ if (!ipalloc_append(&ipme, &ix)) return 0;
+ }
}
freeifaddrs(ifap);
diff --git a/src/ipmeprint.c b/src/ipmeprint.c
index 6379219..9c92138 100644
--- a/src/ipmeprint.c
+++ b/src/ipmeprint.c
@@ -1,39 +1,37 @@
-#include <sys/types.h>
-#include <sys/socket.h>
#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "buffer.h"
-#include "ip.h"
-#include "ipme.h"
#include "exit.h"
#include "fmt.h"
+#include "ip.h"
+
+#include "ipme.h"
char ipaddr[IPFMT];
int main()
{
- int j;
+ int j;
- switch (ipme_init()) {
- case 0: buffer_putsflush(buffer_2,"out of memory\n"); _exit(111);
- case -1: buffer_putsflush(buffer_2,"hard error\n"); _exit(100);
- }
+ switch (ipme_init()) {
+ case 0: buffer_putsflush(buffer_2, "out of memory\n"); _exit(111);
+ case -1: buffer_putsflush(buffer_2, "hard error\n"); _exit(100);
+ }
- for (j = 0;j < ipme.len;++j) {
- switch (ipme.ix[j].af) {
- case AF_INET:
- buffer_put(buffer_1,ipaddr,ip4_fmt(ipaddr,&ipme.ix[j].addr.ip4.d));
- break;
- case AF_INET6:
- buffer_put(buffer_1,ipaddr,ip6_fmt(ipaddr,&ipme.ix[j].addr.ip6.d));
- break;
- default:
- buffer_puts(buffer_1,"Unknown address family = ");
- buffer_put(buffer_1,ipaddr,fmt_ulong(ipaddr,ipme.ix[j].af));
- }
- buffer_puts(buffer_1,"\n");
- }
+ for (j = 0; j < ipme.len; ++j) {
+ switch (ipme.ix[j].af) {
+ case AF_INET: buffer_put(buffer_1, ipaddr, ip4_fmt(ipaddr, &ipme.ix[j].addr.ip4.d)); break;
+ case AF_INET6: buffer_put(buffer_1, ipaddr, ip6_fmt(ipaddr, &ipme.ix[j].addr.ip6.d)); break;
+ default:
+ buffer_puts(buffer_1, "Unknown address family = ");
+ buffer_put(buffer_1, ipaddr, fmt_ulong(ipaddr, ipme.ix[j].af));
+ }
+ buffer_puts(buffer_1, "\n");
+ }
- buffer_flush(buffer_1);
- _exit(0);
+ buffer_flush(buffer_1);
+ _exit(0);
}
diff --git a/src/maildir.c b/src/maildir.c
index 8832d75..c360bc2 100644
--- a/src/maildir.c
+++ b/src/maildir.c
@@ -1,15 +1,18 @@
-#include <unistd.h>
-#include <sys/types.h>
+#include "maildir.h"
+
#include <sys/stat.h>
-#include "prioq.h"
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "direntry.h"
#include "env.h"
+#include "logmsg.h"
+#include "str.h"
#include "stralloc.h"
-#include "direntry.h"
+
#include "datetime.h"
#include "now.h"
-#include "str.h"
-#include "maildir.h"
-#include "logmsg.h"
+#include "prioq.h"
#define WHO "maildir"
@@ -17,10 +20,8 @@ int maildir_chdir()
{
char *maildir;
maildir = env_get("MAILDIR");
- if (!maildir)
- logmsg(WHO,111,ERROR,"MAILDIR not set");
- if (chdir(maildir) == -1)
- logmsg(WHO,110,FATAL,B("unable to chdir to: ",maildir));
+ if (!maildir) logmsg(WHO, 111, ERROR, "MAILDIR not set");
+ if (chdir(maildir) == -1) logmsg(WHO, 110, FATAL, B("unable to chdir to: ", maildir));
return 0;
}
@@ -37,13 +38,12 @@ void maildir_clean(stralloc *tmpname)
if (!dir) return;
while ((d = readdir(dir))) {
- if (d->d_name[0] == '.') continue;
- if (!stralloc_copys(tmpname,"tmp/")) break;
- if (!stralloc_cats(tmpname,d->d_name)) break;
- if (!stralloc_0(tmpname)) break;
- if (stat(tmpname->s,&st) == 0)
- if (time > st.st_atime + 129600)
- unlink(tmpname->s);
+ if (d->d_name[0] == '.') continue;
+ if (!stralloc_copys(tmpname, "tmp/")) break;
+ if (!stralloc_cats(tmpname, d->d_name)) break;
+ if (!stralloc_0(tmpname)) break;
+ if (stat(tmpname->s, &st) == 0)
+ if (time > st.st_atime + 129600) unlink(tmpname->s);
}
closedir(dir);
}
@@ -57,26 +57,25 @@ static int append(prioq *pq, stralloc *filenames, char *subdir, datetime_sec tim
struct stat st;
dir = opendir(subdir);
- if (!dir)
- logmsg(WHO,112,FATAL,B("unable to scan $MAILDIR/:",subdir));
+ if (!dir) logmsg(WHO, 112, FATAL, B("unable to scan $MAILDIR/:", subdir));
while ((d = readdir(dir))) {
if (d->d_name[0] == '.') continue;
pos = filenames->len;
- if (!stralloc_cats(filenames,subdir)) break;
- if (!stralloc_cats(filenames,"/")) break;
- if (!stralloc_cats(filenames,d->d_name)) break;
+ if (!stralloc_cats(filenames, subdir)) break;
+ if (!stralloc_cats(filenames, "/")) break;
+ if (!stralloc_cats(filenames, d->d_name)) break;
if (!stralloc_0(filenames)) break;
- if (stat(filenames->s + pos,&st) == 0)
+ if (stat(filenames->s + pos, &st) == 0)
if (st.st_mtime < time) { /* don't want to mix up the order */
pe.dt = st.st_mtime;
pe.id = pos;
- if (!prioq_insert(pq,&pe)) break;
+ if (!prioq_insert(pq, &pe)) break;
}
}
closedir(dir);
- if (d) logmsg(WHO,112,FATAL,B("unable to read $MAILDIR/:",subdir));
+ if (d) logmsg(WHO, 112, FATAL, B("unable to read $MAILDIR/:", subdir));
return 0;
}
@@ -85,13 +84,14 @@ int maildir_scan(prioq *pq, stralloc *filenames, int flagnew, int flagcur)
struct prioq_elt pe;
datetime_sec time;
- if (!stralloc_copys(filenames,"")) return 0;
- while (prioq_min(pq,&pe))
- prioq_delmin(pq);
+ if (!stralloc_copys(filenames, "")) return 0;
+ while (prioq_min(pq, &pe)) prioq_delmin(pq);
time = now();
- if (flagnew) if (append(pq,filenames,"new",time) == -1) return -1;
- if (flagcur) if (append(pq,filenames,"cur",time) == -1) return -1;
+ if (flagnew)
+ if (append(pq, filenames, "new", time) == -1) return -1;
+ if (flagcur)
+ if (append(pq, filenames, "cur", time) == -1) return -1;
return 0;
}
diff --git a/src/maildir2mbox.c b/src/maildir2mbox.c
index ba187e7..5e31951 100644
--- a/src/maildir2mbox.c
+++ b/src/maildir2mbox.c
@@ -1,24 +1,26 @@
-#include <unistd.h>
#include <sys/stat.h>
+#include <unistd.h>
+
+#include "buffer.h"
#include "env.h"
+#include "exit.h"
#include "genalloc.h"
-#include "stralloc.h"
-#include "buffer.h"
#include "getln.h"
+#include "lock.h"
#include "logmsg.h"
#include "open.h"
-#include "lock.h"
-#include "gfrom.h"
#include "str.h"
-#include "exit.h"
-#include "myctime.h"
+#include "stralloc.h"
+
+#include "gfrom.h"
#include "maildir.h"
+#include "myctime.h"
#include "prioq.h"
char *mbox;
char *mboxtmp;
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
stralloc filenames = {0};
prioq pq = {0};
@@ -33,124 +35,118 @@ char outbuf[BUFFER_OUTSIZE];
#define WHO "maildir2mbox"
-void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
+void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
int main()
{
- buffer bi;
- buffer bo;
- struct prioq_elt pe;
- int fdoldmbox;
- int fdnewmbox;
- int fd;
- int match;
- int fdlock;
-
- umask(077);
-
- mbox = env_get("MAIL");
- if (!mbox) logmsg(WHO,111,FATAL,"MAIL not set");
- mboxtmp = env_get("MAILTMP");
- if (!mboxtmp) logmsg(WHO,111,FATAL,"MAILTMP not set");
-
- if (maildir_chdir() == -1)
- logmsg(WHO,110,FATAL,"Can't changet maildir");
- maildir_clean(&filenames);
- if (maildir_scan(&pq,&filenames,1,1) == -1)
- logmsg(WHO,112,FATAL,"Can't read maidir");
-
- if (!prioq_min(&pq,&pe)) _exit(0); /* nothing new */
-
- fdlock = open_append(mbox);
- if (fdlock == -1)
- logmsg(WHO,111,FATAL,B("unable to lock: ",mbox));
- if (lock_ex(fdlock) == -1)
- logmsg(WHO,111,FATAL,B("unable to lock: ",mbox));
-
- fdoldmbox = open_read(mbox);
- if (fdoldmbox == -1)
- logmsg(WHO,112,FATAL,B("unable to read: ",mbox));
-
- fdnewmbox = open_trunc(mboxtmp);
- if (fdnewmbox == -1)
- logmsg(WHO,112,FATAL,B("unable to create: ",mboxtmp));
-
- buffer_init(&bi,read,fdoldmbox,inbuf,sizeof(inbuf));
- buffer_init(&bo,write,fdnewmbox,outbuf,sizeof(outbuf));
-
- switch (buffer_copy(&bo,&bi)) {
- case -2: logmsg(WHO,112,FATAL,B("unable to read: ",mbox));
- case -3: logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- }
-
- while (prioq_min(&pq,&pe)) {
- prioq_delmin(&pq);
- if (!prioq_insert(&pq2,&pe)) die_nomem();
-
- fd = open_read(filenames.s + pe.id);
- if (fd == -1)
- logmsg(WHO,112,FATAL,B("unable to read: $MAILDIR/",filenames.s + pe.id));
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
-
- if (getln(&bi,&line,&match,'\n') != 0)
- logmsg(WHO,112,FATAL,B("unable to read: $MAILDIR/",filenames.s + pe.id));
-
- if (!stralloc_copys(&ufline,"From XXX ")) die_nomem();
- if (match)
- if (stralloc_starts(&line,"Return-Path: <")) {
- if (line.s[14] == '>') {
- if (!stralloc_copys(&ufline,"From MAILER-DAEMON ")) die_nomem();
- } else {
- int i;
- if (!stralloc_ready(&ufline,line.len)) die_nomem();
- if (!stralloc_copys(&ufline,"From ")) die_nomem();
-
- for (i = 14;i < line.len - 2;++i)
- if ((line.s[i] == ' ') || (line.s[i] == '\t'))
- ufline.s[ufline.len++] = '-';
- else
- ufline.s[ufline.len++] = line.s[i];
- if (!stralloc_cats(&ufline," ")) die_nomem();
- }
+ buffer bi;
+ buffer bo;
+ struct prioq_elt pe;
+ int fdoldmbox;
+ int fdnewmbox;
+ int fd;
+ int match;
+ int fdlock;
+
+ umask(077);
+
+ mbox = env_get("MAIL");
+ if (!mbox) logmsg(WHO, 111, FATAL, "MAIL not set");
+ mboxtmp = env_get("MAILTMP");
+ if (!mboxtmp) logmsg(WHO, 111, FATAL, "MAILTMP not set");
+
+ if (maildir_chdir() == -1) logmsg(WHO, 110, FATAL, "Can't changet maildir");
+ maildir_clean(&filenames);
+ if (maildir_scan(&pq, &filenames, 1, 1) == -1) logmsg(WHO, 112, FATAL, "Can't read maidir");
+
+ if (!prioq_min(&pq, &pe)) _exit(0); /* nothing new */
+
+ fdlock = open_append(mbox);
+ if (fdlock == -1) logmsg(WHO, 111, FATAL, B("unable to lock: ", mbox));
+ if (lock_ex(fdlock) == -1) logmsg(WHO, 111, FATAL, B("unable to lock: ", mbox));
+
+ fdoldmbox = open_read(mbox);
+ if (fdoldmbox == -1) logmsg(WHO, 112, FATAL, B("unable to read: ", mbox));
+
+ fdnewmbox = open_trunc(mboxtmp);
+ if (fdnewmbox == -1) logmsg(WHO, 112, FATAL, B("unable to create: ", mboxtmp));
+
+ buffer_init(&bi, read, fdoldmbox, inbuf, sizeof(inbuf));
+ buffer_init(&bo, write, fdnewmbox, outbuf, sizeof(outbuf));
+
+ switch (buffer_copy(&bo, &bi)) {
+ case -2: logmsg(WHO, 112, FATAL, B("unable to read: ", mbox));
+ case -3: logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ }
+
+ while (prioq_min(&pq, &pe)) {
+ prioq_delmin(&pq);
+ if (!prioq_insert(&pq2, &pe)) die_nomem();
+
+ fd = open_read(filenames.s + pe.id);
+ if (fd == -1) logmsg(WHO, 112, FATAL, B("unable to read: $MAILDIR/", filenames.s + pe.id));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
+
+ if (getln(&bi, &line, &match, '\n') != 0)
+ logmsg(WHO, 112, FATAL, B("unable to read: $MAILDIR/", filenames.s + pe.id));
+
+ if (!stralloc_copys(&ufline, "From XXX ")) die_nomem();
+ if (match)
+ if (stralloc_starts(&line, "Return-Path: <")) {
+ if (line.s[14] == '>') {
+ if (!stralloc_copys(&ufline, "From MAILER-DAEMON ")) die_nomem();
+ } else {
+ int i;
+ if (!stralloc_ready(&ufline, line.len)) die_nomem();
+ if (!stralloc_copys(&ufline, "From ")) die_nomem();
+
+ for (i = 14; i < line.len - 2; ++i)
+ if ((line.s[i] == ' ') || (line.s[i] == '\t'))
+ ufline.s[ufline.len++] = '-';
+ else
+ ufline.s[ufline.len++] = line.s[i];
+ if (!stralloc_cats(&ufline, " ")) die_nomem();
+ }
+ }
+ if (!stralloc_cats(&ufline, myctime(pe.dt))) die_nomem();
+ if (buffer_put(&bo, ufline.s, ufline.len) == -1)
+ logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+
+ while (match && line.len) {
+ if (gfrom(line.s, line.len))
+ if (buffer_puts(&bo, ">") == -1) logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ if (buffer_put(&bo, line.s, line.len) == -1)
+ logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ if (!match) {
+ if (buffer_puts(&bo, "\n") == -1) logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ break;
}
- if (!stralloc_cats(&ufline,myctime(pe.dt))) die_nomem();
- if (buffer_put(&bo,ufline.s,ufline.len) == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
-
- while (match && line.len) {
- if (gfrom(line.s,line.len))
- if (buffer_puts(&bo,">") == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- if (buffer_put(&bo,line.s,line.len) == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- if (!match) {
- if (buffer_puts(&bo,"\n") == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- break;
- }
- if (getln(&bi,&line,&match,'\n') != 0)
- logmsg(WHO,112,FATAL,B("unable to read: $MAILDIR/",filenames.s + pe.id));
- }
- if (buffer_puts(&bo,"\n"))
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
-
- close(fd);
- }
-
- if (buffer_flush(&bo) == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- if (fsync(fdnewmbox) == -1)
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- if (close(fdnewmbox) == -1) /* NFS dorks */
- logmsg(WHO,112,FATAL,B("unable to write to: ",mboxtmp));
- if (rename(mboxtmp,mbox) == -1)
- logmsg(WHO,112,FATAL,B("unable to move ",mboxtmp," to: ",mbox));
-
- while (prioq_min(&pq2,&pe)) {
- prioq_delmin(&pq2);
- if (unlink(filenames.s + pe.id) == -1)
- logmsg(WHO,0,WARN,B("$MAILDIR/",filenames.s + pe.id," will be delivered twice; unable to unlink"));
- }
-
- _exit(0);
+ if (getln(&bi, &line, &match, '\n') != 0)
+ logmsg(WHO, 112, FATAL, B("unable to read: $MAILDIR/", filenames.s + pe.id));
+ }
+ if (buffer_puts(&bo, "\n")) logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+
+ close(fd);
+ }
+
+ if (buffer_flush(&bo) == -1) logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ if (fsync(fdnewmbox) == -1) logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ if (close(fdnewmbox) == -1) /* NFS dorks */
+ logmsg(WHO, 112, FATAL, B("unable to write to: ", mboxtmp));
+ if (rename(mboxtmp, mbox) == -1) logmsg(WHO, 112, FATAL, B("unable to move ", mboxtmp, " to: ", mbox));
+
+ while (prioq_min(&pq2, &pe)) {
+ prioq_delmin(&pq2);
+ if (unlink(filenames.s + pe.id) == -1)
+ logmsg(
+ WHO,
+ 0,
+ WARN,
+ B("$MAILDIR/", filenames.s + pe.id, " will be delivered twice; unable to unlink"));
+ }
+
+ _exit(0);
}
diff --git a/src/maildirmake.c b/src/maildirmake.c
index 47edc44..6828df9 100644
--- a/src/maildirmake.c
+++ b/src/maildirmake.c
@@ -1,24 +1,19 @@
#include <sys/stat.h>
#include <unistd.h>
-#include "logmsg.h"
+
#include "exit.h"
+#include "logmsg.h"
#define WHO "maildirmake"
int main(int argc, char **argv)
{
umask(077);
- if (!argv[1])
- logmsg(WHO,100,USAGE,"maildirmake name");
- if (mkdir(argv[1],0700) == -1)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",argv[1]));
- if (chdir(argv[1]) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",argv[1]));
- if (mkdir("tmp",0700) == -1)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",argv[1],"/tmp"));
- if (mkdir("new",0700) == -1)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",argv[1],"/new"));
- if (mkdir("cur",0700) == -1)
- logmsg(WHO,111,FATAL,B("unable to mkdir: ",argv[1],"/cur"));
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "maildirmake name");
+ if (mkdir(argv[1], 0700) == -1) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", argv[1]));
+ if (chdir(argv[1]) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", argv[1]));
+ if (mkdir("tmp", 0700) == -1) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", argv[1], "/tmp"));
+ if (mkdir("new", 0700) == -1) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", argv[1], "/new"));
+ if (mkdir("cur", 0700) == -1) logmsg(WHO, 111, FATAL, B("unable to mkdir: ", argv[1], "/cur"));
_exit(0);
}
diff --git a/src/maildirwatch.c b/src/maildirwatch.c
index aea5cbb..1496e20 100644
--- a/src/maildirwatch.c
+++ b/src/maildirwatch.c
@@ -1,19 +1,24 @@
#include <unistd.h>
-#include "getln.h"
+
#include "buffer.h"
-#include "prioq.h"
-#include "stralloc.h"
-#include "str.h"
#include "exit.h"
-#include "hfield.h"
+#include "getln.h"
#include "logmsg.h"
#include "open.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "headerbody.h"
+#include "hfield.h"
#include "maildir.h"
+#include "prioq.h"
#define WHO "maildirwatch"
-void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
+void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
stralloc recipient = {0};
stralloc sender = {0};
@@ -22,36 +27,42 @@ stralloc text = {0};
void addtext(char *s, int n)
{
- if (!stralloc_catb(&text,s,n)) die_nomem();
- if (text.len > 158) text.len = 158;
+ if (!stralloc_catb(&text, s, n)) die_nomem();
+ if (text.len > 158) text.len = 158;
}
-void dobody(stralloc *h) { addtext(h->s,h->len); }
+void dobody(stralloc *h)
+{
+ addtext(h->s, h->len);
+}
void doheader(stralloc *h)
{
int i;
- switch (hfield_known(h->s,h->len)) {
+ switch (hfield_known(h->s, h->len)) {
case H_SUBJECT:
- i = hfield_skipname(h->s,h->len);
- addtext(h->s + i,h->len - i);
+ i = hfield_skipname(h->s, h->len);
+ addtext(h->s + i, h->len - i);
break;
case H_DELIVEREDTO:
- i = hfield_skipname(h->s,h->len);
+ i = hfield_skipname(h->s, h->len);
if (i < h->len)
- if (!stralloc_copyb(&recipient,h->s + i,h->len - i - 1)) die_nomem();
+ if (!stralloc_copyb(&recipient, h->s + i, h->len - i - 1)) die_nomem();
break;
case H_RETURNPATH:
- i = hfield_skipname(h->s,h->len);
+ i = hfield_skipname(h->s, h->len);
if (i < h->len)
- if (!stralloc_copyb(&sender,h->s + i,h->len - i - 1)) die_nomem();
+ if (!stralloc_copyb(&sender, h->s + i, h->len - i - 1)) die_nomem();
break;
case H_FROM:
- if (!stralloc_copyb(&fromline,h->s,h->len - 1)) die_nomem();
+ if (!stralloc_copyb(&fromline, h->s, h->len - 1)) die_nomem();
break;
}
}
-void finishheader() { ; }
+void finishheader()
+{
+ ;
+}
stralloc filenames = {0};
prioq pq = {0};
@@ -65,54 +76,48 @@ int main()
int fd;
int i;
- if (maildir_chdir() == -1)
- logmsg(WHO,111,FATAL,"Can't change to maildir");
+ if (maildir_chdir() == -1) logmsg(WHO, 111, FATAL, "Can't change to maildir");
for (;;) {
maildir_clean(&filenames);
- if (maildir_scan(&pq,&filenames,1,0) == -1)
- logmsg(WHO,111,FATAL,"Can't read maildir");
+ if (maildir_scan(&pq, &filenames, 1, 0) == -1) logmsg(WHO, 111, FATAL, "Can't read maildir");
- buffer_putsflush(buffer_1,"\033[;H\033[;J");
+ buffer_putsflush(buffer_1, "\033[;H\033[;J");
- while (prioq_min(&pq,&pe)) {
+ while (prioq_min(&pq, &pe)) {
prioq_delmin(&pq);
fd = open_read(filenames.s + pe.id);
if (fd == -1) continue;
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
- if (!stralloc_copys(&sender,"?")) die_nomem();
- if (!stralloc_copys(&recipient,"?")) die_nomem();
- if (!stralloc_copys(&fromline,"")) die_nomem();
- if (!stralloc_copys(&text,"")) die_nomem();
- if (headerbody(&bi,doheader,finishheader,dobody) == -1)
- logmsg(WHO,111,FATAL,"trouble reading new message");
+ if (!stralloc_copys(&sender, "?")) die_nomem();
+ if (!stralloc_copys(&recipient, "?")) die_nomem();
+ if (!stralloc_copys(&fromline, "")) die_nomem();
+ if (!stralloc_copys(&text, "")) die_nomem();
+ if (headerbody(&bi, doheader, finishheader, dobody) == -1)
+ logmsg(WHO, 111, FATAL, "trouble reading new message");
for (i = 0; i < fromline.len; ++i)
- if ((fromline.s[i] < 32) || (fromline.s[i] > 126))
- fromline.s[i] = '/';
+ if ((fromline.s[i] < 32) || (fromline.s[i] > 126)) fromline.s[i] = '/';
for (i = 0; i < sender.len; ++i)
- if ((sender.s[i] < 32) || (sender.s[i] > 126))
- sender.s[i] = '?';
+ if ((sender.s[i] < 32) || (sender.s[i] > 126)) sender.s[i] = '?';
for (i = 0; i < recipient.len; ++i)
- if ((recipient.s[i] < 32) || (recipient.s[i] > 126))
- recipient.s[i] = '?';
+ if ((recipient.s[i] < 32) || (recipient.s[i] > 126)) recipient.s[i] = '?';
for (i = 0; i < text.len; ++i)
- if ((text.s[i] < 32) || (text.s[i] > 126))
- text.s[i] = '/';
- buffer_puts(buffer_1,"FROM ");
- buffer_put(buffer_1,sender.s,sender.len);
- buffer_puts(buffer_1," TO <");
- buffer_put(buffer_1,recipient.s,recipient.len);
- buffer_puts(buffer_1,">\n");
+ if ((text.s[i] < 32) || (text.s[i] > 126)) text.s[i] = '/';
+ buffer_puts(buffer_1, "FROM ");
+ buffer_put(buffer_1, sender.s, sender.len);
+ buffer_puts(buffer_1, " TO <");
+ buffer_put(buffer_1, recipient.s, recipient.len);
+ buffer_puts(buffer_1, ">\n");
if (fromline.len) {
- buffer_puts(buffer_1,"\033[1m");
- buffer_put(buffer_1,fromline.s,fromline.len);
- buffer_puts(buffer_1,"\033[0m\n");
+ buffer_puts(buffer_1, "\033[1m");
+ buffer_put(buffer_1, fromline.s, fromline.len);
+ buffer_puts(buffer_1, "\033[0m\n");
}
- buffer_put(buffer_1,text.s,text.len);
- buffer_puts(buffer_1,"\n\n");
+ buffer_put(buffer_1, text.s, text.len);
+ buffer_puts(buffer_1, "\n\n");
close(fd);
}
diff --git a/src/matchup.c b/src/matchup.c
index 047ea65..06cd481 100644
--- a/src/matchup.c
+++ b/src/matchup.c
@@ -1,52 +1,63 @@
#include <unistd.h>
-#include "genalloc.h"
+
#include "alloc.h"
-#include "stralloc.h"
-#include "logmsg.h"
-#include "getln.h"
#include "buffer.h"
-#include "readwrite.h"
+#include "case.h"
#include "exit.h"
-#include "str.h"
#include "fmt.h"
+#include "genalloc.h"
+#include "getln.h"
+#include "logmsg.h"
+#include "readwrite.h"
#include "scan.h"
-#include "case.h"
+#include "str.h"
+#include "stralloc.h"
#define WHO "matchup"
-void nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
-void die_read() { logmsg(WHO,110,ERROR,"unable to read input: "); }
-void die_write() { logmsg(WHO,110,ERROR,"unable to write output: "); }
-void die_write5() { logmsg(WHO,111,FATAL,"unable to write fd 5: "); }
+void nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
+void die_read()
+{
+ logmsg(WHO, 110, ERROR, "unable to read input: ");
+}
+void die_write()
+{
+ logmsg(WHO, 110, ERROR, "unable to write output: ");
+}
+void die_write5()
+{
+ logmsg(WHO, 111, FATAL, "unable to write fd 5: ");
+}
-void out(char *buf,int len)
-{
- if (buffer_put(buffer_1,buf,len) == -1) die_write();
+void out(char *buf, int len)
+{
+ if (buffer_put(buffer_1, buf, len) == -1) die_write();
}
-void outs(char *buf)
-{
- if (buffer_puts(buffer_1,buf) == -1) die_write();
+void outs(char *buf)
+{
+ if (buffer_puts(buffer_1, buf) == -1) die_write();
}
char buf5[512];
-buffer bo5 = BUFFER_INIT(write,5,buf5,sizeof(buf5));
+buffer bo5 = BUFFER_INIT(write, 5, buf5, sizeof(buf5));
-void out5(char *buf,int len)
-{
- if (buffer_put(&bo5,buf,len) == -1)
- die_write5();
+void out5(char *buf, int len)
+{
+ if (buffer_put(&bo5, buf, len) == -1) die_write5();
}
-void outs5(char *buf)
-{
- if (buffer_puts(&bo5,buf) == -1)
- die_write5();
+void outs5(char *buf)
+{
+ if (buffer_puts(&bo5, buf) == -1) die_write5();
}
-GEN_ALLOC_typedef(ulongalloc,unsigned long,u,len,a)
-GEN_ALLOC_ready(ulongalloc,unsigned long,u,len,a,i,n,x,30,ulongalloc_ready)
-GEN_ALLOC_readyplus(ulongalloc,unsigned long,u,len,a,i,n,x,30,ulongalloc_readyplus)
+GEN_ALLOC_typedef(ulongalloc, unsigned long, u, len, a)
+ GEN_ALLOC_ready(ulongalloc, unsigned long, u, len, a, i, n, x, 30, ulongalloc_ready)
+ GEN_ALLOC_readyplus(ulongalloc, unsigned long, u, len, a, i, n, x, 30, ulongalloc_readyplus)
-char strnum[FMT_ULONG];
+ char strnum[FMT_ULONG];
stralloc pool = {0};
unsigned int poolbytes = 0;
@@ -62,34 +73,34 @@ ulongalloc numz = {0};
ulongalloc sender = {0};
ulongalloc birth = {0};
-int msg_find(unsigned long m)
+int msg_find(unsigned long m)
{
int i;
- for (i = 0; i < nummsg; ++i)
+ for (i = 0; i < nummsg; ++i)
if (msg.u[i] == m) return i;
return -1;
}
-int msg_add(unsigned long m)
+int msg_add(unsigned long m)
{
int i;
- for (i = 0; i < nummsg; ++i)
+ for (i = 0; i < nummsg; ++i)
if (msg.u[i] == m) return i;
i = nummsg++;
- if (!ulongalloc_ready(&msg,nummsg)) nomem();
- if (!ulongalloc_ready(&bytes,nummsg)) nomem();
- if (!ulongalloc_ready(&qp,nummsg)) nomem();
- if (!ulongalloc_ready(&uid,nummsg)) nomem();
- if (!ulongalloc_ready(&numk,nummsg)) nomem();
- if (!ulongalloc_ready(&numd,nummsg)) nomem();
- if (!ulongalloc_ready(&numz,nummsg)) nomem();
- if (!ulongalloc_ready(&sender,nummsg)) nomem();
- if (!ulongalloc_ready(&birth,nummsg)) nomem();
+ if (!ulongalloc_ready(&msg, nummsg)) nomem();
+ if (!ulongalloc_ready(&bytes, nummsg)) nomem();
+ if (!ulongalloc_ready(&qp, nummsg)) nomem();
+ if (!ulongalloc_ready(&uid, nummsg)) nomem();
+ if (!ulongalloc_ready(&numk, nummsg)) nomem();
+ if (!ulongalloc_ready(&numd, nummsg)) nomem();
+ if (!ulongalloc_ready(&numz, nummsg)) nomem();
+ if (!ulongalloc_ready(&sender, nummsg)) nomem();
+ if (!ulongalloc_ready(&birth, nummsg)) nomem();
msg.u[i] = m;
return i;
}
-void msg_kill(int i)
+void msg_kill(int i)
{
poolbytes -= str_len(pool.s + sender.u[i]) + 1;
poolbytes -= str_len(pool.s + birth.u[i]) + 1;
@@ -113,30 +124,30 @@ ulongalloc dchan = {0};
ulongalloc drecip = {0};
ulongalloc dstart = {0};
-int del_find(unsigned long d)
+int del_find(unsigned long d)
{
int i;
- for (i = 0; i < numdel; ++i)
+ for (i = 0; i < numdel; ++i)
if (del.u[i] == d) return i;
return -1;
}
-int del_add(unsigned long d)
+int del_add(unsigned long d)
{
int i;
- for (i = 0; i < numdel; ++i)
+ for (i = 0; i < numdel; ++i)
if (del.u[i] == d) return i;
i = numdel++;
- if (!ulongalloc_ready(&del,numdel)) nomem();
- if (!ulongalloc_ready(&dmsg,numdel)) nomem();
- if (!ulongalloc_ready(&dchan,numdel)) nomem();
- if (!ulongalloc_ready(&drecip,numdel)) nomem();
- if (!ulongalloc_ready(&dstart,numdel)) nomem();
+ if (!ulongalloc_ready(&del, numdel)) nomem();
+ if (!ulongalloc_ready(&dmsg, numdel)) nomem();
+ if (!ulongalloc_ready(&dchan, numdel)) nomem();
+ if (!ulongalloc_ready(&drecip, numdel)) nomem();
+ if (!ulongalloc_ready(&dstart, numdel)) nomem();
del.u[i] = d;
return i;
}
-void del_kill(int i)
+void del_kill(int i)
{
poolbytes -= str_len(pool.s + dchan.u[i]) + 1;
poolbytes -= str_len(pool.s + drecip.u[i]) + 1;
@@ -158,35 +169,35 @@ void garbage()
if (pool.len - poolbytes < poolbytes + 4096) return;
- if (!stralloc_copys(&pool2,"")) nomem();
+ if (!stralloc_copys(&pool2, "")) nomem();
for (i = 0; i < nummsg; ++i) {
x = pool.s + birth.u[i];
birth.u[i] = pool2.len;
- if (!stralloc_cats(&pool2,x)) nomem();
+ if (!stralloc_cats(&pool2, x)) nomem();
if (!stralloc_0(&pool2)) nomem();
x = pool.s + sender.u[i];
sender.u[i] = pool2.len;
- if (!stralloc_cats(&pool2,x)) nomem();
+ if (!stralloc_cats(&pool2, x)) nomem();
if (!stralloc_0(&pool2)) nomem();
}
for (i = 0; i < numdel; ++i) {
x = pool.s + dstart.u[i];
dstart.u[i] = pool2.len;
- if (!stralloc_cats(&pool2,x)) nomem();
+ if (!stralloc_cats(&pool2, x)) nomem();
if (!stralloc_0(&pool2)) nomem();
x = pool.s + dchan.u[i];
dchan.u[i] = pool2.len;
- if (!stralloc_cats(&pool2,x)) nomem();
+ if (!stralloc_cats(&pool2, x)) nomem();
if (!stralloc_0(&pool2)) nomem();
x = pool.s + drecip.u[i];
drecip.u[i] = pool2.len;
- if (!stralloc_cats(&pool2,x)) nomem();
+ if (!stralloc_cats(&pool2, x)) nomem();
if (!stralloc_0(&pool2)) nomem();
}
- if (!stralloc_copy(&pool,&pool2)) nomem();
+ if (!stralloc_copy(&pool, &pool2)) nomem();
poolbytes = pool.len; /* redundant, but doesn't hurt */
}
@@ -199,8 +210,7 @@ int field[FIELDS];
void clear()
{
- while (numdel > 0)
- del_kill(0);
+ while (numdel > 0) del_kill(0);
garbage();
}
@@ -210,23 +220,23 @@ void starting()
unsigned long m;
int dpos;
- scan_ulong(line.s + field[3],&d);
- scan_ulong(line.s + field[5],&m);
+ scan_ulong(line.s + field[3], &d);
+ scan_ulong(line.s + field[5], &m);
dpos = del_add(d);
dmsg.u[dpos] = m;
dstart.u[dpos] = pool.len;
- if (!stralloc_cats(&pool,line.s + field[0])) nomem();
+ if (!stralloc_cats(&pool, line.s + field[0])) nomem();
if (!stralloc_0(&pool)) nomem();
dchan.u[dpos] = pool.len;
- if (!stralloc_cats(&pool,line.s + field[7])) nomem();
+ if (!stralloc_cats(&pool, line.s + field[7])) nomem();
if (!stralloc_0(&pool)) nomem();
drecip.u[dpos] = pool.len;
- if (!stralloc_cats(&pool,line.s + field[8])) nomem();
+ if (!stralloc_cats(&pool, line.s + field[8])) nomem();
if (!stralloc_0(&pool)) nomem();
case_lowers(pool.s + drecip.u[dpos]);
@@ -242,7 +252,7 @@ void delivery()
char *result = "?";
char *reason = "";
- scan_ulong(line.s + field[2],&d);
+ scan_ulong(line.s + field[2], &d);
dpos = del_find(d);
if (dpos == -1) return;
@@ -250,22 +260,19 @@ void delivery()
m = dmsg.u[dpos];
mpos = msg_find(m);
- if (str_start(line.s + field[3],"succ")) {
+ if (str_start(line.s + field[3], "succ")) {
if (mpos != -1) ++numk.u[mpos];
result = "d k ";
reason = line.s + field[4];
- }
- else if (str_start(line.s + field[3],"fail")) {
+ } else if (str_start(line.s + field[3], "fail")) {
if (mpos != -1) ++numd.u[mpos];
result = "d d ";
reason = line.s + field[4];
- }
- else if (str_start(line.s + field[3],"defer")) {
+ } else if (str_start(line.s + field[3], "defer")) {
if (mpos != -1) ++numz.u[mpos];
result = "d z ";
reason = line.s + field[4];
- }
- else if (str_start(line.s + field[3],"report")) {
+ } else if (str_start(line.s + field[3], "report")) {
if (mpos != -1) ++numz.u[mpos];
result = "d z ";
reason = "report_mangled";
@@ -275,22 +282,36 @@ void delivery()
if (mpos != -1) {
outs(pool.s + birth.u[mpos]);
- outs(" "); outs(pool.s + dstart.u[dpos]);
- outs(" "); outs(line.s + field[0]);
- outs(" "); out(strnum,fmt_ulong(strnum,bytes.u[mpos]));
- outs(" "); outs(pool.s + sender.u[mpos]);
- outs(" "); outs(pool.s + dchan.u[dpos]);
- outs("."); outs(pool.s + drecip.u[dpos]);
- outs(" "); out(strnum,fmt_ulong(strnum,qp.u[mpos]));
- outs(" "); out(strnum,fmt_ulong(strnum,uid.u[mpos]));
- outs(" "); outs(reason);
+ outs(" ");
+ outs(pool.s + dstart.u[dpos]);
+ outs(" ");
+ outs(line.s + field[0]);
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, bytes.u[mpos]));
+ outs(" ");
+ outs(pool.s + sender.u[mpos]);
+ outs(" ");
+ outs(pool.s + dchan.u[dpos]);
+ outs(".");
+ outs(pool.s + drecip.u[dpos]);
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, qp.u[mpos]));
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, uid.u[mpos]));
+ outs(" ");
+ outs(reason);
} else {
outs(pool.s + dstart.u[dpos]);
- outs(" "); outs(pool.s + dstart.u[dpos]);
- outs(" "); outs(line.s + field[0]);
- outs(" 0 ? "); outs(pool.s + dchan.u[dpos]);
- outs("."); outs(pool.s + drecip.u[dpos]);
- outs(" ? ? "); outs(reason);
+ outs(" ");
+ outs(pool.s + dstart.u[dpos]);
+ outs(" ");
+ outs(line.s + field[0]);
+ outs(" 0 ? ");
+ outs(pool.s + dchan.u[dpos]);
+ outs(".");
+ outs(pool.s + drecip.u[dpos]);
+ outs(" ? ? ");
+ outs(reason);
}
outs("\n");
@@ -304,7 +325,7 @@ void newmsg()
unsigned long m;
int mpos;
- scan_ulong(line.s + field[3],&m);
+ scan_ulong(line.s + field[3], &m);
mpos = msg_find(m);
if (mpos == -1) return;
msg_kill(mpos);
@@ -316,19 +337,28 @@ void endmsg()
unsigned long m;
int mpos;
- scan_ulong(line.s + field[3],&m);
+ scan_ulong(line.s + field[3], &m);
mpos = msg_find(m);
if (mpos == -1) return;
- outs("m "); outs(pool.s + birth.u[mpos]);
- outs(" "); outs(line.s + field[0]);
- outs(" "); out(strnum,fmt_ulong(strnum,bytes.u[mpos]));
- outs(" "); out(strnum,fmt_ulong(strnum,numk.u[mpos]));
- outs(" "); out(strnum,fmt_ulong(strnum,numd.u[mpos]));
- outs(" "); out(strnum,fmt_ulong(strnum,numz.u[mpos]));
- outs(" "); outs(pool.s + sender.u[mpos]);
- outs(" "); out(strnum,fmt_ulong(strnum,qp.u[mpos]));
- outs(" "); out(strnum,fmt_ulong(strnum,uid.u[mpos]));
+ outs("m ");
+ outs(pool.s + birth.u[mpos]);
+ outs(" ");
+ outs(line.s + field[0]);
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, bytes.u[mpos]));
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, numk.u[mpos]));
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, numd.u[mpos]));
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, numz.u[mpos]));
+ outs(" ");
+ outs(pool.s + sender.u[mpos]);
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, qp.u[mpos]));
+ outs(" ");
+ out(strnum, fmt_ulong(strnum, uid.u[mpos]));
outs("\n");
msg_kill(mpos);
@@ -340,23 +370,23 @@ void info()
unsigned long m;
int mpos;
- scan_ulong(line.s + field[3],&m);
+ scan_ulong(line.s + field[3], &m);
mpos = msg_add(m);
- scan_ulong(line.s + field[5],&bytes.u[mpos]);
- scan_ulong(line.s + field[9],&qp.u[mpos]);
- scan_ulong(line.s + field[11],&uid.u[mpos]);
+ scan_ulong(line.s + field[5], &bytes.u[mpos]);
+ scan_ulong(line.s + field[9], &qp.u[mpos]);
+ scan_ulong(line.s + field[11], &uid.u[mpos]);
numk.u[mpos] = 0;
numd.u[mpos] = 0;
numz.u[mpos] = 0;
birth.u[mpos] = pool.len;
- if (!stralloc_cats(&pool,line.s + field[0])) nomem();
+ if (!stralloc_cats(&pool, line.s + field[0])) nomem();
if (!stralloc_0(&pool)) nomem();
sender.u[mpos] = pool.len;
- if (!stralloc_cats(&pool,line.s + field[7])) nomem();
+ if (!stralloc_cats(&pool, line.s + field[7])) nomem();
if (!stralloc_0(&pool)) nomem();
case_lowers(pool.s + sender.u[mpos]);
@@ -368,13 +398,13 @@ void extra()
unsigned long m;
int mpos;
- scan_ulong(line.s + field[2],&m);
+ scan_ulong(line.s + field[2], &m);
mpos = msg_find(m);
if (mpos == -1) return;
- scan_ulong(line.s + field[3],&numk.u[mpos]);
- scan_ulong(line.s + field[4],&numz.u[mpos]);
- scan_ulong(line.s + field[5],&numd.u[mpos]);
+ scan_ulong(line.s + field[3], &numk.u[mpos]);
+ scan_ulong(line.s + field[4], &numz.u[mpos]);
+ scan_ulong(line.s + field[5], &numd.u[mpos]);
}
void pending()
@@ -384,34 +414,34 @@ void pending()
for (i = 0; i < nummsg; ++i) {
outs5(pool.s + birth.u[i]);
outs5(" info msg ");
- out5(strnum,fmt_ulong(strnum,msg.u[i]));
+ out5(strnum, fmt_ulong(strnum, msg.u[i]));
outs5(": bytes ");
- out5(strnum,fmt_ulong(strnum,bytes.u[i]));
+ out5(strnum, fmt_ulong(strnum, bytes.u[i]));
outs5(" from ");
outs5(pool.s + sender.u[i]);
outs5(" qp ");
- out5(strnum,fmt_ulong(strnum,qp.u[i]));
+ out5(strnum, fmt_ulong(strnum, qp.u[i]));
outs5(" uid ");
- out5(strnum,fmt_ulong(strnum,uid.u[i]));
+ out5(strnum, fmt_ulong(strnum, uid.u[i]));
outs5("\n");
outs5(pool.s + birth.u[i]);
outs5(" extra ");
- out5(strnum,fmt_ulong(strnum,msg.u[i]));
+ out5(strnum, fmt_ulong(strnum, msg.u[i]));
outs5(" ");
- out5(strnum,fmt_ulong(strnum,numk.u[i]));
+ out5(strnum, fmt_ulong(strnum, numk.u[i]));
outs5(" ");
- out5(strnum,fmt_ulong(strnum,numz.u[i]));
+ out5(strnum, fmt_ulong(strnum, numz.u[i]));
outs5(" ");
- out5(strnum,fmt_ulong(strnum,numd.u[i]));
+ out5(strnum, fmt_ulong(strnum, numd.u[i]));
outs5("\n");
}
for (i = 0; i < numdel; ++i) {
outs5(pool.s + dstart.u[i]);
outs5(" starting delivery ");
- out5(strnum,fmt_ulong(strnum,del.u[i]));
+ out5(strnum, fmt_ulong(strnum, del.u[i]));
outs5(": msg ");
- out5(strnum,fmt_ulong(strnum,dmsg.u[i]));
+ out5(strnum, fmt_ulong(strnum, dmsg.u[i]));
outs5(" to ");
outs5(pool.s + dchan.u[i]);
outs5(" ");
@@ -419,7 +449,7 @@ void pending()
outs5("\n");
}
- out5(line.s,line.len);
+ out5(line.s, line.len);
if (buffer_flush(&bo5) == -1) die_write5();
}
@@ -431,23 +461,23 @@ int main()
int j;
char ch;
- if (!stralloc_copys(&pool,"")) nomem();
+ if (!stralloc_copys(&pool, "")) nomem();
- if (!ulongalloc_ready(&msg,1)) nomem();
- if (!ulongalloc_ready(&bytes,1)) nomem();
- if (!ulongalloc_ready(&qp,1)) nomem();
- if (!ulongalloc_ready(&uid,1)) nomem();
- if (!ulongalloc_ready(&numk,1)) nomem();
- if (!ulongalloc_ready(&numd,1)) nomem();
- if (!ulongalloc_ready(&numz,1)) nomem();
- if (!ulongalloc_ready(&del,1)) nomem();
- if (!ulongalloc_ready(&dmsg,1)) nomem();
+ if (!ulongalloc_ready(&msg, 1)) nomem();
+ if (!ulongalloc_ready(&bytes, 1)) nomem();
+ if (!ulongalloc_ready(&qp, 1)) nomem();
+ if (!ulongalloc_ready(&uid, 1)) nomem();
+ if (!ulongalloc_ready(&numk, 1)) nomem();
+ if (!ulongalloc_ready(&numd, 1)) nomem();
+ if (!ulongalloc_ready(&numz, 1)) nomem();
+ if (!ulongalloc_ready(&del, 1)) nomem();
+ if (!ulongalloc_ready(&dmsg, 1)) nomem();
for (;;) {
- if (getln(buffer_0,&line,&match,'\n') == -1) die_read();
+ if (getln(buffer_0, &line, &match, '\n') == -1) die_read();
if (!match) break;
- if (!stralloc_copy(&outline,&line)) nomem();
+ if (!stralloc_copy(&outline, &line)) nomem();
for (i = 0; i < line.len; ++i) {
ch = line.s[i];
@@ -455,29 +485,51 @@ int main()
}
j = 0;
for (i = 0; i < FIELDS; ++i) {
- while (j < line.len) if (line.s[j]) break; else ++j;
+ while (j < line.len)
+ if (line.s[j])
+ break;
+ else
+ ++j;
field[i] = j;
- while (j < line.len) if (!line.s[j]) break; else ++j;
+ while (j < line.len)
+ if (!line.s[j])
+ break;
+ else
+ ++j;
}
if (!stralloc_0(&line)) nomem();
- if (str_equal(line.s + field[1],"status:")) ;
- else if (str_equal(line.s + field[1],"starting")) starting();
- else if (str_equal(line.s + field[1],"delivery")) delivery();
- else if (str_equal(line.s + field[1],"new")) newmsg();
- else if (str_equal(line.s + field[1],"end")) endmsg();
- else if (str_equal(line.s + field[1],"info")) info();
- else if (str_equal(line.s + field[1],"extra")) extra();
- else if (str_equal(line.s + field[1],"running")) clear();
- else if (str_equal(line.s + field[1],"exiting")) clear();
- else if (str_equal(line.s + field[1],"number")) ;
- else if (str_equal(line.s + field[1],"local")) ;
- else if (str_equal(line.s + field[1],"remote")) ;
- else if (str_equal(line.s + field[1],"warning:")) out(outline.s,outline.len);
- else if (str_equal(line.s + field[1],"alert:")) out(outline.s,outline.len);
+ if (str_equal(line.s + field[1], "status:"))
+ ;
+ else if (str_equal(line.s + field[1], "starting"))
+ starting();
+ else if (str_equal(line.s + field[1], "delivery"))
+ delivery();
+ else if (str_equal(line.s + field[1], "new"))
+ newmsg();
+ else if (str_equal(line.s + field[1], "end"))
+ endmsg();
+ else if (str_equal(line.s + field[1], "info"))
+ info();
+ else if (str_equal(line.s + field[1], "extra"))
+ extra();
+ else if (str_equal(line.s + field[1], "running"))
+ clear();
+ else if (str_equal(line.s + field[1], "exiting"))
+ clear();
+ else if (str_equal(line.s + field[1], "number"))
+ ;
+ else if (str_equal(line.s + field[1], "local"))
+ ;
+ else if (str_equal(line.s + field[1], "remote"))
+ ;
+ else if (str_equal(line.s + field[1], "warning:"))
+ out(outline.s, outline.len);
+ else if (str_equal(line.s + field[1], "alert:"))
+ out(outline.s, outline.len);
else {
outs("? ");
- out(outline.s,outline.len);
+ out(outline.s, outline.len);
}
}
diff --git a/src/md5c.c b/src/md5c.c
index 3143159..3676029 100644
--- a/src/md5c.c
+++ b/src/md5c.c
@@ -23,9 +23,10 @@
documentation and/or software.
*/
+#include <stdint.h>
+
#include "global.h"
#include "md5.h"
-#include <stdint.h>
/* Constants for MD5Transform routine. */
#define S11 7
@@ -45,19 +46,15 @@
#define S43 15
#define S44 21
-static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
-static void Encode PROTO_LIST
- ((unsigned char *, UINT4 *, unsigned int));
-static void Decode PROTO_LIST
- ((UINT4 *, unsigned char *, unsigned int));
-static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
-static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
+static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64]));
+static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int));
+static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int));
+static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int));
+static void MD5_memset PROTO_LIST((POINTER, int, unsigned int));
static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/* F, G, H and I are basic MD5 functions. */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
@@ -66,35 +63,38 @@ static unsigned char PADDING[64] = {
#define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits. */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation. */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
+#define FF(a, b, c, d, x, s, ac) \
+ { \
+ (a) += F((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT((a), (s)); \
+ (a) += (b); \
}
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
+#define GG(a, b, c, d, x, s, ac) \
+ { \
+ (a) += G((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT((a), (s)); \
+ (a) += (b); \
}
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
+#define HH(a, b, c, d, x, s, ac) \
+ { \
+ (a) += H((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT((a), (s)); \
+ (a) += (b); \
}
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
+#define II(a, b, c, d, x, s, ac) \
+ { \
+ (a) += I((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT((a), (s)); \
+ (a) += (b); \
}
/* MD5 initialization. Begins an MD5 operation, writing a new context. */
-void MD5Init (context)
-MD5_CTX *context; /* context */
+void MD5Init(context) MD5_CTX *context; /* context */
{
context->count[0] = context->count[1] = 0;
@@ -110,10 +110,9 @@ MD5_CTX *context; /* context */
operation, processing another message block, and updating the
context. */
-void MD5Update (context, input, inputLen)
-MD5_CTX *context; /* context */
-unsigned char *input; /* input block */
-unsigned int inputLen; /* length of input block */
+void MD5Update(context, input, inputLen) MD5_CTX *context; /* context */
+unsigned char *input; /* input block */
+unsigned int inputLen; /* length of input block */
{
unsigned int i, index, partLen;
@@ -121,157 +120,147 @@ unsigned int inputLen; /* length of input block */
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
- if ((context->count[0] += ((UINT4)inputLen << 3))
- < ((UINT4)inputLen << 3))
- context->count[1]++;
+ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++;
context->count[1] += ((UINT4)inputLen >> 29);
-
+
partLen = 64 - index;
-
+
/* Transform as many times as possible. */
if (inputLen >= partLen) {
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)input, partLen);
- MD5Transform (context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform (context->state, &input[i]);
-
+ MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform(context->state, &input[i]);
+
index = 0;
- }
- else
+ } else
i = 0;
-
+
/* Buffer remaining input */
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)&input[i],
- inputLen-i);
+ MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen - i);
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
the message digest and zeroizing the context. */
-void MD5Final (digest, context)
-unsigned char digest[16]; /* message digest */
-MD5_CTX *context; /* context */
+void MD5Final(digest, context) unsigned char digest[16]; /* message digest */
+MD5_CTX *context; /* context */
{
unsigned char bits[8];
unsigned int index, padLen;
/* Save number of bits */
- Encode (bits, context->count, 8);
+ Encode(bits, context->count, 8);
/* Pad out to 56 mod 64. */
index = (unsigned int)((context->count[0] >> 3) & 0x3f);
padLen = (index < 56) ? (56 - index) : (120 - index);
- MD5Update (context, PADDING, padLen);
-
+ MD5Update(context, PADDING, padLen);
+
/* Append length (before padding) */
- MD5Update (context, bits, 8);
+ MD5Update(context, bits, 8);
/* Store state in digest */
- Encode (digest, context->state, 16);
-
+ Encode(digest, context->state, 16);
+
/* Zeroize sensitive information. */
- MD5_memset ((POINTER)context, 0, sizeof (*context));
+ MD5_memset((POINTER)context, 0, sizeof(*context));
}
/* MD5 basic transformation. Transforms state based on block. */
-static void MD5Transform (state, block)
-UINT4 state[4];
+static void MD5Transform(state, block) UINT4 state[4];
unsigned char block[64];
{
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode (x, block, 64);
+
+ Decode(x, block, 64);
/* Round 1 */
- FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
- FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
- FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
- FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
- FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
- FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
- FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
- FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
- FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
- FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
- FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
/* Round 2 */
- GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
- GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
- GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
- GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
- GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
- GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
- GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
- GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
- GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
- GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
- GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */
- HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
- HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
- HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
- HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
- HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
- HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
- HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
- HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
- HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
- HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */
- II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
- II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
- II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
- II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
- II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
- II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
- II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
- II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
- II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
- II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
-
+
/* Zeroize sensitive information. */
- MD5_memset ((POINTER)x, 0, sizeof (x));
+ MD5_memset((POINTER)x, 0, sizeof(x));
}
/* Encodes input (UINT4) into output (unsigned char).
Assumes len is a multiple of 4. */
-static void Encode (output, input, len)
-unsigned char *output;
+static void Encode(output, input, len) unsigned char *output;
UINT4 *input;
unsigned int len;
{
@@ -279,49 +268,44 @@ unsigned int len;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (unsigned char)(input[i] & 0xff);
- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
+ output[j + 1] = (unsigned char)((input[i] >> 8) & 0xff);
+ output[j + 2] = (unsigned char)((input[i] >> 16) & 0xff);
+ output[j + 3] = (unsigned char)((input[i] >> 24) & 0xff);
}
}
/* Decodes input (unsigned char) into output (UINT4).
Assumes len is a multiple of 4. */
-static void Decode (output, input, len)
-UINT4 *output;
+static void Decode(output, input, len) UINT4 *output;
unsigned char *input;
unsigned int len;
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
- (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
+ output[i] = ((UINT4)input[j]) | (((UINT4)input[j + 1]) << 8) | (((UINT4)input[j + 2]) << 16)
+ | (((UINT4)input[j + 3]) << 24);
}
/* Note: Replace "for loop" with standard memcpy if possible. */
-static void MD5_memcpy (output, input, len)
-POINTER output;
+static void MD5_memcpy(output, input, len) POINTER output;
POINTER input;
unsigned int len;
{
unsigned int i;
-
- for (i = 0; i < len; i++)
- output[i] = input[i];
+
+ for (i = 0; i < len; i++) output[i] = input[i];
}
/* Note: Replace "for loop" with standard memset if possible. */
-static void MD5_memset (output, value, len)
-POINTER output;
+static void MD5_memset(output, value, len) POINTER output;
int value;
unsigned int len;
{
unsigned int i;
-
- for (i = 0; i < len; i++)
- ((char *)output)[i] = (char)value;
+
+ for (i = 0; i < len; i++) ((char *)output)[i] = (char)value;
}
diff --git a/src/mfrules.c b/src/mfrules.c
index 9c6240f..be32422 100644
--- a/src/mfrules.c
+++ b/src/mfrules.c
@@ -1,12 +1,13 @@
-#include "alloc.h"
-#include "stralloc.h"
-#include "open.h"
-#include "cdbread.h"
-#include "case.h"
#include "mfrules.h"
-#include "str.h"
+
+#include "alloc.h"
#include "byte.h"
+#include "case.h"
+#include "cdbread.h"
#include "close.h"
+#include "open.h"
+#include "str.h"
+#include "stralloc.h"
/* return -9: problems reading cdb */
/* return -1: key matches; data not */
@@ -29,9 +30,9 @@ static int mffind(char *mf)
int mflen;
int delta;
- switch (cdb_find(&cdb,key.s,key.len)) {
+ switch (cdb_find(&cdb, key.s, key.len)) {
case -1: return -9;
- case 0: return 0;
+ case 0: return 0;
}
datalen = cdb_datalen(&cdb);
@@ -40,61 +41,65 @@ static int mffind(char *mf)
if (!datalen) return 1;
mflen = str_len(mf);
- if (cdb_read(&cdb,data,datalen,cdb_datapos(&cdb)) == -1) {
+ if (cdb_read(&cdb, data, datalen, cdb_datapos(&cdb)) == -1) {
alloc_free(data);
return -9;
}
- x = data; dlen = datalen - 1; /* trailing separator */
-
+ x = data;
+ dlen = datalen - 1; /* trailing separator */
+
while (dlen > 0) {
- plus = byte_rchr(data,dlen,'+');
+ plus = byte_rchr(data, dlen, '+');
x = data + plus + 1;
len = dlen - plus;
delta = (mflen > len) ? mflen - len : 0;
- if (!byte_diff(x,len,mf + delta)) { alloc_free(data); return 2; }
+ if (!byte_diff(x, len, mf + delta)) {
+ alloc_free(data);
+ return 2;
+ }
dlen = plus - 1;
}
alloc_free(data);
return -1;
-}
+}
-int mfsearch(char *ip,char *host,char *info,char *mf)
+int mfsearch(char *ip, char *host, char *info, char *mf)
{
int r;
if (info) {
- if (!stralloc_copys(&key,info)) return -9;
+ if (!stralloc_copys(&key, info)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
- if (!stralloc_cats(&key,"@")) return -9;
- if (!stralloc_cats(&key,ip)) return -9;
+ if (!stralloc_cats(&key, "@")) return -9;
+ if (!stralloc_cats(&key, ip)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
if (host) {
- if (!stralloc_copys(&key,info)) return -9;
- if (!stralloc_cats(&key,"@=")) return -9;
- if (!stralloc_cats(&key,host)) return -9;
+ if (!stralloc_copys(&key, info)) return -9;
+ if (!stralloc_cats(&key, "@=")) return -9;
+ if (!stralloc_cats(&key, host)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
}
}
- if (!stralloc_copys(&key,ip)) return -9;
+ if (!stralloc_copys(&key, ip)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
if (host) {
- if (!stralloc_copys(&key,"=")) return -9;
- if (!stralloc_cats(&key,host)) return -9;
+ if (!stralloc_copys(&key, "=")) return -9;
+ if (!stralloc_cats(&key, host)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
}
- if (!stralloc_copys(&key,ip)) return -9; /* IPv6 */
+ if (!stralloc_copys(&key, ip)) return -9; /* IPv6 */
while (key.len > 0) {
if (ip[key.len - 1] == ':') {
r = mffind(mf);
@@ -103,7 +108,7 @@ int mfsearch(char *ip,char *host,char *info,char *mf)
--key.len;
}
- if (!stralloc_copys(&key,ip)) return -9; /* IPv4 */
+ if (!stralloc_copys(&key, ip)) return -9; /* IPv4 */
while (key.len > 0) {
if (ip[key.len - 1] == '.') {
r = mffind(mf);
@@ -115,30 +120,30 @@ int mfsearch(char *ip,char *host,char *info,char *mf)
if (host) {
while (*host) {
if (*host == '.') {
- if (!stralloc_copys(&key,"=")) return -9;
- if (!stralloc_cats(&key,host)) return -9;
+ if (!stralloc_copys(&key, "=")) return -9;
+ if (!stralloc_cats(&key, host)) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
}
++host;
}
- if (!stralloc_copys(&key,"=")) return -9;
+ if (!stralloc_copys(&key, "=")) return -9;
r = mffind(mf);
if (r < -1 || r > 0) return r;
}
key.len = 0;
-/* return mffind(mf); */
+ /* return mffind(mf); */
return -1;
}
-int mfrules(int fd,char *ip,char *host,char *info,char *mf)
+int mfrules(int fd, char *ip, char *host, char *info, char *mf)
{
int r;
- cdb_init(&cdb,fd);
+ cdb_init(&cdb, fd);
case_lowers(mf);
- r = mfsearch(ip,host,info,mf);
+ r = mfsearch(ip, host, info, mf);
cdb_free(&cdb);
close(fd);
diff --git a/src/myctime.c b/src/myctime.c
index 6f554c9..ebb01ba 100644
--- a/src/myctime.c
+++ b/src/myctime.c
@@ -1,13 +1,12 @@
-#include "datetime.h"
-#include "fmt.h"
#include "myctime.h"
-static char *daytab[7] = {
-"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
-};
+#include "fmt.h"
+
+#include "datetime.h"
+
+static char *daytab[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
static char *montab[12] = {
-"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
-};
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
static char result[30];
@@ -15,21 +14,21 @@ char *myctime(datetime_sec t)
{
struct datetime dt;
unsigned int len;
- datetime_tai(&dt,t);
+ datetime_tai(&dt, t);
len = 0;
- len += fmt_str(result + len,daytab[dt.wday]);
+ len += fmt_str(result + len, daytab[dt.wday]);
result[len++] = ' ';
- len += fmt_str(result + len,montab[dt.mon]);
+ len += fmt_str(result + len, montab[dt.mon]);
result[len++] = ' ';
- len += fmt_uint0(result + len,dt.mday,2);
+ len += fmt_uint0(result + len, dt.mday, 2);
result[len++] = ' ';
- len += fmt_uint0(result + len,dt.hour,2);
+ len += fmt_uint0(result + len, dt.hour, 2);
result[len++] = ':';
- len += fmt_uint0(result + len,dt.min,2);
+ len += fmt_uint0(result + len, dt.min, 2);
result[len++] = ':';
- len += fmt_uint0(result + len,dt.sec,2);
+ len += fmt_uint0(result + len, dt.sec, 2);
result[len++] = ' ';
- len += fmt_uint(result + len,1900 + dt.year);
+ len += fmt_uint(result + len, 1900 + dt.year);
result[len++] = '\n';
result[len++] = 0;
return result;
diff --git a/src/newaliases.c b/src/newaliases.c
index 98aa095..08106a4 100644
--- a/src/newaliases.c
+++ b/src/newaliases.c
@@ -1,45 +1,47 @@
-#include <unistd.h>
#include <sys/stat.h>
+#include <unistd.h>
+
#include "buffer.h"
-#include "logmsg.h"
+#include "byte.h"
+#include "case.h"
+#include "cdbmake.h"
#include "genalloc.h"
-#include "stralloc.h"
#include "getln.h"
+#include "logmsg.h"
#include "open.h"
-#include "token822.h"
-#include "control.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "case.h"
-#include "cdbmake.h"
-#include "byte.h"
+#include "control.h"
+#include "token822.h"
#define WHO "newaliases"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory");
+ logmsg(WHO, 111, FATAL, "out of memory");
}
void nulbyte()
{
- logmsg(WHO,100,FATAL,"NUL bytes are not permitted");
+ logmsg(WHO, 100, FATAL, "NUL bytes are not permitted");
}
void longaddress()
{
- logmsg(WHO,100,FATAL,"addresses over 800 bytes are not permitted");
+ logmsg(WHO, 100, FATAL, "addresses over 800 bytes are not permitted");
}
void writeerr()
{
- logmsg(WHO,111,FATAL,"unable to write to /etc/aliases.tmp");
+ logmsg(WHO, 111, FATAL, "unable to write to /etc/aliases.tmp");
}
void readerr()
{
- logmsg(WHO,111,FATAL,"unable to read /etc/aliases");
+ logmsg(WHO, 111, FATAL, "unable to read /etc/aliases");
}
void die_control()
{
- logmsg(WHO,111,FATAL,"unable to read controls");
+ logmsg(WHO, 111, FATAL, "unable to read controls");
}
stralloc me = {0};
@@ -53,30 +55,31 @@ void readcontrols()
int fddir;
fddir = open_read(".");
- if (fddir == -1)
- logmsg(WHO,111,FATAL,"unable to open current directory");
+ if (fddir == -1) logmsg(WHO, 111, FATAL, "unable to open current directory");
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
- r = control_readline(&me,"control/me");
+ r = control_readline(&me, "control/me");
if (r == -1) die_control();
- if (!r) if (!stralloc_copys(&me,"me")) nomem();
+ if (!r)
+ if (!stralloc_copys(&me, "me")) nomem();
- r = control_readline(&defaultdomain,"control/defaultdomain");
+ r = control_readline(&defaultdomain, "control/defaultdomain");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&defaultdomain,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&defaultdomain, &me)) nomem();
- r = control_readline(&defaulthost,"control/defaulthost");
+ r = control_readline(&defaulthost, "control/defaulthost");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&defaulthost,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&defaulthost, &me)) nomem();
- r = control_readline(&plusdomain,"control/plusdomain");
+ r = control_readline(&plusdomain, "control/plusdomain");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&plusdomain,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&plusdomain, &me)) nomem();
- if (fchdir(fddir) == -1)
- logmsg(WHO,111,FATAL,"unable to set current directory");
+ if (fchdir(fddir) == -1) logmsg(WHO, 111, FATAL, "unable to set current directory");
}
stralloc target = {0};
@@ -91,18 +94,17 @@ stralloc address = {0};
void gotincl()
{
token822_reverse(&tokaddr);
- if (token822_unquote(&address,&tokaddr) != 1) nomem();
+ if (token822_unquote(&address, &tokaddr) != 1) nomem();
tokaddr.len = 0;
- if (!address.len)
- logmsg(WHO,111,FATAL,"empty :include: filenames not permitted");
- if (byte_chr(address.s,address.len,'\0') < address.len)
- logmsg(WHO,111,FATAL,"NUL not permitted in :include: filenames");
+ if (!address.len) logmsg(WHO, 111, FATAL, "empty :include: filenames not permitted");
+ if (byte_chr(address.s, address.len, '\0') < address.len)
+ logmsg(WHO, 111, FATAL, "NUL not permitted in :include: filenames");
if ((address.s[0] != '.') && (address.s[0] != '/'))
- if (!stralloc_cats(&instr,"./")) nomem();
- if (!stralloc_cat(&instr,&address)) nomem();
- if (!stralloc_cats(&instr,".bin")) nomem();
+ if (!stralloc_cats(&instr, "./")) nomem();
+ if (!stralloc_cat(&instr, &address)) nomem();
+ if (!stralloc_cats(&instr, ".bin")) nomem();
if (!stralloc_0(&instr)) nomem();
}
@@ -111,18 +113,16 @@ void gotaddr()
int i;
int j;
int flaghasat;
-
+
token822_reverse(&tokaddr);
- if (token822_unquote(&address,&tokaddr) != 1) nomem();
+ if (token822_unquote(&address, &tokaddr) != 1) nomem();
+
+ if (!address.len) logmsg(WHO, 111, FATAL, "empty recipient addresses not permitted");
- if (!address.len)
- logmsg(WHO,111,FATAL,"empty recipient addresses not permitted");
-
flaghasat = 0;
for (i = 0; i < tokaddr.len; ++i)
- if (tokaddr.t[i].type == TOKEN822_AT)
- flaghasat = 1;
-
+ if (tokaddr.t[i].type == TOKEN822_AT) flaghasat = 1;
+
tokaddr.len = 0;
if (!address.len) return;
@@ -130,49 +130,51 @@ void gotaddr()
if (!flaghasat)
if (address.s[0] == '/') {
if (!stralloc_0(&address)) nomem();
- logmsg(WHO,111,FATAL,B("file delivery for ",address.s," not supported"));
+ logmsg(WHO, 111, FATAL, B("file delivery for ", address.s, " not supported"));
}
if (!flaghasat)
if (address.s[0] == '|') {
- if (byte_chr(address.s,address.len,'\0') < address.len)
- logmsg(WHO,111,FATAL,"NUL not permitted in program names");
- if (!stralloc_cats(&instr,"!")) nomem();
- if (!stralloc_catb(&instr,address.s + 1,address.len - 1)) nomem();
+ if (byte_chr(address.s, address.len, '\0') < address.len)
+ logmsg(WHO, 111, FATAL, "NUL not permitted in program names");
+ if (!stralloc_cats(&instr, "!")) nomem();
+ if (!stralloc_catb(&instr, address.s + 1, address.len - 1)) nomem();
if (!stralloc_0(&instr)) nomem();
return;
}
if (target.len) {
- if (!stralloc_cats(&instr,"&")) nomem();
- if (!stralloc_cat(&instr,&fulltarget)) nomem();
+ if (!stralloc_cats(&instr, "&")) nomem();
+ if (!stralloc_cat(&instr, &fulltarget)) nomem();
if (!stralloc_0(&instr)) nomem();
}
if (!flaghasat)
- if (!stralloc_cats(&address,"@")) nomem();
+ if (!stralloc_cats(&address, "@")) nomem();
- if (!stralloc_copy(&target,&address)) nomem();
- if (!stralloc_copy(&fulltarget,&address)) nomem();
+ if (!stralloc_copy(&target, &address)) nomem();
+ if (!stralloc_copy(&fulltarget, &address)) nomem();
if (fulltarget.s[fulltarget.len - 1] == '@')
- if (!stralloc_cat(&fulltarget,&defaulthost)) nomem();
+ if (!stralloc_cat(&fulltarget, &defaulthost)) nomem();
if (fulltarget.s[fulltarget.len - 1] == '+') {
fulltarget.s[fulltarget.len - 1] = '.';
- if (!stralloc_cat(&fulltarget,&plusdomain)) nomem();
+ if (!stralloc_cat(&fulltarget, &plusdomain)) nomem();
}
j = 0;
- for (i = 0;i < fulltarget.len;++i) if (fulltarget.s[i] == '@') j = i;
- for (i = j;i < fulltarget.len;++i) if (fulltarget.s[i] == '.') break;
+ for (i = 0; i < fulltarget.len; ++i)
+ if (fulltarget.s[i] == '@') j = i;
+ for (i = j; i < fulltarget.len; ++i)
+ if (fulltarget.s[i] == '.') break;
if (i == fulltarget.len) {
- if (!stralloc_cats(&fulltarget,".")) nomem();
- if (!stralloc_cat(&fulltarget,&defaultdomain)) nomem();
+ if (!stralloc_cats(&fulltarget, ".")) nomem();
+ if (!stralloc_cat(&fulltarget, &defaultdomain)) nomem();
}
if (fulltarget.len > 800) longaddress();
- if (byte_chr(fulltarget.s,fulltarget.len,'\0') < fulltarget.len)
- logmsg(WHO,111,FATAL,"NUL not permitted in recipient addresses");
+ if (byte_chr(fulltarget.s, fulltarget.len, '\0') < fulltarget.len)
+ logmsg(WHO, 111, FATAL, "NUL not permitted in recipient addresses");
}
stralloc line = {0};
@@ -182,7 +184,7 @@ int match;
void parseerr()
{
if (!stralloc_0(&line)) nomem();
- logmsg(WHO,111,FATAL,B("unable to parse this line: ",line.s));
+ logmsg(WHO, 111, FATAL, B("unable to parse this line: ", line.s));
}
void parseline()
@@ -190,29 +192,28 @@ void parseline()
int wordok;
struct token822 *t;
struct token822 *beginning;
-
- switch (token822_parse(&toks,&line,&cbuf)) {
+
+ switch (token822_parse(&toks, &line, &cbuf)) {
case -1: nomem();
- case 0: parseerr();
+ case 0: parseerr();
}
beginning = toks.t;
t = toks.t + toks.len;
wordok = 1;
-
- if (!token822_readyplus(&tokaddr,1)) nomem();
+
+ if (!token822_readyplus(&tokaddr, 1)) nomem();
tokaddr.len = 0;
-
- while (t > beginning)
- switch ((--t)->type) {
- case TOKEN822_SEMI:
- break; /*XXX*/
+
+ while (t > beginning) switch ((--t)->type)
+ {
+ case TOKEN822_SEMI: break; /*XXX*/
case TOKEN822_COLON:
if (t >= beginning + 2)
if (t[-2].type == TOKEN822_COLON)
if (t[-1].type == TOKEN822_ATOM)
if (t[-1].slen == 7)
- if (!byte_diff(t[-1].s,7,"include")) {
+ if (!byte_diff(t[-1].s, 7, "include")) {
gotincl();
t -= 2;
}
@@ -220,18 +221,24 @@ void parseline()
case TOKEN822_RIGHT:
if (tokaddr.len) gotaddr();
while ((t > beginning) && (t[-1].type != TOKEN822_LEFT))
- if (!token822_append(&tokaddr,--t)) nomem();
+ if (!token822_append(&tokaddr, --t)) nomem();
gotaddr();
if (t <= beginning) parseerr();
--t;
- while ((t > beginning) && ((t[-1].type == TOKEN822_COMMENT) || (t[-1].type == TOKEN822_ATOM) || (t[-1].type == TOKEN822_QUOTE) || (t[-1].type == TOKEN822_AT) || (t[-1].type == TOKEN822_DOT)))
+ while ((t > beginning)
+ && ((t[-1].type == TOKEN822_COMMENT) || (t[-1].type == TOKEN822_ATOM)
+ || (t[-1].type == TOKEN822_QUOTE) || (t[-1].type == TOKEN822_AT)
+ || (t[-1].type == TOKEN822_DOT)))
--t;
wordok = 0;
continue;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL:
- if (!wordok) if (tokaddr.len) gotaddr();
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
+ if (!wordok)
+ if (tokaddr.len) gotaddr();
wordok = 0;
- if (!token822_append(&tokaddr,t)) nomem();
+ if (!token822_append(&tokaddr, t)) nomem();
continue;
case TOKEN822_COMMENT:
/* comment is lexically a space; shouldn't affect wordok */
@@ -242,7 +249,7 @@ void parseline()
break;
default:
wordok = 1;
- if (!token822_append(&tokaddr,t)) nomem();
+ if (!token822_append(&tokaddr, t)) nomem();
continue;
}
if (tokaddr.len) gotaddr();
@@ -262,17 +269,17 @@ void doit()
if (!target.len) parseerr();
- if (stralloc_starts(&target,"owner-")) {
- if (!stralloc_copys(&key,"?")) nomem();
- if (!stralloc_catb(&key,target.s + 6,target.len - 6)) nomem();
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,fulltarget.s,fulltarget.len) == -1) writeerr();
+ if (stralloc_starts(&target, "owner-")) {
+ if (!stralloc_copys(&key, "?")) nomem();
+ if (!stralloc_catb(&key, target.s + 6, target.len - 6)) nomem();
+ case_lowerb(key.s, key.len);
+ if (cdb_make_add(&cdb, key.s, key.len, fulltarget.s, fulltarget.len) == -1) writeerr();
}
- if (!stralloc_copys(&key,":")) nomem();
- if (!stralloc_cat(&key,&target)) nomem();
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,instr.s,instr.len) == -1) writeerr();
+ if (!stralloc_copys(&key, ":")) nomem();
+ if (!stralloc_cat(&key, &target)) nomem();
+ case_lowerb(key.s, key.len);
+ if (cdb_make_add(&cdb, key.s, key.len, instr.s, instr.len) == -1) writeerr();
}
int main()
@@ -284,43 +291,43 @@ int main()
fd = open_read("/etc/aliases");
if (fd == -1) readerr();
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
fd = open_trunc("/etc/aliases.tmp");
- if (fd == -1) logmsg(WHO,111,FATAL,"unable to create /etc/aliases.tmp");
- if (cdb_make_start(&cdb,fd) == -1) writeerr();
+ if (fd == -1) logmsg(WHO, 111, FATAL, "unable to create /etc/aliases.tmp");
+ if (cdb_make_start(&cdb, fd) == -1) writeerr();
- if (!stralloc_copys(&line,"")) nomem();
+ if (!stralloc_copys(&line, "")) nomem();
for (;;) {
- if (getln(&bi,&newline,&match,'\n') != 0) readerr();
+ if (getln(&bi, &newline, &match, '\n') != 0) readerr();
if (match && (newline.s[0] == '\n')) continue;
if (match && ((newline.s[0] == ' ') || (newline.s[0] == '\t'))) {
- if (!stralloc_cat(&line,&newline)) nomem();
+ if (!stralloc_cat(&line, &newline)) nomem();
continue;
}
if (line.len)
if (line.s[0] != '#') {
- if (!stralloc_copys(&target,"")) nomem();
- if (!stralloc_copys(&fulltarget,"")) nomem();
- if (!stralloc_copys(&instr,"")) nomem();
+ if (!stralloc_copys(&target, "")) nomem();
+ if (!stralloc_copys(&fulltarget, "")) nomem();
+ if (!stralloc_copys(&instr, "")) nomem();
parseline();
- doit();
+ doit();
}
if (!match) break;
- if (!stralloc_copy(&line,&newline)) nomem();
+ if (!stralloc_copy(&line, &newline)) nomem();
}
if (cdb_make_finish(&cdb) == -1) writeerr();
if (fsync(fd) == -1) writeerr();
if (close(fd) == -1) writeerr(); /* NFS stupidity */
- if (rename("/etc/aliases.tmp","/etc/aliases.cdb") == -1)
- logmsg(WHO,111,FATAL,"unable to move /etc/aliases.tmp to /etc/aliases.cdb");
-
+ if (rename("/etc/aliases.tmp", "/etc/aliases.cdb") == -1)
+ logmsg(WHO, 111, FATAL, "unable to move /etc/aliases.tmp to /etc/aliases.cdb");
+
_exit(0);
}
diff --git a/src/newfield.c b/src/newfield.c
index 6d69ec6..2e6b07f 100644
--- a/src/newfield.c
+++ b/src/newfield.c
@@ -1,9 +1,12 @@
+#include "newfield.h"
+
#include <unistd.h>
+
#include "fmt.h"
-#include "datetime.h"
#include "stralloc.h"
+
#include "date822fmt.h"
-#include "newfield.h"
+#include "datetime.h"
/* "Date: 26 Sep 1995 04:46:53 -0000\n" */
stralloc newfield_date = {0};
@@ -15,10 +18,14 @@ static unsigned int datefmt(char *s, datetime_sec when)
unsigned int i;
unsigned int len;
struct datetime dt;
- datetime_tai(&dt,when);
+ datetime_tai(&dt, when);
len = 0;
- i = fmt_str(s,"Date: "); len += i; if (s) s += i;
- i = date822fmt(s,&dt); len += i; if (s) s += i;
+ i = fmt_str(s, "Date: ");
+ len += i;
+ if (s) s += i;
+ i = date822fmt(s, &dt);
+ len += i;
+ if (s) s += i;
return len;
}
@@ -27,33 +34,57 @@ static unsigned int msgidfmt(char *s, char *idhost, int idhostlen, datetime_sec
unsigned int i;
unsigned int len;
struct datetime dt;
- datetime_tai(&dt,when);
+ datetime_tai(&dt, when);
len = 0;
- i = fmt_str(s,"Message-ID: <"); len += i; if (s) s += i;
- i = fmt_uint(s,dt.year + 1900); len += i; if (s) s += i;
- i = fmt_uint0(s,dt.mon + 1,2); len += i; if (s) s += i;
- i = fmt_uint0(s,dt.mday,2); len += i; if (s) s += i;
- i = fmt_uint0(s,dt.hour,2); len += i; if (s) s += i;
- i = fmt_uint0(s,dt.min,2); len += i; if (s) s += i;
- i = fmt_uint0(s,dt.sec,2); len += i; if (s) s += i;
- i = fmt_str(s,"."); len += i; if (s) s += i;
- i = fmt_uint(s,getpid()); len += i; if (s) s += i;
- i = fmt_str(s,".qmail@"); len += i; if (s) s += i;
- i = fmt_strn(s,idhost,idhostlen); len += i; if (s) s += i;
- i = fmt_str(s,">\n"); len += i; if (s) s += i;
+ i = fmt_str(s, "Message-ID: <");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint(s, dt.year + 1900);
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt.mon + 1, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt.mday, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt.hour, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt.min, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_uint0(s, dt.sec, 2);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ".");
+ len += i;
+ if (s) s += i;
+ i = fmt_uint(s, getpid());
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ".qmail@");
+ len += i;
+ if (s) s += i;
+ i = fmt_strn(s, idhost, idhostlen);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ">\n");
+ len += i;
+ if (s) s += i;
return len;
}
int newfield_datemake(datetime_sec when)
{
- if (!stralloc_ready(&newfield_date,datefmt(FMT_LEN,when))) return 0;
- newfield_date.len = datefmt(newfield_date.s,when);
+ if (!stralloc_ready(&newfield_date, datefmt(FMT_LEN, when))) return 0;
+ newfield_date.len = datefmt(newfield_date.s, when);
return 1;
}
int newfield_msgidmake(char *idhost, int idhostlen, datetime_sec when)
{
- if (!stralloc_ready(&newfield_msgid,msgidfmt(FMT_LEN,idhost,idhostlen,when))) return 0;
- newfield_msgid.len = msgidfmt(newfield_msgid.s,idhost,idhostlen,when);
+ if (!stralloc_ready(&newfield_msgid, msgidfmt(FMT_LEN, idhost, idhostlen, when))) return 0;
+ newfield_msgid.len = msgidfmt(newfield_msgid.s, idhost, idhostlen, when);
return 1;
}
diff --git a/src/newinclude.c b/src/newinclude.c
index 746b6a4..4e1bab2 100644
--- a/src/newinclude.c
+++ b/src/newinclude.c
@@ -1,29 +1,32 @@
#include <sys/stat.h>
#include <unistd.h>
-#include <stdio.h> // rename
+
+#include <stdio.h> // rename
+
#include "buffer.h"
-#include "logmsg.h"
+#include "byte.h"
+#include "env.h"
#include "genalloc.h"
-#include "stralloc.h"
#include "getln.h"
+#include "logmsg.h"
#include "open.h"
-#include "token822.h"
-#include "control.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "byte.h"
-#include "env.h"
+#include "control.h"
+#include "token822.h"
#define WHO "newinclude"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory");
+ logmsg(WHO, 111, FATAL, "out of memory");
}
void usage()
{
- logmsg(WHO,100,USAGE,"newinclude list");
+ logmsg(WHO, 100, USAGE, "newinclude list");
}
char *fnlist;
@@ -40,57 +43,51 @@ buffer bt;
void readerr()
{
- logmsg(WHO,111,FATAL,B("unable to read: ",fnlist));
+ logmsg(WHO, 111, FATAL, B("unable to read: ", fnlist));
}
void writeerr()
{
- logmsg(WHO,111,FATAL,B("unable to write to ",fntmp));
+ logmsg(WHO, 111, FATAL, B("unable to write to ", fntmp));
}
-static void out(char *s,int len)
+static void out(char *s, int len)
{
- if (buffer_put(&bt,s,len) == -1) writeerr();
+ if (buffer_put(&bt, s, len) == -1) writeerr();
}
-void doincl(buf,len)
-char *buf;
+void doincl(buf, len) char *buf;
int len;
{
- if (!len)
- logmsg(WHO,111,FATAL,"empty :include: filenames not permitted");
- if (byte_chr(buf,len,'\n') != len)
- logmsg(WHO,111,FATAL,"newlines not permitted in :include: filenames");
- if (byte_chr(buf,len,'\0') != len)
- logmsg(WHO,111,FATAL,"NUL not permitted in :include: filenames");
- if ((buf[0] != '.') && (buf[0] != '/'))
- out("./",2);
- out(buf,len);
- out("",1);
+ if (!len) logmsg(WHO, 111, FATAL, "empty :include: filenames not permitted");
+ if (byte_chr(buf, len, '\n') != len)
+ logmsg(WHO, 111, FATAL, "newlines not permitted in :include: filenames");
+ if (byte_chr(buf, len, '\0') != len)
+ logmsg(WHO, 111, FATAL, "NUL not permitted in :include: filenames");
+ if ((buf[0] != '.') && (buf[0] != '/')) out("./", 2);
+ out(buf, len);
+ out("", 1);
}
-void dorecip(buf,len)
-char *buf;
+void dorecip(buf, len) char *buf;
int len;
{
- if (!len)
- logmsg(WHO,111,FATAL,"empty recipient addresses not permitted");
- if (byte_chr(buf,len,'\n') != len)
- logmsg(WHO,111,FATAL,"newlines not permitted in recipient addresses");
- if (byte_chr(buf,len,'\0') != len)
- logmsg(WHO,111,FATAL,"NUL not permitted in recipient addresses");
- if (len > 800)
- logmsg(WHO,111,FATAL,"addresses must be under 800 bytes");
+ if (!len) logmsg(WHO, 111, FATAL, "empty recipient addresses not permitted");
+ if (byte_chr(buf, len, '\n') != len)
+ logmsg(WHO, 111, FATAL, "newlines not permitted in recipient addresses");
+ if (byte_chr(buf, len, '\0') != len)
+ logmsg(WHO, 111, FATAL, "NUL not permitted in recipient addresses");
+ if (len > 800) logmsg(WHO, 111, FATAL, "addresses must be under 800 bytes");
if ((buf[len - 1] == ' ') || (buf[len - 1] == '\t'))
- logmsg(WHO,111,FATAL,"spaces and tabs not permitted at ends of addresses");
- out("&",1);
- out(buf,len);
- out("",1);
+ logmsg(WHO, 111, FATAL, "spaces and tabs not permitted at ends of addresses");
+ out("&", 1);
+ out(buf, len);
+ out("", 1);
}
void die_control()
{
- logmsg(WHO,111,FATAL,"unable to read controls");
+ logmsg(WHO, 111, FATAL, "unable to read controls");
}
stralloc me = {0};
@@ -105,36 +102,40 @@ void readcontrols()
char *x;
fddir = open_read(".");
- if (fddir == -1)
- logmsg(WHO,111,FATAL,"unable to open current directory");
+ if (fddir == -1) logmsg(WHO, 111, FATAL, "unable to open current directory");
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
- r = control_readline(&me,"control/me");
+ r = control_readline(&me, "control/me");
if (r == -1) die_control();
- if (!r) if (!stralloc_copys(&me,"me")) nomem();
+ if (!r)
+ if (!stralloc_copys(&me, "me")) nomem();
- r = control_readline(&defaultdomain,"control/defaultdomain");
+ r = control_readline(&defaultdomain, "control/defaultdomain");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&defaultdomain,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&defaultdomain, &me)) nomem();
x = env_get("QMAILDEFAULTDOMAIN");
- if (x) if (!stralloc_copys(&defaultdomain,x)) nomem();
+ if (x)
+ if (!stralloc_copys(&defaultdomain, x)) nomem();
- r = control_readline(&defaulthost,"control/defaulthost");
+ r = control_readline(&defaulthost, "control/defaulthost");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&defaulthost,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&defaulthost, &me)) nomem();
x = env_get("QMAILDEFAULTHOST");
- if (x) if (!stralloc_copys(&defaulthost,x)) nomem();
+ if (x)
+ if (!stralloc_copys(&defaulthost, x)) nomem();
- r = control_readline(&plusdomain,"control/plusdomain");
+ r = control_readline(&plusdomain, "control/plusdomain");
if (r == -1) die_control();
- if (!r) if (!stralloc_copy(&plusdomain,&me)) nomem();
+ if (!r)
+ if (!stralloc_copy(&plusdomain, &me)) nomem();
x = env_get("QMAILPLUSDOMAIN");
- if (x) if (!stralloc_copys(&plusdomain,x)) nomem();
+ if (x)
+ if (!stralloc_copys(&plusdomain, x)) nomem();
- if (fchdir(fddir) == -1)
- logmsg(WHO,111,FATAL,"unable to set current directory");
+ if (fchdir(fddir) == -1) logmsg(WHO, 111, FATAL, "unable to set current directory");
}
stralloc cbuf = {0};
@@ -145,9 +146,9 @@ stralloc address = {0};
void gotincl()
{
token822_reverse(&tokaddr);
- if (token822_unquote(&address,&tokaddr) != 1) nomem();
+ if (token822_unquote(&address, &tokaddr) != 1) nomem();
tokaddr.len = 0;
- doincl(address.s,address.len);
+ doincl(address.s, address.len);
}
void gotaddr()
@@ -155,15 +156,14 @@ void gotaddr()
int i;
int j;
int flaghasat;
-
+
token822_reverse(&tokaddr);
- if (token822_unquote(&address,&tokaddr) != 1) nomem();
-
+ if (token822_unquote(&address, &tokaddr) != 1) nomem();
+
flaghasat = 0;
- for (i = 0;i < tokaddr.len;++i)
- if (tokaddr.t[i].type == TOKEN822_AT)
- flaghasat = 1;
-
+ for (i = 0; i < tokaddr.len; ++i)
+ if (tokaddr.t[i].type == TOKEN822_AT) flaghasat = 1;
+
tokaddr.len = 0;
if (!address.len) return;
@@ -171,31 +171,33 @@ void gotaddr()
if (!flaghasat)
if (address.s[0] == '/') {
if (!stralloc_0(&address)) nomem();
- logmsg(WHO,111,FATAL,B("file delivery for ",address.s," not supported"));
+ logmsg(WHO, 111, FATAL, B("file delivery for ", address.s, " not supported"));
}
if (!flaghasat)
if (address.s[0] == '|') {
if (!stralloc_0(&address)) nomem();
- logmsg(WHO,111,FATAL,B("program delivery for ",address.s," not supported"));
+ logmsg(WHO, 111, FATAL, B("program delivery for ", address.s, " not supported"));
}
if (!flaghasat) {
- if (!stralloc_cats(&address,"@")) nomem();
- if (!stralloc_cat(&address,&defaulthost)) nomem();
+ if (!stralloc_cats(&address, "@")) nomem();
+ if (!stralloc_cat(&address, &defaulthost)) nomem();
}
if (address.s[address.len - 1] == '+') {
address.s[address.len - 1] = '.';
- if (!stralloc_cat(&address,&plusdomain)) nomem();
+ if (!stralloc_cat(&address, &plusdomain)) nomem();
}
j = 0;
- for (i = 0;i < address.len;++i) if (address.s[i] == '@') j = i;
- for (i = j;i < address.len;++i) if (address.s[i] == '.') break;
+ for (i = 0; i < address.len; ++i)
+ if (address.s[i] == '@') j = i;
+ for (i = j; i < address.len; ++i)
+ if (address.s[i] == '.') break;
if (i == address.len) {
- if (!stralloc_cats(&address,".")) nomem();
- if (!stralloc_cat(&address,&defaultdomain)) nomem();
+ if (!stralloc_cats(&address, ".")) nomem();
+ if (!stralloc_cat(&address, &defaultdomain)) nomem();
}
- dorecip(address.s,address.len);
+ dorecip(address.s, address.len);
}
@@ -205,7 +207,7 @@ int match;
void parseerr()
{
if (!stralloc_0(&line)) nomem();
- logmsg(WHO,111,FATAL,B("unable to parse this line: ",line.s));
+ logmsg(WHO, 111, FATAL, B("unable to parse this line: ", line.s));
}
void parseline()
@@ -213,29 +215,28 @@ void parseline()
int wordok;
struct token822 *t;
struct token822 *beginning;
-
- switch (token822_parse(&toks,&line,&cbuf)) {
+
+ switch (token822_parse(&toks, &line, &cbuf)) {
case -1: nomem();
- case 0: parseerr();
+ case 0: parseerr();
}
beginning = toks.t;
t = toks.t + toks.len;
wordok = 1;
-
- if (!token822_readyplus(&tokaddr,1)) nomem();
+
+ if (!token822_readyplus(&tokaddr, 1)) nomem();
tokaddr.len = 0;
-
- while (t > beginning)
- switch ((--t)->type) {
- case TOKEN822_SEMI:
- break; /*XXX*/
+
+ while (t > beginning) switch ((--t)->type)
+ {
+ case TOKEN822_SEMI: break; /*XXX*/
case TOKEN822_COLON:
if (t >= beginning + 2)
if (t[-2].type == TOKEN822_COLON)
if (t[-1].type == TOKEN822_ATOM)
if (t[-1].slen == 7)
- if (!byte_diff(t[-1].s,7,"include")) {
+ if (!byte_diff(t[-1].s, 7, "include")) {
gotincl();
t -= 2;
}
@@ -243,18 +244,24 @@ void parseline()
case TOKEN822_RIGHT:
if (tokaddr.len) gotaddr();
while ((t > beginning) && (t[-1].type != TOKEN822_LEFT))
- if (!token822_append(&tokaddr,--t)) nomem();
+ if (!token822_append(&tokaddr, --t)) nomem();
gotaddr();
if (t <= beginning) parseerr();
--t;
- while ((t > beginning) && ((t[-1].type == TOKEN822_COMMENT) || (t[-1].type == TOKEN822_ATOM) || (t[-1].type == TOKEN822_QUOTE) || (t[-1].type == TOKEN822_AT) || (t[-1].type == TOKEN822_DOT)))
+ while ((t > beginning)
+ && ((t[-1].type == TOKEN822_COMMENT) || (t[-1].type == TOKEN822_ATOM)
+ || (t[-1].type == TOKEN822_QUOTE) || (t[-1].type == TOKEN822_AT)
+ || (t[-1].type == TOKEN822_DOT)))
--t;
wordok = 0;
continue;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL:
- if (!wordok) if (tokaddr.len) gotaddr();
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
+ if (!wordok)
+ if (tokaddr.len) gotaddr();
wordok = 0;
- if (!token822_append(&tokaddr,t)) nomem();
+ if (!token822_append(&tokaddr, t)) nomem();
continue;
case TOKEN822_COMMENT:
/* comment is lexically a space; shouldn't affect wordok */
@@ -265,14 +272,14 @@ void parseline()
break;
default:
wordok = 1;
- if (!token822_append(&tokaddr,t)) nomem();
+ if (!token822_append(&tokaddr, t)) nomem();
continue;
}
if (tokaddr.len) gotaddr();
}
-
-int main(argc,argv)
+
+int main(argc, argv)
int argc;
char **argv;
{
@@ -281,26 +288,27 @@ char **argv;
umask(033);
readcontrols();
- fnlist = argv[1]; if (!fnlist) usage();
+ fnlist = argv[1];
+ if (!fnlist) usage();
- if (!stralloc_copys(&bin,fnlist)) nomem();
- if (!stralloc_cats(&bin,".bin")) nomem();
+ if (!stralloc_copys(&bin, fnlist)) nomem();
+ if (!stralloc_cats(&bin, ".bin")) nomem();
if (!stralloc_0(&bin)) nomem();
- if (!stralloc_copys(&tmp,fnlist)) nomem();
- if (!stralloc_cats(&tmp,".tmp")) nomem();
+ if (!stralloc_copys(&tmp, fnlist)) nomem();
+ if (!stralloc_cats(&tmp, ".tmp")) nomem();
if (!stralloc_0(&tmp)) nomem();
fd = open_read(fnlist);
if (fd == -1) readerr();
- buffer_init(&bi,read,fd,listbuf,sizeof(listbuf));
+ buffer_init(&bi, read, fd, listbuf, sizeof(listbuf));
fd = open_trunc(fntmp);
if (fd == -1) writeerr();
- buffer_init(&bt,write,fd,tmpbuf,sizeof(tmpbuf));
+ buffer_init(&bt, write, fd, tmpbuf, sizeof(tmpbuf));
for (;;) {
- if (getln(&bi,&line,&match,'\n') == -1) readerr();
+ if (getln(&bi, &line, &match, '\n') == -1) readerr();
if (!line.len) break;
if (line.s[0] != '#') parseline();
if (!match) break;
@@ -310,8 +318,7 @@ char **argv;
if (fsync(fd) == -1) writeerr();
if (close(fd) == -1) writeerr(); /* NFS stupidity */
- if (rename(fntmp,fnbin) == -1)
- logmsg(WHO,111,FATAL,B("unable to move ",fntmp," to: ",fnbin));
-
+ if (rename(fntmp, fnbin) == -1) logmsg(WHO, 111, FATAL, B("unable to move ", fntmp, " to: ", fnbin));
+
_exit(0);
}
diff --git a/src/now.c b/src/now.c
index 5ce4d90..dc408e6 100644
--- a/src/now.c
+++ b/src/now.c
@@ -1,8 +1,10 @@
+#include "now.h"
+
#include <time.h>
+
#include "datetime.h"
-#include "now.h"
datetime_sec now()
{
- return time((long *) 0);
+ return time((long *)0);
}
diff --git a/src/predate.c b/src/predate.c
index f6007b3..6512d20 100644
--- a/src/predate.c
+++ b/src/predate.c
@@ -1,20 +1,22 @@
#include <sys/types.h>
-#include <time.h>
#include <unistd.h>
-#include "datetime.h"
-#include "wait.h"
+
+#include <time.h>
+
+#include "buffer.h"
+#include "exit.h"
#include "fd.h"
#include "fmt.h"
#include "logmsg.h"
-#include "buffer.h"
-#include "exit.h"
#include "sig.h"
+#include "wait.h"
+
+#include "datetime.h"
#define WHO "predate"
static char *montab[12] = {
-"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
-};
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
char num[FMT_ULONG];
char outbuf[1024];
@@ -34,25 +36,21 @@ int main(int argc, char **argv)
sig_pipeignore();
- if (!argv[1])
- logmsg(WHO,100,USAGE,"predate child");
+ if (!argv[1]) logmsg(WHO, 100, USAGE, "predate child");
- if (pipe(pi) == -1)
- logmsg(WHO,111,FATAL,"unable to create pipe");
+ if (pipe(pi) == -1) logmsg(WHO, 111, FATAL, "unable to create pipe");
switch (pid = fork()) {
- case -1:
- logmsg(WHO,111,FATAL,"unable to fork");
+ case -1: logmsg(WHO, 111, FATAL, "unable to fork");
case 0:
close(pi[1]);
- if (fd_move(0,pi[0]) == -1)
- logmsg(WHO,111,FATAL,"unable to set up fds");
+ if (fd_move(0, pi[0]) == -1) logmsg(WHO, 111, FATAL, "unable to set up fds");
sig_pipedefault();
- execvp(argv[1],argv + 1);
- logmsg(WHO,111,FATAL,B("unable to run: ",argv[1]));
+ execvp(argv[1], argv + 1);
+ logmsg(WHO, 111, FATAL, B("unable to run: ", argv[1]));
}
close(pi[0]);
- buffer_init(&bo,write,pi[1],outbuf,sizeof(outbuf));
+ buffer_init(&bo, write, pi[1], outbuf, sizeof(outbuf));
time(&now);
@@ -74,40 +72,37 @@ int main(int argc, char **argv)
dt.sec = tm->tm_sec;
local = datetime_untai(&dt);
- buffer_puts(&bo,"Date: ");
- buffer_put(&bo,num,fmt_uint(num,dt.mday));
- buffer_puts(&bo," ");
- buffer_puts(&bo,montab[dt.mon]);
- buffer_puts(&bo," ");
- buffer_put(&bo,num,fmt_uint(num,dt.year + 1900));
- buffer_puts(&bo," ");
- buffer_put(&bo,num,fmt_uint0(num,dt.hour,2));
- buffer_puts(&bo,":");
- buffer_put(&bo,num,fmt_uint0(num,dt.min,2));
- buffer_puts(&bo,":");
- buffer_put(&bo,num,fmt_uint0(num,dt.sec,2));
+ buffer_puts(&bo, "Date: ");
+ buffer_put(&bo, num, fmt_uint(num, dt.mday));
+ buffer_puts(&bo, " ");
+ buffer_puts(&bo, montab[dt.mon]);
+ buffer_puts(&bo, " ");
+ buffer_put(&bo, num, fmt_uint(num, dt.year + 1900));
+ buffer_puts(&bo, " ");
+ buffer_put(&bo, num, fmt_uint0(num, dt.hour, 2));
+ buffer_puts(&bo, ":");
+ buffer_put(&bo, num, fmt_uint0(num, dt.min, 2));
+ buffer_puts(&bo, ":");
+ buffer_put(&bo, num, fmt_uint0(num, dt.sec, 2));
if (local < utc) {
minutes = (utc - local + 30) / 60;
- buffer_puts(&bo," -");
- buffer_put(&bo,num,fmt_uint0(num,minutes / 60,2));
- buffer_put(&bo,num,fmt_uint0(num,minutes % 60,2));
- }
- else {
+ buffer_puts(&bo, " -");
+ buffer_put(&bo, num, fmt_uint0(num, minutes / 60, 2));
+ buffer_put(&bo, num, fmt_uint0(num, minutes % 60, 2));
+ } else {
minutes = (local - utc + 30) / 60;
- buffer_puts(&bo," +");
- buffer_put(&bo,num,fmt_uint0(num,minutes / 60,2));
- buffer_put(&bo,num,fmt_uint0(num,minutes % 60,2));
+ buffer_puts(&bo, " +");
+ buffer_put(&bo, num, fmt_uint0(num, minutes / 60, 2));
+ buffer_put(&bo, num, fmt_uint0(num, minutes % 60, 2));
}
- buffer_puts(&bo,"\n");
- buffer_copy(&bo,buffer_0);
+ buffer_puts(&bo, "\n");
+ buffer_copy(&bo, buffer_0);
buffer_flush(&bo);
close(pi[1]);
- if (wait_pid(&wstat,pid) == -1)
- logmsg(WHO,111,FATAL,"wait failed");
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,"child crashed");
+ if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed");
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed");
_exit(wait_exitcode(wstat));
}
diff --git a/src/preline.c b/src/preline.c
index fb4af06..e61c588 100644
--- a/src/preline.c
+++ b/src/preline.c
@@ -1,28 +1,32 @@
#include <unistd.h>
-#include "fd.h"
+
#include "buffer.h"
-#include "exit.h"
-#include "wait.h"
#include "env.h"
-#include "sig.h"
+#include "exit.h"
+#include "fd.h"
#include "getoptb.h"
#include "logmsg.h"
+#include "sig.h"
+#include "wait.h"
#define WHO "preline"
void die_usage()
{
- logmsg(WHO,100,USAGE,"preline cmd [ arg ... ]");
+ logmsg(WHO, 100, USAGE, "preline cmd [ arg ... ]");
}
-int flagufline = 1; char *ufline;
-int flagrpline = 1; char *rpline;
-int flagdtline = 1; char *dtline;
+int flagufline = 1;
+char *ufline;
+int flagrpline = 1;
+char *rpline;
+int flagdtline = 1;
+char *dtline;
char outbuf[BUFFER_OUTSIZE];
-buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(write, 1, outbuf, sizeof(outbuf));
char inbuf[BUFFER_INSIZE];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
int main(int argc, char **argv)
{
@@ -30,57 +34,50 @@ int main(int argc, char **argv)
int pi[2];
int pid;
int wstat;
-
+
sig_pipeignore();
-
+
if (!(ufline = env_get("UFLINE"))) die_usage();
if (!(rpline = env_get("RPLINE"))) die_usage();
if (!(dtline = env_get("DTLINE"))) die_usage();
-
- while ((opt = getopt(argc,argv,"frdFRD")) != opteof)
- switch (opt) {
+
+ while ((opt = getopt(argc, argv, "frdFRD")) != opteof) switch (opt)
+ {
case 'f': flagufline = 0; break;
case 'r': flagrpline = 0; break;
case 'd': flagdtline = 0; break;
case 'F': flagufline = 1; break;
case 'R': flagrpline = 1; break;
case 'D': flagdtline = 1; break;
- default: die_usage();
+ default: die_usage();
}
argc -= optind;
argv += optind;
if (!*argv) die_usage();
-
- if (pipe(pi) == -1)
- logmsg(WHO,111,FATAL,"unable to create pipe");
+
+ if (pipe(pi) == -1) logmsg(WHO, 111, FATAL, "unable to create pipe");
pid = fork();
- if (pid == -1)
- logmsg(WHO,111,FATAL,"unable to fork");
+ if (pid == -1) logmsg(WHO, 111, FATAL, "unable to fork");
if (pid == 0) {
close(pi[1]);
- if (fd_move(0,pi[0]) == -1)
- logmsg(WHO,111,FATAL,"unable to set up fds");
+ if (fd_move(0, pi[0]) == -1) logmsg(WHO, 111, FATAL, "unable to set up fds");
sig_pipedefault();
- execvp(*argv,argv);
- logmsg(WHO,errno,FATAL,B("unable to run: ",*argv));
+ execvp(*argv, argv);
+ logmsg(WHO, errno, FATAL, B("unable to run: ", *argv));
}
close(pi[0]);
- if (fd_move(1,pi[1]) == -1)
- logmsg(WHO,111,FATAL,"unable to set up fds");
-
- if (flagufline) buffer_puts(&bo,ufline);
- if (flagrpline) buffer_puts(&bo,rpline);
- if (flagdtline) buffer_puts(&bo,dtline);
- if (buffer_copy(&bo,&bi) != 0)
- logmsg(WHO,111,FATAL,"unable to copy input");
+ if (fd_move(1, pi[1]) == -1) logmsg(WHO, 111, FATAL, "unable to set up fds");
+
+ if (flagufline) buffer_puts(&bo, ufline);
+ if (flagrpline) buffer_puts(&bo, rpline);
+ if (flagdtline) buffer_puts(&bo, dtline);
+ if (buffer_copy(&bo, &bi) != 0) logmsg(WHO, 111, FATAL, "unable to copy input");
buffer_flush(&bo);
close(1);
-
- if (wait_pid(&wstat,pid) == -1)
- logmsg(WHO,111,FATAL,"wait failed");
- if (wait_crashed(wstat))
- logmsg(WHO,111,FATAL,"child crashed");
+
+ if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed");
+ if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed");
_exit(wait_exitcode(wstat));
}
diff --git a/src/printforward.c b/src/printforward.c
index 0ab7ad9..594ccad 100644
--- a/src/printforward.c
+++ b/src/printforward.c
@@ -1,43 +1,40 @@
#include <unistd.h>
+
#include "buffer.h"
+#include "cdbread.h"
#include "logmsg.h"
#include "stralloc.h"
-#include "cdbread.h"
#define WHO "printmaillist"
void badformat()
{
- logmsg(WHO,100,FATAL,"bad database format");
+ logmsg(WHO, 100, FATAL, "bad database format");
}
void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory");
+ logmsg(WHO, 111, FATAL, "out of memory");
}
void getch(char *ch)
{
int r;
- r = buffer_get(buffer_0small,ch,1);
- if (r == -1)
- logmsg(WHO,111,FATAL,"unable to read input");
- if (r == 0)
- badformat();
+ r = buffer_get(buffer_0small, ch, 1);
+ if (r == -1) logmsg(WHO, 111, FATAL, "unable to read input");
+ if (r == 0) badformat();
}
void out(char *ch)
{
- if (buffer_put(buffer_1small,ch,1) == -1)
- logmsg(WHO,111,FATAL,"unable to write output");
+ if (buffer_put(buffer_1small, ch, 1) == -1) logmsg(WHO, 111, FATAL, "unable to write output");
}
void printbuf(char *buf)
{
- while (*buf)
- out(buf++);
+ while (*buf) out(buf++);
}
-void printsafe(char *buf,int len)
+void printsafe(char *buf, int len)
{
char ch;
@@ -65,12 +62,10 @@ int main()
int i;
int j;
- for (i = 0; i < 4; ++i)
- getch(buf + i);
+ for (i = 0; i < 4; ++i) getch(buf + i);
eod = cdb_unpack(buf);
- for (i = 4; i < 2048; ++i)
- getch(&ch);
+ for (i = 4; i < 2048; ++i) getch(&ch);
pos = 2048;
while (pos < eod) {
@@ -80,33 +75,32 @@ int main()
klen = cdb_unpack(buf);
dlen = cdb_unpack(buf + 4);
- if (!stralloc_copys(&key,"")) nomem();
+ if (!stralloc_copys(&key, "")) nomem();
if (eod - pos < klen) badformat();
pos += klen;
while (klen) {
--klen;
getch(&ch);
- if (!stralloc_append(&key,&ch)) nomem();
+ if (!stralloc_append(&key, &ch)) nomem();
}
if (eod - pos < dlen) badformat();
pos += dlen;
- if (!stralloc_copys(&data,"")) nomem();
+ if (!stralloc_copys(&data, "")) nomem();
while (dlen) {
--dlen;
getch(&ch);
- if (!stralloc_append(&data,&ch)) nomem();
+ if (!stralloc_append(&data, &ch)) nomem();
}
if (!key.len) badformat();
if (key.s[0] == '?') {
- printsafe(key.s + 1,key.len - 1);
+ printsafe(key.s + 1, key.len - 1);
printbuf(": ?");
- printsafe(data.s,data.len);
+ printsafe(data.s, data.len);
printbuf(";\n");
- }
- else if (key.s[0] == ':') {
- printsafe(key.s + 1,key.len - 1);
+ } else if (key.s[0] == ':') {
+ printsafe(key.s + 1, key.len - 1);
printbuf(":\n");
i = 0;
@@ -114,29 +108,26 @@ int main()
if (!data.s[j]) {
if ((data.s[i] == '.') || (data.s[i] == '/')) {
printbuf(", ");
- printsafe(data.s + i,j - i);
+ printsafe(data.s + i, j - i);
printbuf("\n");
- }
- else if ((data.s[i] == '|') || (data.s[i] == '!')) {
+ } else if ((data.s[i] == '|') || (data.s[i] == '!')) {
printbuf(", ");
- printsafe(data.s + i,j - i);
+ printsafe(data.s + i, j - i);
printbuf("\n");
- }
- else if ((data.s[i] == '&') && (j - i < 900)) {
+ } else if ((data.s[i] == '&') && (j - i < 900)) {
printbuf(", ");
- printsafe(data.s + i,j - i);
+ printsafe(data.s + i, j - i);
printbuf("\n");
- }
- else badformat();
+ } else
+ badformat();
i = j + 1;
}
if (i != j) badformat();
printbuf(";\n");
- }
- else badformat();
+ } else
+ badformat();
}
- if (buffer_flush(buffer_1small) == -1)
- logmsg(WHO,111,FATAL,"unable to write output");
+ if (buffer_flush(buffer_1small) == -1) logmsg(WHO, 111, FATAL, "unable to write output");
_exit(0);
}
diff --git a/src/printmaillist.c b/src/printmaillist.c
index 6edb3b3..8de8b69 100644
--- a/src/printmaillist.c
+++ b/src/printmaillist.c
@@ -1,15 +1,16 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "logmsg.h"
-#include "stralloc.h"
#include "getln.h"
+#include "logmsg.h"
#include "str.h"
+#include "stralloc.h"
#define WHO "printmaillist"
void badformat()
{
- logmsg(WHO,100,FATAL,"bad mailing list format");
+ logmsg(WHO, 100, FATAL, "bad mailing list format");
}
stralloc line = {0};
@@ -18,33 +19,27 @@ int match;
int main()
{
for (;;) {
- if (getln(buffer_1small,&line,&match,'\0') == -1)
- logmsg(WHO,111,FATAL,"unable to read input: ");
+ if (getln(buffer_1small, &line, &match, '\0') == -1)
+ logmsg(WHO, 111, FATAL, "unable to read input: ");
if (!match) {
- if (line.len)
- badformat();
- if (buffer_flush(buffer_1small) == -1)
- logmsg(WHO,111,FATAL,"unable to write output: ");
+ if (line.len) badformat();
+ if (buffer_flush(buffer_1small) == -1) logmsg(WHO, 111, FATAL, "unable to write output: ");
_exit(0);
}
- if (line.s[str_chr(line.s,'\n')]) badformat();
+ if (line.s[str_chr(line.s, '\n')]) badformat();
if (line.s[line.len - 1] == ' ') badformat();
if (line.s[line.len - 1] == '\t') badformat();
if ((line.s[0] == '.') || (line.s[0] == '/')) {
- if (buffer_puts(buffer_1small,line.s) == -1)
- logmsg(WHO,111,FATAL,"unable to write output: ");
- if (buffer_puts(buffer_1small,"\n") == -1)
- logmsg(WHO,111,FATAL,"unable to write output: ");
+ if (buffer_puts(buffer_1small, line.s) == -1) logmsg(WHO, 111, FATAL, "unable to write output: ");
+ if (buffer_puts(buffer_1small, "\n") == -1) logmsg(WHO, 111, FATAL, "unable to write output: ");
continue;
}
if (line.s[0] == '&') {
if (line.len > 900) badformat();
- if (buffer_puts(buffer_1small,line.s) == -1)
- logmsg(WHO,111,FATAL,"unable to write output: ");
- if (buffer_puts(buffer_1small,"\n") == -1)
- logmsg(WHO,111,FATAL,"unable to write output: ");
+ if (buffer_puts(buffer_1small, line.s) == -1) logmsg(WHO, 111, FATAL, "unable to write output: ");
+ if (buffer_puts(buffer_1small, "\n") == -1) logmsg(WHO, 111, FATAL, "unable to write output: ");
continue;
}
diff --git a/src/prioq.c b/src/prioq.c
index 9559d31..7cd29e8 100644
--- a/src/prioq.c
+++ b/src/prioq.c
@@ -1,18 +1,19 @@
+#include "prioq.h"
+
#include "alloc.h"
#include "genalloc.h"
-#include "prioq.h"
-GEN_ALLOC_readyplus(prioq,struct prioq_elt,p,len,a,i,n,x,100,prioq_readyplus)
+GEN_ALLOC_readyplus(prioq, struct prioq_elt, p, len, a, i, n, x, 100, prioq_readyplus)
-int prioq_insert(prioq *pq, struct prioq_elt *pe)
+ int prioq_insert(prioq *pq, struct prioq_elt *pe)
{
int i;
int j;
- if (!prioq_readyplus(pq,1)) return 0;
+ if (!prioq_readyplus(pq, 1)) return 0;
j = pq->len++;
while (j) {
- i = (j - 1)/2;
+ i = (j - 1) / 2;
if (pq->p[i].dt <= pe->dt) break;
pq->p[j] = pq->p[i];
j = i;
@@ -49,6 +50,6 @@ void prioq_delmin(prioq *pq)
pq->p[i] = pq->p[j];
i = j;
}
- pq->p[i] = pq->p[n];
- pq->len = n;
+ pq->p[i] = pq->p[n];
+ pq->len = n;
}
diff --git a/src/prot.c b/src/prot.c
index 5bcddd0..aa685c4 100644
--- a/src/prot.c
+++ b/src/prot.c
@@ -1,21 +1,23 @@
-#include "hasshsgr.h"
#include "prot.h"
+#include "hasshsgr.h"
+
/* XXX: there are more portability problems here waiting to leap out at me */
-int prot_gid(int gid)
+int prot_gid(int gid)
{
#ifdef HASSHORTSETGROUPS
short x[2];
- x[0] = gid; x[1] = 73; /* catch errors */
- if (setgroups(1,x) == -1) return -1;
+ x[0] = gid;
+ x[1] = 73; /* catch errors */
+ if (setgroups(1, x) == -1) return -1;
#else
- if (setgroups(1,&gid) == -1) return -1;
+ if (setgroups(1, &gid) == -1) return -1;
#endif
return setgid(gid); /* _should_ be redundant, but on some systems it isn't */
}
-int prot_uid(int uid)
+int prot_uid(int uid)
{
return setuid(uid);
}
diff --git a/src/qbiff.c b/src/qbiff.c
index b9b55bf..186e524 100644
--- a/src/qbiff.c
+++ b/src/qbiff.c
@@ -1,28 +1,30 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "hasutmp.h"
#ifdef HASUTMP
-#include <utmp.h>
-#ifndef UTMP_FILE
-#ifdef _PATH_UTMP
-#define UTMP_FILE _PATH_UTMP
-#else
-#define UTMP_FILE "/etc/utmp"
-#endif
-#endif
+ #include <utmp.h>
+ #ifndef UTMP_FILE
+ #ifdef _PATH_UTMP
+ #define UTMP_FILE _PATH_UTMP
+ #else
+ #define UTMP_FILE "/etc/utmp"
+ #endif
+ #endif
#else
-#include <utmpx.h>
+ #include <utmpx.h>
#endif
-#include "stralloc.h"
#include "buffer.h"
-#include "open.h"
#include "byte.h"
+#include "env.h"
+#include "exit.h"
+#include "open.h"
#include "str.h"
+#include "stralloc.h"
+
#include "headerbody.h"
#include "hfield.h"
-#include "env.h"
-#include "exit.h"
buffer b;
#ifdef HASUTMP
@@ -46,23 +48,29 @@ stralloc text = {0};
void doit(char *s, int n)
{
- if (!stralloc_catb(&text,s,n)) _exit(0);
+ if (!stralloc_catb(&text, s, n)) _exit(0);
if (text.len > 78) text.len = 78;
}
-void dobody(stralloc *h) { doit(h->s,h->len); }
+void dobody(stralloc *h)
+{
+ doit(h->s, h->len);
+}
void doheader(stralloc *h)
{
int i;
- if (hfield_known(h->s,h->len) == H_SUBJECT) {
- i = hfield_skipname(h->s,h->len);
- doit(h->s + i,h->len - i);
+ if (hfield_known(h->s, h->len) == H_SUBJECT) {
+ i = hfield_skipname(h->s, h->len);
+ doit(h->s + i, h->len - i);
}
}
-void finishheader() { ; }
+void finishheader()
+{
+ ;
+}
int main()
{
@@ -83,58 +91,65 @@ int main()
if (str_len(user) > sizeof(ut->ut_user)) _exit(0);
#endif
- if (!stralloc_copys(&tofrom,"*** TO <")) _exit(0);
- if (!stralloc_cats(&tofrom,userext)) _exit(0);
- if (!stralloc_cats(&tofrom,"> FROM <")) _exit(0);
- if (!stralloc_cats(&tofrom,sender)) _exit(0);
- if (!stralloc_cats(&tofrom,">")) _exit(0);
+ if (!stralloc_copys(&tofrom, "*** TO <")) _exit(0);
+ if (!stralloc_cats(&tofrom, userext)) _exit(0);
+ if (!stralloc_cats(&tofrom, "> FROM <")) _exit(0);
+ if (!stralloc_cats(&tofrom, sender)) _exit(0);
+ if (!stralloc_cats(&tofrom, ">")) _exit(0);
for (i = 0; i < tofrom.len; ++i)
- if ((tofrom.s[i] < 32) || (tofrom.s[i] > 126))
- tofrom.s[i] = '_';
+ if ((tofrom.s[i] < 32) || (tofrom.s[i] > 126)) tofrom.s[i] = '_';
- if (!stralloc_copys(&text," ")) _exit(0);
- if (headerbody(buffer_0,doheader,finishheader,dobody) == -1) _exit(0);
+ if (!stralloc_copys(&text, " ")) _exit(0);
+ if (headerbody(buffer_0, doheader, finishheader, dobody) == -1) _exit(0);
for (i = 0; i < text.len; ++i)
- if ((text.s[i] < 32) || (text.s[i] > 126))
- text.s[i] = '/';
+ if ((text.s[i] < 32) || (text.s[i] > 126)) text.s[i] = '/';
- if (!stralloc_copys(&woof,"\015\n\007")) _exit(0);
- if (!stralloc_cat(&woof,&tofrom)) _exit(0);
- if (!stralloc_cats(&woof,"\015\n")) _exit(0);
- if (!stralloc_cat(&woof,&text)) _exit(0);
- if (!stralloc_cats(&woof,"\015\n")) _exit(0);
+ if (!stralloc_copys(&woof, "\015\n\007")) _exit(0);
+ if (!stralloc_cat(&woof, &tofrom)) _exit(0);
+ if (!stralloc_cats(&woof, "\015\n")) _exit(0);
+ if (!stralloc_cat(&woof, &text)) _exit(0);
+ if (!stralloc_cats(&woof, "\015\n")) _exit(0);
#ifdef HASUTMP
fdutmp = open_read(UTMP_FILE);
if (fdutmp == -1) _exit(0);
- buffer_init(&b,read,fdutmp,bufutmp,sizeof(bufutmp));
+ buffer_init(&b, read, fdutmp, bufutmp, sizeof(bufutmp));
- while (buffer_get(&b,&ut,sizeof(ut)) == sizeof(ut))
- if (!str_diffn(ut.ut_name,user,sizeof(ut.ut_name))) {
+ while (buffer_get(&b, &ut, sizeof(ut)) == sizeof(ut))
+ if (!str_diffn(ut.ut_name, user, sizeof(ut.ut_name))) {
#else
while ((ut = getutxent()) != 0)
- if (ut->ut_type == USER_PROCESS && !str_diffn(ut->ut_user,user,sizeof(ut->ut_user))) {
+ if (ut->ut_type == USER_PROCESS && !str_diffn(ut->ut_user, user, sizeof(ut->ut_user))) {
#endif
#ifdef HASUTMP
- byte_copy(line,sizeof(ut.ut_line),ut.ut_line);
+ byte_copy(line, sizeof(ut.ut_line), ut.ut_line);
line[sizeof(ut.ut_line)] = 0;
#else
- byte_copy(line,sizeof(ut->ut_line),ut->ut_line);
+ byte_copy(line, sizeof(ut->ut_line), ut->ut_line);
line[sizeof(ut->ut_line)] = 0;
#endif
if (line[0] == '/') continue;
if (!line[0]) continue;
- if (line[str_chr(line,'.')]) continue;
+ if (line[str_chr(line, '.')]) continue;
fdtty = open_append(line);
if (fdtty == -1) continue;
- if (fstat(fdtty,&st) == -1) { close(fdtty); continue; }
- if (!(st.st_mode & 0100)) { close(fdtty); continue; }
- if (st.st_uid != getuid()) { close(fdtty); continue; }
- buffer_init(&b,write,fdtty,buftty,sizeof(buftty));
- buffer_putflush(&b,woof.s,woof.len);
+ if (fstat(fdtty, &st) == -1) {
+ close(fdtty);
+ continue;
+ }
+ if (!(st.st_mode & 0100)) {
+ close(fdtty);
+ continue;
+ }
+ if (st.st_uid != getuid()) {
+ close(fdtty);
+ continue;
+ }
+ buffer_init(&b, write, fdtty, buftty, sizeof(buftty));
+ buffer_putflush(&b, woof.s, woof.len);
close(fdtty);
}
_exit(0);
diff --git a/src/qmail-authuser.c b/src/qmail-authuser.c
index e90468f..2cdb01e 100644
--- a/src/qmail-authuser.c
+++ b/src/qmail-authuser.c
@@ -1,32 +1,35 @@
-#include <stdio.h>
#include <unistd.h>
-#include "global.h"
-#include "stralloc.h"
+
+#include <stdio.h>
+
#include "buffer.h"
-#include "auto_qmail.h"
+#include "byte.h"
#include "case.h"
-#include "control.h"
#include "constmap.h"
-#include "str.h"
-#include "fmt.h"
+#include "error.h"
#include "fd.h"
+#include "fmt.h"
#include "open.h"
-#include "byte.h"
+#include "pathexec.h"
+#include "prot.h"
#include "scan.h"
-#include "md5.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "wait.h"
+
+#include "auto_qmail.h"
+#include "control.h"
+#include "global.h"
#include "hmac_md5.h"
+#include "md5.h"
#include "sha1.h"
#include "sha256.h"
-#include "pathexec.h"
-#include "prot.h"
-#include "wait.h"
-#include "sig.h"
-#include "error.h"
-#define FDAUTH 3
-#define FDGOSSIP 1
-#define SOCKET_CALL "-s"
+#define FDAUTH 3
+#define FDGOSSIP 1
+#define SOCKET_CALL "-s"
#define DOVECOT_SERVICE "-x"
-#define POP_USER "qmail-pop3d"
+#define POP_USER "qmail-pop3d"
extern char *crypt();
#include <pwd.h>
@@ -34,13 +37,13 @@ static struct passwd *pw;
#include "hasspnam.h"
#ifdef HASGETSPNAM
-#include <shadow.h>
+ #include <shadow.h>
static struct spwd *spw;
#endif
#include "hasuserpw.h"
#ifdef HASUSERPW
-#include <userpw.h>
+ #include <userpw.h>
static struct userpw *upw;
#endif
@@ -53,12 +56,12 @@ static struct userpw *upw;
*/
char authbuf[512];
-buffer ba = BUFFER_INIT(write,FDAUTH,authbuf,sizeof(authbuf));
+buffer ba = BUFFER_INIT(write, FDAUTH, authbuf, sizeof(authbuf));
struct constmap mapauthuser;
stralloc authfile = {0};
stralloc disabled = {0};
-stralloc user = {0}; // user w/o domain appended
+stralloc user = {0}; // user w/o domain appended
stralloc homedir = {0};
stralloc shell = {0};
@@ -78,11 +81,11 @@ void exit(int fail)
{
int i;
- for (i = 0; i < sizeof(authbuf); ++i) authbuf[i] = 0;
+ for (i = 0; i < sizeof(authbuf); ++i) authbuf[i] = 0;
_exit(fail);
}
-int dig_ascii(char *digascii,const char *digest,const int len)
+int dig_ascii(char *digascii, const char *digest, const int len)
{
static const char hextab[] = "0123456789abcdef";
int j;
@@ -93,56 +96,56 @@ int dig_ascii(char *digascii,const char *digest,const int len)
}
digascii[2 * len] = '\0';
- return (2*j); // 2*len
+ return (2 * j); // 2*len
}
-int auth_sha1(char *pwdhash,char *response)
+int auth_sha1(char *pwdhash, char *response)
{
unsigned char digest[20];
unsigned char digascii[41];
- sha1_hash(digest,response,str_len(response));
- dig_ascii(digascii,digest,20);
+ sha1_hash(digest, response, str_len(response));
+ dig_ascii(digascii, digest, 20);
- return str_diffn(digascii,pwdhash,40);
-}
+ return str_diffn(digascii, pwdhash, 40);
+}
-int auth_sha256(char *pwdhash,char *response)
+int auth_sha256(char *pwdhash, char *response)
{
unsigned char digest[32];
unsigned char digascii[65];
- sha256_hash(digest,response,str_len(response));
- dig_ascii(digascii,digest,32);
+ sha256_hash(digest, response, str_len(response));
+ dig_ascii(digascii, digest, 32);
- return str_diffn(digascii,pwdhash,64);
-}
+ return str_diffn(digascii, pwdhash, 64);
+}
-int auth_md5(char *pwdhash,char *response)
-{
+int auth_md5(char *pwdhash, char *response)
+{
MD5_CTX ctx;
unsigned char digest[16];
unsigned char digascii[33];
MD5Init(&ctx);
- MD5Update(&ctx,response,str_len(response));
- MD5Final(digest,&ctx);
- dig_ascii(digascii,digest,16);
+ MD5Update(&ctx, response, str_len(response));
+ MD5Final(digest, &ctx);
+ dig_ascii(digascii, digest, 16);
- return str_diffn(digascii,pwdhash,32);
+ return str_diffn(digascii, pwdhash, 32);
}
-int auth_hash(char *password,char *response)
+int auth_hash(char *password, char *response)
{
switch (str_len(password)) {
- case 32: return auth_md5(password,response);
- case 40: return auth_sha1(password,response);
- case 64: return auth_sha256(password,response);
- default: return -1;
+ case 32: return auth_md5(password, response);
+ case 40: return auth_sha1(password, response);
+ case 64: return auth_sha256(password, response);
+ default: return -1;
}
}
-int auth_unix(char *user,char* response)
+int auth_unix(char *user, char *response)
{
char *encrypted = 0;
char *stored = 0;
@@ -151,8 +154,8 @@ int auth_unix(char *user,char* response)
pw = getpwnam(user);
if (pw) {
stored = pw->pw_passwd;
- if (!stralloc_copys(&homedir,pw->pw_dir)) exit(111);
- if (!stralloc_copys(&shell,pw->pw_shell)) exit(111);
+ if (!stralloc_copys(&homedir, pw->pw_dir)) exit(111);
+ if (!stralloc_copys(&shell, pw->pw_shell)) exit(111);
} else {
if (errno == ETXTBSY) exit(111);
exit(1);
@@ -163,68 +166,67 @@ int auth_unix(char *user,char* response)
upw = getuserpw(user);
if (upw)
stored = upw->upw_passwd;
- else
- if (errno == ETXTBSY) exit(111);
+ else if (errno == ETXTBSY)
+ exit(111);
#elif HASGETSPNAM
spw = getspnam(user);
if (spw)
stored = spw->sp_pwdp;
- else
- if (errno == ETXTBSY) exit(111);
+ else if (errno == ETXTBSY)
+ exit(111);
#endif
if (!stored || !*stored) exit(111);
- encrypted = crypt(response,stored);
+ encrypted = crypt(response, stored);
if (!encrypted) exit(111); // no password given (tx. M.B.)
- r = str_diff(encrypted,stored);
+ r = str_diff(encrypted, stored);
}
if (r == 0 || !response) {
- if (prot_gid((int) pw->pw_gid) == -1) exit(1);
- if (prot_uid((int) pw->pw_uid) == -1) exit(1);
+ if (prot_gid((int)pw->pw_gid) == -1) exit(1);
+ if (prot_uid((int)pw->pw_uid) == -1) exit(1);
if (chdir(pw->pw_dir) == -1) exit(111);
}
return r;
}
-int auth_apop(unsigned char *password,unsigned char *response,unsigned char *challenge)
+int auth_apop(unsigned char *password, unsigned char *response, unsigned char *challenge)
{
MD5_CTX context;
unsigned char digest[16];
unsigned char digascii[33];
MD5Init(&context);
- MD5Update(&context,challenge,str_len(challenge));
- MD5Update(&context,password,str_len(password));
- MD5Final(digest,&context);
- dig_ascii(digascii,digest,16);
+ MD5Update(&context, challenge, str_len(challenge));
+ MD5Update(&context, password, str_len(password));
+ MD5Final(digest, &context);
+ dig_ascii(digascii, digest, 16);
- return (str_diff(digascii,response));
+ return (str_diff(digascii, response));
}
-int auth_cram(unsigned char *password,unsigned char *response,unsigned char *challenge)
+int auth_cram(unsigned char *password, unsigned char *response, unsigned char *challenge)
{
unsigned char digest[16];
unsigned char digascii[33];
- hmac_md5(challenge,str_len(challenge),password,str_len(password),digest);
- dig_ascii(digascii,digest,16);
+ hmac_md5(challenge, str_len(challenge), password, str_len(password), digest);
+ dig_ascii(digascii, digest, 16);
- return (str_diff(digascii,response) && str_diff(password,response));
+ return (str_diff(digascii, response) && str_diff(password, response));
}
-int auth_dovecot(char *user,char *response,char *socket,char *service)
+int auth_dovecot(char *user, char *response, char *socket, char *service)
{
int wstat;
int child;
char *wrapper[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int i = 0;
- close(FDGOSSIP); /* gossiping doveadm */
+ close(FDGOSSIP); /* gossiping doveadm */
switch (child = fork()) {
- case -1:
- exit(111);
+ case -1: exit(111);
case 0:
wrapper[i] = "doveadm";
wrapper[++i] = "auth";
@@ -238,56 +240,55 @@ int auth_dovecot(char *user,char *response,char *socket,char *service)
wrapper[++i] = service;
}
wrapper[++i] = user;
- wrapper[++i] = response;
+ wrapper[++i] = response;
wrapper[++i] = 0;
- execvp(wrapper[0],wrapper);
+ execvp(wrapper[0], wrapper);
exit(111);
}
- if (wait_pid(&wstat,child) == -1) exit(111);
+ if (wait_pid(&wstat, child) == -1) exit(111);
if (wait_crashed(wstat)) exit(111);
- return wait_exitcode(wstat);
+ return wait_exitcode(wstat);
}
-int auth_wrapper(char *pam,char *arg1,char *arg2,char *auth,int len)
+int auth_wrapper(char *pam, char *arg1, char *arg2, char *auth, int len)
{
int wstat;
int child;
int pi[2];
char *wrapper[4] = {0, 0, 0, 0};
-
+
if (pipe(pi) == -1) exit(111);
if (pi[0] != FDAUTH) exit(111);
switch (child = fork()) {
- case -1:
- exit(111);
- case 0:
+ case -1: exit(111);
+ case 0:
close(pi[1]);
- if (fd_copy(FDAUTH,pi[0]) == -1) exit(111);
+ if (fd_copy(FDAUTH, pi[0]) == -1) exit(111);
wrapper[0] = pam;
wrapper[1] = arg1;
wrapper[2] = arg2;
wrapper[3] = 0;
sig_pipedefault();
- execvp(wrapper[0],wrapper);
+ execvp(wrapper[0], wrapper);
exit(111);
}
close(pi[0]);
- buffer_init(&ba,write,pi[1],authbuf,sizeof(authbuf));
- if (buffer_put(&ba,auth,len) == -1) exit(111);
+ buffer_init(&ba, write, pi[1], authbuf, sizeof(authbuf));
+ if (buffer_put(&ba, auth, len) == -1) exit(111);
if (buffer_flush(&ba) == -1) exit(111);
close(pi[1]);
- if (wait_pid(&wstat,child) == -1) exit(111);
+ if (wait_pid(&wstat, child) == -1) exit(111);
if (wait_crashed(wstat)) exit(111);
return wait_exitcode(wstat);
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
char *authuser;
char *authpass;
@@ -300,31 +301,31 @@ int main(int argc,char **argv)
int rc = -1; /* initialise: -1; ok: 0; !ok: > 0 */
int authlen = 0;
int buflen = 0;
- int domlen = 0;
+ int domlen = 0;
int popuser = 0;
int i = 0;
int r;
- if (!argv[1])
+ if (!argv[1])
exit(2);
else if (argv[2]) { // pop user with homedir
- if (!case_diffs(argv[1],POP_USER)) {
+ if (!case_diffs(argv[1], POP_USER)) {
if (!argv[3]) exit(2);
maildirname = argv[2];
- popuser = 1;
+ popuser = 1;
}
- if (!case_diffs(argv[1],SOCKET_CALL)) { // dovecot socket
+ if (!case_diffs(argv[1], SOCKET_CALL)) { // dovecot socket
if (!argv[3]) exit(2);
authsocket = argv[2];
- if (!case_diffs(argv[3],DOVECOT_SERVICE)) { // ++ dovecot service
+ if (!case_diffs(argv[3], DOVECOT_SERVICE)) { // ++ dovecot service
service = argv[4];
if (!argv[5]) exit(2);
}
}
- if (!case_diffs(argv[1],DOVECOT_SERVICE)) { // dovecot service
+ if (!case_diffs(argv[1], DOVECOT_SERVICE)) { // dovecot service
if (!argv[3]) exit(2);
service = argv[2];
- if (!case_diffs(argv[3],SOCKET_CALL)) { // ++ dovecot socket
+ if (!case_diffs(argv[3], SOCKET_CALL)) { // ++ dovecot socket
if (!argv[5]) exit(2);
authsocket = argv[4];
}
@@ -333,9 +334,8 @@ int main(int argc,char **argv)
/* Read input on FDAUTH */
- for (;;) {
- do
- r = read(FDAUTH,authbuf + buflen,sizeof(authbuf) - buflen);
+ for (;;) {
+ do r = read(FDAUTH, authbuf + buflen, sizeof(authbuf) - buflen);
while ((r == -1) && (errno == EINTR));
if (r == -1) exit(111);
if (r == 0) break;
@@ -344,98 +344,106 @@ int main(int argc,char **argv)
}
close(FDAUTH);
- authuser = authbuf + i; /* username */
+ authuser = authbuf + i; /* username */
if (i == buflen) exit(2);
- while (authbuf[i++]) /* response */
+ while (authbuf[i++]) /* response */
if (i == buflen) exit(2);
response = authbuf + i;
if (i == buflen) exit(2);
- while (authbuf[i++]) /* challenge */
+ while (authbuf[i++]) /* challenge */
if (i == buflen) exit(2);
challenge = authbuf + i;
- authlen = str_len(authuser);
- if (!stralloc_copyb(&user,authuser,authlen)) exit(111);
+ authlen = str_len(authuser);
+ if (!stralloc_copyb(&user, authuser, authlen)) exit(111);
- if ((i = byte_rchr(authuser,authlen,'@'))) /* @domain */
+ if ((i = byte_rchr(authuser, authlen, '@'))) /* @domain */
if (i < authlen && authuser[i] == '@') {
domain = authuser + i;
domlen = str_len(domain);
- case_lowerb(domain,domlen);
+ case_lowerb(domain, domlen);
user.len = 0;
- if (!stralloc_copyb(&user,authuser,i)) exit(111);
+ if (!stralloc_copyb(&user, authuser, i)) exit(111);
}
if (!stralloc_0(&user)) exit(111);
/* Read control file users/authuser and go for checks */
if (chdir(auto_qmail) == -1) exit(110);
-
- switch (control_readfile(&authfile,"users/authuser",0)) {
+
+ switch (control_readfile(&authfile, "users/authuser", 0)) {
case -1: exit(110);
- case 0: if (!constmap_init(&mapauthuser,"",0,1)) exit(111);
- case 1: if (!constmap_init(&mapauthuser,authfile.s,authfile.len,1)) exit(111);
+ case 0:
+ if (!constmap_init(&mapauthuser, "", 0, 1)) exit(111);
+ case 1:
+ if (!constmap_init(&mapauthuser, authfile.s, authfile.len, 1)) exit(111);
}
/* Check for disabled authuser/domains */
- if (!stralloc_copys(&disabled,"!")) exit(111);
- if (!stralloc_catb(&disabled,authuser,authlen)) exit(111);
- if (constmap(&mapauthuser,disabled.s,disabled.len)) exit(1);
+ if (!stralloc_copys(&disabled, "!")) exit(111);
+ if (!stralloc_catb(&disabled, authuser, authlen)) exit(111);
+ if (constmap(&mapauthuser, disabled.s, disabled.len)) exit(1);
if (domlen) {
disabled.len = 0;
- if (!stralloc_copys(&disabled,"!")) exit(111);
- if (!stralloc_catb(&disabled,domain,domlen)) exit(111);
- if (constmap(&mapauthuser,disabled.s,disabled.len)) exit(1);
+ if (!stralloc_copys(&disabled, "!")) exit(111);
+ if (!stralloc_catb(&disabled, domain, domlen)) exit(111);
+ if (constmap(&mapauthuser, disabled.s, disabled.len)) exit(1);
}
/* Virtual and system user accounts */
- authpass = constmap(&mapauthuser,authuser,authlen);
+ authpass = constmap(&mapauthuser, authuser, authlen);
- if (!authpass && domlen)
- authpass = constmap(&mapauthuser,domain,domlen); // 1. authuser accounts
- if (!authpass)
- authpass = constmap(&mapauthuser,"*",1); // 2. system accounts
- if (!authpass)
- authpass = constmap(&mapauthuser,"@",1); // 3. virtual user accounts
+ if (!authpass && domlen) authpass = constmap(&mapauthuser, domain, domlen); // 1. authuser accounts
+ if (!authpass) authpass = constmap(&mapauthuser, "*", 1); // 2. system accounts
+ if (!authpass) authpass = constmap(&mapauthuser, "@", 1); // 3. virtual user accounts
if (!authpass) exit(1);
if (str_len(authpass) == 1) {
switch (authpass[0]) {
- case '?': rc = auth_unix(user.s,response); break;
- case '+': if (popuser)
- rc = auth_wrapper("checkvpw","qmail-pop3d",maildirname,authbuf,buflen);
- else
- rc = auth_wrapper("checkvpw","true","Maildir",authbuf,buflen); break;
- case '&': if (popuser)
- rc = auth_wrapper("vchkpw","qmail-pop3d",maildirname,authbuf,buflen);
- else
- rc = auth_wrapper("vchkpw","true",0,authbuf,buflen); break;
- case '=': rc = auth_dovecot(authuser,response,authsocket,service); break;
+ case '?': rc = auth_unix(user.s, response); break;
+ case '+':
+ if (popuser)
+ rc = auth_wrapper("checkvpw", "qmail-pop3d", maildirname, authbuf, buflen);
+ else
+ rc = auth_wrapper("checkvpw", "true", "Maildir", authbuf, buflen);
+ break;
+ case '&':
+ if (popuser)
+ rc = auth_wrapper("vchkpw", "qmail-pop3d", maildirname, authbuf, buflen);
+ else
+ rc = auth_wrapper("vchkpw", "true", 0, authbuf, buflen);
+ break;
+ case '=': rc = auth_dovecot(authuser, response, authsocket, service); break;
default: rc = 2; break;
}
} else {
switch (authpass[0]) {
- case '%': rc = auth_hash(authpass + 1,response); break;
- default: if (rc) {
- if (popuser) {
- if ((rc = auth_apop(authpass,response,challenge)) == 0) {
- auth_unix(user.s,0); // Unix environment only
- }
- } else rc = auth_cram(authpass,response,challenge);
- } break;
- }
+ case '%': rc = auth_hash(authpass + 1, response); break;
+ default:
+ if (rc) {
+ if (popuser) {
+ if ((rc = auth_apop(authpass, response, challenge)) == 0) {
+ auth_unix(user.s, 0); // Unix environment only
+ }
+ } else
+ rc = auth_cram(authpass, response, challenge);
+ }
+ break;
+ }
}
if (rc) exit(rc);
- for (i = 0; i < sizeof(authbuf); ++i) authbuf[i] = 0;
+ for (i = 0; i < sizeof(authbuf); ++i) authbuf[i] = 0;
if (authsocket && service) pathexec(argv + 5);
- if (authsocket || service || popuser) pathexec(argv + 3);
- else pathexec(argv + 1);
+ if (authsocket || service || popuser)
+ pathexec(argv + 3);
+ else
+ pathexec(argv + 1);
exit(111);
}
diff --git a/src/qmail-badloadertypes.c b/src/qmail-badloadertypes.c
index 3472fd5..779c73a 100644
--- a/src/qmail-badloadertypes.c
+++ b/src/qmail-badloadertypes.c
@@ -1,27 +1,30 @@
+#include <sys/stat.h>
#include <unistd.h>
+
#include <stdlib.h>
-#include <sys/stat.h>
-#include "logmsg.h"
-#include "stralloc.h"
+
#include "buffer.h"
-#include "getln.h"
+#include "cdbmake.h"
#include "exit.h"
+#include "getln.h"
+#include "logmsg.h"
#include "open.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "cdbmake.h"
-#define WHO "qmail-badloadertypes"
+#define WHO "qmail-badloadertypes"
#define LOADER_LEN 5
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void die_read()
{
- logmsg(WHO,111,FATAL,"unable to read control/badloadertypes");
+ logmsg(WHO, 111, FATAL, "unable to read control/badloadertypes");
}
void die_write()
{
- logmsg(WHO,111,FATAL,"unable to write to control/badloadertypes.tmp");
+ logmsg(WHO, 111, FATAL, "unable to write to control/badloadertypes.tmp");
}
char inbuf[1024];
@@ -37,32 +40,30 @@ int match;
int main()
{
umask(033);
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
fd = open_read("control/badloadertypes");
if (fd == -1) die_read();
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("control/badloadertypes.tmp");
if (fdtemp == -1) die_write();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_write();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_write();
for (;;) {
- if (getln(&b,&line,&match,'\n') != 0) die_read();
+ if (getln(&b, &line, &match, '\n') != 0) die_read();
if (line.s[0] != '#' && line.len > LOADER_LEN)
- if (cdb_make_add(&cdb,line.s,LOADER_LEN,"",0) == -1)
- die_write();
+ if (cdb_make_add(&cdb, line.s, LOADER_LEN, "", 0) == -1) die_write();
if (!match) break;
}
if (cdb_make_finish(&cdb) == -1) die_write();
if (fsync(fdtemp) == -1) die_write();
if (close(fdtemp) == -1) die_write(); /* NFS stupidity */
- if (rename("control/badloadertypes.tmp","control/badloadertypes.cdb") == -1)
- logmsg(WHO,111,FATAL,"unable to move control/badloadertypes.tmp to control/badloadertypes.cdb");
+ if (rename("control/badloadertypes.tmp", "control/badloadertypes.cdb") == -1)
+ logmsg(WHO, 111, FATAL, "unable to move control/badloadertypes.tmp to control/badloadertypes.cdb");
_exit(0);
}
diff --git a/src/qmail-badmimetypes.c b/src/qmail-badmimetypes.c
index a75ad4c..d56854e 100644
--- a/src/qmail-badmimetypes.c
+++ b/src/qmail-badmimetypes.c
@@ -1,26 +1,28 @@
-#include <unistd.h>
#include <sys/stat.h>
-#include "logmsg.h"
-#include "stralloc.h"
+#include <unistd.h>
+
#include "buffer.h"
-#include "getln.h"
+#include "cdbmake.h"
#include "exit.h"
+#include "getln.h"
+#include "logmsg.h"
#include "open.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "cdbmake.h"
-#define WHO "qmail-badmimetypes"
+#define WHO "qmail-badmimetypes"
#define MIMETYPE_LEN 9
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void die_read()
{
- logmsg(WHO,111,FATAL,"unable to read control/badmimetypes");
+ logmsg(WHO, 111, FATAL, "unable to read control/badmimetypes");
}
void die_write()
{
- logmsg(WHO,111,FATAL,"unable to write to control/badmimetypes.tmp");
+ logmsg(WHO, 111, FATAL, "unable to write to control/badmimetypes.tmp");
}
char inbuf[1024];
@@ -36,32 +38,30 @@ int match;
int main()
{
umask(033);
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
fd = open_read("control/badmimetypes");
if (fd == -1) die_read();
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("control/badmimetypes.tmp");
if (fdtemp == -1) die_write();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_write();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_write();
for (;;) {
- if (getln(&b,&line,&match,'\n') != 0) die_read();
+ if (getln(&b, &line, &match, '\n') != 0) die_read();
if (line.s[0] != '#' && line.len > MIMETYPE_LEN)
- if (cdb_make_add(&cdb,line.s,MIMETYPE_LEN,"",0) == -1)
- die_write();
+ if (cdb_make_add(&cdb, line.s, MIMETYPE_LEN, "", 0) == -1) die_write();
if (!match) break;
}
if (cdb_make_finish(&cdb) == -1) die_write();
if (fsync(fdtemp) == -1) die_write();
if (close(fdtemp) == -1) die_write(); /* NFS stupidity */
- if (rename("control/badmimetypes.tmp","control/badmimetypes.cdb") == -1)
- logmsg(WHO,111,FATAL,"unable to move control/badmimetypes.tmp to control/badmimetypes.cdb");
+ if (rename("control/badmimetypes.tmp", "control/badmimetypes.cdb") == -1)
+ logmsg(WHO, 111, FATAL, "unable to move control/badmimetypes.tmp to control/badmimetypes.cdb");
_exit(0);
}
diff --git a/src/qmail-clean.c b/src/qmail-clean.c
index df149a5..2a9d706 100644
--- a/src/qmail-clean.c
+++ b/src/qmail-clean.c
@@ -1,20 +1,22 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <sys/stat.h>
-#include "sig.h"
-#include "now.h"
-#include "str.h"
-#include "direntry.h"
-#include "getln.h"
-#include "stralloc.h"
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
#include "byte.h"
-#include "scan.h"
-#include "fmt.h"
-#include "exit.h"
+#include "direntry.h"
#include "error.h"
-#include "fmtqfn.h"
+#include "exit.h"
+#include "fmt.h"
+#include "getln.h"
+#include "scan.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
+#include "fmtqfn.h"
+#include "now.h"
#define OSSIFIED 129600 /* see qmail-send.c */
@@ -30,14 +32,14 @@ void cleanuppid()
time = now();
dir = opendir("pid");
if (!dir) return;
-
+
while ((d = readdir(dir))) {
- if (str_equal(d->d_name,".")) continue;
- if (str_equal(d->d_name,"..")) continue;
- if (!stralloc_copys(&line,"pid/")) continue;
- if (!stralloc_cats(&line,d->d_name)) continue;
+ if (str_equal(d->d_name, ".")) continue;
+ if (str_equal(d->d_name, "..")) continue;
+ if (!stralloc_copys(&line, "pid/")) continue;
+ if (!stralloc_cats(&line, d->d_name)) continue;
if (!stralloc_0(&line)) continue;
- if (stat(line.s,&st) == -1) continue;
+ if (stat(line.s, &st) == -1) continue;
if (time < st.st_atime + OSSIFIED) continue;
unlink(line.s);
}
@@ -46,9 +48,9 @@ void cleanuppid()
char fnbuf[FMTQFN];
-void respond(char *s)
-{
- if (buffer_putflush(buffer_1small,s,1) == -1) _exit(100);
+void respond(char *s)
+{
+ if (buffer_putflush(buffer_1small, s, 1) == -1) _exit(100);
}
int main()
@@ -63,37 +65,60 @@ int main()
sig_pipeignore();
- if (!stralloc_ready(&line,200)) _exit(111);
+ if (!stralloc_ready(&line, 200)) _exit(111);
cleanuploop = 0;
for (;;) {
- if (cleanuploop) --cleanuploop; else { cleanuppid(); cleanuploop = 30; }
- if (getln(buffer_0small,&line,&match,'\0') == -1) break;
+ if (cleanuploop)
+ --cleanuploop;
+ else {
+ cleanuppid();
+ cleanuploop = 30;
+ }
+ if (getln(buffer_0small, &line, &match, '\0') == -1) break;
if (!match) break;
- if (line.len < 7) { respond("x"); continue; }
- if (line.len > 100) { respond("x"); continue; }
- if (line.s[line.len - 1]) { respond("x"); continue; } /* impossible */
+ if (line.len < 7) {
+ respond("x");
+ continue;
+ }
+ if (line.len > 100) {
+ respond("x");
+ continue;
+ }
+ if (line.s[line.len - 1]) {
+ respond("x");
+ continue;
+ } /* impossible */
for (i = line.len - 2; i > 4; --i) {
if (line.s[i] == '/') break;
- if ((unsigned char) (line.s[i] - '0') > 9)
- { respond("x"); continue; }
+ if ((unsigned char)(line.s[i] - '0') > 9) {
+ respond("x");
+ continue;
+ }
}
- if (line.s[i] == '/')
- if (!scan_ulong(line.s + i + 1,&id)) { respond("x"); continue; }
- if (byte_equal(line.s,5,"foop/")) {
-#define U(prefix,flag) fmtqfn(fnbuf,prefix,id,flag); \
- if (unlink(fnbuf) == -1) if (errno != ENOENT) { respond("!"); continue; }
- U("intd/",1)
- U("mess/",1)
+ if (line.s[i] == '/')
+ if (!scan_ulong(line.s + i + 1, &id)) {
+ respond("x");
+ continue;
+ }
+ if (byte_equal(line.s, 5, "foop/")) {
+#define U(prefix, flag) \
+ fmtqfn(fnbuf, prefix, id, flag); \
+ if (unlink(fnbuf) == -1) \
+ if (errno != ENOENT) { \
+ respond("!"); \
+ continue; \
+ }
+ U("intd/", 1)
+ U("mess/", 1)
respond("+");
- } else if (byte_equal(line.s,4,"todo/")) {
- U("intd/",1)
- U("todo/",1)
+ } else if (byte_equal(line.s, 4, "todo/")) {
+ U("intd/", 1)
+ U("todo/", 1)
respond("+");
- }
- else
+ } else
respond("x");
}
_exit(0);
diff --git a/src/qmail-dkim.cpp b/src/qmail-dkim.cpp
index fba94fe..53e1b27 100644
--- a/src/qmail-dkim.cpp
+++ b/src/qmail-dkim.cpp
@@ -26,32 +26,36 @@
* Network: Sigh, exchanged internal DNS routines by fehQlibs resolver
*
*****************************************************************************/
+#include <unistd.h>
+
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <time.h>
-#include <stdlib.h>
-#include <unistd.h>
+
#include "dkim.h"
extern "C" {
#include "dns.h"
}
// change these to your selector name, domain name, etc
-#define MYRSASELECTOR "default"
-#define MYECCSELECTOR "eddy"
-#define MYDOMAIN "" //"bardenhagen.com"
-#define MYIDENTITY "" //"dkimtest@bardenhagen.com"
+#define MYRSASELECTOR "default"
+#define MYECCSELECTOR "eddy"
+#define MYDOMAIN "" //"bardenhagen.com"
+#define MYIDENTITY "" //"dkimtest@bardenhagen.com"
-#define strnicmp strncasecmp
-#define FDLOG stderr /* writing to another FD requires a method */
+#define strnicmp strncasecmp
+#define FDLOG stderr /* writing to another FD requires a method */
-int DKIM_CALL SignThisHeader(const char* szHeader)
+int DKIM_CALL SignThisHeader(const char *szHeader)
{
- if (strnicmp(szHeader,"X-",2) == 0 ) { return 0; }
+ if (strnicmp(szHeader, "X-", 2) == 0) {
+ return 0;
+ }
return 1;
}
-int DKIM_CALL SelectorCallback(const char* szFQDN,char* szBuffer,int nBufLen)
+int DKIM_CALL SelectorCallback(const char *szFQDN, char *szBuffer, int nBufLen)
{
return 0;
}
@@ -59,34 +63,50 @@ int DKIM_CALL SelectorCallback(const char* szFQDN,char* szBuffer,int nBufLen)
void usage()
{
char version[] = "1.4.0";
- fprintf(FDLOG,"qmail-dkim %s \n",version);
- fprintf(FDLOG,"Usage: qmail-dkim [-h|-v|-s] [tags] <msgfile> [<RSAkeyfile> <outfile> <Ed25519keyfile>]\n\n");
+ fprintf(FDLOG, "qmail-dkim %s \n", version);
+ fprintf(
+ FDLOG,
+ "Usage: qmail-dkim [-h|-v|-s] [tags] <msgfile> [<RSAkeyfile> <outfile> <Ed25519keyfile>]\n\n");
fprintf(FDLOG, "Options:\n\t-h show this help\n");
fprintf(FDLOG, "\t-s sign the message \n");
fprintf(FDLOG, "\t-v verify the message\n");
fprintf(FDLOG, "\t-V verify the message and write result to output file (Pass/Fail)\n\n");
fprintf(FDLOG, "These tags are available:\n");
- fprintf(FDLOG, "\t-c<canonicalization> - r=relaxed [DEFAULT], s=simple, t=relaxed/simple, u=simple/relaxed\n");
- fprintf(FDLOG, "\t-d<sdid> - Signing Domain Identifier (if not provided it will be determined from the sender/from header)\n");
- fprintf(FDLOG, "\t-i<auid> - Agent User Identifier, usually the sender's email address (optional)\n");
+ fprintf(
+ FDLOG,
+ "\t-c<canonicalization> - r=relaxed [DEFAULT], s=simple, t=relaxed/simple, u=simple/relaxed\n");
+ fprintf(
+ FDLOG,
+ "\t-d<sdid> - Signing Domain Identifier (if not provided it will be determined from "
+ "the sender/from header)\n");
+ fprintf(
+ FDLOG,
+ "\t-i<auid> - Agent User Identifier, usually the sender's email address "
+ "(optional)\n");
fprintf(FDLOG, "\t-l - include body length tag (optional)\n");
fprintf(FDLOG, "\t-q - include query method tag\n");
fprintf(FDLOG, "\t-t - include a timestamp tag (optional)\n");
- fprintf(FDLOG, "\t-x<expire_time> - the expire time in seconds since epoch (optional, DEFAULT = current time + 604800)\n");
+ fprintf(
+ FDLOG,
+ "\t-x<expire_time> - the expire time in seconds since epoch (optional, DEFAULT = current "
+ "time + 604800)\n");
fprintf(FDLOG, "\t-y<selector> - set RSA selector (DEFAULT: default)\n");
fprintf(FDLOG, "\t-Y<selector> - set Ed25519 selector (DEFAULT: default)\n");
- fprintf(FDLOG, "\t-z<hash> - set signature algorithm type (1=rsa-sha1, 2=rsa-sha256, 3=both, 4=ed25519, 5=hybrid)\n");
+ fprintf(
+ FDLOG,
+ "\t-z<hash> - set signature algorithm type (1=rsa-sha1, 2=rsa-sha256, 3=both, "
+ "4=ed25519, 5=hybrid)\n");
}
-int main(int argc, char* argv[])
+int main(int argc, char *argv[])
{
int n;
- const char* RSAKeyFile = "rsa.pem";
- const char* ECCKeyFile = "ed25519.pem";
- const char* MsgFile = "test.msg";
- const char* OutFile = "signed.msg";
+ const char *RSAKeyFile = "rsa.pem";
+ const char *ECCKeyFile = "ed25519.pem";
+ const char *MsgFile = "test.msg";
+ const char *OutFile = "signed.msg";
int nKeyLen;
- char RSAPrivKey[4196]; // storge for private key FILE including header and DER envelope
+ char RSAPrivKey[4196]; // storge for private key FILE including header and DER envelope
char ECCPrivKey[128];
char Buffer[1000];
int BufLen;
@@ -103,20 +123,20 @@ int main(int argc, char* argv[])
opts.nIncludeBodyLengthTag = 0;
opts.nIncludeQueryMethod = 0;
opts.nIncludeTimeStamp = 0;
- opts.expireTime = t + 604800; // expires in 1 week
- strcpy(opts.szSelector,MYRSASELECTOR);
- strcpy(opts.szSelectorE,MYECCSELECTOR);
- strcpy(opts.szDomain,MYDOMAIN);
- strcpy(opts.szIdentity,MYIDENTITY);
+ opts.expireTime = t + 604800; // expires in 1 week
+ strcpy(opts.szSelector, MYRSASELECTOR);
+ strcpy(opts.szSelectorE, MYECCSELECTOR);
+ strcpy(opts.szDomain, MYDOMAIN);
+ strcpy(opts.szIdentity, MYIDENTITY);
opts.pfnHeaderCallback = SignThisHeader;
- strcpy(opts.szRequiredHeaders,"NonExistant");
+ strcpy(opts.szRequiredHeaders, "NonExistant");
opts.nIncludeCopiedHeaders = 0;
int nArgParseState = 0;
bool bSign = true;
bool bRes = false;
- if (argc < 2){
+ if (argc < 2) {
usage();
exit(1);
}
@@ -124,92 +144,93 @@ int main(int argc, char* argv[])
for (n = 1; n < argc; n++) {
if (argv[n][0] == '-' && strlen(argv[n]) > 1) {
switch (argv[n][1]) {
- case 'c': // canonicalization
- if (argv[n][2] == 'r') { opts.nCanon = DKIM_SIGN_RELAXED; }
- else if (argv[n][2] == 's') { opts.nCanon = DKIM_SIGN_SIMPLE; }
- else if (argv[n][2] == 't') { opts.nCanon = DKIM_SIGN_RELAXED_SIMPLE; }
- else if (argv[n][2] == 'u') { opts.nCanon = DKIM_SIGN_SIMPLE_RELAXED; }
- break;
- case 'd':
- strncpy(opts.szDomain,(const char*)(argv[n] + 2),sizeof(opts.szDomain) - 1);
+ case 'c': // canonicalization
+ if (argv[n][2] == 'r') {
+ opts.nCanon = DKIM_SIGN_RELAXED;
+ } else if (argv[n][2] == 's') {
+ opts.nCanon = DKIM_SIGN_SIMPLE;
+ } else if (argv[n][2] == 't') {
+ opts.nCanon = DKIM_SIGN_RELAXED_SIMPLE;
+ } else if (argv[n][2] == 'u') {
+ opts.nCanon = DKIM_SIGN_SIMPLE_RELAXED;
+ }
break;
- case 'l': // body length tag
+ case 'd': strncpy(opts.szDomain, (const char *)(argv[n] + 2), sizeof(opts.szDomain) - 1); break;
+ case 'l': // body length tag
opts.nIncludeBodyLengthTag = 1;
break;
- case 'h':
- usage();
- return 0;
- case 'i': // identity
- if (argv[n][2] == '-') { opts.szIdentity[0] = '\0'; }
- else { strncpy(opts.szIdentity, argv[n] + 2,sizeof(opts.szIdentity) - 1); }
+ case 'h': usage(); return 0;
+ case 'i': // identity
+ if (argv[n][2] == '-') {
+ opts.szIdentity[0] = '\0';
+ } else {
+ strncpy(opts.szIdentity, argv[n] + 2, sizeof(opts.szIdentity) - 1);
+ }
break;
- case 'q': // query method tag
+ case 'q': // query method tag
opts.nIncludeQueryMethod = 1;
break;
- case 's': // sign with and use potentially Ed25519 private key
+ case 's': // sign with and use potentially Ed25519 private key
bSign = true;
break;
- case 't': // timestamp tag
+ case 't': // timestamp tag
opts.nIncludeTimeStamp = 1;
break;
- case 'v': // verify
+ case 'v': // verify
bSign = false;
break;
- case 'V': // verify and write result to OutFile
+ case 'V': // verify and write result to OutFile
bSign = false;
bRes = true;
break;
- case 'x': // expire time
- if (argv[n][2] == '-') { opts.expireTime = 0; }
- else { opts.expireTime = t + atoi(argv[n] + 2); }
- break;
- case 'y':
- strncpy(opts.szSelector,argv[n] + 2,sizeof(opts.szSelector) - 1);
+ case 'x': // expire time
+ if (argv[n][2] == '-') {
+ opts.expireTime = 0;
+ } else {
+ opts.expireTime = t + atoi(argv[n] + 2);
+ }
break;
- case 'Y':
- strncpy(opts.szSelectorE,argv[n] + 2,sizeof(opts.szSelectorE) - 1);
- break;
- case 'z': // sign w/ sha1, sha256, both, ed25519, hybrid
+ case 'y': strncpy(opts.szSelector, argv[n] + 2, sizeof(opts.szSelector) - 1); break;
+ case 'Y': strncpy(opts.szSelectorE, argv[n] + 2, sizeof(opts.szSelectorE) - 1); break;
+ case 'z': // sign w/ sha1, sha256, both, ed25519, hybrid
opts.nHash = atoi(&argv[n][2]);
}
- }
- else {
+ } else {
switch (nArgParseState) {
- case 0:
- MsgFile = argv[n];
- break;
- case 1:
- RSAKeyFile = argv[n];
- break;
- case 2:
- OutFile = argv[n];
- break;
- case 3:
- ECCKeyFile = argv[n];
- break;
+ case 0: MsgFile = argv[n]; break;
+ case 1: RSAKeyFile = argv[n]; break;
+ case 2: OutFile = argv[n]; break;
+ case 3: ECCKeyFile = argv[n]; break;
}
nArgParseState++;
}
}
-
-/** Go for DKIM signing ... **/
+
+ /** Go for DKIM signing ... **/
if (bSign) {
if (opts.nHash != 4) {
- FILE* RSAPrivKeyFP = fopen(RSAKeyFile,"r");
+ FILE *RSAPrivKeyFP = fopen(RSAKeyFile, "r");
if (RSAPrivKeyFP == NULL) {
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: can't open private key file (%s) \n",RSAKeyFile);
+ fprintf(FDLOG, " qmail-dkim: can't open private key file (%s) \n", RSAKeyFile);
#endif
exit(1);
- }
- nKeyLen = fread(RSAPrivKey,1,sizeof(RSAPrivKey),RSAPrivKeyFP); // we read sizeof(RSAPrivKey) members with size of 1 byte each; sigh
+ }
+ nKeyLen = fread(
+ RSAPrivKey,
+ 1,
+ sizeof(RSAPrivKey),
+ RSAPrivKeyFP); // we read sizeof(RSAPrivKey) members with size of 1 byte each; sigh
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: private key file (%s) - length %i \n",RSAKeyFile,nKeyLen);
+ fprintf(FDLOG, " qmail-dkim: private key file (%s) - length %i \n", RSAKeyFile, nKeyLen);
#endif
if (nKeyLen >= sizeof(RSAPrivKey)) { /* (TC9) on return, we get the number of members read! */
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: private key buffer isn't big enough for private key length %i \n",nKeyLen);
+ fprintf(
+ FDLOG,
+ " qmail-dkim: private key buffer isn't big enough for private key length %i \n",
+ nKeyLen);
#endif
exit(1);
}
@@ -217,124 +238,136 @@ int main(int argc, char* argv[])
fclose(RSAPrivKeyFP);
}
-/** Ed25519 signing **/
+ /** Ed25519 signing **/
if (opts.nHash == 4 || opts.nHash == 5) {
- FILE* ECCPrivKeyFP = fopen(ECCKeyFile,"r");
+ FILE *ECCPrivKeyFP = fopen(ECCKeyFile, "r");
if (ECCPrivKeyFP == NULL) {
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: can't open Ed25519 private key file (%s) \n",ECCKeyFile);
+ fprintf(FDLOG, " qmail-dkim: can't open Ed25519 private key file (%s) \n", ECCKeyFile);
#endif
exit(1);
}
- nKeyLen = fread(ECCPrivKey,1,sizeof(ECCPrivKey),ECCPrivKeyFP);
+ nKeyLen = fread(ECCPrivKey, 1, sizeof(ECCPrivKey), ECCPrivKeyFP);
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: Ed25519 private key file (%s) - length %i \n",ECCKeyFile,nKeyLen);
+ fprintf(FDLOG, " qmail-dkim: Ed25519 private key file (%s) - length %i \n", ECCKeyFile, nKeyLen);
#endif
if (nKeyLen >= sizeof(ECCPrivKey)) {
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: ECC private key buffer isn't big enough for ECC private key length %i \n",nKeyLen);
+ fprintf(
+ FDLOG,
+ " qmail-dkim: ECC private key buffer isn't big enough for ECC private key length %i \n",
+ nKeyLen);
#endif
exit(1);
}
ECCPrivKey[nKeyLen] = '\0';
fclose(ECCPrivKeyFP);
- }
+ }
-/** Input message for signing **/
+ /** Input message for signing **/
- FILE* MsgFP = fopen(MsgFile,"rb");
+ FILE *MsgFP = fopen(MsgFile, "rb");
if (MsgFP == NULL) {
#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: can't open msg file (%s) \n",MsgFile);
+ fprintf(FDLOG, " qmail-dkim: can't open msg file (%s) \n", MsgFile);
#endif
exit(1);
}
- n = DKIMSignInit(&ctxt,&opts);
+ n = DKIMSignInit(&ctxt, &opts);
while (1) {
- BufLen = fread(Buffer,1,sizeof(Buffer),MsgFP);
- if (BufLen > 0) { DKIMSignProcess(&ctxt,Buffer,BufLen); }
- else { break; }
+ BufLen = fread(Buffer, 1, sizeof(Buffer), MsgFP);
+ if (BufLen > 0) {
+ DKIMSignProcess(&ctxt, Buffer, BufLen);
+ } else {
+ break;
+ }
}
fclose(MsgFP);
- char* pSig = NULL;
+ char *pSig = NULL;
-/** Do the actual signing **/
+ /** Do the actual signing **/
- n = DKIMSignGetSig2(&ctxt,RSAPrivKey,ECCPrivKey,&pSig);
+ n = DKIMSignGetSig2(&ctxt, RSAPrivKey, ECCPrivKey, &pSig);
- strcpy(szSignature,pSig);
+ strcpy(szSignature, pSig);
DKIMSignFree(&ctxt);
- FILE* in = fopen(MsgFile,"rb");
- FILE* out = fopen(OutFile,"wb+");
+ FILE *in = fopen(MsgFile, "rb");
+ FILE *out = fopen(OutFile, "wb+");
#ifdef SHOWLOG
- fprintf(FDLOG," outfile written %s \n",OutFile);
+ fprintf(FDLOG, " outfile written %s \n", OutFile);
#endif
- fwrite(szSignature,1,strlen(szSignature),out);
- fwrite("\r\n",1,2,out);
+ fwrite(szSignature, 1, strlen(szSignature), out);
+ fwrite("\r\n", 1, 2, out);
while (1) {
- BufLen = fread(Buffer,1,sizeof(Buffer),in);
- if (BufLen > 0) { fwrite(Buffer,1,BufLen,out); }
- else { break; }
+ BufLen = fread(Buffer, 1, sizeof(Buffer), in);
+ if (BufLen > 0) {
+ fwrite(Buffer, 1, BufLen, out);
+ } else {
+ break;
+ }
}
fclose(in);
}
-/** Now go for verification **/
+ /** Now go for verification **/
- else {
- FILE* in = fopen(MsgFile,"rb");
+ else
+ {
+ FILE *in = fopen(MsgFile, "rb");
if (in == NULL) {
-//#ifdef SHOWLOG
- fprintf(FDLOG," qmail-dkim: can't open input file\n");
-//#endif
- return 0; // bad option -- no CTX set up yet
+ //#ifdef SHOWLOG
+ fprintf(FDLOG, " qmail-dkim: can't open input file\n");
+ //#endif
+ return 0; // bad option -- no CTX set up yet
}
DKIMVerifyOptions vopts = {0};
- vopts.pfnSelectorCallback = NULL; //SelectorCallback;
+ vopts.pfnSelectorCallback = NULL; //SelectorCallback;
- n = DKIMVerifyInit(&ctxt,&vopts);
+ n = DKIMVerifyInit(&ctxt, &vopts);
while (1) {
- BufLen = fread(Buffer,1,sizeof(Buffer),in);
- if (BufLen > 0) { DKIMVerifyProcess(&ctxt,Buffer,BufLen); }
- else { break; }
+ BufLen = fread(Buffer, 1, sizeof(Buffer), in);
+ if (BufLen > 0) {
+ DKIMVerifyProcess(&ctxt, Buffer, BufLen);
+ } else {
+ break;
+ }
}
n = DKIMVerifyResults(&ctxt);
int nSigCount = 0;
- DKIMVerifyDetails* pDetails;
+ DKIMVerifyDetails *pDetails;
char szPolicy[512];
- n = DKIMVerifyGetDetails(&ctxt,&nSigCount,&pDetails,szPolicy);
+ n = DKIMVerifyGetDetails(&ctxt, &nSigCount, &pDetails, szPolicy);
for (int i = 0; i < nSigCount; i++) {
const char s[] = "pass";
const char f[] = "fail";
- const char* error = DKIM_ErrorResult(pDetails[i].nResult);
- if (!bRes)
- fprintf(FDLOG," Signature #%d: ",i + 1);
- if (pDetails[i].nResult >= 0 ) {
+ const char *error = DKIM_ErrorResult(pDetails[i].nResult);
+ if (!bRes) fprintf(FDLOG, " Signature #%d: ", i + 1);
+ if (pDetails[i].nResult >= 0) {
if (bRes) {
- _DKIM_ReportResult(OutFile,s,0);
+ _DKIM_ReportResult(OutFile, s, 0);
} else
- printf(" Pass\n");
- } else { // fail
+ printf(" Pass\n");
+ } else { // fail
if (bRes) {
- _DKIM_ReportResult(OutFile,f,error);
+ _DKIM_ReportResult(OutFile, f, error);
} else
- printf(" Fail %s \n",error);
+ printf(" Fail %s \n", error);
}
}
DKIMVerifyFree(&ctxt);
diff --git a/src/qmail-dksign.c b/src/qmail-dksign.c
index 5135cd4..06fee37 100644
--- a/src/qmail-dksign.c
+++ b/src/qmail-dksign.c
@@ -1,29 +1,31 @@
-#include <sys/types.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/stat.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "sig.h"
-#include "stralloc.h"
+
#include "buffer.h"
-#include "error.h"
-#include "auto_qmail.h"
-#include "control.h"
-#include "str.h"
-#include "exit.h"
#include "case.h"
#include "constmap.h"
-#include "uint_t.h"
+#include "error.h"
+#include "exit.h"
#include "fd.h"
+#include "fmt.h"
#include "logmsg.h"
#include "open.h"
-#include "fmt.h"
-#include "fmtqfn.h"
+#include "pathexec.h"
#include "readwrite.h"
-#include "qmail.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "uint_t.h"
#include "wait.h"
-#include "pathexec.h"
+
+#include "auto_qmail.h"
+#include "control.h"
+#include "fmtqfn.h"
+#include "qmail.h"
#include "rcpthosts.h"
#define WHO "qmail-dksign"
@@ -54,21 +56,42 @@
*/
char bufin[1000]; // RFC 5322: 998 chars - why?
-buffer bi = BUFFER_INIT(read,0,bufin,sizeof(bufin));
+buffer bi = BUFFER_INIT(read, 0, bufin, sizeof(bufin));
char bufout[1000];
-buffer bo = BUFFER_INIT(write,1,bufout,sizeof(bufout));
+buffer bo = BUFFER_INIT(write, 1, bufout, sizeof(bufout));
-void die(int e) { _exit(e); }
-void die_write(char *fn) { unlink(fn); die(53); };
-void die_read() { die(54); };
-void out(char *s) { if (buffer_puts(&bo,s) == -1) _exit(111); }
-void zero() { if (buffer_put(&bo,"\0",1) == -1) _exit(111); }
-void zerodie() { zero(); buffer_flush(&bo); _exit(111); }
+void die(int e)
+{
+ _exit(e);
+}
+void die_write(char *fn)
+{
+ unlink(fn);
+ die(53);
+}
+void die_read()
+{
+ die(54);
+}
+void out(char *s)
+{
+ if (buffer_puts(&bo, s) == -1) _exit(111);
+}
+void zero()
+{
+ if (buffer_put(&bo, "\0", 1) == -1) _exit(111);
+}
+void zerodie()
+{
+ zero();
+ buffer_flush(&bo);
+ _exit(111);
+}
stralloc fndkin = {0};
stralloc fndkout = {0};
-stralloc sender = {0}; // will be re-written
+stralloc sender = {0}; // will be re-written
stralloc senddomain = {0};
stralloc originator = {0};
stralloc dkimdomains = {0};
@@ -78,34 +101,35 @@ stralloc ecckey = {0};
stralloc rsakey = {0};
char *dkimparams = 0;
-void temp_nomem()
+void temp_nomem()
{
out("ZOut of memory. (#4.3.0)\n");
zerodie();
}
-void temp_chdir()
+void temp_chdir()
{
out("ZUnable to switch to target directory. (#4.3.0)\n");
zerodie();
}
-void temp_create()
+void temp_create()
{
out("ZUnable to create DKIM stage file: ");
out(error_str(errno));
- out(fndkin.s); out(". (#4.3.0)\n");
+ out(fndkin.s);
+ out(". (#4.3.0)\n");
zerodie();
}
-void temp_unlink()
+void temp_unlink()
{
out("ZUnable to unlink DKIM stage file. (#4.3.0)\n");
zerodie();
}
-void temp_control()
+void temp_control()
{
out("ZUnable to read DKIM control files. (#4.3.0)\n");
zerodie();
}
-void perm_usage()
+void perm_usage()
{
out("Zqmail-dksign was invoked improperly. (#5.3.5)\n");
zerodie();
@@ -116,12 +140,12 @@ void temp_read()
zerodie();
}
void temp_nosignkey()
-{
+{
out("DCan't read sign key: ");
out(rsakey.s);
out(" or ");
out(ecckey.s);
- out(". (#4.3.0)\n");
+ out(". (#4.3.0)\n");
zerodie();
}
@@ -132,46 +156,50 @@ int get_controls()
if (control_init() == -1) temp_control();
- switch (control_readfile(&dkimdomains,"control/dkimdomains",0)) {
+ switch (control_readfile(&dkimdomains, "control/dkimdomains", 0)) {
case -1: return 0;
- case 0: if (!constmap_init(&mapdkimdomains,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapdkimdomains,dkimdomains.s,dkimdomains.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapdkimdomains, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapdkimdomains, dkimdomains.s, dkimdomains.len, 1)) temp_nomem();
+ break;
}
-/* Check for disabled DKIM send domains */
+ /* Check for disabled DKIM send domains */
- if (!stralloc_copys(&domname,"!")) temp_nomem();
- if (!stralloc_cats(&domname,senddomain.s)) temp_nomem();
- if (constmap(&mapdkimdomains,domname.s,domname.len)) return 0;
+ if (!stralloc_copys(&domname, "!")) temp_nomem();
+ if (!stralloc_cats(&domname, senddomain.s)) temp_nomem();
+ if (constmap(&mapdkimdomains, domname.s, domname.len)) return 0;
-/* Parenting domains; senddomain 0-terminated; lowercase */
+ /* Parenting domains; senddomain 0-terminated; lowercase */
for (i = 0; i <= senddomain.len; ++i) {
if ((i == 0) || (senddomain.s[i] == '.'))
- if ((dkimparams = constmap(&mapdkimdomains,senddomain.s + i,senddomain.len - i - 1))) {
- if (!stralloc_copys(&sender,senddomain.s + i)) temp_nomem();
+ if ((dkimparams = constmap(&mapdkimdomains, senddomain.s + i, senddomain.len - i - 1))) {
+ if (!stralloc_copys(&sender, senddomain.s + i)) temp_nomem();
if (!stralloc_0(&sender)) temp_nomem();
return 3;
}
}
-/* We sign only senddomains we take responsibility for: rcpthosts */
+ /* We sign only senddomains we take responsibility for: rcpthosts */
- if ((dkimparams = constmap(&mapdkimdomains,"=",1))) {
+ if ((dkimparams = constmap(&mapdkimdomains, "=", 1))) {
if (rcpthosts_init() == -1) temp_control();
- if (rcpthosts(originator.s,originator.len)) {
- if ((control_readline(&sender,"control/defaultdomain") != 1))
- if (control_readline(&sender,"control/me") == -1) temp_control();
+ if (rcpthosts(originator.s, originator.len)) {
+ if ((control_readline(&sender, "control/defaultdomain") != 1))
+ if (control_readline(&sender, "control/me") == -1) temp_control();
if (!stralloc_0(&sender)) temp_nomem();
return 2;
}
}
-/* Default settings for MTA: 'defaultdomain' or even 'me' */
+ /* Default settings for MTA: 'defaultdomain' or even 'me' */
- if ((dkimparams = constmap(&mapdkimdomains,"*",1))) {
- if ((control_readline(&sender,"control/defaultdomain") != 1))
- if (control_readline(&sender,"control/me") == -1) temp_control();
+ if ((dkimparams = constmap(&mapdkimdomains, "*", 1))) {
+ if ((control_readline(&sender, "control/defaultdomain") != 1))
+ if (control_readline(&sender, "control/me") == -1) temp_control();
if (!stralloc_0(&sender)) temp_nomem();
return 1;
}
@@ -179,18 +207,18 @@ int get_controls()
return 0;
}
-void fnmake_dkim(unsigned long id)
-{
- fndkin.len = fmtqfn(fndkin.s,"queue/dkim/",id,1);
+void fnmake_dkim(unsigned long id)
+{
+ fndkin.len = fmtqfn(fndkin.s, "queue/dkim/", id, 1);
id += id;
- fndkout.len = fmtqfn(fndkout.s,"queue/dkim/",id,1);
+ fndkout.len = fmtqfn(fndkout.s, "queue/dkim/", id, 1);
}
void dkim_unlink()
{
- if (unlink(fndkin.s) == -1)
+ if (unlink(fndkin.s) == -1)
if (errno != ENOENT) temp_unlink();
- if (unlink(fndkout.s) == -1)
+ if (unlink(fndkout.s) == -1)
if (errno != ENOENT) temp_unlink();
}
@@ -201,33 +229,33 @@ void dkim_stage()
char ch;
struct stat st;
- if (!stralloc_ready(&fndkin,FMTQFN)) temp_nomem();
- if (!stralloc_ready(&fndkout,FMTQFN)) temp_nomem();
+ if (!stralloc_ready(&fndkin, FMTQFN)) temp_nomem();
+ if (!stralloc_ready(&fndkout, FMTQFN)) temp_nomem();
fnmake_dkim(getpid()); // pre-staging
- dkim_unlink(); // duplicate, left over file
+ dkim_unlink(); // duplicate, left over file
fd = open_excl(fndkin.s);
if (fd == -1) die_write(fndkin.s);
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
- buffer_init(&bo,write,fd,bufout,sizeof(bufout));
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
+ buffer_init(&bo, write, fd, bufout, sizeof(bufout));
for (;;) {
- r = buffer_get(&bi,&ch,1);
+ r = buffer_get(&bi, &ch, 1);
if (r == 0) break;
if (r == -1) temp_read();
if (ch == '\r') continue;
while (ch != '\n') {
- buffer_put(&bo,&ch,1);
- r = buffer_get(&bi,&ch,1);
+ buffer_put(&bo, &ch, 1);
+ r = buffer_get(&bi, &ch, 1);
if (r == -1) temp_read();
}
- buffer_put(&bo,"\r\n",2);
+ buffer_put(&bo, "\r\n", 2);
}
if (buffer_flush(&bo) == -1) die(51);
- if (fstat(fd,&st) == -1) die_read();
+ if (fstat(fd, &st) == -1) die_read();
if (fsync(fd) == -1) die_write(fndkin.s);
if (close(fd) == -1) die_write(fndkin.s);
}
@@ -261,28 +289,61 @@ stralloc length = {0}; // -l
-z<hash> - set signature type (1=sha1, 2=sha256, 3=both, 4=ed25519, 5=hybrid)
*/
-int dkim_sign(const char *rsakeyfile,const char *ecckeyfile,const char *fnin,const char *fnout)
+int dkim_sign(const char *rsakeyfile, const char *ecckeyfile, const char *fnin, const char *fnout)
{
int child;
int wstat;
char *(args[17]);
int i = 0;
- args[i] = "qmail-dkim"; ++i;
- args[i] = "-s"; ++i;
- args[i] = "-q"; ++i;
- if (sdid.len > 3) { args[i] = sdid.s; ++i; }
- if (selector.len > 3) { args[i] = selector.s; ++i; }
- if (selectore.len > 3) { args[i] = selectore.s; ++i; }
- if (auid.len > 3) { args[i] = auid.s; ++i; }
- if (expire.len > 3) { args[i] = expire.s; ++i; }
- if (canon.len > 2) { args[i] = canon.s; ++i; }
- if (hash.len > 2) { args[i] = hash.s; ++i; }
- if (length.len > 2) { args[i] = length.s; ++i; }
- args[i] = fnin; ++i;
- args[i] = rsakeyfile; ++i;
- args[i] = fnout; ++i;
- if (str_len(ecckeyfile) > 3) { args[i] = ecckeyfile; ++i; }
+ args[i] = "qmail-dkim";
+ ++i;
+ args[i] = "-s";
+ ++i;
+ args[i] = "-q";
+ ++i;
+ if (sdid.len > 3) {
+ args[i] = sdid.s;
+ ++i;
+ }
+ if (selector.len > 3) {
+ args[i] = selector.s;
+ ++i;
+ }
+ if (selectore.len > 3) {
+ args[i] = selectore.s;
+ ++i;
+ }
+ if (auid.len > 3) {
+ args[i] = auid.s;
+ ++i;
+ }
+ if (expire.len > 3) {
+ args[i] = expire.s;
+ ++i;
+ }
+ if (canon.len > 2) {
+ args[i] = canon.s;
+ ++i;
+ }
+ if (hash.len > 2) {
+ args[i] = hash.s;
+ ++i;
+ }
+ if (length.len > 2) {
+ args[i] = length.s;
+ ++i;
+ }
+ args[i] = fnin;
+ ++i;
+ args[i] = rsakeyfile;
+ ++i;
+ args[i] = fnout;
+ ++i;
+ if (str_len(ecckeyfile) > 3) {
+ args[i] = ecckeyfile;
+ ++i;
+ }
args[i] = 0;
if (!(child = vfork())) {
@@ -291,16 +352,16 @@ int dkim_sign(const char *rsakeyfile,const char *ecckeyfile,const char *fnin,con
_exit(100);
}
- wait_pid(&wstat,child);
+ wait_pid(&wstat, child);
if (wait_crashed(wstat)) return 1;
switch (wait_exitcode(wstat)) {
- case 1: return 1;
+ case 1: return 1;
default: return 0;
}
}
-int qmail_remote(char **qargs,int fd)
+int qmail_remote(char **qargs, int fd)
{
int child;
int wstat;
@@ -314,20 +375,20 @@ int qmail_remote(char **qargs,int fd)
if (!(child = vfork())) {
if (fd) {
- if (fd_move(0,fd) == -1) _exit(111);
- if (fd_copy(2,1) == -1) _exit(111);
+ if (fd_move(0, fd) == -1) _exit(111);
+ if (fd_copy(2, 1) == -1) _exit(111);
}
pathexec(args);
if (errno) _exit(111);
_exit(100);
}
-
- wait_pid(&wstat,child);
+
+ wait_pid(&wstat, child);
if (wait_crashed(wstat)) return 1;
switch (wait_exitcode(wstat)) {
case 111: return 1;
- default: return 0;
+ default: return 0;
}
}
@@ -338,104 +399,106 @@ void dkim_setup()
/* defaults: selector=default, IETF format, q=dns/txt, z=2, c=r */
- if (!stralloc_copys(&sdid,"-d")) temp_nomem();
- if (!stralloc_cat(&sdid,&sender)) temp_nomem();
+ if (!stralloc_copys(&sdid, "-d")) temp_nomem();
+ if (!stralloc_cat(&sdid, &sender)) temp_nomem();
if (!stralloc_0(&sdid)) temp_nomem();
- if (!stralloc_copys(&selector,"-ydefault")) temp_nomem();
+ if (!stralloc_copys(&selector, "-ydefault")) temp_nomem();
if (!stralloc_0(&selector)) temp_nomem();
- if (!stralloc_copys(&selectore,"-Yeddy")) temp_nomem();
+ if (!stralloc_copys(&selectore, "-Yeddy")) temp_nomem();
if (!stralloc_0(&selectore)) temp_nomem();
- if (!stralloc_copys(&canon,"-cr")) temp_nomem();
+ if (!stralloc_copys(&canon, "-cr")) temp_nomem();
if (!stralloc_0(&canon)) temp_nomem();
- if (!stralloc_copys(&hash,"-z2")) temp_nomem();
+ if (!stralloc_copys(&hash, "-z2")) temp_nomem();
if (!stralloc_0(&hash)) temp_nomem();
/* domain:selector,selectore|sdid|[auid|~]|expire|c:z:l; c=[r|s|t|u], z=[1,2,3,4,5], l=l */
if (dkimparams && *dkimparams) {
- i = str_chr(dkimparams,'|');
+ i = str_chr(dkimparams, '|');
pos = dkimparams + i;
- if (*pos == '|' || *pos == '\0') { // selector
+ if (*pos == '|' || *pos == '\0') { // selector
dkimparams[i] = '\0';
- c = str_chr(dkimparams,','); // selectore=eddy
+ c = str_chr(dkimparams, ','); // selectore=eddy
if (dkimparams[c] == ',') {
dkimparams[c] = '\0';
if (str_len(dkimparams + c + 1)) {
- if (!stralloc_copys(&selectore,"-Y")) temp_nomem();
- if (!stralloc_cats(&selectore,dkimparams + c + 1)) temp_nomem();
+ if (!stralloc_copys(&selectore, "-Y")) temp_nomem();
+ if (!stralloc_cats(&selectore, dkimparams + c + 1)) temp_nomem();
if (!stralloc_0(&selectore)) temp_nomem();
}
- } else if (str_len(dkimparams)) { // selector=default
- if (!stralloc_copys(&selector,"-y")) temp_nomem();
- if (!stralloc_cats(&selector,dkimparams)) temp_nomem();
+ } else if (str_len(dkimparams)) { // selector=default
+ if (!stralloc_copys(&selector, "-y")) temp_nomem();
+ if (!stralloc_cats(&selector, dkimparams)) temp_nomem();
if (!stralloc_0(&selector)) temp_nomem();
}
- j = str_chr(dkimparams + i + 1,'|');
+ j = str_chr(dkimparams + i + 1, '|');
pos = dkimparams + i + j + 1;
- if (*pos == '|' || *pos == '\0') { // sdid; domain in DKIM header
+ if (*pos == '|' || *pos == '\0') { // sdid; domain in DKIM header
dkimparams[i + j + 1] = '\0';
- if (!stralloc_copys(&sdid,"-d")) temp_nomem();
- if (!stralloc_cats(&sdid,dkimparams + i + 1)) temp_nomem();
+ if (!stralloc_copys(&sdid, "-d")) temp_nomem();
+ if (!stralloc_cats(&sdid, dkimparams + i + 1)) temp_nomem();
if (!stralloc_0(&sdid)) temp_nomem();
- k = str_chr(dkimparams + i + j + 2,'|');
+ k = str_chr(dkimparams + i + j + 2, '|');
pos = dkimparams + i + j + k + 2;
- if (*pos == '|' || *pos == '\0') { // auid = identifier
+ if (*pos == '|' || *pos == '\0') { // auid = identifier
dkimparams[i + j + k + 2] = '\0';
- if (!stralloc_copys(&auid,"-i")) temp_nomem();
+ if (!stralloc_copys(&auid, "-i")) temp_nomem();
if (dkimparams[i + j + 2] == '~') {
- if (!stralloc_cat(&auid,&originator)) temp_nomem();
- } else
- if (!stralloc_cats(&auid,dkimparams + i + j + 2)) temp_nomem();
-
+ if (!stralloc_cat(&auid, &originator)) temp_nomem();
+ } else if (!stralloc_cats(&auid, dkimparams + i + j + 2))
+ temp_nomem();
+
if (!stralloc_0(&auid)) temp_nomem();
-
- l = str_chr(dkimparams + i + j + k + 3,'|');
+
+ l = str_chr(dkimparams + i + j + k + 3, '|');
pos = dkimparams + i + j + k + l + 3;
- if (*pos == '|' || *pos == '\0') { // expire after n secs
+ if (*pos == '|' || *pos == '\0') { // expire after n secs
dkimparams[i + j + k + l + 3] = '\0';
- if (!stralloc_copys(&expire,"-x")) temp_nomem();
- if (!stralloc_cats(&expire,dkimparams + i + j + k + 3)) temp_nomem();
+ if (!stralloc_copys(&expire, "-x")) temp_nomem();
+ if (!stralloc_cats(&expire, dkimparams + i + j + k + 3)) temp_nomem();
if (!stralloc_0(&expire)) temp_nomem();
- /* Options to follow */
+ /* Options to follow */
opt = dkimparams + i + j + k + l + 4;
if (*opt == '\0') return;
- if (*opt != ':') {
- if (!stralloc_copys(&canon,"-c")) temp_nomem(); // canonicalization
- if (!stralloc_catb(&canon,opt,1)) temp_nomem();
+ if (*opt != ':') {
+ if (!stralloc_copys(&canon, "-c")) temp_nomem(); // canonicalization
+ if (!stralloc_catb(&canon, opt, 1)) temp_nomem();
if (!stralloc_0(&canon)) temp_nomem();
- ++opt; if (*opt == '\0') return; // next colon
+ ++opt;
+ if (*opt == '\0') return; // next colon
}
if (*opt != ':' || *opt == '\0') return;
if (*opt == ':') ++opt;
if (*opt != ':') {
- if (!stralloc_copys(&hash,"-z")) temp_nomem(); // hash
- if (!stralloc_catb(&hash,opt,1)) temp_nomem();
+ if (!stralloc_copys(&hash, "-z")) temp_nomem(); // hash
+ if (!stralloc_catb(&hash, opt, 1)) temp_nomem();
if (!stralloc_0(&hash)) temp_nomem();
- ++opt; if (*opt == '\0') return; // next colon
+ ++opt;
+ if (*opt == '\0') return; // next colon
}
if (*opt != ':' || *opt == '\0') return;
if (*opt == ':') ++opt;
if (*opt != ':' && *opt == 'l') {
- if (!stralloc_copys(&length,"-l")) temp_nomem(); // length
+ if (!stralloc_copys(&length, "-l")) temp_nomem(); // length
if (!stralloc_0(&length)) temp_nomem();
}
}
}
- }
- }
+ }
+ }
}
return;
}
-int main(int argc,char **args)
+int main(int argc, char **args)
{
- int i;
- int fdin = 0; // initial read from FD 0
+ int i;
+ int fdin = 0; // initial read from FD 0
int nkey = 0;
char *(qargs[4]);
struct stat st;
@@ -451,15 +514,15 @@ int main(int argc,char **args)
if (chdir(auto_qmail) == -1) temp_chdir();
if (str_len(args[2]) > 2) {
- i = str_chr(args[2],'@');
- if (*(args[2] + i) == '@')
- if (!stralloc_copys(&senddomain,args[2] + i + 1)) temp_nomem();
+ i = str_chr(args[2], '@');
+ if (*(args[2] + i) == '@')
+ if (!stralloc_copys(&senddomain, args[2] + i + 1)) temp_nomem();
}
- if (!stralloc_0(&senddomain)) temp_nomem();
- if (!stralloc_copys(&originator,args[2])) temp_nomem();
+ if (!stralloc_0(&senddomain)) temp_nomem();
+ if (!stralloc_copys(&originator, args[2])) temp_nomem();
- if (!get_controls()) {
- qmail_remote(qargs,fdin);
+ if (!get_controls()) {
+ qmail_remote(qargs, fdin);
_exit(0);
}
@@ -467,34 +530,34 @@ int main(int argc,char **args)
/* Setup keys: they are composed from selector */
- case_lowerb(sender.s,sender.len); // needs to be lowercase
- if (!stralloc_copys(&rsakey,DOMAINKEYS)) temp_nomem();
- if (!stralloc_cats(&rsakey,sender.s)) temp_nomem();
- if (!stralloc_cats(&rsakey,"/")) temp_nomem();
+ case_lowerb(sender.s, sender.len); // needs to be lowercase
+ if (!stralloc_copys(&rsakey, DOMAINKEYS)) temp_nomem();
+ if (!stralloc_cats(&rsakey, sender.s)) temp_nomem();
+ if (!stralloc_cats(&rsakey, "/")) temp_nomem();
- if (!stralloc_copys(&ecckey,DOMAINKEYS)) temp_nomem();
- if (!stralloc_cats(&ecckey,sender.s)) temp_nomem();
- if (!stralloc_cats(&ecckey,"/")) temp_nomem();
+ if (!stralloc_copys(&ecckey, DOMAINKEYS)) temp_nomem();
+ if (!stralloc_cats(&ecckey, sender.s)) temp_nomem();
+ if (!stralloc_cats(&ecckey, "/")) temp_nomem();
/* RSA key common for SHA1 and SHA256: rsakeyfile -> selector */
- if (!stralloc_cats(&rsakey,selector.s + 2)) temp_nomem(); // -y prepended
+ if (!stralloc_cats(&rsakey, selector.s + 2)) temp_nomem(); // -y prepended
if (!stralloc_0(&rsakey)) temp_nomem();
- if (stat(rsakey.s,&st) != -1)
+ if (stat(rsakey.s, &st) != -1)
if (open_read(rsakey.s) > 0) ++nkey;
/* ECC key follows: ecckeyfile -> (,)selector2 */
- if (!stralloc_cats(&ecckey,selectore.s + 2)) temp_nomem(); // -Y prepended
+ if (!stralloc_cats(&ecckey, selectore.s + 2)) temp_nomem(); // -Y prepended
if (!stralloc_0(&ecckey)) temp_nomem();
- if (stat(ecckey.s,&st) != -1)
+ if (stat(ecckey.s, &st) != -1)
if (open_read(ecckey.s) > 0) ++nkey;
/* We got keys - go for staging */
-
- if (nkey) { // otherwise no key exists; why bother
+
+ if (nkey) { // otherwise no key exists; why bother
dkim_stage();
- if (!dkim_sign(rsakey.s,ecckey.s,fndkin.s,fndkout.s)) {
+ if (!dkim_sign(rsakey.s, ecckey.s, fndkin.s, fndkout.s)) {
fdin = open_read(fndkout.s);
if (fdin == -1) die_read();
} else {
@@ -503,8 +566,8 @@ int main(int argc,char **args)
}
} else
temp_nosignkey();
-
- qmail_remote(qargs,fdin); // closes fdin
+
+ qmail_remote(qargs, fdin); // closes fdin
if (nkey) dkim_unlink();
_exit(0);
diff --git a/src/qmail-dkverify.c b/src/qmail-dkverify.c
index e607e08..3d64e51 100644
--- a/src/qmail-dkverify.c
+++ b/src/qmail-dkverify.c
@@ -1,30 +1,32 @@
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
-#include "sig.h"
-#include "stralloc.h"
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
+#include "byte.h"
+#include "case.h"
+#include "env.h"
#include "error.h"
-#include "auto_qmail.h"
-#include "str.h"
#include "exit.h"
-#include "uint_t.h"
#include "fd.h"
-#include "open.h"
#include "fmt.h"
-#include "fmtqfn.h"
-#include "readwrite.h"
#include "getln.h"
-#include "qmail.h"
+#include "logmsg.h"
+#include "open.h"
+#include "pathexec.h"
+#include "readwrite.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "uint_t.h"
#include "wait.h"
-#include "byte.h"
-#include "case.h"
+
+#include "auto_qmail.h"
#include "control.h"
-#include "pathexec.h"
-#include "env.h"
-#include "logmsg.h"
+#include "fmtqfn.h"
+#include "qmail.h"
#define WHO "qmail-dkverify"
@@ -41,35 +43,60 @@
*/
-char bufin[1024]; // RFC 5322: 998 chars - why?
-buffer bi = BUFFER_INIT(read,0,bufin,sizeof(bufin)); // read buffer
+char bufin[1024]; // RFC 5322: 998 chars - why?
+buffer bi = BUFFER_INIT(read, 0, bufin, sizeof(bufin)); // read buffer
char bufout[1024];
-buffer bo = BUFFER_INIT(write,1,bufout,sizeof(bufout)); // output message
+buffer bo = BUFFER_INIT(write, 1, bufout, sizeof(bufout)); // output message
-void die(int e) { _exit(e); }
-void die_pipe(char *fn) { unlink(fn); die(53); };
-void die_write(char *fn) { unlink(fn); die(53); };
-void die_read() { die(54); };
-void out(char *s) { if (buffer_puts(&bo,s) == -1) _exit(111); }
-void zero() { if (buffer_put(&bo,"\0",1) == -1) _exit(111); }
-void zerodie() { zero(); buffer_flush(&bo); _exit(111); }
+void die(int e)
+{
+ _exit(e);
+}
+void die_pipe(char *fn)
+{
+ unlink(fn);
+ die(53);
+}
+void die_write(char *fn)
+{
+ unlink(fn);
+ die(53);
+}
+void die_read()
+{
+ die(54);
+}
+void out(char *s)
+{
+ if (buffer_puts(&bo, s) == -1) _exit(111);
+}
+void zero()
+{
+ if (buffer_put(&bo, "\0", 1) == -1) _exit(111);
+}
+void zerodie()
+{
+ zero();
+ buffer_flush(&bo);
+ _exit(111);
+}
-void temp_nomem()
+void temp_nomem()
{
out("ZOut of memory. (#4.3.0)\n");
zerodie();
}
-void temp_chdir()
+void temp_chdir()
{
out("ZUnable to switch to target directory. (#4.3.0)\n");
zerodie();
}
-void temp_create()
+void temp_create()
{
out("ZUnable to create DKIM stage file. (#4.3.0)\n");
zerodie();
}
-void temp_unlink()
+void temp_unlink()
{
out("ZUnable to unlink DKIM stage file. (#4.3.0)\n");
zerodie();
@@ -96,13 +123,13 @@ static stralloc dkheader = {0};
static stralloc fndkin = {0};
static stralloc fndkout = {0};
static stralloc result = {0};
-
-void fnmake_dkim(unsigned long id)
-{
- fndkin.len = fmtqfn(fndkin.s,"queue/dkim/",id,1);
+
+void fnmake_dkim(unsigned long id)
+{
+ fndkin.len = fmtqfn(fndkin.s, "queue/dkim/", id, 1);
id += id;
- fndkout.len = fmtqfn(fndkout.s,"queue/dkim/",id,1);
-}
+ fndkout.len = fmtqfn(fndkout.s, "queue/dkim/", id, 1);
+}
void dkim_stage()
{
@@ -111,32 +138,32 @@ void dkim_stage()
char ch;
struct stat st;
- if (!stralloc_ready(&fndkin,FMTQFN)) temp_nomem();
- if (!stralloc_ready(&fndkout,FMTQFN)) temp_nomem();
+ if (!stralloc_ready(&fndkin, FMTQFN)) temp_nomem();
+ if (!stralloc_ready(&fndkout, FMTQFN)) temp_nomem();
fnmake_dkim(getpid()); // pre-staging
fd = open_excl(fndkin.s);
if (fd == -1) die_write(fndkin.s);
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
- buffer_init(&bo,write,fd,bufout,sizeof(bufout));
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
+ buffer_init(&bo, write, fd, bufout, sizeof(bufout));
for (int i = 0;;) {
- r = buffer_get(&bi,&ch,1);
+ r = buffer_get(&bi, &ch, 1);
if (r == 0) break;
if (r == -1) temp_read();
while (ch != '\n') {
- if (ch != '\r') buffer_put(&bo,&ch,1);
- r = buffer_get(&bi,&ch,1);
+ if (ch != '\r') buffer_put(&bo, &ch, 1);
+ r = buffer_get(&bi, &ch, 1);
if (r == -1) temp_read();
i++;
}
- buffer_put(&bo,"\r\n",2);
+ buffer_put(&bo, "\r\n", 2);
}
if (buffer_flush(&bo) == -1) die(51);
- if (fstat(fd,&st) == -1) die_write(fndkin.s);
+ if (fstat(fd, &st) == -1) die_write(fndkin.s);
if (fsync(fd) == -1) die_write(fndkin.s);
if (close(fd) == -1) die_write(fndkin.s);
}
@@ -154,34 +181,34 @@ int mess_dkim()
int i;
fd = open_read(fndkin.s);
- if (fd == -1) die_read();
- buffer_init(&bi,read,fd,bufin,sizeof(bufin));
+ if (fd == -1) die_read();
+ buffer_init(&bi, read, fd, bufin, sizeof(bufin));
+
+ if (!stralloc_copys(&senddomain, "")) temp_nomem();
- if (!stralloc_copys(&senddomain,"")) temp_nomem();
-
for (;;) {
- if (getln(&bi,&line,&match,'\n') == -1) temp_read();
- if (case_starts(line.s,"DKIM-Signature: ")) r = 1;
- if (r == 1) {
- if (case_starts(line.s,"From: ")) { // fallback: From
- at = str_chr(line.s,'@');
+ if (getln(&bi, &line, &match, '\n') == -1) temp_read();
+ if (case_starts(line.s, "DKIM-Signature: ")) r = 1;
+ if (r == 1) {
+ if (case_starts(line.s, "From: ")) { // fallback: From
+ at = str_chr(line.s, '@');
if (at < line.len) {
- end = str_chr(line.s,'\n'); // From: user@senddomain\n
- ket = str_chr(line.s,'>'); // From: User <user@senddomain>
+ end = str_chr(line.s, '\n'); // From: user@senddomain\n
+ ket = str_chr(line.s, '>'); // From: User <user@senddomain>
len = (ket < end) ? ket : end;
len -= at - 1;
if (len) {
- if (!stralloc_copyb(&senddomain,line.s + at + 1,len)) temp_nomem();
- } else
- if (!stralloc_copys(&senddomain,"uknown")) temp_nomem();
+ if (!stralloc_copyb(&senddomain, line.s + at + 1, len)) temp_nomem();
+ } else if (!stralloc_copys(&senddomain, "uknown"))
+ temp_nomem();
r = 2;
}
}
- for (i = 0; i < line.len; ++i) { // d=domain.tld
+ for (i = 0; i < line.len; ++i) { // d=domain.tld
if (*(line.s + i) == '=' && *(line.s + i - 1) == 'd') {
- ++i; // gotcha
+ ++i; // gotcha
while (*(line.s + i) != ';') {
- if (!stralloc_catb(&senddomain,line.s + i,1)) temp_nomem();
+ if (!stralloc_catb(&senddomain, line.s + i, 1)) temp_nomem();
i++;
r = 3;
}
@@ -190,8 +217,8 @@ int mess_dkim()
}
if (r >= 2 || !match) break;
}
- if (senddomain.len < 2)
- if (!stralloc_copys(&senddomain,"unknown")) temp_nomem();
+ if (senddomain.len < 2)
+ if (!stralloc_copys(&senddomain, "unknown")) temp_nomem();
if (!stralloc_0(&senddomain)) temp_nomem();
return r;
@@ -211,13 +238,13 @@ int dkim_verify()
args[4] = fndkout.s;
args[5] = 0;
- if (!(child = fork())) {
+ if (!(child = fork())) {
pathexec(args);
if (errno) _exit(111);
_exit(100);
}
- wait_pid(&wstat,child);
+ wait_pid(&wstat, child);
if (wait_crashed(wstat)) return 1;
switch (r = wait_exitcode(wstat)) {
@@ -232,44 +259,45 @@ int dkim_result(const char *me)
int fd;
int j;
char ch;
- int r = 0;
+ int r = 0;
- if (!stralloc_copys(&result,"")) temp_nomem();
+ if (!stralloc_copys(&result, "")) temp_nomem();
- if ((fd = open_read(fndkout.s)) == -1) return 0; // nothing to read
- while ((r = read(fd,bufin,sizeof(bufin))) > 0)
- if (!stralloc_catb(&result,bufin,r)) temp_nomem();
+ if ((fd = open_read(fndkout.s)) == -1) return 0; // nothing to read
+ while ((r = read(fd, bufin, sizeof(bufin))) > 0)
+ if (!stralloc_catb(&result, bufin, r)) temp_nomem();
if (!stralloc_0(&result)) temp_nomem();
if (result.len > 2) {
- if (case_starts(result.s,"pass")) r = 0;
- if (case_starts(result.s,"fail")) r = 35;
- } else
- if (!stralloc_copys(&result,"unknown")) temp_nomem();
+ if (case_starts(result.s, "pass")) r = 0;
+ if (case_starts(result.s, "fail")) r = 35;
+ } else if (!stralloc_copys(&result, "unknown"))
+ temp_nomem();
- if (!stralloc_copys(&dkheader,"X-Authentication-Results: ")) temp_nomem();
- if (!stralloc_cats(&dkheader,senddomain.s)) temp_nomem();
- if (!stralloc_cats(&dkheader,"; dkim=")) temp_nomem();
+ if (!stralloc_copys(&dkheader, "X-Authentication-Results: ")) temp_nomem();
+ if (!stralloc_cats(&dkheader, senddomain.s)) temp_nomem();
+ if (!stralloc_cats(&dkheader, "; dkim=")) temp_nomem();
for (j = 0; j < result.len; j++) {
ch = result.s[j];
if (ch == '\r' || ch == '\n' || ch == '\0') continue;
- if (j <= max) if (!stralloc_catb(&dkheader,&ch,1)) temp_nomem();
+ if (j <= max)
+ if (!stralloc_catb(&dkheader, &ch, 1)) temp_nomem();
if (ch == ' ' && (j > max)) {
- if (!stralloc_cats(&dkheader,"\n ")) temp_nomem();
+ if (!stralloc_cats(&dkheader, "\n ")) temp_nomem();
max += max;
}
}
- if (!stralloc_cats(&dkheader,"; ")) temp_nomem();
- if (!stralloc_cats(&dkheader,me)) temp_nomem();
+ if (!stralloc_cats(&dkheader, "; ")) temp_nomem();
+ if (!stralloc_cats(&dkheader, me)) temp_nomem();
if (!stralloc_0(&dkheader)) temp_nomem();
return r;
}
-int qmail_queue()
+int qmail_queue()
{
int fd;
int r;
@@ -285,12 +313,13 @@ int qmail_queue()
args[1] = 0;
switch (child = vfork()) {
- case -1:
- close(pi[0]); close(pi[1]);
- die_write(fndkin.s);
- case 0:
+ case -1:
+ close(pi[0]);
+ close(pi[1]);
+ die_write(fndkin.s);
+ case 0:
close(pi[1]);
- if (fd_move(0,pi[0]) == -1) die_pipe(fndkin.s);
+ if (fd_move(0, pi[0]) == -1) die_pipe(fndkin.s);
sig_pipedefault();
pathexec(args);
if (errno) _exit(111);
@@ -298,25 +327,25 @@ int qmail_queue()
}
close(pi[0]);
- buffer_init(&bo,write,pi[1],bufout,sizeof(bufout));
+ buffer_init(&bo, write, pi[1], bufout, sizeof(bufout));
- if (dkheader.len > 2) { // write DKIM header
- if (buffer_put(&bo,dkheader.s,dkheader.len - 1) == -1) die_write(fndkout.s);
- if (buffer_put(&bo,"\n",1) == -1) die_write(fndkout.s);
+ if (dkheader.len > 2) { // write DKIM header
+ if (buffer_put(&bo, dkheader.s, dkheader.len - 1) == -1) die_write(fndkout.s);
+ if (buffer_put(&bo, "\n", 1) == -1) die_write(fndkout.s);
if (buffer_flush(&bo) == -1) die_write(fndkout.s);
}
/* read/write message byte-by-byte; we need to remove the CR (inefficient) */
if ((fd = open_read(fndkin.s)) == -1) die_read();
- while ((r = read(fd,&ch,1)) > 0)
+ while ((r = read(fd, &ch, 1)) > 0)
if (ch != '\r')
- if (buffer_put(&bo,&ch,1) == -1) die_write(fndkin.s);
+ if (buffer_put(&bo, &ch, 1) == -1) die_write(fndkin.s);
if (buffer_flush(&bo) == -1) die_write(fndkin.s);
close(pi[1]);
- wait_pid(&wstat,child);
+ wait_pid(&wstat, child);
if (wait_crashed(wstat)) return 1;
switch (r = wait_exitcode(wstat)) {
@@ -343,13 +372,13 @@ int main()
umask(033);
if (chdir(auto_qmail) == -1) temp_chdir();
if (control_init() == -1) temp_control();
- if (control_readline(&me,"control/me") == -1) temp_control();
+ if (control_readline(&me, "control/me") == -1) temp_control();
if (!stralloc_0(&me)) temp_nomem();
dkim_stage();
if (mess_dkim()) {
- dkim_verify();
+ dkim_verify();
r = dkim_result(me.s);
}
diff --git a/src/qmail-getpw.c b/src/qmail-getpw.c
index f801c3c..9de7ec6 100644
--- a/src/qmail-getpw.c
+++ b/src/qmail-getpw.c
@@ -1,16 +1,18 @@
-#include <sys/types.h>
-#include <sys/stat.h>
#include <pwd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "error.h"
+
#include "buffer.h"
-#include "exit.h"
#include "byte.h"
-#include "str.h"
#include "case.h"
+#include "error.h"
+#include "exit.h"
#include "fmt.h"
-#include "auto_usera.h"
+#include "str.h"
+
#include "auto_break.h"
+#include "auto_usera.h"
#include "qlx.h"
#define GETPW_USERLEN 32
@@ -29,7 +31,7 @@ int userext()
for (;;) {
if (extension - local < sizeof(username))
if (!*extension || (*extension == *auto_break)) {
- byte_copy(username,extension - local,local);
+ byte_copy(username, extension - local, local);
username[extension - local] = 0;
case_lowers(username);
errno = 0;
@@ -37,24 +39,27 @@ int userext()
if (errno == ETXTBSY) _exit(QLX_SYS);
if (pw)
if (pw->pw_uid)
- if (stat(pw->pw_dir,&st) == 0) {
+ if (stat(pw->pw_dir, &st) == 0) {
if (st.st_uid == pw->pw_uid) {
dash = "";
- if (*extension) { ++extension; dash = "-"; }
+ if (*extension) {
+ ++extension;
+ dash = "-";
+ }
return 1;
}
} else {
if (errno) _exit(QLX_NFS);
}
}
- if (extension == local) return 0;
+ if (extension == local) return 0;
--extension;
}
}
char num[FMT_ULONG];
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
local = argv[1];
if (!local) _exit(100);
@@ -67,18 +72,18 @@ int main(int argc,char **argv)
if (!pw) _exit(QLX_NOALIAS);
- buffer_puts(buffer_1small,pw->pw_name);
- buffer_put(buffer_1small,"",1);
- buffer_put(buffer_1small,num,fmt_ulong(num,(long) pw->pw_uid));
- buffer_put(buffer_1small,"",1);
- buffer_put(buffer_1small,num,fmt_ulong(num,(long) pw->pw_gid));
- buffer_put(buffer_1small,"",1);
- buffer_puts(buffer_1small,pw->pw_dir);
- buffer_put(buffer_1small,"",1);
- buffer_puts(buffer_1small,dash);
- buffer_put(buffer_1small,"",1);
- buffer_puts(buffer_1small,extension);
- buffer_put(buffer_1small,"",1);
+ buffer_puts(buffer_1small, pw->pw_name);
+ buffer_put(buffer_1small, "", 1);
+ buffer_put(buffer_1small, num, fmt_ulong(num, (long)pw->pw_uid));
+ buffer_put(buffer_1small, "", 1);
+ buffer_put(buffer_1small, num, fmt_ulong(num, (long)pw->pw_gid));
+ buffer_put(buffer_1small, "", 1);
+ buffer_puts(buffer_1small, pw->pw_dir);
+ buffer_put(buffer_1small, "", 1);
+ buffer_puts(buffer_1small, dash);
+ buffer_put(buffer_1small, "", 1);
+ buffer_puts(buffer_1small, extension);
+ buffer_put(buffer_1small, "", 1);
buffer_flush(buffer_1small);
_exit(0);
diff --git a/src/qmail-inject.c b/src/qmail-inject.c
index 0071316..dd8bb21 100644
--- a/src/qmail-inject.c
+++ b/src/qmail-inject.c
@@ -1,26 +1,28 @@
#include <unistd.h>
-#include "sig.h"
+
+#include "alloc.h"
#include "buffer.h"
+#include "constmap.h"
+#include "env.h"
+#include "error.h"
+#include "exit.h"
+#include "fmt.h"
#include "genalloc.h"
-#include "stralloc.h"
-#include "getoptb.h"
#include "getln.h"
-#include "alloc.h"
+#include "getoptb.h"
+#include "sig.h"
#include "str.h"
-#include "fmt.h"
-#include "hfield.h"
-#include "token822.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
#include "control.h"
-#include "env.h"
-#include "qmail.h"
-#include "now.h"
-#include "exit.h"
-#include "error.h"
-#include "quote.h"
#include "headerbody.h"
-#include "auto_qmail.h"
+#include "hfield.h"
#include "newfield.h"
-#include "constmap.h"
+#include "now.h"
+#include "qmail.h"
+#include "quote.h"
+#include "token822.h"
#define LINELEN 80
@@ -52,57 +54,68 @@ int flagrh;
int flagqueue;
struct qmail qqt;
-void out(char *s,int len)
+void out(char *s, int len)
{
- if (flagqueue) qmail_put(&qqt,s,len);
- else buffer_putflush(buffer_1,s,len);
+ if (flagqueue)
+ qmail_put(&qqt, s, len);
+ else
+ buffer_putflush(buffer_1, s, len);
}
-void outs(char *s) { out(s,str_len(s)); }
+void outs(char *s)
+{
+ out(s, str_len(s));
+}
-void perm() { _exit(100); }
-void temp() { _exit(111); }
+void perm()
+{
+ _exit(100);
+}
+void temp()
+{
+ _exit(111);
+}
-void die_nomem()
+void die_nomem()
{
- buffer_putsflush(buffer_2,"qmail-inject: fatal: out of memory\n");
- temp();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: out of memory\n");
+ temp();
}
-void die_invalid(stralloc *sa)
+void die_invalid(stralloc *sa)
{
- buffer_putsflush(buffer_2,"qmail-inject: fatal: invalid header field: ");
- buffer_putflush(buffer_2,sa->s,sa->len);
- perm();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: invalid header field: ");
+ buffer_putflush(buffer_2, sa->s, sa->len);
+ perm();
}
-void die_qqt()
+void die_qqt()
{
- buffer_putsflush(buffer_2,"qmail-inject: fatal: unable to run qmail-queue\n");
- temp();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: unable to run qmail-queue\n");
+ temp();
}
-void die_chdir()
+void die_chdir()
{
- buffer_putsflush(buffer_2,"qmail-inject: fatal: internal bug\n");
- temp();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: internal bug\n");
+ temp();
}
-void die_read()
+void die_read()
{
if (errno == ENOMEM) die_nomem();
- buffer_putsflush(buffer_2,"qmail-inject: fatal: read error\n");
- temp();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: read error\n");
+ temp();
}
-void doordie(stralloc *sa,int r)
+void doordie(stralloc *sa, int r)
{
- if (r == 1) return;
+ if (r == 1) return;
if (r == -1) die_nomem();
- buffer_putsflush(buffer_2,"qmail-inject: fatal: unable to parse this line:\n");
- buffer_putflush(buffer_2,sa->s,sa->len);
- perm();
+ buffer_putsflush(buffer_2, "qmail-inject: fatal: unable to parse this line:\n");
+ buffer_putflush(buffer_2, sa->s, sa->len);
+ perm();
}
-GEN_ALLOC_typedef(saa,stralloc,sa,len,a)
-GEN_ALLOC_readyplus(saa,stralloc,sa,len,a,i,n,x,10,saa_readyplus)
+GEN_ALLOC_typedef(saa, stralloc, sa, len, a)
+ GEN_ALLOC_readyplus(saa, stralloc, sa, len, a, i, n, x, 10, saa_readyplus)
-static stralloc sauninit = {0};
+ static stralloc sauninit = {0};
saa savedh = {0};
saa hrlist = {0};
@@ -113,60 +126,60 @@ int flagresent;
void exitnicely()
{
- char *qqx;
-
- if (!flagqueue) buffer_flush(buffer_1);
-
- if (flagqueue) {
- int i;
-
- if (!stralloc_0(&sender)) die_nomem();
- qmail_from(&qqt,sender.s);
-
- for (i = 0; i < reciplist.len; ++i) {
- if (!stralloc_0(&reciplist.sa[i])) die_nomem();
- qmail_to(&qqt,reciplist.sa[i].s);
- }
- if (flagrh) {
- if (flagresent) {
- for (i = 0; i < hrrlist.len; ++i) {
- if (!stralloc_0(&hrrlist.sa[i])) die_nomem();
- qmail_to(&qqt,hrrlist.sa[i].s);
- }
- } else {
- for (i = 0; i < hrlist.len; ++i) {
- if (!stralloc_0(&hrlist.sa[i])) die_nomem();
- qmail_to(&qqt,hrlist.sa[i].s);
- }
- }
- }
-
- qqx = qmail_close(&qqt);
- if (*qqx) {
- if (*qqx == 'D') {
- buffer_puts(buffer_2,"qmail-inject: fatal: ");
- buffer_puts(buffer_2,qqx + 1);
- buffer_puts(buffer_2,"\n");
- buffer_flush(buffer_2);
- perm();
- } else {
- buffer_puts(buffer_2,"qmail-inject: fatal: ");
- buffer_puts(buffer_2,qqx + 1);
- buffer_puts(buffer_2,"\n");
- buffer_flush(buffer_2);
- temp();
- }
- }
- }
-
- _exit(0);
+ char *qqx;
+
+ if (!flagqueue) buffer_flush(buffer_1);
+
+ if (flagqueue) {
+ int i;
+
+ if (!stralloc_0(&sender)) die_nomem();
+ qmail_from(&qqt, sender.s);
+
+ for (i = 0; i < reciplist.len; ++i) {
+ if (!stralloc_0(&reciplist.sa[i])) die_nomem();
+ qmail_to(&qqt, reciplist.sa[i].s);
+ }
+ if (flagrh) {
+ if (flagresent) {
+ for (i = 0; i < hrrlist.len; ++i) {
+ if (!stralloc_0(&hrrlist.sa[i])) die_nomem();
+ qmail_to(&qqt, hrrlist.sa[i].s);
+ }
+ } else {
+ for (i = 0; i < hrlist.len; ++i) {
+ if (!stralloc_0(&hrlist.sa[i])) die_nomem();
+ qmail_to(&qqt, hrlist.sa[i].s);
+ }
+ }
+ }
+
+ qqx = qmail_close(&qqt);
+ if (*qqx) {
+ if (*qqx == 'D') {
+ buffer_puts(buffer_2, "qmail-inject: fatal: ");
+ buffer_puts(buffer_2, qqx + 1);
+ buffer_puts(buffer_2, "\n");
+ buffer_flush(buffer_2);
+ perm();
+ } else {
+ buffer_puts(buffer_2, "qmail-inject: fatal: ");
+ buffer_puts(buffer_2, qqx + 1);
+ buffer_puts(buffer_2, "\n");
+ buffer_flush(buffer_2);
+ temp();
+ }
+ }
+ }
+
+ _exit(0);
}
void savedh_append(stralloc *h)
{
- if (!saa_readyplus(&savedh,1)) die_nomem();
+ if (!saa_readyplus(&savedh, 1)) die_nomem();
savedh.sa[savedh.len] = sauninit;
- if (!stralloc_copy(savedh.sa + savedh.len,h)) die_nomem();
+ if (!stralloc_copy(savedh.sa + savedh.len, h)) die_nomem();
++savedh.len;
}
@@ -174,8 +187,7 @@ void savedh_print()
{
int i;
- for (i = 0; i < savedh.len; ++i)
- out(savedh.sa[i].s,savedh.sa[i].len);
+ for (i = 0; i < savedh.len; ++i) out(savedh.sa[i].s, savedh.sa[i].len);
}
stralloc defaultdomainbuf = {0};
@@ -189,8 +201,7 @@ void rwroute(token822_alloc *addr)
{
if (addr->t[addr->len - 1].type == TOKEN822_AT)
while (addr->len)
- if (addr->t[--addr->len].type == TOKEN822_COLON)
- return;
+ if (addr->t[--addr->len].type == TOKEN822_COLON) return;
}
void rwextraat(token822_alloc *addr)
@@ -199,9 +210,8 @@ void rwextraat(token822_alloc *addr)
if (addr->t[0].type == TOKEN822_AT) {
--addr->len;
- for (i = 0; i < addr->len; ++i)
- addr->t[i] = addr->t[i + 1];
- }
+ for (i = 0; i < addr->len; ++i) addr->t[i] = addr->t[i + 1];
+ }
}
void rwextradot(token822_alloc *addr)
@@ -210,8 +220,7 @@ void rwextradot(token822_alloc *addr)
if (addr->t[0].type == TOKEN822_DOT) {
--addr->len;
- for (i = 0; i < addr->len; ++i)
- addr->t[i] = addr->t[i + 1];
+ for (i = 0; i < addr->len; ++i) addr->t[i] = addr->t[i + 1];
}
}
@@ -221,17 +230,14 @@ void rwnoat(token822_alloc *addr)
int shift;
for (i = 0; i < addr->len; ++i)
- if (addr->t[i].type == TOKEN822_AT)
- return;
+ if (addr->t[i].type == TOKEN822_AT) return;
shift = defaulthost.len;
- if (!token822_readyplus(addr,shift)) die_nomem();
- for (i = addr->len - 1; i >= 0; --i)
- addr->t[i + shift] = addr->t[i];
+ if (!token822_readyplus(addr, shift)) die_nomem();
+ for (i = addr->len - 1; i >= 0; --i) addr->t[i + shift] = addr->t[i];
addr->len += shift;
- for (i = 0; i < shift; ++i)
- addr->t[i] = defaulthost.t[shift - 1 - i];
+ for (i = 0; i < shift; ++i) addr->t[i] = defaulthost.t[shift - 1 - i];
}
void rwnodot(token822_alloc *addr)
@@ -240,27 +246,21 @@ void rwnodot(token822_alloc *addr)
int shift;
for (i = 0; i < addr->len; ++i) {
- if (addr->t[i].type == TOKEN822_DOT)
- return;
- if (addr->t[i].type == TOKEN822_AT)
- break;
+ if (addr->t[i].type == TOKEN822_DOT) return;
+ if (addr->t[i].type == TOKEN822_AT) break;
}
for (i = 0; i < addr->len; ++i) {
- if (addr->t[i].type == TOKEN822_LITERAL)
- return;
- if (addr->t[i].type == TOKEN822_AT)
- break;
+ if (addr->t[i].type == TOKEN822_LITERAL) return;
+ if (addr->t[i].type == TOKEN822_AT) break;
}
shift = defaultdomain.len;
- if (!token822_readyplus(addr,shift)) die_nomem();
+ if (!token822_readyplus(addr, shift)) die_nomem();
- for (i = addr->len - 1; i >= 0; --i)
- addr->t[i + shift] = addr->t[i];
+ for (i = addr->len - 1; i >= 0; --i) addr->t[i + shift] = addr->t[i];
addr->len += shift;
-
- for (i = 0; i < shift; ++i)
- addr->t[i] = defaultdomain.t[shift - 1 - i];
+
+ for (i = 0; i < shift; ++i) addr->t[i] = defaultdomain.t[shift - 1 - i];
}
void rwplus(token822_alloc *addr)
@@ -275,15 +275,13 @@ void rwplus(token822_alloc *addr)
--addr->t[0].slen; /* remove + */
shift = plusdomain.len;
- if (!token822_readyplus(addr,shift)) die_nomem();
+ if (!token822_readyplus(addr, shift)) die_nomem();
+
+ for (i = addr->len - 1; i >= 0; --i) addr->t[i + shift] = addr->t[i];
- for (i = addr->len - 1; i >= 0; --i)
- addr->t[i + shift] = addr->t[i];
-
addr->len += shift;
-
- for (i = 0; i < shift; ++i)
- addr->t[i] = plusdomain.t[shift - 1 - i];
+
+ for (i = 0; i < shift; ++i) addr->t[i] = plusdomain.t[shift - 1 - i];
}
void rwgeneric(token822_alloc *addr)
@@ -293,7 +291,7 @@ void rwgeneric(token822_alloc *addr)
if (addr->t[1].type == TOKEN822_AT)
if (addr->t[0].type == TOKEN822_LITERAL)
if (!addr->t[0].slen) /* don't rewrite <foo@[]> */
- return;
+ return;
rwroute(addr);
if (!addr->len) return; /* <@foo:> -> <> */
@@ -310,9 +308,9 @@ int setreturn(token822_alloc *addr)
{
if (!sender.s) {
token822_reverse(addr);
- if (token822_unquote(&sender,addr) != 1) die_nomem();
+ if (token822_unquote(&sender, addr) != 1) die_nomem();
if (flaghackrecip)
- if (!stralloc_cats(&sender,"-@[]")) die_nomem();
+ if (!stralloc_cats(&sender, "-@[]")) die_nomem();
token822_reverse(addr);
}
return 1;
@@ -331,36 +329,36 @@ int rwsender(token822_alloc *addr)
return 1;
}
-void rwappend(token822_alloc *addr,saa *xl)
+void rwappend(token822_alloc *addr, saa *xl)
{
token822_reverse(addr);
- if (!saa_readyplus(xl,1)) die_nomem();
+ if (!saa_readyplus(xl, 1)) die_nomem();
xl->sa[xl->len] = sauninit;
- if (token822_unquote(&xl->sa[xl->len],addr) != 1) die_nomem();
+ if (token822_unquote(&xl->sa[xl->len], addr) != 1) die_nomem();
++xl->len;
token822_reverse(addr);
}
int rwhrr(token822_alloc *addr)
-{
- rwgeneric(addr);
- rwappend(addr,&hrrlist);
- return 1;
+{
+ rwgeneric(addr);
+ rwappend(addr, &hrrlist);
+ return 1;
}
int rwhr(token822_alloc *addr)
-{
- rwgeneric(addr);
- rwappend(addr,&hrlist);
- return 1;
+{
+ rwgeneric(addr);
+ rwappend(addr, &hrlist);
+ return 1;
}
int rwtocc(token822_alloc *addr)
-{
- rwgeneric(addr);
- rwappend(addr,&hrlist);
- rwappend(addr,&tocclist);
- return 1;
+{
+ rwgeneric(addr);
+ rwappend(addr, &hrlist);
+ rwappend(addr, &tocclist);
+ return 1;
}
int htypeseen[H_NUM];
@@ -373,40 +371,45 @@ void doheaderfield(stralloc *h)
{
int htype;
int (*rw)() = 0;
-
- htype = hfield_known(h->s,h->len);
- if (flagdeletefrom) if (htype == H_FROM) return;
- if (flagdeletemessid) if (htype == H_MESSAGEID) return;
- if (flagdeletesender) if (htype == H_RETURNPATH) return;
-
+
+ htype = hfield_known(h->s, h->len);
+ if (flagdeletefrom)
+ if (htype == H_FROM) return;
+ if (flagdeletemessid)
+ if (htype == H_MESSAGEID) return;
+ if (flagdeletesender)
+ if (htype == H_RETURNPATH) return;
+
if (htype)
htypeseen[htype] = 1;
- else
- if (!hfield_valid(h->s,h->len))
- die_invalid(h);
-
+ else if (!hfield_valid(h->s, h->len))
+ die_invalid(h);
+
switch (htype) {
- case H_TO: case H_CC:
- rw = rwtocc; break;
- case H_BCC: case H_APPARENTLYTO:
- rw = rwhr; break;
- case H_R_TO: case H_R_CC: case H_R_BCC:
- rw = rwhrr; break;
- case H_RETURNPATH:
- rw = rwreturn; break;
- case H_SENDER: case H_FROM: case H_REPLYTO:
- case H_RETURNRECEIPTTO: case H_ERRORSTO:
- case H_R_SENDER: case H_R_FROM: case H_R_REPLYTO:
- rw = rwsender; break;
+ case H_TO:
+ case H_CC: rw = rwtocc; break;
+ case H_BCC:
+ case H_APPARENTLYTO: rw = rwhr; break;
+ case H_R_TO:
+ case H_R_CC:
+ case H_R_BCC: rw = rwhrr; break;
+ case H_RETURNPATH: rw = rwreturn; break;
+ case H_SENDER:
+ case H_FROM:
+ case H_REPLYTO:
+ case H_RETURNRECEIPTTO:
+ case H_ERRORSTO:
+ case H_R_SENDER:
+ case H_R_FROM:
+ case H_R_REPLYTO: rw = rwsender; break;
}
if (rw) {
- doordie(h,token822_parse(&hfin,h,&hfbuf));
- doordie(h,token822_addrlist(&hfrewrite,&hfaddr,&hfin,rw));
- if (token822_unparse(h,&hfrewrite,LINELEN) != 1)
- die_nomem();
+ doordie(h, token822_parse(&hfin, h, &hfbuf));
+ doordie(h, token822_addrlist(&hfrewrite, &hfaddr, &hfin, rw));
+ if (token822_unparse(h, &hfrewrite, LINELEN) != 1) die_nomem();
}
-
+
if (htype == H_BCC) return;
if (htype == H_R_BCC) return;
if (htype == H_RETURNPATH) return;
@@ -416,7 +419,7 @@ void doheaderfield(stralloc *h)
void dobody(stralloc *h)
{
- out(h->s,h->len);
+ out(h->s, h->len);
}
stralloc torecip = {0};
@@ -424,19 +427,19 @@ token822_alloc tr = {0};
void dorecip(char *s)
{
- if (!quote2(&torecip,s)) die_nomem();
+ if (!quote2(&torecip, s)) die_nomem();
- switch (token822_parse(&tr,&torecip,&hfbuf)) {
+ switch (token822_parse(&tr, &torecip, &hfbuf)) {
case -1: die_nomem();
case 0:
- buffer_puts(buffer_2,"qmail-inject: fatal: unable to parse address: ");
- buffer_puts(buffer_2,s);
- buffer_putsflush(buffer_2,"\n");
+ buffer_puts(buffer_2, "qmail-inject: fatal: unable to parse address: ");
+ buffer_puts(buffer_2, s);
+ buffer_putsflush(buffer_2, "\n");
perm();
}
token822_reverse(&tr);
rwgeneric(&tr);
- rwappend(&tr,&reciplist);
+ rwappend(&tr, &reciplist);
}
stralloc defaultfrom = {0};
@@ -448,7 +451,7 @@ void defaultfrommake()
fullname = env_get("QMAILNAME");
if (!fullname) fullname = env_get("MAILNAME");
if (!fullname) fullname = env_get("NAME");
- if (!token822_ready(&df,20)) die_nomem();
+ if (!token822_ready(&df, 20)) die_nomem();
df.len = 0;
df.t[df.len].type = TOKEN822_ATOM;
@@ -493,10 +496,10 @@ void defaultfrommake()
++df.len;
}
- if (token822_unparse(&defaultfrom,&df,LINELEN) != 1) die_nomem();
- doordie(&defaultfrom,token822_parse(&df,&defaultfrom,&hfbuf));
- doordie(&defaultfrom,token822_addrlist(&hfrewrite,&hfaddr,&df,rwsender));
- if (token822_unparse(&defaultfrom,&hfrewrite,LINELEN) != 1) die_nomem();
+ if (token822_unparse(&defaultfrom, &df, LINELEN) != 1) die_nomem();
+ doordie(&defaultfrom, token822_parse(&df, &defaultfrom, &hfbuf));
+ doordie(&defaultfrom, token822_addrlist(&hfrewrite, &hfaddr, &df, rwsender));
+ if (token822_unparse(&defaultfrom, &hfrewrite, LINELEN) != 1) die_nomem();
}
stralloc defaultreturnpath = {0};
@@ -506,18 +509,18 @@ char strnum[FMT_ULONG];
void dodefaultreturnpath()
{
- if (!stralloc_copys(&hackedruser,mailruser)) die_nomem();
+ if (!stralloc_copys(&hackedruser, mailruser)) die_nomem();
if (flaghackmess) {
- if (!stralloc_cats(&hackedruser,"-")) die_nomem();
- if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) starttime))) die_nomem();
- if (!stralloc_cats(&hackedruser,".")) die_nomem();
- if (!stralloc_catb(&hackedruser,strnum,fmt_ulong(strnum,(unsigned long) getpid()))) die_nomem();
+ if (!stralloc_cats(&hackedruser, "-")) die_nomem();
+ if (!stralloc_catb(&hackedruser, strnum, fmt_ulong(strnum, (unsigned long)starttime))) die_nomem();
+ if (!stralloc_cats(&hackedruser, ".")) die_nomem();
+ if (!stralloc_catb(&hackedruser, strnum, fmt_ulong(strnum, (unsigned long)getpid()))) die_nomem();
}
if (flaghackrecip)
- if (!stralloc_cats(&hackedruser,"-")) die_nomem();
+ if (!stralloc_cats(&hackedruser, "-")) die_nomem();
- if (!token822_ready(&drp,10)) die_nomem();
+ if (!token822_ready(&drp, 10)) die_nomem();
drp.len = 0;
drp.t[drp.len].type = TOKEN822_ATOM;
@@ -540,10 +543,10 @@ void dodefaultreturnpath()
++drp.len;
}
- if (token822_unparse(&defaultreturnpath,&drp,LINELEN) != 1) die_nomem();
- doordie(&defaultreturnpath,token822_parse(&drp,&defaultreturnpath,&hfbuf));
- doordie(&defaultreturnpath,token822_addrlist(&hfrewrite,&hfaddr,&drp,rwreturn));
- if (token822_unparse(&defaultreturnpath,&hfrewrite,LINELEN) != 1) die_nomem();
+ if (token822_unparse(&defaultreturnpath, &drp, LINELEN) != 1) die_nomem();
+ doordie(&defaultreturnpath, token822_parse(&drp, &defaultreturnpath, &hfbuf));
+ doordie(&defaultreturnpath, token822_addrlist(&hfrewrite, &hfaddr, &drp, rwreturn));
+ if (token822_unparse(&defaultreturnpath, &hfrewrite, LINELEN) != 1) die_nomem();
}
int flagmft = 0;
@@ -558,11 +561,11 @@ void mft_init()
x = env_get("QMAILMFTFILE");
if (!x) return;
- r = control_readfile(&mft,x,0);
+ r = control_readfile(&mft, x, 0);
if (r == -1) die_read(); /*XXX*/
if (!r) return;
- if (!constmap_init(&mapmft,mft.s,mft.len,0)) die_nomem();
+ if (!constmap_init(&mapmft, mft.s, mft.len, 0)) die_nomem();
flagmft = 1;
}
@@ -576,18 +579,17 @@ void finishmft()
if (htypeseen[H_MAILFOLLOWUPTO]) return;
for (i = 0; i < tocclist.len; ++i)
- if (constmap(&mapmft,tocclist.sa[i].s,tocclist.sa[i].len))
- break;
+ if (constmap(&mapmft, tocclist.sa[i].s, tocclist.sa[i].len)) break;
if (i == tocclist.len) return;
outs("Mail-Followup-To: ");
i = tocclist.len;
while (i--) {
- if (!stralloc_copy(&sa,&tocclist.sa[i])) die_nomem();
+ if (!stralloc_copy(&sa, &tocclist.sa[i])) die_nomem();
if (!stralloc_0(&sa)) die_nomem();
- if (!quote2(&sa2,sa.s)) die_nomem();
- out(sa2.s,sa2.len);
+ if (!quote2(&sa2, sa.s)) die_nomem();
+ out(sa2.s, sa2.len);
if (i) outs(",\n ");
}
outs("\n");
@@ -596,27 +598,25 @@ void finishmft()
void finishheader()
{
flagresent =
- htypeseen[H_R_SENDER] || htypeseen[H_R_FROM] || htypeseen[H_R_REPLYTO]
- || htypeseen[H_R_TO] || htypeseen[H_R_CC] || htypeseen[H_R_BCC]
- || htypeseen[H_R_DATE] || htypeseen[H_R_MESSAGEID];
+ htypeseen[H_R_SENDER] || htypeseen[H_R_FROM] || htypeseen[H_R_REPLYTO] || htypeseen[H_R_TO]
+ || htypeseen[H_R_CC] || htypeseen[H_R_BCC] || htypeseen[H_R_DATE] || htypeseen[H_R_MESSAGEID];
- if (!sender.s)
- dodefaultreturnpath();
+ if (!sender.s) dodefaultreturnpath();
if (!flagqueue) {
static stralloc sa = {0};
static stralloc sa2 = {0};
- if (!stralloc_copy(&sa,&sender)) die_nomem();
+ if (!stralloc_copy(&sa, &sender)) die_nomem();
if (!stralloc_0(&sa)) die_nomem();
- if (!quote2(&sa2,sa.s)) die_nomem();
+ if (!quote2(&sa2, sa.s)) die_nomem();
outs("Return-Path: <");
- out(sa2.s,sa2.len);
+ out(sa2.s, sa2.len);
outs(">\n");
}
- /* could check at this point whether there are any recipients */
+ /* could check at this point whether there are any recipients */
if (flagqueue)
if (qmail_open(&qqt) == -1) die_qqt();
@@ -624,35 +624,33 @@ void finishheader()
if (!htypeseen[H_R_DATE]) {
if (!newfield_datemake(starttime)) die_nomem();
outs("Resent-");
- out(newfield_date.s,newfield_date.len);
+ out(newfield_date.s, newfield_date.len);
}
if (!htypeseen[H_R_MESSAGEID]) {
- if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem();
+ if (!newfield_msgidmake(control_idhost.s, control_idhost.len, starttime)) die_nomem();
outs("Resent-");
- out(newfield_msgid.s,newfield_msgid.len);
+ out(newfield_msgid.s, newfield_msgid.len);
}
if (!htypeseen[H_R_FROM]) {
defaultfrommake();
outs("Resent-");
- out(defaultfrom.s,defaultfrom.len);
+ out(defaultfrom.s, defaultfrom.len);
}
- if (!htypeseen[H_R_TO] && !htypeseen[H_R_CC])
- outs("Resent-Cc: recipient list not shown: ;\n");
+ if (!htypeseen[H_R_TO] && !htypeseen[H_R_CC]) outs("Resent-Cc: recipient list not shown: ;\n");
} else {
if (!htypeseen[H_DATE]) {
if (!newfield_datemake(starttime)) die_nomem();
- out(newfield_date.s,newfield_date.len);
+ out(newfield_date.s, newfield_date.len);
}
if (!htypeseen[H_MESSAGEID]) {
- if (!newfield_msgidmake(control_idhost.s,control_idhost.len,starttime)) die_nomem();
- out(newfield_msgid.s,newfield_msgid.len);
+ if (!newfield_msgidmake(control_idhost.s, control_idhost.len, starttime)) die_nomem();
+ out(newfield_msgid.s, newfield_msgid.len);
}
if (!htypeseen[H_FROM]) {
defaultfrommake();
- out(defaultfrom.s,defaultfrom.len);
+ out(defaultfrom.s, defaultfrom.len);
}
- if (!htypeseen[H_TO] && !htypeseen[H_CC])
- outs("Cc: recipient list not shown: ;\n");
+ if (!htypeseen[H_TO] && !htypeseen[H_CC]) outs("Cc: recipient list not shown: ;\n");
finishmft();
}
@@ -669,42 +667,43 @@ void getcontrols()
if (chdir(auto_qmail) == -1) die_chdir();
if (control_init() == -1) die_read();
- if (control_rldef(&control_defaultdomain,"control/defaultdomain",1,"defaultdomain") != 1)
+ if (control_rldef(&control_defaultdomain, "control/defaultdomain", 1, "defaultdomain") != 1)
die_read();
x = env_get("QMAILDEFAULTDOMAIN");
- if (x) if (!stralloc_copys(&control_defaultdomain,x)) die_nomem();
- if (!stralloc_copys(&sa,".")) die_nomem();
- if (!stralloc_cat(&sa,&control_defaultdomain)) die_nomem();
- doordie(&sa,token822_parse(&defaultdomain,&sa,&defaultdomainbuf));
+ if (x)
+ if (!stralloc_copys(&control_defaultdomain, x)) die_nomem();
+ if (!stralloc_copys(&sa, ".")) die_nomem();
+ if (!stralloc_cat(&sa, &control_defaultdomain)) die_nomem();
+ doordie(&sa, token822_parse(&defaultdomain, &sa, &defaultdomainbuf));
- if (control_rldef(&control_defaulthost,"control/defaulthost",1,"defaulthost") != 1)
- die_read();
+ if (control_rldef(&control_defaulthost, "control/defaulthost", 1, "defaulthost") != 1) die_read();
x = env_get("QMAILDEFAULTHOST");
- if (x) if (!stralloc_copys(&control_defaulthost,x)) die_nomem();
- if (!stralloc_copys(&sa,"@")) die_nomem();
- if (!stralloc_cat(&sa,&control_defaulthost)) die_nomem();
- doordie(&sa,token822_parse(&defaulthost,&sa,&defaulthostbuf));
+ if (x)
+ if (!stralloc_copys(&control_defaulthost, x)) die_nomem();
+ if (!stralloc_copys(&sa, "@")) die_nomem();
+ if (!stralloc_cat(&sa, &control_defaulthost)) die_nomem();
+ doordie(&sa, token822_parse(&defaulthost, &sa, &defaulthostbuf));
- if (control_rldef(&control_plusdomain,"control/plusdomain",1,"plusdomain") != 1)
- die_read();
+ if (control_rldef(&control_plusdomain, "control/plusdomain", 1, "plusdomain") != 1) die_read();
x = env_get("QMAILPLUSDOMAIN");
- if (x) if (!stralloc_copys(&control_plusdomain,x)) die_nomem();
- if (!stralloc_copys(&sa,".")) die_nomem();
- if (!stralloc_cat(&sa,&control_plusdomain)) die_nomem();
- doordie(&sa,token822_parse(&plusdomain,&sa,&plusdomainbuf));
+ if (x)
+ if (!stralloc_copys(&control_plusdomain, x)) die_nomem();
+ if (!stralloc_copys(&sa, ".")) die_nomem();
+ if (!stralloc_cat(&sa, &control_plusdomain)) die_nomem();
+ doordie(&sa, token822_parse(&plusdomain, &sa, &plusdomainbuf));
- if (control_rldef(&control_idhost,"control/idhost",1,"idhost") != 1)
- die_read();
+ if (control_rldef(&control_idhost, "control/idhost", 1, "idhost") != 1) die_read();
x = env_get("QMAILIDHOST");
- if (x) if (!stralloc_copys(&control_idhost,x)) die_nomem();
+ if (x)
+ if (!stralloc_copys(&control_idhost, x)) die_nomem();
}
#define RECIP_DEFAULT 1
-#define RECIP_ARGS 2
-#define RECIP_HEADER 3
-#define RECIP_AH 4
+#define RECIP_ARGS 2
+#define RECIP_HEADER 3
+#define RECIP_AH 4
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int i;
int opt;
@@ -716,8 +715,8 @@ int main(int argc,char **argv)
qmopts = env_get("QMAILINJECT");
if (qmopts)
- while (*qmopts)
- switch (*qmopts++) {
+ while (*qmopts) switch (*qmopts++)
+ {
case 'c': flagnamecomment = 1; break;
case 's': flagdeletesender = 1; break;
case 'f': flagdeletefrom = 1; break;
@@ -737,7 +736,7 @@ int main(int argc,char **argv)
if (!mailuser) mailuser = env_get("LOGNAME");
if (!mailuser) mailuser = "anonymous";
mailusertokentype = TOKEN822_ATOM;
- if (quote_need(mailuser,str_len(mailuser))) mailusertokentype = TOKEN822_QUOTE;
+ if (quote_need(mailuser, str_len(mailuser))) mailusertokentype = TOKEN822_QUOTE;
mailruser = env_get("QMAILSUSER");
if (!mailruser) mailruser = mailuser;
@@ -748,13 +747,13 @@ int main(int argc,char **argv)
getcontrols();
- if (!saa_readyplus(&hrlist,1)) die_nomem();
- if (!saa_readyplus(&tocclist,1)) die_nomem();
- if (!saa_readyplus(&hrrlist,1)) die_nomem();
- if (!saa_readyplus(&reciplist,1)) die_nomem();
+ if (!saa_readyplus(&hrlist, 1)) die_nomem();
+ if (!saa_readyplus(&tocclist, 1)) die_nomem();
+ if (!saa_readyplus(&hrrlist, 1)) die_nomem();
+ if (!saa_readyplus(&reciplist, 1)) die_nomem();
- while ((opt = getopt(argc,argv,"aAhHnNf:")) != opteof)
- switch (opt) {
+ while ((opt = getopt(argc, argv, "aAhHnNf:")) != opteof) switch (opt)
+ {
case 'a': recipstrategy = RECIP_ARGS; break;
case 'A': recipstrategy = RECIP_DEFAULT; break;
case 'h': recipstrategy = RECIP_HEADER; break;
@@ -762,32 +761,28 @@ int main(int argc,char **argv)
case 'n': flagqueue = 0; break;
case 'N': flagqueue = 1; break;
case 'f':
- if (!quote2(&sender,optarg)) die_nomem();
- doordie(&sender,token822_parse(&envs,&sender,&envsbuf));
+ if (!quote2(&sender, optarg)) die_nomem();
+ doordie(&sender, token822_parse(&envs, &sender, &envsbuf));
token822_reverse(&envs);
rwgeneric(&envs);
token822_reverse(&envs);
- if (token822_unquote(&sender,&envs) != 1) die_nomem();
+ if (token822_unquote(&sender, &envs) != 1) die_nomem();
break;
case '?':
- default:
- perm();
+ default: perm();
}
argc -= optind;
argv += optind;
- if (recipstrategy == RECIP_DEFAULT)
- recipstrategy = (*argv ? RECIP_ARGS : RECIP_HEADER);
+ if (recipstrategy == RECIP_DEFAULT) recipstrategy = (*argv ? RECIP_ARGS : RECIP_HEADER);
if (recipstrategy != RECIP_HEADER)
- while (*argv)
- dorecip(*argv++);
+ while (*argv) dorecip(*argv++);
flagrh = (recipstrategy != RECIP_ARGS);
- if (headerbody(buffer_0,doheaderfield,finishheader,dobody) == -1)
- die_read();
+ if (headerbody(buffer_0, doheaderfield, finishheader, dobody) == -1) die_read();
exitnicely();
}
diff --git a/src/qmail-local.c b/src/qmail-local.c
index 7d1e6a3..4479e9b 100644
--- a/src/qmail-local.c
+++ b/src/qmail-local.c
@@ -1,33 +1,35 @@
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "sig.h"
-#include "env.h"
+
+#include "alloc.h"
+#include "buffer.h"
#include "byte.h"
+#include "case.h"
+#include "env.h"
#include "exit.h"
-#include "open.h"
-#include "wait.h"
-#include "lock.h"
-#include "seek.h"
-#include "buffer.h"
+#include "fmt.h"
#include "getln.h"
#include "getoptb.h"
-#include "alloc.h"
+#include "lock.h"
#include "logmsg.h"
-#include "stralloc.h"
-#include "fmt.h"
-#include "str.h"
-#include "now.h"
-#include "case.h"
-#include "quote.h"
-#include "qmail.h"
+#include "open.h"
#include "readclose.h"
-#include "myctime.h"
-#include "gfrom.h"
+#include "seek.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "wait.h"
+
#include "auto_break.h"
#include "auto_patrn.h"
+#include "gfrom.h"
+#include "myctime.h"
+#include "now.h"
+#include "qmail.h"
+#include "quote.h"
/**
@file qmail-local
@@ -38,23 +40,45 @@
#define WHO "qmail-local"
-void usage() { logmsg(WHO,100,USAGE,"qmail-local [ -nN ] user homedir local dash ext domain sender aliasempty"); }
+void usage()
+{
+ logmsg(WHO, 100, USAGE, "qmail-local [ -nN ] user homedir local dash ext domain sender aliasempty");
+}
-void temp_nomem() { logmsg(WHO,111,FATAL,"Out of memory. (#4.3.0)"); }
-void temp_rewind() { logmsg(WHO,111,FATAL,"Unable to rewind message. (#4.3.0)"); }
-void temp_childcrashed() { logmsg(WHO,111,FATAL,"Aack, child crashed. (#4.3.0)"); }
-void temp_fork() { logmsg(WHO,111,FATAL,B("Unable to fork: ",error_str(errno),". (#4.3.0)")); }
-void temp_read() { logmsg(WHO,111,ERROR,B("Unable to read message: ",error_str(errno),". (#4.3.0)")); }
+void temp_nomem()
+{
+ logmsg(WHO, 111, FATAL, "Out of memory. (#4.3.0)");
+}
+void temp_rewind()
+{
+ logmsg(WHO, 111, FATAL, "Unable to rewind message. (#4.3.0)");
+}
+void temp_childcrashed()
+{
+ logmsg(WHO, 111, FATAL, "Aack, child crashed. (#4.3.0)");
+}
+void temp_fork()
+{
+ logmsg(WHO, 111, FATAL, B("Unable to fork: ", error_str(errno), ". (#4.3.0)"));
+}
+void temp_read()
+{
+ logmsg(WHO, 111, ERROR, B("Unable to read message: ", error_str(errno), ". (#4.3.0)"));
+}
void temp_slowlock()
-{ logmsg(WHO,111,ERROR,"File has been locked for 30 seconds straight. (#4.3.0)"); }
+{
+ logmsg(WHO, 111, ERROR, "File has been locked for 30 seconds straight. (#4.3.0)");
+}
void temp_qmail(fn) char *fn;
-{ logmsg(WHO,111,FATAL,B("Unable to open: ",fn," ",error_str(errno),". (#4.3.0)")); }
+{
+ logmsg(WHO, 111, FATAL, B("Unable to open: ", fn, " ", error_str(errno), ". (#4.3.0)"));
+}
int flagdoit;
int flag99;
char *user;
-char *homedir;
+char *homedir;
char *local;
char *dash;
char *ext;
@@ -81,8 +105,15 @@ char bufout[1024];
char fntmptph[80 + FMT_ULONG * 2];
char fnnewtph[80 + FMT_ULONG * 2];
-void tryunlinktmp() { unlink(fntmptph); }
-void sigalrm() { tryunlinktmp(); _exit(3); }
+void tryunlinktmp()
+{
+ unlink(fntmptph);
+}
+void sigalrm()
+{
+ tryunlinktmp();
+ _exit(3);
+}
void maildir_child(char *dir)
{
@@ -97,34 +128,43 @@ void maildir_child(char *dir)
buffer bo;
sig_alarmcatch(sigalrm);
- if (chdir(dir) == -1) { if (errno != ENOENT) _exit(1); _exit(2); }
+ if (chdir(dir) == -1) {
+ if (errno != ENOENT) _exit(1);
+ _exit(2);
+ }
pid = getpid();
host[0] = 0;
- gethostname(host,sizeof(host));
+ gethostname(host, sizeof(host));
s = host;
for (loop = 0; loop < str_len(host); ++loop) {
if (host[loop] == '/') {
- if (!stralloc_cats(&hostname,"\\057")) temp_nomem();
- continue;
+ if (!stralloc_cats(&hostname, "\\057")) temp_nomem();
+ continue;
}
if (host[loop] == ':') {
- if (!stralloc_cats(&hostname,"\\072")) temp_nomem();
+ if (!stralloc_cats(&hostname, "\\072")) temp_nomem();
continue;
}
- if (!stralloc_append(&hostname,s+loop)) temp_nomem();
+ if (!stralloc_append(&hostname, s + loop)) temp_nomem();
}
- for (loop = 0 ;; ++loop) {
- gettimeofday(&time,0);
+ for (loop = 0;; ++loop) {
+ gettimeofday(&time, 0);
s = fntmptph;
- s += fmt_str(s,"tmp/");
- s += fmt_ulong(s,time.tv_sec); *s++ = '.';
- *s++ = 'M'; s += fmt_ulong(s,time.tv_usec);
- *s++ = 'P'; s += fmt_ulong(s,pid); *s++ = '.';
- s += fmt_strn(s,hostname.s,hostname.len); *s++ = 0;
-
- if (stat(fntmptph,&st) == -1) if (errno == ENOENT) break;
+ s += fmt_str(s, "tmp/");
+ s += fmt_ulong(s, time.tv_sec);
+ *s++ = '.';
+ *s++ = 'M';
+ s += fmt_ulong(s, time.tv_usec);
+ *s++ = 'P';
+ s += fmt_ulong(s, pid);
+ *s++ = '.';
+ s += fmt_strn(s, hostname.s, hostname.len);
+ *s++ = 0;
+
+ if (stat(fntmptph, &st) == -1)
+ if (errno == ENOENT) break;
/* really should never get to this point */
if (loop == 2) _exit(1);
sleep(2);
@@ -134,41 +174,51 @@ void maildir_child(char *dir)
fd = open_excl(fntmptph);
if (fd == -1) _exit(1);
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
- buffer_init(&bo,write,fd,bufout,sizeof(bufout));
- if (buffer_put(&bo,rpline.s,rpline.len) == -1) goto FAIL;
- if (buffer_put(&bo,dtline.s,dtline.len) == -1) goto FAIL;
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
+ buffer_init(&bo, write, fd, bufout, sizeof(bufout));
+ if (buffer_put(&bo, rpline.s, rpline.len) == -1) goto FAIL;
+ if (buffer_put(&bo, dtline.s, dtline.len) == -1) goto FAIL;
- switch (buffer_copy(&bo,&bi)) {
+ switch (buffer_copy(&bo, &bi)) {
case -2: tryunlinktmp(); _exit(4);
case -3: goto FAIL;
}
if (buffer_flush(&bo) == -1) goto FAIL;
- if (fstat(fd,&st) == -1) goto FAIL;
+ if (fstat(fd, &st) == -1) goto FAIL;
if (fsync(fd) == -1) goto FAIL;
if (close(fd) == -1) goto FAIL; /* NFS dorks */
s = fnnewtph;
- s += fmt_str(s,"new/");
- s += fmt_ulong(s,time.tv_sec); *s++ = '.';
-
+ s += fmt_str(s, "new/");
+ s += fmt_ulong(s, time.tv_sec);
+ *s++ = '.';
+
/* in hexadecimal */
- *s++ = 'I'; s += fmt_xlong(s,st.st_ino);
- *s++ = 'V'; s += fmt_xlong(s,st.st_dev);
-
- /* in decimal */
- *s++ = 'M'; s += fmt_ulong(s,time.tv_usec);
- *s++ = 'P'; s += fmt_ulong(s,pid); *s++ = '.';
-
- s += fmt_strn(s,hostname.s,hostname.len); *s++ = 0;
+ *s++ = 'I';
+ s += fmt_xlong(s, st.st_ino);
+ *s++ = 'V';
+ s += fmt_xlong(s, st.st_dev);
- if (link(fntmptph,fnnewtph) == -1) goto FAIL;
- if ((fd = open(fnnewtph,O_RDONLY)) < 0 || fsync(fd) < 0 || close(fd)) goto FAIL;
- /* DJB: if it was error_exist, almost certainly successful; i hate NFS -- FEH: Reiser patch */
- tryunlinktmp(); _exit(0);
+ /* in decimal */
+ *s++ = 'M';
+ s += fmt_ulong(s, time.tv_usec);
+ *s++ = 'P';
+ s += fmt_ulong(s, pid);
+ *s++ = '.';
+
+ s += fmt_strn(s, hostname.s, hostname.len);
+ *s++ = 0;
+
+ if (link(fntmptph, fnnewtph) == -1) goto FAIL;
+ if ((fd = open(fnnewtph, O_RDONLY)) < 0 || fsync(fd) < 0 || close(fd)) goto FAIL;
+ /* DJB: if it was error_exist, almost certainly successful; i hate NFS -- FEH: Reiser patch */
+ tryunlinktmp();
+ _exit(0);
- FAIL: tryunlinktmp(); _exit(1);
+FAIL:
+ tryunlinktmp();
+ _exit(1);
}
/* end child process */
@@ -181,23 +231,19 @@ void maildir(char *fn)
if (seek_begin(0) == -1) temp_rewind();
switch (child = fork()) {
- case -1:
- temp_fork();
- case 0:
- maildir_child(fn);
- _exit(111);
+ case -1: temp_fork();
+ case 0: maildir_child(fn); _exit(111);
}
- wait_pid(&wstat,child);
- if (wait_crashed(wstat))
- temp_childcrashed();
+ wait_pid(&wstat, child);
+ if (wait_crashed(wstat)) temp_childcrashed();
switch (wait_exitcode(wstat)) {
- case 0: break;
- case 2: logmsg(WHO,111,ERROR,"Unable to chdir to maildir. (#4.2.1)");
- case 3: logmsg(WHO,111,ERROR,"Timeout on maildir delivery. (#4.3.0)");
- case 4: logmsg(WHO,111,ERROR,"Unable to read message. (#4.3.0)");
- default: logmsg(WHO,111,ERROR,"Temporary error on maildir delivery. (#4.3.0)");
+ case 0: break;
+ case 2: logmsg(WHO, 111, ERROR, "Unable to chdir to maildir. (#4.2.1)");
+ case 3: logmsg(WHO, 111, ERROR, "Timeout on maildir delivery. (#4.3.0)");
+ case 4: logmsg(WHO, 111, ERROR, "Unable to read message. (#4.3.0)");
+ default: logmsg(WHO, 111, ERROR, "Temporary error on maildir delivery. (#4.3.0)");
}
}
@@ -213,8 +259,7 @@ void mailfile(char *fn)
if (seek_begin(0) == -1) temp_rewind();
fd = open_append(fn);
- if (fd == -1)
- logmsg(WHO,111,ERROR,B("Unable to open:",fn," ",error_str(errno),". (#4.2.1)"));
+ if (fd == -1) logmsg(WHO, 111, ERROR, B("Unable to open:", fn, " ", error_str(errno), ". (#4.2.1)"));
sig_alarmcatch(temp_slowlock);
alarm(30);
@@ -225,38 +270,38 @@ void mailfile(char *fn)
seek_end(fd);
pos = seek_cur(fd);
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
- buffer_init(&bo,write,fd,bufout,sizeof(bufout));
- if (buffer_put(&bo,ufline.s,ufline.len)) goto WRITERRS;
- if (buffer_put(&bo,rpline.s,rpline.len)) goto WRITERRS;
- if (buffer_put(&bo,dtline.s,dtline.len)) goto WRITERRS;
-
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
+ buffer_init(&bo, write, fd, bufout, sizeof(bufout));
+ if (buffer_put(&bo, ufline.s, ufline.len)) goto WRITERRS;
+ if (buffer_put(&bo, rpline.s, rpline.len)) goto WRITERRS;
+ if (buffer_put(&bo, dtline.s, dtline.len)) goto WRITERRS;
+
for (;;) {
- if (getln(&bi,&messline,&match,'\n') != 0) {
- logmsg(WHO,0,WARN,B("Unable to read message: ",error_str(errno),". (#4.3.0)"));
- if (flaglocked) seek_trunc(fd,pos);
+ if (getln(&bi, &messline, &match, '\n') != 0) {
+ logmsg(WHO, 0, WARN, B("Unable to read message: ", error_str(errno), ". (#4.3.0)"));
+ if (flaglocked) seek_trunc(fd, pos);
close(fd);
_exit(111);
}
if (!match && !messline.len) break;
- if (gfrom(messline.s,messline.len))
- if (buffer_puts(&bo,">")) goto WRITERRS;
- if (buffer_put(&bo,messline.s,messline.len)) goto WRITERRS;
+ if (gfrom(messline.s, messline.len))
+ if (buffer_puts(&bo, ">")) goto WRITERRS;
+ if (buffer_put(&bo, messline.s, messline.len)) goto WRITERRS;
if (!match) {
- if (buffer_puts(&bo,"\n")) goto WRITERRS;
+ if (buffer_puts(&bo, "\n")) goto WRITERRS;
break;
}
}
- if (buffer_puts(&bo,"\n")) goto WRITERRS;
+ if (buffer_puts(&bo, "\n")) goto WRITERRS;
if (buffer_flush(&bo)) goto WRITERRS;
if (fsync(fd) == -1) goto WRITERRS;
close(fd);
return;
- WRITERRS:
- logmsg(WHO,0,WARN,B("Unable to write ",fn,": ",error_str(errno),". (#4.3.0)"));
- if (flaglocked) seek_trunc(fd,pos);
+WRITERRS:
+ logmsg(WHO, 0, WARN, B("Unable to write ", fn, ": ", error_str(errno), ". (#4.3.0)"));
+ if (flaglocked) seek_trunc(fd, pos);
close(fd);
_exit(111);
}
@@ -270,29 +315,33 @@ void mailprogram(char *prog)
if (seek_begin(0) == -1) temp_rewind();
switch (child = fork()) {
- case -1:
- temp_fork();
+ case -1: temp_fork();
case 0:
- args[0] = "/bin/sh";
- args[1] = "-c";
- args[2] = prog;
+ args[0] = "/bin/sh";
+ args[1] = "-c";
+ args[2] = prog;
args[3] = 0;
sig_pipedefault();
- execv(*args,args);
- logmsg(WHO,0,ERROR,B("Unable to run /bin/sh: ",error_str(errno),". (#4.3.0)"));
+ execv(*args, args);
+ logmsg(WHO, 0, ERROR, B("Unable to run /bin/sh: ", error_str(errno), ". (#4.3.0)"));
}
- wait_pid(&wstat,child);
- if (wait_crashed(wstat))
- temp_childcrashed();
+ wait_pid(&wstat, child);
+ if (wait_crashed(wstat)) temp_childcrashed();
switch (wait_exitcode(wstat)) {
case 100:
- case 64: case 65: case 70: case 76: case 77: case 78: case 112: _exit(100);
- case 0: break;
- case 99: flag99 = 1; break;
- default: _exit(111);
- }
+ case 64:
+ case 65:
+ case 70:
+ case 76:
+ case 77:
+ case 78:
+ case 112: _exit(100);
+ case 0: break;
+ case 99: flag99 = 1; break;
+ default: _exit(111);
+ }
}
unsigned long mailforward_qp = 0;
@@ -305,22 +354,25 @@ void mailforward(char **recips)
int match;
if (seek_begin(0) == -1) temp_rewind();
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
if (qmail_open(&qqt) == -1) temp_fork();
mailforward_qp = qmail_qp(&qqt);
- qmail_put(&qqt,dtline.s,dtline.len);
+ qmail_put(&qqt, dtline.s, dtline.len);
do {
- if (getln(&bi,&messline,&match,'\n') != 0) { qmail_fail(&qqt); break; }
- qmail_put(&qqt,messline.s,messline.len);
+ if (getln(&bi, &messline, &match, '\n') != 0) {
+ qmail_fail(&qqt);
+ break;
+ }
+ qmail_put(&qqt, messline.s, messline.len);
} while (match);
- qmail_from(&qqt,ueo.s);
- while (*recips) qmail_to(&qqt,*recips++);
+ qmail_from(&qqt, ueo.s);
+ while (*recips) qmail_to(&qqt, *recips++);
qqx = qmail_close(&qqt);
if (!*qqx) return;
- logmsg(WHO,*qqx == 'D' ? 100 : 111,ERROR,B("Unable to forward message: ",qqx + 1,"."));
+ logmsg(WHO, *qqx == 'D' ? 100 : 111, ERROR, B("Unable to forward message: ", qqx + 1, "."));
}
void bouncexf()
@@ -329,16 +381,16 @@ void bouncexf()
buffer bi;
if (seek_begin(0) == -1) temp_rewind();
- buffer_init(&bi,read,0,bufin,sizeof(bufin));
+ buffer_init(&bi, read, 0, bufin, sizeof(bufin));
for (;;) {
- if (getln(&bi,&messline,&match,'\n') != 0) temp_read();
+ if (getln(&bi, &messline, &match, '\n') != 0) temp_read();
if (!match) break;
- if (messline.len <= 1)
- break;
+ if (messline.len <= 1) break;
if (messline.len == dtline.len)
- if (!str_diffn(messline.s,dtline.s,dtline.len))
- logmsg(WHO,100,ERROR,"This message is looping: it already has my Delivered-To line. (#5.4.6)");
+ if (!str_diffn(messline.s, dtline.s, dtline.len))
+ logmsg(
+ WHO, 100, ERROR, "This message is looping: it already has my Delivered-To line. (#5.4.6)");
}
}
@@ -346,35 +398,34 @@ void checkhome()
{
struct stat st;
- if (stat(".",&st) == -1)
- logmsg(WHO,111,ERROR,B("Unable to stat home directory: ",error_str(errno),". (#4.3.0)"));
- if (st.st_mode & auto_patrn)
- logmsg(WHO,111,ERROR,"Uh-oh: home directory is writable. (#4.7.0)");
+ if (stat(".", &st) == -1)
+ logmsg(WHO, 111, ERROR, B("Unable to stat home directory: ", error_str(errno), ". (#4.3.0)"));
+ if (st.st_mode & auto_patrn) logmsg(WHO, 111, ERROR, "Uh-oh: home directory is writable. (#4.7.0)");
if (st.st_mode & 01000)
if (flagdoit)
- logmsg(WHO,111,ERROR,"Home directory is sticky: user is editing his .qmail file. (#4.2.1)");
+ logmsg(WHO, 111, ERROR, "Home directory is sticky: user is editing his .qmail file. (#4.2.1)");
else
- logmsg(WHO,0,WARN,"Warning: home directory is sticky.");
+ logmsg(WHO, 0, WARN, "Warning: home directory is sticky.");
}
int qmeox(char *dashowner)
{
struct stat st;
-
- if (!stralloc_copys(&qme,".qmail")) temp_nomem();
- if (!stralloc_cats(&qme,dash)) temp_nomem();
- if (!stralloc_cat(&qme,&safeext)) temp_nomem();
- if (!stralloc_cats(&qme,dashowner)) temp_nomem();
+
+ if (!stralloc_copys(&qme, ".qmail")) temp_nomem();
+ if (!stralloc_cats(&qme, dash)) temp_nomem();
+ if (!stralloc_cat(&qme, &safeext)) temp_nomem();
+ if (!stralloc_cats(&qme, dashowner)) temp_nomem();
if (!stralloc_0(&qme)) temp_nomem();
- if (stat(qme.s,&st) == -1) {
+ if (stat(qme.s, &st) == -1) {
if (errno != ENOENT) temp_qmail(qme.s);
return -1;
}
- return 0;
+ return 0;
}
-int qmeexists(int *fd,int *cutable)
+int qmeexists(int *fd, int *cutable)
{
struct stat st;
@@ -388,10 +439,9 @@ int qmeexists(int *fd,int *cutable)
return 0;
}
- if (fstat(*fd,&st) == -1) temp_qmail(qme.s);
+ if (fstat(*fd, &st) == -1) temp_qmail(qme.s);
if ((st.st_mode & S_IFMT) == S_IFREG) {
- if (st.st_mode & auto_patrn)
- logmsg(WHO,111,ERROR,"Uh-oh: .qmail file is writable. (#4.7.0)");
+ if (st.st_mode & auto_patrn) logmsg(WHO, 111, ERROR, "Uh-oh: .qmail file is writable. (#4.7.0)");
*cutable = !!(st.st_mode & 0100);
return 1;
}
@@ -407,32 +457,32 @@ int qmeexists(int *fd,int *cutable)
/* "-/" "a-b-": "-/a-b-" "-/a-b-default" "-/a-default" "-/default" */
/* "-/" "a-b-c": "-/a-b-c" "-/a-b-default" "-/a-default" "-/default" */
-void qmesearch(int *fd,int *cutable)
+void qmesearch(int *fd, int *cutable)
{
int i;
- if (!stralloc_copys(&qme,".qmail")) temp_nomem();
- if (!stralloc_cats(&qme,dash)) temp_nomem();
- if (!stralloc_cat(&qme,&safeext)) temp_nomem();
- if (qmeexists(fd,cutable)) {
+ if (!stralloc_copys(&qme, ".qmail")) temp_nomem();
+ if (!stralloc_cats(&qme, dash)) temp_nomem();
+ if (!stralloc_cat(&qme, &safeext)) temp_nomem();
+ if (qmeexists(fd, cutable)) {
if (safeext.len >= 7) {
i = safeext.len - 7;
- if (!byte_diff("default",7,safeext.s + i))
+ if (!byte_diff("default", 7, safeext.s + i))
if (i <= str_len(ext)) /* paranoia */
- if (!env_put("DEFAULT",ext + i)) temp_nomem();
+ if (!env_put("DEFAULT", ext + i)) temp_nomem();
}
return;
}
- for (i = safeext.len; i >= 0 ;--i)
+ for (i = safeext.len; i >= 0; --i)
if (!i || (safeext.s[i - 1] == '-')) {
- if (!stralloc_copys(&qme,".qmail")) temp_nomem();
- if (!stralloc_cats(&qme,dash)) temp_nomem();
- if (!stralloc_catb(&qme,safeext.s,i)) temp_nomem();
- if (!stralloc_cats(&qme,"default")) temp_nomem();
- if (qmeexists(fd,cutable)) {
+ if (!stralloc_copys(&qme, ".qmail")) temp_nomem();
+ if (!stralloc_cats(&qme, dash)) temp_nomem();
+ if (!stralloc_catb(&qme, safeext.s, i)) temp_nomem();
+ if (!stralloc_cats(&qme, "default")) temp_nomem();
+ if (qmeexists(fd, cutable)) {
if (i <= str_len(ext)) /* paranoia */
- if (!env_put("DEFAULT",ext + i)) temp_nomem();
+ if (!env_put("DEFAULT", ext + i)) temp_nomem();
return;
}
}
@@ -445,34 +495,34 @@ unsigned long count_forward = 0;
unsigned long count_program = 0;
char count_buf[FMT_ULONG];
char buflog[256];
-buffer bl = BUFFER_INIT(write,1,buflog,sizeof(buflog));
+buffer bl = BUFFER_INIT(write, 1, buflog, sizeof(buflog));
void count_print()
{
- buffer_puts(&bl,"did ");
- buffer_put(&bl,count_buf,fmt_ulong(count_buf,count_file));
- buffer_puts(&bl,"+");
- buffer_put(&bl,count_buf,fmt_ulong(count_buf,count_forward));
- buffer_puts(&bl,"+");
- buffer_put(&bl,count_buf,fmt_ulong(count_buf,count_program));
- buffer_puts(&bl,"\n");
+ buffer_puts(&bl, "did ");
+ buffer_put(&bl, count_buf, fmt_ulong(count_buf, count_file));
+ buffer_puts(&bl, "+");
+ buffer_put(&bl, count_buf, fmt_ulong(count_buf, count_forward));
+ buffer_puts(&bl, "+");
+ buffer_put(&bl, count_buf, fmt_ulong(count_buf, count_program));
+ buffer_puts(&bl, "\n");
if (mailforward_qp) {
- buffer_puts(&bl,"qp ");
- buffer_put(&bl,count_buf,fmt_ulong(count_buf,mailforward_qp));
- buffer_puts(&bl,"\n");
+ buffer_puts(&bl, "qp ");
+ buffer_put(&bl, count_buf, fmt_ulong(count_buf, mailforward_qp));
+ buffer_puts(&bl, "\n");
}
buffer_flush(&bl);
}
-void sayit(char *type,char *cmd,int len)
+void sayit(char *type, char *cmd, int len)
{
- buffer_puts(&bl,type);
- buffer_put(&bl,cmd,len);
- buffer_putsflush(&bl,"\n");
+ buffer_puts(&bl, type);
+ buffer_put(&bl, cmd, len);
+ buffer_putsflush(&bl, "\n");
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int opt;
int i, j, k;
@@ -489,11 +539,11 @@ int main(int argc,char **argv)
if (!env_init()) temp_nomem();
flagdoit = 1;
- while ((opt = getopt(argc,argv,"nN")) != opteof)
- switch (opt) {
- case 'n': flagdoit = 0; break;
- case 'N': flagdoit = 1; break;
- default: usage();
+ while ((opt = getopt(argc, argv, "nN")) != opteof) switch (opt)
+ {
+ case 'n': flagdoit = 0; break;
+ case 'N': flagdoit = 1; break;
+ default: usage();
}
argc -= optind;
argv += optind;
@@ -510,159 +560,167 @@ int main(int argc,char **argv)
if (homedir[0] != '/') usage();
if (chdir(homedir) == -1)
- logmsg(WHO,111,ERROR,B("Unable to switch to: ",homedir," ",error_str(errno),". (#4.3.0)"));
+ logmsg(WHO, 111, ERROR, B("Unable to switch to: ", homedir, " ", error_str(errno), ". (#4.3.0)"));
checkhome();
- if (!env_put("HOST",host)) temp_nomem();
- if (!env_put("HOME",homedir)) temp_nomem();
- if (!env_put("USER",user)) temp_nomem();
- if (!env_put("LOCAL",local)) temp_nomem();
+ if (!env_put("HOST", host)) temp_nomem();
+ if (!env_put("HOME", homedir)) temp_nomem();
+ if (!env_put("USER", user)) temp_nomem();
+ if (!env_put("LOCAL", local)) temp_nomem();
#ifdef HIDEVIRTUALUSER
if (str_len(ext) > 1) {
- i = str_chr(local,*auto_break);
- if (!stralloc_copys(&envrecip,local + i + 1)) temp_nomem();
- } else
+ i = str_chr(local, *auto_break);
+ if (!stralloc_copys(&envrecip, local + i + 1)) temp_nomem();
+ } else
#endif
- if (!stralloc_copys(&envrecip,local)) temp_nomem();
- if (!stralloc_cats(&envrecip,"@")) temp_nomem();
- if (!stralloc_cats(&envrecip,host)) temp_nomem();
+ if (!stralloc_copys(&envrecip, local))
+ temp_nomem();
+ if (!stralloc_cats(&envrecip, "@")) temp_nomem();
+ if (!stralloc_cats(&envrecip, host)) temp_nomem();
- if (!stralloc_copy(&foo,&envrecip)) temp_nomem();
+ if (!stralloc_copy(&foo, &envrecip)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("RECIPIENT",foo.s)) temp_nomem();
+ if (!env_put("RECIPIENT", foo.s)) temp_nomem();
+
+ if (!stralloc_copys(&dtline, "Delivered-To: ")) temp_nomem();
+ if (!stralloc_cat(&dtline, &envrecip)) temp_nomem();
- if (!stralloc_copys(&dtline,"Delivered-To: ")) temp_nomem();
- if (!stralloc_cat(&dtline,&envrecip)) temp_nomem();
-
- for (i = 0; i < dtline.len; ++i)
- if (dtline.s[i] == '\n') dtline.s[i] = '_';
- if (!stralloc_cats(&dtline,"\n")) temp_nomem();
+ for (i = 0; i < dtline.len; ++i)
+ if (dtline.s[i] == '\n') dtline.s[i] = '_';
+ if (!stralloc_cats(&dtline, "\n")) temp_nomem();
- if (!stralloc_copy(&foo,&dtline)) temp_nomem();
+ if (!stralloc_copy(&foo, &dtline)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("DTLINE",foo.s)) temp_nomem();
+ if (!env_put("DTLINE", foo.s)) temp_nomem();
if (flagdoit) bouncexf();
- if (!env_put("SENDER",sender)) temp_nomem();
+ if (!env_put("SENDER", sender)) temp_nomem();
- if (!quote2(&foo,sender)) temp_nomem();
- if (!stralloc_copys(&rpline,"Return-Path: <")) temp_nomem();
- if (!stralloc_cat(&rpline,&foo)) temp_nomem();
- for (i = 0;i < rpline.len;++i) if (rpline.s[i] == '\n') rpline.s[i] = '_';
- if (!stralloc_cats(&rpline,">\n")) temp_nomem();
+ if (!quote2(&foo, sender)) temp_nomem();
+ if (!stralloc_copys(&rpline, "Return-Path: <")) temp_nomem();
+ if (!stralloc_cat(&rpline, &foo)) temp_nomem();
+ for (i = 0; i < rpline.len; ++i)
+ if (rpline.s[i] == '\n') rpline.s[i] = '_';
+ if (!stralloc_cats(&rpline, ">\n")) temp_nomem();
- if (!stralloc_copy(&foo,&rpline)) temp_nomem();
+ if (!stralloc_copy(&foo, &rpline)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("RPLINE",foo.s)) temp_nomem();
+ if (!env_put("RPLINE", foo.s)) temp_nomem();
- if (!stralloc_copys(&ufline,"From ")) temp_nomem();
+ if (!stralloc_copys(&ufline, "From ")) temp_nomem();
if (*sender) {
- int len; int i; char ch;
+ int len;
+ int i;
+ char ch;
len = str_len(sender);
- if (!stralloc_readyplus(&ufline,len)) temp_nomem();
+ if (!stralloc_readyplus(&ufline, len)) temp_nomem();
- for (i = 0;i < len;++i) {
+ for (i = 0; i < len; ++i) {
ch = sender[i];
if ((ch == ' ') || (ch == '\t') || (ch == '\n')) ch = '-';
ufline.s[ufline.len + i] = ch;
}
ufline.len += len;
- } else
- if (!stralloc_cats(&ufline,"MAILER-DAEMON")) temp_nomem();
+ } else if (!stralloc_cats(&ufline, "MAILER-DAEMON"))
+ temp_nomem();
- if (!stralloc_cats(&ufline," ")) temp_nomem();
+ if (!stralloc_cats(&ufline, " ")) temp_nomem();
starttime = now();
- if (!stralloc_cats(&ufline,myctime(starttime))) temp_nomem();
+ if (!stralloc_cats(&ufline, myctime(starttime))) temp_nomem();
- if (!stralloc_copy(&foo,&ufline)) temp_nomem();
+ if (!stralloc_copy(&foo, &ufline)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("UFLINE",foo.s)) temp_nomem();
+ if (!env_put("UFLINE", foo.s)) temp_nomem();
x = ext;
- if (!env_put("EXT",x)) temp_nomem();
- x += str_chr(x,'-'); if (*x) ++x;
- if (!env_put("EXT2",x)) temp_nomem();
- x += str_chr(x,'-'); if (*x) ++x;
- if (!env_put("EXT3",x)) temp_nomem();
- x += str_chr(x,'-'); if (*x) ++x;
- if (!env_put("EXT4",x)) temp_nomem();
-
- if (!stralloc_copys(&safeext,ext)) temp_nomem();
- case_lowerb(safeext.s,safeext.len);
+ if (!env_put("EXT", x)) temp_nomem();
+ x += str_chr(x, '-');
+ if (*x) ++x;
+ if (!env_put("EXT2", x)) temp_nomem();
+ x += str_chr(x, '-');
+ if (*x) ++x;
+ if (!env_put("EXT3", x)) temp_nomem();
+ x += str_chr(x, '-');
+ if (*x) ++x;
+ if (!env_put("EXT4", x)) temp_nomem();
+
+ if (!stralloc_copys(&safeext, ext)) temp_nomem();
+ case_lowerb(safeext.s, safeext.len);
for (i = 0; i < safeext.len; ++i)
- if (safeext.s[i] == '.')
- safeext.s[i] = ':';
+ if (safeext.s[i] == '.') safeext.s[i] = ':';
i = str_len(host);
- i = byte_rchr(host,i,'.');
- if (!stralloc_copyb(&foo,host,i)) temp_nomem();
+ i = byte_rchr(host, i, '.');
+ if (!stralloc_copyb(&foo, host, i)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("HOST2",foo.s)) temp_nomem();
- i = byte_rchr(host,i,'.');
- if (!stralloc_copyb(&foo,host,i)) temp_nomem();
+ if (!env_put("HOST2", foo.s)) temp_nomem();
+ i = byte_rchr(host, i, '.');
+ if (!stralloc_copyb(&foo, host, i)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("HOST3",foo.s)) temp_nomem();
- i = byte_rchr(host,i,'.');
- if (!stralloc_copyb(&foo,host,i)) temp_nomem();
+ if (!env_put("HOST3", foo.s)) temp_nomem();
+ i = byte_rchr(host, i, '.');
+ if (!stralloc_copyb(&foo, host, i)) temp_nomem();
if (!stralloc_0(&foo)) temp_nomem();
- if (!env_put("HOST4",foo.s)) temp_nomem();
+ if (!env_put("HOST4", foo.s)) temp_nomem();
flagforwardonly = 0;
- qmesearch(&fd,&flagforwardonly);
+ qmesearch(&fd, &flagforwardonly);
if (fd == -1)
- if (*dash)
- logmsg(WHO,100,ERROR,"Sorry, no mailbox here by that name. (#5.1.1)");
+ if (*dash) logmsg(WHO, 100, ERROR, "Sorry, no mailbox here by that name. (#5.1.1)");
- if (!stralloc_copys(&ueo,sender)) temp_nomem();
- if (str_diff(sender,""))
- if (str_diff(sender,"#@[]"))
+ if (!stralloc_copys(&ueo, sender)) temp_nomem();
+ if (str_diff(sender, ""))
+ if (str_diff(sender, "#@[]"))
if (qmeox("-owner") == 0) {
if (qmeox("-owner-default") == 0) {
- if (!stralloc_copys(&ueo,local)) temp_nomem();
- if (!stralloc_cats(&ueo,"-owner-@")) temp_nomem();
- if (!stralloc_cats(&ueo,host)) temp_nomem();
- if (!stralloc_cats(&ueo,"-@[]")) temp_nomem();
+ if (!stralloc_copys(&ueo, local)) temp_nomem();
+ if (!stralloc_cats(&ueo, "-owner-@")) temp_nomem();
+ if (!stralloc_cats(&ueo, host)) temp_nomem();
+ if (!stralloc_cats(&ueo, "-@[]")) temp_nomem();
} else {
- if (!stralloc_copys(&ueo,local)) temp_nomem();
- if (!stralloc_cats(&ueo,"-owner@")) temp_nomem();
- if (!stralloc_cats(&ueo,host)) temp_nomem();
+ if (!stralloc_copys(&ueo, local)) temp_nomem();
+ if (!stralloc_cats(&ueo, "-owner@")) temp_nomem();
+ if (!stralloc_cats(&ueo, host)) temp_nomem();
}
}
if (!stralloc_0(&ueo)) temp_nomem();
- if (!env_put("NEWSENDER",ueo.s)) temp_nomem();
+ if (!env_put("NEWSENDER", ueo.s)) temp_nomem();
- if (!stralloc_ready(&cmds,0)) temp_nomem();
+ if (!stralloc_ready(&cmds, 0)) temp_nomem();
cmds.len = 0;
if (fd != -1)
- if (readclose_append(fd,&cmds,256) == -1) temp_nomem();
+ if (readclose_append(fd, &cmds, 256) == -1) temp_nomem();
if (!cmds.len) {
- if (!stralloc_copys(&cmds,aliasempty)) temp_nomem();
+ if (!stralloc_copys(&cmds, aliasempty)) temp_nomem();
flagforwardonly = 0;
}
if (!cmds.len || (cmds.s[cmds.len - 1] != '\n'))
- if (!stralloc_cats(&cmds,"\n")) temp_nomem();
+ if (!stralloc_cats(&cmds, "\n")) temp_nomem();
numforward = 0;
i = 0;
for (j = 0; j < cmds.len; ++j)
if (cmds.s[j] == '\n') {
- switch (cmds.s[i]) {
- case '#': case '.': case '/': case '|': break;
- default: ++numforward;
+ switch (cmds.s[i]) {
+ case '#':
+ case '.':
+ case '/':
+ case '|': break;
+ default: ++numforward;
}
i = j + 1;
}
- recips = (char **) alloc((numforward + 1) * sizeof(char *));
+ recips = (char **)alloc((numforward + 1) * sizeof(char *));
if (!recips) temp_nomem();
numforward = 0;
@@ -673,52 +731,58 @@ int main(int argc,char **argv)
if (cmds.s[j] == '\n') {
cmds.s[j] = 0;
k = j;
- /* Patch contributed by Erik Sjolund <erik.sjolund@gmail.com>. */
- while ((k > i) && ((cmds.s[k - 1] == ' ') || (cmds.s[k - 1] == '\t')))
- cmds.s[--k] = 0;
+ /* Patch contributed by Erik Sjolund <erik.sjolund@gmail.com>. */
+ while ((k > i) && ((cmds.s[k - 1] == ' ') || (cmds.s[k - 1] == '\t'))) cmds.s[--k] = 0;
switch (cmds.s[i]) {
case 0: /* k == i */
if (i) break;
- logmsg(WHO,111,ERROR,"Uh-oh: first line of .qmail file is blank. (#4.2.1)");
- case '#':
- break;
+ logmsg(WHO, 111, ERROR, "Uh-oh: first line of .qmail file is blank. (#4.2.1)");
+ case '#': break;
case '.':
case '/':
- ++count_file;
- if (flagforwardonly) logmsg(WHO,111,ERROR,"Uh-oh: .qmail has file delivery but has x bit set. (#4.7.0)");
- if (cmds.s[k - 1] == '/')
- if (flagdoit) maildir(cmds.s + i);
- else sayit("maildir ",cmds.s + i,k - i);
- else
- if (flagdoit) mailfile(cmds.s + i);
- else sayit("mbox ",cmds.s + i,k - i);
- break;
- case '|':
- ++count_program;
- if (flagforwardonly) logmsg(WHO,111,ERROR,"Uh-oh: .qmail has prog delivery but has x bit set. (#4.7.0)");
- if (flagdoit) mailprogram(cmds.s + i + 1);
- else sayit("program ",cmds.s + i + 1,k - i - 1);
- break;
- case '+':
- if (str_equal(cmds.s + i + 1,"list"))
- flagforwardonly = 1;
- break;
- case '&':
- ++i;
- default:
- ++count_forward;
- if (flagdoit) recips[numforward++] = cmds.s + i;
- else sayit("forward ",cmds.s + i,k - i);
- break;
+ ++count_file;
+ if (flagforwardonly)
+ logmsg(WHO, 111, ERROR, "Uh-oh: .qmail has file delivery but has x bit set. (#4.7.0)");
+ if (cmds.s[k - 1] == '/')
+ if (flagdoit)
+ maildir(cmds.s + i);
+ else
+ sayit("maildir ", cmds.s + i, k - i);
+ else if (flagdoit)
+ mailfile(cmds.s + i);
+ else
+ sayit("mbox ", cmds.s + i, k - i);
+ break;
+ case '|':
+ ++count_program;
+ if (flagforwardonly)
+ logmsg(WHO, 111, ERROR, "Uh-oh: .qmail has prog delivery but has x bit set. (#4.7.0)");
+ if (flagdoit)
+ mailprogram(cmds.s + i + 1);
+ else
+ sayit("program ", cmds.s + i + 1, k - i - 1);
+ break;
+ case '+':
+ if (str_equal(cmds.s + i + 1, "list")) flagforwardonly = 1;
+ break;
+ case '&': ++i;
+ default:
+ ++count_forward;
+ if (flagdoit)
+ recips[numforward++] = cmds.s + i;
+ else
+ sayit("forward ", cmds.s + i, k - i);
+ break;
}
i = j + 1;
if (flag99) break;
}
- if (numforward) if (flagdoit) {
- recips[numforward] = 0;
- mailforward(recips);
- }
+ if (numforward)
+ if (flagdoit) {
+ recips[numforward] = 0;
+ mailforward(recips);
+ }
count_print();
_exit(0);
diff --git a/src/qmail-lspawn.c b/src/qmail-lspawn.c
index fed5c4c..29c1b7a 100644
--- a/src/qmail-lspawn.c
+++ b/src/qmail-lspawn.c
@@ -1,24 +1,26 @@
#include <unistd.h>
-#include "fd.h"
-#include "wait.h"
-#include "prot.h"
+
#include "buffer.h"
-#include "stralloc.h"
-#include "scan.h"
-#include "exit.h"
-#include "cdbread.h"
+#include "byte.h"
#include "case.h"
+#include "cdbread.h"
+#include "error.h"
+#include "exit.h"
+#include "fd.h"
+#include "open.h"
+#include "prot.h"
#include "readclose.h"
+#include "scan.h"
+#include "stralloc.h"
+#include "wait.h"
+
#include "auto_qmail.h"
#include "auto_uids.h"
#include "qlx.h"
-#include "error.h"
-#include "open.h"
-#include "byte.h"
char *aliasempty;
-void initialize(int argc,char **argv)
+void initialize(int argc, char **argv)
{
aliasempty = argv[1];
if (!aliasempty) _exit(100);
@@ -26,45 +28,40 @@ void initialize(int argc,char **argv)
int truncreport = 3000;
-void report(buffer *log,int wstat,char *s,int len)
+void report(buffer *log, int wstat, char *s, int len)
{
int i;
- if (wait_crashed(wstat)) { buffer_putsflush(log,"Zqmail-lspawn: qmail-local crashed.\n"); return; }
+ if (wait_crashed(wstat)) {
+ buffer_putsflush(log, "Zqmail-lspawn: qmail-local crashed.\n");
+ return;
+ }
switch (wait_exitcode(wstat)) {
- case QLX_CDB:
- buffer_putsflush(log,"Zqmail-lspawn: Trouble reading users/assign.cdb.\n"); return;
- case QLX_NOMEM:
- buffer_putsflush(log,"Zqmail-lspawn: Out of memory.\n"); return;
- case QLX_SYS:
- buffer_putsflush(log,"Zqmail-lspawn: Temporary failure.\n"); return;
- case QLX_NOALIAS:
- buffer_putsflush(log,"Zqmail-lspawn: Unable to find alias user!\n"); return;
+ case QLX_CDB: buffer_putsflush(log, "Zqmail-lspawn: Trouble reading users/assign.cdb.\n"); return;
+ case QLX_NOMEM: buffer_putsflush(log, "Zqmail-lspawn: Out of memory.\n"); return;
+ case QLX_SYS: buffer_putsflush(log, "Zqmail-lspawn: Temporary failure.\n"); return;
+ case QLX_NOALIAS: buffer_putsflush(log, "Zqmail-lspawn: Unable to find alias user!\n"); return;
case QLX_ROOT:
- buffer_putsflush(log,"Zqmail-spawn: Not allowed to perform deliveries as root.\n"); return;
- case QLX_USAGE:
- buffer_putsflush(log,"Zqmail-spawn: Internal bug.\n"); return;
- case QLX_NFS:
- buffer_putsflush(log,"Zqmail-spawn: NFS failure in qmail-local.\n"); return;
- case QLX_EXECHARD:
- buffer_putsflush(log,"Dqmail-spawn: Unable to run qmail-local.\n"); return;
- case QLX_EXECSOFT:
- buffer_putsflush(log,"Zqmail-spawn: Unable to run qmail-local.\n"); return;
- case QLX_EXECPW:
- buffer_putsflush(log,"Zqmail-spawn: Unable to run qmail-getpw.\n"); return;
- case 111: case 71: case 74: case 75:
- buffer_put(log,"Z",1); break;
- case 0:
- buffer_put(log,"K",1); break;
+ buffer_putsflush(log, "Zqmail-spawn: Not allowed to perform deliveries as root.\n");
+ return;
+ case QLX_USAGE: buffer_putsflush(log, "Zqmail-spawn: Internal bug.\n"); return;
+ case QLX_NFS: buffer_putsflush(log, "Zqmail-spawn: NFS failure in qmail-local.\n"); return;
+ case QLX_EXECHARD: buffer_putsflush(log, "Dqmail-spawn: Unable to run qmail-local.\n"); return;
+ case QLX_EXECSOFT: buffer_putsflush(log, "Zqmail-spawn: Unable to run qmail-local.\n"); return;
+ case QLX_EXECPW: buffer_putsflush(log, "Zqmail-spawn: Unable to run qmail-getpw.\n"); return;
+ case 111:
+ case 71:
+ case 74:
+ case 75: buffer_put(log, "Z", 1); break;
+ case 0: buffer_put(log, "K", 1); break;
case 100:
- default:
- buffer_put(log,"D",1); break;
+ default: buffer_put(log, "D", 1); break;
}
- for (i = 0; i < len; ++i)
+ for (i = 0; i < len; ++i)
if (!s[i]) break;
- buffer_put(log,s,i);
+ buffer_put(log, s, i);
}
stralloc lower = {0};
@@ -83,42 +80,43 @@ void nughde_get(char *local)
int fd;
int flagwild;
- if (!stralloc_copys(&lower,"!")) _exit(QLX_NOMEM);
- if (!stralloc_cats(&lower,local)) _exit(QLX_NOMEM);
+ if (!stralloc_copys(&lower, "!")) _exit(QLX_NOMEM);
+ if (!stralloc_cats(&lower, local)) _exit(QLX_NOMEM);
if (!stralloc_0(&lower)) _exit(QLX_NOMEM);
- case_lowerb(lower.s,lower.len);
+ case_lowerb(lower.s, lower.len);
- if (!stralloc_copys(&nughde,"")) _exit(QLX_NOMEM);
+ if (!stralloc_copys(&nughde, "")) _exit(QLX_NOMEM);
fd = open_read("users/assign.cdb");
if (fd == -1)
- if (errno != ENOENT)
- _exit(QLX_CDB);
+ if (errno != ENOENT) _exit(QLX_CDB);
if (fd != -1) {
unsigned int i;
- cdb_init(&c,fd);
- r = cdb_find(&c,"",0);
+ cdb_init(&c, fd);
+ r = cdb_find(&c, "", 0);
if (r != 1) _exit(QLX_CDB);
- if (!stralloc_ready(&wildchars,cdb_datalen(&c))) _exit(QLX_NOMEM);
+ if (!stralloc_ready(&wildchars, cdb_datalen(&c))) _exit(QLX_NOMEM);
wildchars.len = cdb_datalen(&c);
- if (cdb_read(&c,wildchars.s,wildchars.len,cdb_datapos(&c)) == -1) _exit(QLX_CDB);
+ if (cdb_read(&c, wildchars.s, wildchars.len, cdb_datapos(&c)) == -1) _exit(QLX_CDB);
i = lower.len;
flagwild = 0;
do {
/* i > 0 */
- if (!flagwild || (i == 1) || (byte_chr(wildchars.s,wildchars.len,lower.s[i - 1]) < wildchars.len)) {
- r = cdb_find(&c,lower.s,i);
+ if (!flagwild || (i == 1)
+ || (byte_chr(wildchars.s, wildchars.len, lower.s[i - 1]) < wildchars.len))
+ {
+ r = cdb_find(&c, lower.s, i);
if (r == -1) _exit(QLX_CDB);
if (r == 1) {
- if (!stralloc_ready(&nughde,cdb_datalen(&c))) _exit(QLX_NOMEM);
+ if (!stralloc_ready(&nughde, cdb_datalen(&c))) _exit(QLX_NOMEM);
nughde.len = cdb_datalen(&c);
- if (cdb_read(&c,nughde.s,nughde.len,cdb_datapos(&c)) == -1) _exit(QLX_CDB);
+ if (cdb_read(&c, nughde.s, nughde.len, cdb_datapos(&c)) == -1) _exit(QLX_CDB);
if (flagwild)
- if (!stralloc_cats(&nughde,local + i - 1)) _exit(QLX_NOMEM);
+ if (!stralloc_cats(&nughde, local + i - 1)) _exit(QLX_NOMEM);
if (!stralloc_0(&nughde)) _exit(QLX_NOMEM);
close(fd);
return;
@@ -137,27 +135,26 @@ void nughde_get(char *local)
args[1] = local;
args[2] = 0;
switch (gpwpid = fork()) {
- case -1:
- _exit(QLX_SYS);
+ case -1: _exit(QLX_SYS);
case 0:
if (prot_gid(auto_gidn) == -1) _exit(QLX_USAGE);
if (prot_uid(auto_uidp) == -1) _exit(QLX_USAGE);
close(pi[0]);
- if (fd_move(1,pi[1]) == -1) _exit(QLX_SYS);
- execv(*args,args);
+ if (fd_move(1, pi[1]) == -1) _exit(QLX_SYS);
+ execv(*args, args);
_exit(QLX_EXECPW);
}
close(pi[1]);
- if (readclose_append(pi[0],&nughde,128) == -1) _exit(QLX_SYS);
+ if (readclose_append(pi[0], &nughde, 128) == -1) _exit(QLX_SYS);
- if (wait_pid(&gpwstat,gpwpid) != -1) {
+ if (wait_pid(&gpwstat, gpwpid) != -1) {
if (wait_crashed(gpwstat)) _exit(QLX_SYS);
if (wait_exitcode(gpwstat) != 0) _exit(wait_exitcode(gpwstat));
}
}
-int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
+int spawn(int fdmess, int fdout, const char *s, char *r, const int at)
{
int f;
@@ -169,7 +166,7 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
int gid;
char *x;
unsigned int xlen;
-
+
r[at] = 0;
if (!r[0]) _exit(0); /* <> */
@@ -183,42 +180,42 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
args[0] = "bin/qmail-local";
args[1] = "--";
args[2] = x;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
- scan_ulong(x,&u);
+ scan_ulong(x, &u);
uid = u;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
- scan_ulong(x,&u);
+ scan_ulong(x, &u);
gid = u;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
args[3] = x;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
args[4] = r;
args[5] = x;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
args[6] = x;
- n = byte_chr(x,xlen,0);
- if (n++ == xlen) _exit(QLX_USAGE);
- x += n;
+ n = byte_chr(x, xlen, 0);
+ if (n++ == xlen) _exit(QLX_USAGE);
+ x += n;
xlen -= n;
args[7] = r + at + 1;
@@ -226,14 +223,14 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
args[9] = aliasempty;
args[10] = 0;
- if (fd_move(0,fdmess) == -1) _exit(QLX_SYS);
- if (fd_move(1,fdout) == -1) _exit(QLX_SYS);
- if (fd_copy(2,1) == -1) _exit(QLX_SYS);
+ if (fd_move(0, fdmess) == -1) _exit(QLX_SYS);
+ if (fd_move(1, fdout) == -1) _exit(QLX_SYS);
+ if (fd_copy(2, 1) == -1) _exit(QLX_SYS);
if (prot_gid(gid) == -1) _exit(QLX_USAGE);
if (prot_uid(uid) == -1) _exit(QLX_USAGE);
if (!getuid()) _exit(QLX_ROOT);
- execv(*args,args);
+ execv(*args, args);
if (errno) _exit(QLX_EXECSOFT);
_exit(QLX_EXECHARD);
}
diff --git a/src/qmail-mfrules.c b/src/qmail-mfrules.c
index e8cfc94..7247cf7 100644
--- a/src/qmail-mfrules.c
+++ b/src/qmail-mfrules.c
@@ -1,22 +1,25 @@
#include <sys/stat.h>
-#include <stdio.h> // rename
-#include "logmsg.h"
-#include "stralloc.h"
-#include "buffer.h"
-#include "getln.h"
-#include "exit.h"
#include <unistd.h>
-#include "open.h"
-#include "auto_qmail.h"
+
+#include <stdio.h> // rename
+
+#include "buffer.h"
+#include "byte.h"
+#include "case.h"
#include "cdbmake.h"
+#include "exit.h"
#include "fmt.h"
+#include "getln.h"
+#include "logmsg.h"
+#include "open.h"
#include "scan.h"
-#include "byte.h"
-#include "case.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
#define WHO "qmail-mfrules"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
stralloc address = {0};
stralloc data = {0};
@@ -34,30 +37,30 @@ struct cdb_make cdb;
void die_nomem()
{
- logmsg(WHO,112,FATAL,"out of memory");
+ logmsg(WHO, 112, FATAL, "out of memory");
}
void die_parse()
{
if (!stralloc_0(&line)) die_nomem();
- logmsg(WHO,100,ERROR,B("unable to parse this line: ",line.s));
+ logmsg(WHO, 100, ERROR, B("unable to parse this line: ", line.s));
}
void die_read()
{
- logmsg(WHO,111,ERROR,"unable to read control/mailfromrules");
+ logmsg(WHO, 111, ERROR, "unable to read control/mailfromrules");
}
void die_write()
{
- logmsg(WHO,111,ERROR,"unable to write to control/mailfromrules.tmp");
+ logmsg(WHO, 111, ERROR, "unable to write to control/mailfromrules.tmp");
}
char strnum[FMT_ULONG];
stralloc sanum = {0};
-void getnum(char *buf,int len,unsigned long *u)
+void getnum(char *buf, int len, unsigned long *u)
{
- if (!stralloc_copyb(&sanum,buf,len)) die_nomem();
+ if (!stralloc_copyb(&sanum, buf, len)) die_nomem();
if (!stralloc_0(&sanum)) die_nomem();
- if (sanum.s[scan_ulong(sanum.s,u)]) die_parse();
+ if (sanum.s[scan_ulong(sanum.s, u)]) die_parse();
}
void doaddressdata()
@@ -68,26 +71,29 @@ void doaddressdata()
unsigned long bot;
unsigned long top;
- if (byte_chr(address.s,address.len,'=') == address.len)
- if (byte_chr(address.s,address.len,'@') == address.len) {
- i = byte_chr(address.s,address.len,'-');
+ if (byte_chr(address.s, address.len, '=') == address.len)
+ if (byte_chr(address.s, address.len, '@') == address.len) {
+ i = byte_chr(address.s, address.len, '-');
if (i < address.len) {
- left = byte_rchr(address.s,i,'.');
- if (left == i) left = 0; else ++left;
+ left = byte_rchr(address.s, i, '.');
+ if (left == i)
+ left = 0;
+ else
+ ++left;
++i;
- right = i + byte_chr(address.s + i,address.len - i,'.');
-
- getnum(address.s + left,i - 1 - left,&bot);
- getnum(address.s + i,right - i,&top);
+ right = i + byte_chr(address.s + i, address.len - i, '.');
+
+ getnum(address.s + left, i - 1 - left, &bot);
+ getnum(address.s + i, right - i, &top);
if (top > 255) top = 255;
while (bot <= top) {
- if (!stralloc_copyb(&key,address.s,left)) die_nomem();
- if (!stralloc_catb(&key,strnum,fmt_ulong(strnum,bot))) die_nomem();
- if (!stralloc_catb(&key,address.s + right,address.len - right)) die_nomem();
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,data.s,data.len) == -1) die_write();
+ if (!stralloc_copyb(&key, address.s, left)) die_nomem();
+ if (!stralloc_catb(&key, strnum, fmt_ulong(strnum, bot))) die_nomem();
+ if (!stralloc_catb(&key, address.s + right, address.len - right)) die_nomem();
+ case_lowerb(key.s, key.len);
+ if (cdb_make_add(&cdb, key.s, key.len, data.s, data.len) == -1) die_write();
++bot;
}
@@ -95,9 +101,9 @@ void doaddressdata()
}
}
- case_lowerb(address.s,address.len);
- case_lowerb(data.s,data.len);
- if (cdb_make_add(&cdb,address.s,address.len,data.s,data.len) == -1) die_write();
+ case_lowerb(address.s, address.len);
+ case_lowerb(data.s, data.len);
+ if (cdb_make_add(&cdb, address.s, address.len, data.s, data.len) == -1) die_write();
}
int main()
@@ -109,23 +115,23 @@ int main()
char ch;
umask(033);
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,ERROR,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, ERROR, B("unable to chdir to: ", auto_qmail));
fd = open_read("control/mailfromrules");
if (fd == -1) die_read();
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("control/mailfromrules.tmp");
if (fdtemp == -1) die_write();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_write();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_write();
while (match) {
- if (getln(&bi,&line,&match,'\n') != 0) die_read();
+ if (getln(&bi, &line, &match, '\n') != 0) die_read();
- x = line.s; len = line.len;
+ x = line.s;
+ len = line.len;
if (!len) break;
if (x[0] == '#') continue;
@@ -133,32 +139,38 @@ int main()
while (len) {
ch = x[len - 1];
- if (ch != '\n') if (ch != ' ') if (ch != '\t') break;
+ if (ch != '\n')
+ if (ch != ' ')
+ if (ch != '\t') break;
--len;
}
line.len = len; /* for die_parse() */
- amper = byte_chr(x,len,'&');
+ amper = byte_chr(x, len, '&');
if (!amper) die_parse();
- if (amper) if (amper == len || amper < 2) die_parse();
+ if (amper)
+ if (amper == len || amper < 2) die_parse();
- if (!stralloc_copyb(&address,x,amper)) die_nomem();
- if (!stralloc_copys(&data,"")) die_nomem();
+ if (!stralloc_copyb(&address, x, amper)) die_nomem();
+ if (!stralloc_copys(&data, "")) die_nomem();
- x = line.s + amper + 1; len = line.len - amper - 1;
+ x = line.s + amper + 1;
+ len = line.len - amper - 1;
while (len) {
- if (len < 3) die_parse(); /* input checks */
- if ( *x == ',' || *x == ' ' || *x == '\t') die_parse();
- i = byte_chr(x,len,','); /* &addr1,addr2,.. */
+ if (len < 3) die_parse(); /* input checks */
+ if (*x == ',' || *x == ' ' || *x == '\t') die_parse();
+ i = byte_chr(x, len, ','); /* &addr1,addr2,.. */
if (i > 0 && i < len) {
- if (!stralloc_catb(&data,"+",1)) die_nomem();
- if (!stralloc_catb(&data,x,i)) die_nomem();
- x += i + 1; len -= i + 1; }
- else {
- if (!stralloc_catb(&data,"+",1)) die_nomem();
- if (!stralloc_catb(&data,x,len)) die_nomem();
- len = 0; }
+ if (!stralloc_catb(&data, "+", 1)) die_nomem();
+ if (!stralloc_catb(&data, x, i)) die_nomem();
+ x += i + 1;
+ len -= i + 1;
+ } else {
+ if (!stralloc_catb(&data, "+", 1)) die_nomem();
+ if (!stralloc_catb(&data, x, len)) die_nomem();
+ len = 0;
+ }
}
doaddressdata();
}
@@ -166,8 +178,8 @@ int main()
if (cdb_make_finish(&cdb) == -1) die_write();
if (fsync(fdtemp) == -1) die_write();
if (close(fdtemp) == -1) die_write(); /* NFS stupidity */
- if (rename("control/mailfromrules.tmp","control/mailfromrules.cdb") == -1)
- logmsg(WHO,111,ERROR,"unable to move control/mailfromrules.tmp to control/mailfromrules.cdb");
+ if (rename("control/mailfromrules.tmp", "control/mailfromrules.cdb") == -1)
+ logmsg(WHO, 111, ERROR, "unable to move control/mailfromrules.tmp to control/mailfromrules.cdb");
_exit(0);
}
diff --git a/src/qmail-mrtg.c b/src/qmail-mrtg.c
index 1ccedeb..cecd067 100644
--- a/src/qmail-mrtg.c
+++ b/src/qmail-mrtg.c
@@ -1,18 +1,20 @@
#include <unistd.h>
-#include "stralloc.h"
+
#include "buffer.h"
-#include "getln.h"
+#include "case.h"
#include "exit.h"
+#include "fmt.h"
+#include "getln.h"
+#include "logmsg.h"
#include "open.h"
#include "scan.h"
-#include "fmt.h"
-#include "case.h"
-#include "now.h"
#include "str.h"
+#include "stralloc.h"
+
#include "datetime.h"
-#include "logmsg.h"
+#include "now.h"
-#define WHO "qmail-mrtg"
+#define WHO "qmail-mrtg"
#define TAI64NLEN 24
/** @file qmail-mrtg.c
@@ -75,174 +77,262 @@ int grey = 0;
int rbl = 0;
char bufsmall[64];
-buffer bo = BUFFER_INIT(write,1,bufsmall,sizeof(bufsmall));
+buffer bo = BUFFER_INIT(write, 1, bufsmall, sizeof(bufsmall));
-static void outs(char *s)
+static void outs(char *s)
{
- if (buffer_puts(&bo,s) == -1) _exit(1);
- if (buffer_puts(&bo,"\n") == -1) _exit(1);
+ if (buffer_puts(&bo, s) == -1) _exit(1);
+ if (buffer_puts(&bo, "\n") == -1) _exit(1);
if (buffer_flush(&bo) == -1) _exit(1);
}
-static void out(int i)
+static void out(int i)
{
char num[FMT_ULONG];
- if (buffer_put(&bo,num,fmt_ulong(num,(unsigned long) i)) == -1) _exit(1);
- if (buffer_puts(&bo,"\n") == -1) _exit(1);
+ if (buffer_put(&bo, num, fmt_ulong(num, (unsigned long)i)) == -1) _exit(1);
+ if (buffer_puts(&bo, "\n") == -1) _exit(1);
if (buffer_flush(&bo) == -1) _exit(1);
}
char bufspace[1024];
-buffer bi = BUFFER_INIT(read,0,bufspace,sizeof(bufspace));
+buffer bi = BUFFER_INIT(read, 0, bufspace, sizeof(bufspace));
-void mrtg_results(char flag)
+void mrtg_results(char flag)
{
switch (flag) {
- case '1': out(success); out(tlstrans); break;
- case '2': bytes = bytes/1024; out(bytes); out(bytes); break;
- case '3': out(local); out(remote); break;
- case '4': out(failure); out(deferral); break;
- case '5': out(bounces); out(triples); break;
- case '6': qmtps += qmtp; out(qmtp); out(qmtps); break; /* QMTP */
-
- case 'a': out(asessions); out(rsessions); break; /* total */
- case 'b': out(aorig); out(arcpt); break; /* accepted */
- case 'c': out(rsend); out(rhelo); break; /* rejected MTA */
- case 'd': out(rorigbad); out(rorigdns); break; /* Orig */
- case 'e': out(rrcptbad); out(rrcptfail); break; /* Recipient */
- case 'f': out(rmime); out(rloader); break; /* Warlord */
- case 'g': out(rvirus); out(rspam); break; /* Infected/Spam */
- case 'h': out(aauth); out(rauth); break; /* Auth */
- case 'i': out(atls); out(rtls); break; /* TLS */
- case 'j': out(spfpass); out(spfail); break; /* SPF */
- case 'k': out(grey); break; /* Greylisted */
- case 'z': sdeny +=rbl; out(sok); out(sdeny); break; /* reject session */
-
- case 'A': out(apop); out(rpop); break;
- case 'B': out(pok); out(pdeny); break;
+ case '1':
+ out(success);
+ out(tlstrans);
+ break;
+ case '2':
+ bytes = bytes / 1024;
+ out(bytes);
+ out(bytes);
+ break;
+ case '3':
+ out(local);
+ out(remote);
+ break;
+ case '4':
+ out(failure);
+ out(deferral);
+ break;
+ case '5':
+ out(bounces);
+ out(triples);
+ break;
+ case '6':
+ qmtps += qmtp;
+ out(qmtp);
+ out(qmtps);
+ break; /* QMTP */
+
+ case 'a':
+ out(asessions);
+ out(rsessions);
+ break; /* total */
+ case 'b':
+ out(aorig);
+ out(arcpt);
+ break; /* accepted */
+ case 'c':
+ out(rsend);
+ out(rhelo);
+ break; /* rejected MTA */
+ case 'd':
+ out(rorigbad);
+ out(rorigdns);
+ break; /* Orig */
+ case 'e':
+ out(rrcptbad);
+ out(rrcptfail);
+ break; /* Recipient */
+ case 'f':
+ out(rmime);
+ out(rloader);
+ break; /* Warlord */
+ case 'g':
+ out(rvirus);
+ out(rspam);
+ break; /* Infected/Spam */
+ case 'h':
+ out(aauth);
+ out(rauth);
+ break; /* Auth */
+ case 'i':
+ out(atls);
+ out(rtls);
+ break; /* TLS */
+ case 'j':
+ out(spfpass);
+ out(spfail);
+ break; /* SPF */
+ case 'k': out(grey); break; /* Greylisted */
+ case 'z':
+ sdeny += rbl;
+ out(sok);
+ out(sdeny);
+ break; /* reject session */
+
+ case 'A':
+ out(apop);
+ out(rpop);
+ break;
+ case 'B':
+ out(pok);
+ out(pdeny);
+ break;
default: break;
}
}
-void mrtg_sendlog(char *in, char flag)
+void mrtg_sendlog(char *in, char flag)
{
int i, j, k = 0;
- switch (flag) {
- case '1': if (case_starts(in,"delivery")) {
- i = str_chr(in,':') + 2;
- if (case_starts(in + i,"success:")) success++;
- i = str_chr(in,'T');
- if (case_starts(in + i,"TLS_")) tlstrans++;
- }; break;
- case '2': if (case_starts(in,"info msg")) {
- i = str_chr(in,':') + 8;
- if ((j = str_chr(in + i,' '))) in[i + j] = '\0';
- bytes += atoi(in + i);
- }; break;
- case '3': if (case_starts(in,"status:")) {
- i = str_rchr(in,'c') + 4;
- k = str_rchr(in,'r') + 7;
- if ((j = str_chr(in + i,'/'))) in[i + j] = '\0';
- if (atoi(in + i) > local) local = atoi(in + i);
- if ((j = str_chr(in + k,'/'))) in[k + j] = '\0';
- if (atoi(in + k) > remote) remote = atoi(in + k);
- }; break;
- case '4': if (case_starts(in,"delivery")) {
- i = str_chr(in,':') + 2;
- if (case_starts(in + i,"failure:")) failure++;
- if (case_starts(in + i,"deferral:")) deferral++;
- }; break;
- case '5': if (case_starts(in,"bounce msg")) bounces++;
- if (case_starts(in,"triple bounce:")) triples++;
- break;
- case '6': if (case_starts(in,"delivery")) {
- i = str_chr(in,'q');
- if (case_starts(in + i,"qmtp:_ok")) qmtp++;
- if (case_starts(in + i,"qmtps:_ok")) qmtps++;
- }; break;
- default: break;
+ switch (flag) {
+ case '1':
+ if (case_starts(in, "delivery")) {
+ i = str_chr(in, ':') + 2;
+ if (case_starts(in + i, "success:")) success++;
+ i = str_chr(in, 'T');
+ if (case_starts(in + i, "TLS_")) tlstrans++;
+ };
+ break;
+ case '2':
+ if (case_starts(in, "info msg")) {
+ i = str_chr(in, ':') + 8;
+ if ((j = str_chr(in + i, ' '))) in[i + j] = '\0';
+ bytes += atoi(in + i);
+ };
+ break;
+ case '3':
+ if (case_starts(in, "status:")) {
+ i = str_rchr(in, 'c') + 4;
+ k = str_rchr(in, 'r') + 7;
+ if ((j = str_chr(in + i, '/'))) in[i + j] = '\0';
+ if (atoi(in + i) > local) local = atoi(in + i);
+ if ((j = str_chr(in + k, '/'))) in[k + j] = '\0';
+ if (atoi(in + k) > remote) remote = atoi(in + k);
+ };
+ break;
+ case '4':
+ if (case_starts(in, "delivery")) {
+ i = str_chr(in, ':') + 2;
+ if (case_starts(in + i, "failure:")) failure++;
+ if (case_starts(in + i, "deferral:")) deferral++;
+ };
+ break;
+ case '5':
+ if (case_starts(in, "bounce msg")) bounces++;
+ if (case_starts(in, "triple bounce:")) triples++;
+ break;
+ case '6':
+ if (case_starts(in, "delivery")) {
+ i = str_chr(in, 'q');
+ if (case_starts(in + i, "qmtp:_ok")) qmtp++;
+ if (case_starts(in + i, "qmtps:_ok")) qmtps++;
+ };
+ break;
+ default: break;
}
}
-void mrtg_smtplog(char *in, char flag)
+void mrtg_smtplog(char *in, char flag)
{
int i, j, k = 0;
- i = str_chr(in,'A');
- j = str_chr(in,'R');
- k = str_chr(in,'P');
+ i = str_chr(in, 'A');
+ j = str_chr(in, 'R');
+ k = str_chr(in, 'P');
switch (flag) {
- case 'a': if (case_starts(in + i,"Accept")) asessions++;
- if (case_starts(in + j,"Reject")) rsessions++;
- break;
- case 'b': if (case_starts(in + i,"Accept::ORIG:")) aorig++;
- if (case_starts(in + i,"Accept::RCPT:")) arcpt++;
- break;
- case 'c': if (case_starts(in + j,"Reject::SNDR::Invalid_Relay")) rsend++;
- if (case_starts(in + j,"Reject::SNDR::Bad_Helo")) rhelo++;
- if (case_starts(in + j,"Reject::SNDR::DNS_Helo")) rhelo++;
- break;
- case 'd': if (case_starts(in + j,"Reject::ORIG::Bad_Mailfrom")) rorigbad++;
- if (case_starts(in + j,"Reject::ORIG::DNS_MF")) rorigdns++;
- break;
- case 'e': if (case_starts(in + j,"Reject::RCPT::Bad_Rcptto")) rrcptbad++;
- if (case_starts(in + j,"Reject::RCPT::Failed_Rcptto")) rrcptfail++;
- break;
- case 'f': if (case_starts(in + j,"Reject::DATA::Invalid_Size")) rsize++;
- if (case_starts(in + j,"Reject::DATA::Bad_MIME")) rmime++;
- if (case_starts(in + j,"Reject::DATA::MIME_Attach")) rmime++;
- if (case_starts(in + j,"Reject::DATA::Bad_Loader")) rloader++;
- break;
- case 'g': if (case_starts(in + j,"Reject::DATA::Spam_Message")) rspam++;
- if (case_starts(in + j,"Reject::DATA::Virus_Infected")) rvirus++;
- break;
- case 'h': if (case_starts(in + i,"Accept::AUTH:")) aauth++;
- if (case_starts(in + j,"Reject::AUTH:")) rauth++;
- break;
- case 'i': if (case_starts(in + k,"P:ESMTPS")) atls++;
- if (case_starts(in + j,"Reject::TLS:")) rtls++;
- break;
- case 'j': if (case_starts(in + i,"Accept::SPF:")) spfpass++;
- if (case_starts(in + j,"Reject::SPF:")) spfail++;
- break;
- case 'k': if (case_starts(in + i,"Deferred::SNDR::Grey_Listed")) grey++;
- break;
- case 'z': if (case_starts(in,"tcpserver") || case_starts(in,"sslserver") || case_starts(in,"rblsmtpd")) {
- i = str_chr(in,':') + 2;
- if (case_starts(in + i,"ok")) sok++;
- if (case_starts(in + i,"deny")) sdeny++;
- j = str_chr(in+i,':') + 2;
- if (case_starts(in + i + j,"451")) rbl++;
- if (case_starts(in + i + j,"553")) rbl++;
- if (case_starts(in + i + j,"greetdelay:")) greet++;
- } break;
- default: break;
+ case 'a':
+ if (case_starts(in + i, "Accept")) asessions++;
+ if (case_starts(in + j, "Reject")) rsessions++;
+ break;
+ case 'b':
+ if (case_starts(in + i, "Accept::ORIG:")) aorig++;
+ if (case_starts(in + i, "Accept::RCPT:")) arcpt++;
+ break;
+ case 'c':
+ if (case_starts(in + j, "Reject::SNDR::Invalid_Relay")) rsend++;
+ if (case_starts(in + j, "Reject::SNDR::Bad_Helo")) rhelo++;
+ if (case_starts(in + j, "Reject::SNDR::DNS_Helo")) rhelo++;
+ break;
+ case 'd':
+ if (case_starts(in + j, "Reject::ORIG::Bad_Mailfrom")) rorigbad++;
+ if (case_starts(in + j, "Reject::ORIG::DNS_MF")) rorigdns++;
+ break;
+ case 'e':
+ if (case_starts(in + j, "Reject::RCPT::Bad_Rcptto")) rrcptbad++;
+ if (case_starts(in + j, "Reject::RCPT::Failed_Rcptto")) rrcptfail++;
+ break;
+ case 'f':
+ if (case_starts(in + j, "Reject::DATA::Invalid_Size")) rsize++;
+ if (case_starts(in + j, "Reject::DATA::Bad_MIME")) rmime++;
+ if (case_starts(in + j, "Reject::DATA::MIME_Attach")) rmime++;
+ if (case_starts(in + j, "Reject::DATA::Bad_Loader")) rloader++;
+ break;
+ case 'g':
+ if (case_starts(in + j, "Reject::DATA::Spam_Message")) rspam++;
+ if (case_starts(in + j, "Reject::DATA::Virus_Infected")) rvirus++;
+ break;
+ case 'h':
+ if (case_starts(in + i, "Accept::AUTH:")) aauth++;
+ if (case_starts(in + j, "Reject::AUTH:")) rauth++;
+ break;
+ case 'i':
+ if (case_starts(in + k, "P:ESMTPS")) atls++;
+ if (case_starts(in + j, "Reject::TLS:")) rtls++;
+ break;
+ case 'j':
+ if (case_starts(in + i, "Accept::SPF:")) spfpass++;
+ if (case_starts(in + j, "Reject::SPF:")) spfail++;
+ break;
+ case 'k':
+ if (case_starts(in + i, "Deferred::SNDR::Grey_Listed")) grey++;
+ break;
+ case 'z':
+ if (case_starts(in, "tcpserver") || case_starts(in, "sslserver") || case_starts(in, "rblsmtpd")) {
+ i = str_chr(in, ':') + 2;
+ if (case_starts(in + i, "ok")) sok++;
+ if (case_starts(in + i, "deny")) sdeny++;
+ j = str_chr(in + i, ':') + 2;
+ if (case_starts(in + i + j, "451")) rbl++;
+ if (case_starts(in + i + j, "553")) rbl++;
+ if (case_starts(in + i + j, "greetdelay:")) greet++;
+ }
+ break;
+ default: break;
}
-}
+}
-void mrtg_pop3log(char *in, char flag)
+void mrtg_pop3log(char *in, char flag)
{
int i, j = 0;
switch (flag) {
- case 'A': i = str_chr(in,'A'); j = str_chr(in,'R');
- if (case_starts(in + i,"Accept::AUTH:")) apop++;
- if (case_starts(in + j,"Reject::AUTH:")) rpop++;
- break;
- case 'B': if (case_starts(in,"tcpserver:") || case_starts(in,"sslserver:")) {
- i = str_chr(in,':') + 2;
- if (case_starts(in + i,"ok")) pok++;
- if (case_starts(in + i,"deny")) pdeny++;
- }; break;
- default: break;
+ case 'A':
+ i = str_chr(in, 'A');
+ j = str_chr(in, 'R');
+ if (case_starts(in + i, "Accept::AUTH:")) apop++;
+ if (case_starts(in + j, "Reject::AUTH:")) rpop++;
+ break;
+ case 'B':
+ if (case_starts(in, "tcpserver:") || case_starts(in, "sslserver:")) {
+ i = str_chr(in, ':') + 2;
+ if (case_starts(in + i, "ok")) pok++;
+ if (case_starts(in + i, "deny")) pdeny++;
+ };
+ break;
+ default: break;
}
}
-int main(int argc, char **argv)
+int main(int argc, char **argv)
{
int i;
int c;
@@ -258,27 +348,34 @@ int main(int argc, char **argv)
stralloc line = {0};
calltime = now();
- if (argc < 2)
- logmsg(WHO,100,USAGE,"qmail-mrtg [ -1 | -2 | -3 | -4 | -5 | -6 |\
+ if (argc < 2)
+ logmsg(
+ WHO,
+ 100,
+ USAGE,
+ "qmail-mrtg [ -1 | -2 | -3 | -4 | -5 | -6 |\
-a | -b | -c | -d | -e | -f | -g | -h | -i | -j | -k | -z | -A | -B ] [time] \n\
qmail-mrtg needs to be called every [time] minutes (i.e. by crontab) - default 305 secs");
flag = *(argv[1] + 1);
- if (argc == 3) { scan_ulong(argv[2],&u); history = 60 * u; }
+ if (argc == 3) {
+ scan_ulong(argv[2], &u);
+ history = 60 * u;
+ }
-/* Read input lines sequentially */
+ /* Read input lines sequentially */
- buffer_init(&bi,read,0,bufspace,sizeof(bufspace));
+ buffer_init(&bi, read, 0, bufspace, sizeof(bufspace));
for (;;) {
- if (getln(&bi,&line,&match,'\n') != 0) _exit(1);
+ if (getln(&bi, &line, &match, '\n') != 0) _exit(1);
if (!match) break;
if (!stralloc_0(&line)) _exit(1);
seconds = 0;
nanoseconds = 0;
- if (line.s[0] == '@') { /* tai64 timestamp */
+ if (line.s[0] == '@') { /* tai64 timestamp */
for (i = 1; i <= TAI64NLEN; i++) {
c = (int)line.s[i];
u = c - '0';
@@ -300,23 +397,26 @@ int main(int argc, char **argv)
_exit(1);
}
- if (enoughtime) { /* default history = 305 sec => evaluate logs every ~5 mins */
+ if (enoughtime) { /* default history = 305 sec => evaluate logs every ~5 mins */
if (seconds <= calltime && seconds >= (calltime - history)) {
- if (flag >= '1' && flag <= '9') mrtg_sendlog(line.s + TAI64NLEN + 2,flag);
- else if (flag >= 'a' && flag <= 'z') mrtg_smtplog(line.s + TAI64NLEN + 2,flag);
- else if (flag >= 'A' && flag <= 'Z') mrtg_pop3log(line.s + TAI64NLEN + 2,flag);
+ if (flag >= '1' && flag <= '9')
+ mrtg_sendlog(line.s + TAI64NLEN + 2, flag);
+ else if (flag >= 'a' && flag <= 'z')
+ mrtg_smtplog(line.s + TAI64NLEN + 2, flag);
+ else if (flag >= 'A' && flag <= 'Z')
+ mrtg_pop3log(line.s + TAI64NLEN + 2, flag);
}
- } else {
+ } else {
if (seconds) {
enoughtime++;
} else {
outs("Warning: Not enough time left between calls");
_exit(1);
- }
+ }
}
}
mrtg_results(flag);
-
+
_exit(0);
}
diff --git a/src/qmail-newmrh.c b/src/qmail-newmrh.c
index 4a74698..20945a4 100644
--- a/src/qmail-newmrh.c
+++ b/src/qmail-newmrh.c
@@ -1,27 +1,30 @@
-#include <unistd.h>
#include <sys/stat.h>
-#include <stdio.h> // rename
-#include "logmsg.h"
-#include "stralloc.h"
+#include <unistd.h>
+
+#include <stdio.h> // rename
+
#include "buffer.h"
-#include "getln.h"
+#include "case.h"
+#include "cdbmake.h"
#include "exit.h"
+#include "getln.h"
+#include "logmsg.h"
#include "open.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "cdbmake.h"
-#include "case.h"
#define WHO "qmail-newmrh"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void die_read()
{
- logmsg(WHO,111,ERROR,"unable to read control/morercpthosts");
+ logmsg(WHO, 111, ERROR, "unable to read control/morercpthosts");
}
void die_write()
{
- logmsg(WHO,111,ERROR,"unable to write to control/morercpthosts.tmp");
+ logmsg(WHO, 111, ERROR, "unable to write to control/morercpthosts.tmp");
}
char inbuf[1024];
@@ -37,29 +40,36 @@ int match;
int main()
{
umask(033);
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,ERROR,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, ERROR, B("unable to chdir to: ", auto_qmail));
fd = open_read("control/morercpthosts");
if (fd == -1) die_read();
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("control/morercpthosts.tmp");
if (fdtemp == -1) die_write();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_write();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_write();
for (;;) {
- if (getln(&bi,&line,&match,'\n') != 0) die_read();
- case_lowerb(line.s,line.len);
+ if (getln(&bi, &line, &match, '\n') != 0) die_read();
+ case_lowerb(line.s, line.len);
while (line.len) {
- if (line.s[line.len - 1] == ' ') { --line.len; continue; }
- if (line.s[line.len - 1] == '\n') { --line.len; continue; }
- if (line.s[line.len - 1] == '\t') { --line.len; continue; }
+ if (line.s[line.len - 1] == ' ') {
+ --line.len;
+ continue;
+ }
+ if (line.s[line.len - 1] == '\n') {
+ --line.len;
+ continue;
+ }
+ if (line.s[line.len - 1] == '\t') {
+ --line.len;
+ continue;
+ }
if (line.s[0] != '#')
- if (cdb_make_add(&cdb,line.s,line.len,"",0) == -1)
- die_write();
+ if (cdb_make_add(&cdb, line.s, line.len, "", 0) == -1) die_write();
break;
}
if (!match) break;
@@ -68,8 +78,8 @@ int main()
if (cdb_make_finish(&cdb) == -1) die_write();
if (fsync(fdtemp) == -1) die_write();
if (close(fdtemp) == -1) die_write(); /* NFS stupidity */
- if (rename("control/morercpthosts.tmp","control/morercpthosts.cdb") == -1)
- logmsg(WHO,111,ERROR,"unable to move control/morercpthosts.tmp to control/morercpthosts.cdb");
+ if (rename("control/morercpthosts.tmp", "control/morercpthosts.cdb") == -1)
+ logmsg(WHO, 111, ERROR, "unable to move control/morercpthosts.tmp to control/morercpthosts.cdb");
_exit(0);
}
diff --git a/src/qmail-newu.c b/src/qmail-newu.c
index d5e9baa..f2e33cd 100644
--- a/src/qmail-newu.c
+++ b/src/qmail-newu.c
@@ -1,52 +1,55 @@
-#include <unistd.h>
#include <sys/stat.h>
-#include <stdio.h> // rename
-#include "stralloc.h"
-#include "getln.h"
+#include <unistd.h>
+
+#include <stdio.h> // rename
+
#include "buffer.h"
+#include "byte.h"
+#include "case.h"
#include "cdbmake.h"
#include "exit.h"
-#include "open.h"
+#include "getln.h"
#include "logmsg.h"
-#include "case.h"
-#include "byte.h"
+#include "open.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
#define WHO "qmail-newu"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void die_chdir()
{
- logmsg(WHO,110,ERROR,"unable to chdir");
+ logmsg(WHO, 110, ERROR, "unable to chdir");
}
void die_nomem()
{
- logmsg(WHO,111,FATAL,"fatal: out of memory");
+ logmsg(WHO, 111, FATAL, "fatal: out of memory");
}
void die_opena()
{
- logmsg(WHO,112,ERROR,"unable to open users/assign");
+ logmsg(WHO, 112, ERROR, "unable to open users/assign");
}
void die_reada()
{
- logmsg(WHO,110,ERROR,"unable to read users/assign");
+ logmsg(WHO, 110, ERROR, "unable to read users/assign");
}
void die_format()
{
- logmsg(WHO,112,ERROR,"bad format in users/assign");
+ logmsg(WHO, 112, ERROR, "bad format in users/assign");
}
void die_opent()
{
- logmsg(WHO,112,ERROR,"unable to open users/assign.cdb.tmp");
+ logmsg(WHO, 112, ERROR, "unable to open users/assign.cdb.tmp");
}
void die_writet()
{
- logmsg(WHO,112,ERROR,"unable to write users/assign.cdb.tmp");
+ logmsg(WHO, 112, ERROR, "unable to write users/assign.cdb.tmp");
}
void die_rename()
{
- logmsg(WHO,112,ERROR,"unable to move users/cdb.tmp to users/assign.cdb");
+ logmsg(WHO, 112, ERROR, "unable to move users/cdb.tmp to users/assign.cdb");
}
struct cdb_make cdb;
@@ -75,39 +78,38 @@ int main()
fd = open_read("users/assign");
if (fd == -1) die_opena();
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("users/assign.cdb.tmp");
if (fdtemp == -1) die_opent();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_writet();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_writet();
- if (!stralloc_copys(&wildchars,"")) die_nomem();
+ if (!stralloc_copys(&wildchars, "")) die_nomem();
for (;;) {
- if (getln(&bi,&line,&match,'\n') != 0) die_reada();
+ if (getln(&bi, &line, &match, '\n') != 0) die_reada();
if (line.len && (line.s[0] == '.')) break;
if (!match) die_format();
- if (byte_chr(line.s,line.len,'\0') < line.len) die_format();
- i = byte_chr(line.s,line.len,':');
+ if (byte_chr(line.s, line.len, '\0') < line.len) die_format();
+ i = byte_chr(line.s, line.len, ':');
if (i == line.len) die_format();
if (i == 0) die_format();
- if (!stralloc_copys(&key,"!")) die_nomem();
+ if (!stralloc_copys(&key, "!")) die_nomem();
if (line.s[0] == '+') {
- if (!stralloc_catb(&key,line.s + 1,i - 1)) die_nomem();
- case_lowerb(key.s,key.len);
+ if (!stralloc_catb(&key, line.s + 1, i - 1)) die_nomem();
+ case_lowerb(key.s, key.len);
if (i >= 2)
- if (byte_chr(wildchars.s,wildchars.len,line.s[i - 1]) == wildchars.len)
- if (!stralloc_append(&wildchars,line.s + i - 1)) die_nomem();
- }
- else {
- if (!stralloc_catb(&key,line.s + 1,i - 1)) die_nomem();
+ if (byte_chr(wildchars.s, wildchars.len, line.s[i - 1]) == wildchars.len)
+ if (!stralloc_append(&wildchars, line.s + i - 1)) die_nomem();
+ } else {
+ if (!stralloc_catb(&key, line.s + 1, i - 1)) die_nomem();
if (!stralloc_0(&key)) die_nomem();
- case_lowerb(key.s,key.len);
+ case_lowerb(key.s, key.len);
}
- if (!stralloc_copyb(&data,line.s + i + 1,line.len - i - 1)) die_nomem();
+ if (!stralloc_copyb(&data, line.s + i + 1, line.len - i - 1)) die_nomem();
numcolons = 0;
for (i = 0; i < data.len; ++i)
@@ -118,15 +120,15 @@ int main()
if (numcolons < 6) die_format();
data.len = i;
- if (cdb_make_add(&cdb,key.s,key.len,data.s,data.len) == -1) die_writet();
+ if (cdb_make_add(&cdb, key.s, key.len, data.s, data.len) == -1) die_writet();
}
- if (cdb_make_add(&cdb,"",0,wildchars.s,wildchars.len) == -1) die_writet();
+ if (cdb_make_add(&cdb, "", 0, wildchars.s, wildchars.len) == -1) die_writet();
if (cdb_make_finish(&cdb) == -1) die_writet();
if (fsync(fdtemp) == -1) die_writet();
if (close(fdtemp) == -1) die_writet(); /* NFS stupidity */
- if (rename("users/assign.cdb.tmp","users/assign.cdb") == -1) die_rename();
+ if (rename("users/assign.cdb.tmp", "users/assign.cdb") == -1) die_rename();
_exit(0);
}
diff --git a/src/qmail-pop3d.c b/src/qmail-pop3d.c
index 2d26c16..bd46d7b 100644
--- a/src/qmail-pop3d.c
+++ b/src/qmail-pop3d.c
@@ -1,57 +1,62 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <sys/stat.h>
-#include "commands.h"
-#include "sig.h"
-#include "getln.h"
-#include "stralloc.h"
-#include "buffer.h"
+#include <sys/types.h>
+#include <unistd.h>
+
#include "alloc.h"
+#include "buffer.h"
+#include "exit.h"
+#include "fmt.h"
+#include "getln.h"
#include "open.h"
-#include "prioq.h"
#include "scan.h"
-#include "fmt.h"
+#include "sig.h"
#include "str.h"
-#include "exit.h"
-#include "maildir.h"
+#include "stralloc.h"
#include "timeout.h"
-#define FDIN 0
+#include "commands.h"
+#include "maildir.h"
+#include "prioq.h"
+
+#define FDIN 0
#define FDOUT 1
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
-void die() { _exit(0); }
+void die()
+{
+ _exit(0);
+}
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
- r = timeoutread(1200,fd,buf,len);
+ r = timeoutread(1200, fd, buf, len);
if (r <= 0) die();
return r;
}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = timeoutwrite(1200,fd,buf,len);
+ r = timeoutwrite(1200, fd, buf, len);
if (r <= 0) die();
return r;
}
char outbuf[1024];
-buffer bo = BUFFER_INIT(safewrite,FDOUT,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, FDOUT, outbuf, sizeof(outbuf));
char inbuf[128];
-buffer bi = BUFFER_INIT(saferead,FDIN,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(saferead, FDIN, inbuf, sizeof(inbuf));
-void out(char *buf,int len)
+void out(char *buf, int len)
{
- buffer_put(&bo,buf,len);
+ buffer_put(&bo, buf, len);
}
void outs(char *s)
{
- buffer_puts(&bo,s);
+ buffer_puts(&bo, s);
}
void flush()
{
@@ -65,50 +70,88 @@ void err(char *s)
flush();
}
-void die_nomem() { err("out of memory"); die(); }
-void die_nomaildir() { err("this user has no $HOME/Maildir"); die(); }
-void die_scan() { err("unable to scan $HOME/Maildir"); die(); }
+void die_nomem()
+{
+ err("out of memory");
+ die();
+}
+void die_nomaildir()
+{
+ err("this user has no $HOME/Maildir");
+ die();
+}
+void die_scan()
+{
+ err("unable to scan $HOME/Maildir");
+ die();
+}
-void err_syntax() { err("syntax error"); }
-void err_unimpl() { err("unimplemented"); }
-void err_deleted() { err("already deleted"); }
-void err_nozero() { err("messages are counted from 1"); }
-void err_toobig() { err("not that many messages"); }
-void err_nosuch() { err("unable to open that message"); }
-void err_nounlink() { err("unable to unlink all deleted messages"); }
+void err_syntax()
+{
+ err("syntax error");
+}
+void err_unimpl()
+{
+ err("unimplemented");
+}
+void err_deleted()
+{
+ err("already deleted");
+}
+void err_nozero()
+{
+ err("messages are counted from 1");
+}
+void err_toobig()
+{
+ err("not that many messages");
+}
+void err_nosuch()
+{
+ err("unable to open that message");
+}
+void err_nounlink()
+{
+ err("unable to unlink all deleted messages");
+}
-void okay() { outs("+OK \r\n"); flush(); }
+void okay()
+{
+ outs("+OK \r\n");
+ flush();
+}
void printfn(char *fn)
{
fn += 4;
- out(fn,str_chr(fn,':'));
+ out(fn, str_chr(fn, ':'));
}
char strnum[FMT_ULONG];
stralloc line = {0};
-void blast(buffer *bf,unsigned long limit)
+void blast(buffer *bf, unsigned long limit)
{
int match;
int inheaders = 1;
-
+
for (;;) {
- if (getln(bf,&line,&match,'\n') != 0) die();
+ if (getln(bf, &line, &match, '\n') != 0) die();
if (!match && !line.len) break;
if (match) --line.len; /* no way to pass this info over POP */
- if (limit) if (!inheaders) if (!--limit) break;
+ if (limit)
+ if (!inheaders)
+ if (!--limit) break;
if (!line.len)
inheaders = 0;
- else
- if (line.s[0] == '.')
- out(".",1);
- out(line.s,line.len);
- out("\r\n",2);
-
+ else if (line.s[0] == '.')
+ out(".", 1);
+ out(line.s, line.len);
+ out("\r\n", 2);
+
if (!match) break;
}
- out("\r\n.\r\n",5);
+ out("\r\n.\r\n", 5);
flush();
}
@@ -129,20 +172,23 @@ void getlist()
struct prioq_elt pe;
struct stat st;
int i;
-
+
maildir_clean(&line);
- if (maildir_scan(&pq,&filenames,1,1) == -1) die_scan();
-
+ if (maildir_scan(&pq, &filenames, 1, 1) == -1) die_scan();
+
numm = pq.p ? pq.len : 0;
- m = (struct message *) alloc(numm * sizeof(struct message));
+ m = (struct message *)alloc(numm * sizeof(struct message));
if (!m) die_nomem();
-
+
for (i = 0; i < numm; ++i) {
- if (!prioq_min(&pq,&pe)) { numm = i; break; }
+ if (!prioq_min(&pq, &pe)) {
+ numm = i;
+ break;
+ }
prioq_delmin(&pq);
m[i].fn = filenames.s + pe.id;
m[i].flagdeleted = 0;
- if (stat(m[i].fn,&st) == -1)
+ if (stat(m[i].fn, &st) == -1)
m[i].size = 0;
else
m[i].size = st.st_size;
@@ -153,15 +199,15 @@ void pop3_stat()
{
int i;
unsigned long total;
-
+
total = 0;
- for (i = 0; i < numm; ++i)
+ for (i = 0; i < numm; ++i)
if (!m[i].flagdeleted) total += m[i].size;
outs("+OK ");
- out(strnum,fmt_uint(strnum,numm));
+ out(strnum, fmt_uint(strnum, numm));
outs(" ");
- out(strnum,fmt_ulong(strnum,total));
+ out(strnum, fmt_ulong(strnum, total));
outs("\r\n");
flush();
}
@@ -170,8 +216,7 @@ void pop3_rset()
{
int i;
- for (i = 0; i < numm; ++i)
- m[i].flagdeleted = 0;
+ for (i = 0; i < numm; ++i) m[i].flagdeleted = 0;
last = 0;
okay();
}
@@ -179,7 +224,7 @@ void pop3_rset()
void pop3_last()
{
outs("+OK ");
- out(strnum,fmt_uint(strnum,last));
+ out(strnum, fmt_uint(strnum, last));
outs("\r\n");
flush();
}
@@ -192,12 +237,12 @@ void pop3_quit()
if (m[i].flagdeleted) {
if (unlink(m[i].fn) == -1) err_nounlink();
} else {
- if (str_start(m[i].fn,"new/")) {
- if (!stralloc_copys(&line,"cur/")) die_nomem();
- if (!stralloc_cats(&line,m[i].fn + 4)) die_nomem();
- if (!stralloc_cats(&line,":2,")) die_nomem();
+ if (str_start(m[i].fn, "new/")) {
+ if (!stralloc_copys(&line, "cur/")) die_nomem();
+ if (!stralloc_cats(&line, m[i].fn + 4)) die_nomem();
+ if (!stralloc_cats(&line, ":2,")) die_nomem();
if (!stralloc_0(&line)) die_nomem();
- rename(m[i].fn,line.s); /* if it fails, bummer */
+ rename(m[i].fn, line.s); /* if it fails, bummer */
}
}
okay();
@@ -208,11 +253,23 @@ int msgno(char *arg)
{
unsigned long u;
- if (!scan_ulong(arg,&u)) { err_syntax(); return -1; }
- if (!u) { err_nozero(); return -1; }
+ if (!scan_ulong(arg, &u)) {
+ err_syntax();
+ return -1;
+ }
+ if (!u) {
+ err_nozero();
+ return -1;
+ }
--u;
- if (u >= numm) { err_toobig(); return -1; }
- if (m[u].flagdeleted) { err_deleted(); return -1; }
+ if (u >= numm) {
+ err_toobig();
+ return -1;
+ }
+ if (m[u].flagdeleted) {
+ err_deleted();
+ return -1;
+ }
return u;
}
@@ -227,16 +284,18 @@ void pop3_dele(char *arg)
okay();
}
-void list(int i,int flaguidl)
+void list(int i, int flaguidl)
{
- out(strnum,fmt_uint(strnum,i + 1));
+ out(strnum, fmt_uint(strnum, i + 1));
outs(" ");
- if (flaguidl) printfn(m[i].fn);
- else out(strnum,fmt_ulong(strnum,m[i].size));
+ if (flaguidl)
+ printfn(m[i].fn);
+ else
+ out(strnum, fmt_ulong(strnum, m[i].size));
outs("\r\n");
}
-void dolisting(char *arg,int flaguidl)
+void dolisting(char *arg, int flaguidl)
{
unsigned int i;
@@ -245,69 +304,80 @@ void dolisting(char *arg,int flaguidl)
if (i == -1) return;
outs("+OK ");
- list(i,flaguidl);
+ list(i, flaguidl);
} else {
okay();
for (i = 0; i < numm; ++i)
- if (!m[i].flagdeleted) list(i,flaguidl);
+ if (!m[i].flagdeleted) list(i, flaguidl);
outs(".\r\n");
}
flush();
}
-void pop3_uidl(char *arg) { dolisting(arg,1); }
-void pop3_list(char *arg) { dolisting(arg,0); }
+void pop3_uidl(char *arg)
+{
+ dolisting(arg, 1);
+}
+void pop3_list(char *arg)
+{
+ dolisting(arg, 0);
+}
char msgbuf[1024];
-buffer bm;
+buffer bm;
void pop3_top(char *arg)
{
int i;
unsigned long limit;
int fd;
-
+
i = msgno(arg);
if (i == -1) return;
-
- arg += scan_ulong(arg,&limit);
+
+ arg += scan_ulong(arg, &limit);
while (*arg == ' ') ++arg;
- if (scan_ulong(arg,&limit)) ++limit;
- else limit = 0;
-
+ if (scan_ulong(arg, &limit))
+ ++limit;
+ else
+ limit = 0;
+
fd = open_read(m[i].fn);
- if (fd == -1) { err_nosuch(); return; }
+ if (fd == -1) {
+ err_nosuch();
+ return;
+ }
okay();
- buffer_init(&bm,read,fd,msgbuf,sizeof(msgbuf));
- blast(&bm,limit);
+ buffer_init(&bm, read, fd, msgbuf, sizeof(msgbuf));
+ blast(&bm, limit);
close(fd);
}
struct commands pop3commands[] = {
- { "quit", pop3_quit, 0 }
-, { "stat", pop3_stat, 0 }
-, { "list", pop3_list, 0 }
-, { "uidl", pop3_uidl, 0 }
-, { "dele", pop3_dele, 0 }
-, { "retr", pop3_top, 0 }
-, { "rset", pop3_rset, 0 }
-, { "last", pop3_last, 0 }
-, { "top", pop3_top, 0 }
-, { "noop", okay, 0 }
-, { 0, err_unimpl, 0 }
-} ;
-
-int main(int argc,char **argv)
+ {"quit", pop3_quit, 0},
+ {"stat", pop3_stat, 0},
+ {"list", pop3_list, 0},
+ {"uidl", pop3_uidl, 0},
+ {"dele", pop3_dele, 0},
+ {"retr", pop3_top, 0},
+ {"rset", pop3_rset, 0},
+ {"last", pop3_last, 0},
+ { "top", pop3_top, 0},
+ {"noop", okay, 0},
+ { 0, err_unimpl, 0}
+};
+
+int main(int argc, char **argv)
{
sig_alarmcatch(die);
sig_pipeignore();
-
+
if (!argv[1]) die_nomaildir();
if (chdir(argv[1]) == -1) die_nomaildir();
-
+
getlist();
okay();
- commands(&bi,pop3commands);
+ commands(&bi, pop3commands);
die();
}
diff --git a/src/qmail-popup.c b/src/qmail-popup.c
index 522e719..832a56f 100644
--- a/src/qmail-popup.c
+++ b/src/qmail-popup.c
@@ -1,55 +1,60 @@
#include <unistd.h>
-#include "commands.h"
-#include "fd.h"
-#include "sig.h"
-#include "stralloc.h"
-#include "buffer.h"
+
#include "alloc.h"
-#include "wait.h"
-#include "str.h"
+#include "buffer.h"
#include "byte.h"
-#include "now.h"
-#include "fmt.h"
#include "case.h"
+#include "env.h"
#include "exit.h"
+#include "fd.h"
+#include "fmt.h"
+#include "ip.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
#include "timeout.h"
-#include "env.h"
+#include "wait.h"
+
+#include "commands.h"
+#include "now.h"
#include "tls_start.h"
-#include "ip.h"
#define PORT_POP3S "995"
-#define FDIN 0
-#define FDOUT 1
-#define FDAUTH 3
-#define FDLOG 5
+#define FDIN 0
+#define FDOUT 1
+#define FDAUTH 3
+#define FDLOG 5
-void die() { _exit(1); }
+void die()
+{
+ _exit(1);
+}
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
- r = timeoutread(1200,fd,buf,len);
+ r = timeoutread(1200, fd, buf, len);
if (r <= 0) die();
return r;
}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = timeoutwrite(1200,fd,buf,len);
+ r = timeoutwrite(1200, fd, buf, len);
if (r <= 0) die();
return r;
}
char outbuf[128];
-buffer bo = BUFFER_INIT(safewrite,FDOUT,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, FDOUT, outbuf, sizeof(outbuf));
char inbuf[128];
-buffer bi = BUFFER_INIT(saferead,FDIN,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(saferead, FDIN, inbuf, sizeof(inbuf));
void outs(char *s)
{
- buffer_puts(&bo,s);
+ buffer_puts(&bo, s);
}
void flush()
{
@@ -65,7 +70,7 @@ void err(char *s)
/* Logging */
-stralloc protocol = {0};
+stralloc protocol = {0};
stralloc auth = {0};
char *localport;
char *remoteip;
@@ -73,49 +78,131 @@ char *remotehost;
char strnum[FMT_ULONG];
char logbuf[512];
-buffer bl = BUFFER_INIT(safewrite,FDLOG,logbuf,sizeof(logbuf));
-
-void logs(char *s) { if (buffer_puts(&bl,s) == -1) _exit(1); }
-void logp(char *s) { logs(" P:"); logs(s); }
-void logh(char *s1, char *s2) { logs(" S:"); logs(s1); logs(":"); logs(s2); }
-void logu(char *s) { logs(" ?~ '"); logs(s); logs("'"); }
-void logn(char *s) { if (buffer_puts(&bl,s) == -1) _exit(1); if (buffer_flush(&bl) == -1) _exit(1); }
-void logpid() { strnum[fmt_ulong(strnum,getpid())] = 0; logs("qmail-popup: pid "); logs(strnum); logs(" "); }
-void log_pop(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6)
- { logpid(); logs(s1); logs(s2); logp(s3); logh(s4,s5), logu(s6), logn("\n"); }
-
-void die_usage() { err("usage: popup hostname subprogram"); die(); }
-void die_nomem() { err("out of memory"); die(); }
-void die_pipe() { err("unable to open pipe"); die(); }
-void die_write() { err("unable to write pipe"); die(); }
-void die_fork() { err("unable to fork"); die(); }
-void die_childcrashed() { err("aack, child crashed"); }
-void die_badauth() { err("authorization failed"); }
-void die_tls() { err("TLS startup failed"); die(); }
-void die_notls() {
- err("TLS required but not negotiated");
- log_pop("Reject::STLS::","Any","POP3",remoteip,remotehost,"unknown");
- die();
-}
-
-void err_syntax() { err("syntax error"); }
-void err_wantuser() { err("USER first"); }
-void err_authoriz() { err("authorization first"); }
-
-void okay() { outs("+OK \r\n"); flush(); }
-void pop3_quit() { okay(); die(); }
+buffer bl = BUFFER_INIT(safewrite, FDLOG, logbuf, sizeof(logbuf));
+
+void logs(char *s)
+{
+ if (buffer_puts(&bl, s) == -1) _exit(1);
+}
+void logp(char *s)
+{
+ logs(" P:");
+ logs(s);
+}
+void logh(char *s1, char *s2)
+{
+ logs(" S:");
+ logs(s1);
+ logs(":");
+ logs(s2);
+}
+void logu(char *s)
+{
+ logs(" ?~ '");
+ logs(s);
+ logs("'");
+}
+void logn(char *s)
+{
+ if (buffer_puts(&bl, s) == -1) _exit(1);
+ if (buffer_flush(&bl) == -1) _exit(1);
+}
+void logpid()
+{
+ strnum[fmt_ulong(strnum, getpid())] = 0;
+ logs("qmail-popup: pid ");
+ logs(strnum);
+ logs(" ");
+}
+void log_pop(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6)
+{
+ logpid();
+ logs(s1);
+ logs(s2);
+ logp(s3);
+ logh(s4, s5), logu(s6), logn("\n");
+}
+
+void die_usage()
+{
+ err("usage: popup hostname subprogram");
+ die();
+}
+void die_nomem()
+{
+ err("out of memory");
+ die();
+}
+void die_pipe()
+{
+ err("unable to open pipe");
+ die();
+}
+void die_write()
+{
+ err("unable to write pipe");
+ die();
+}
+void die_fork()
+{
+ err("unable to fork");
+ die();
+}
+void die_childcrashed()
+{
+ err("aack, child crashed");
+}
+void die_badauth()
+{
+ err("authorization failed");
+}
+void die_tls()
+{
+ err("TLS startup failed");
+ die();
+}
+void die_notls()
+{
+ err("TLS required but not negotiated");
+ log_pop("Reject::STLS::", "Any", "POP3", remoteip, remotehost, "unknown");
+ die();
+}
+
+void err_syntax()
+{
+ err("syntax error");
+}
+void err_wantuser()
+{
+ err("USER first");
+}
+void err_authoriz()
+{
+ err("authorization first");
+}
+
+void okay()
+{
+ outs("+OK \r\n");
+ flush();
+}
+void pop3_quit()
+{
+ okay();
+ die();
+}
void poplog_init()
{
- if (!stralloc_copys(&protocol,"POP3")) die_nomem();
+ if (!stralloc_copys(&protocol, "POP3")) die_nomem();
localport = env_get("TCP6LOCALPORT");
- if (!localport) localport = env_get("TCPLOCALPORT");
+ if (!localport) localport = env_get("TCPLOCALPORT");
if (!localport) localport = "unknown";
- if (!case_diffs(localport,PORT_POP3S))
- if (!stralloc_cats(&protocol,"S")) die_nomem();
+ if (!case_diffs(localport, PORT_POP3S))
+ if (!stralloc_cats(&protocol, "S")) die_nomem();
remoteip = env_get("TCP6REMOTEIP");
- if (remoteip && byte_equal(remoteip,7,V4MAPPREFIX)) remoteip = remoteip + 7;
- if (!remoteip) remoteip = env_get("TCPREMOTEIP");
+ if (remoteip && byte_equal(remoteip, 7, V4MAPPREFIX)) remoteip = remoteip + 7;
+ if (!remoteip) remoteip = env_get("TCPREMOTEIP");
if (!remoteip) remoteip = "unknown";
remotehost = env_get("TCP6REMOTEHOST");
if (!remotehost) remotehost = env_get("TCPREMOTEHOST");
@@ -133,47 +220,45 @@ int stls = 0;
int seenstls = 0;
int apop = 0;
-void doanddie(char *user,unsigned int userlen,char *pass) /* userlen: including 0 byte */
+void doanddie(char *user, unsigned int userlen, char *pass) /* userlen: including 0 byte */
{
int child;
int wstat;
int pi[2];
-
- if (fd_copy(2,1) == -1) die_pipe();
+
+ if (fd_copy(2, 1) == -1) die_pipe();
close(FDAUTH);
if (pipe(pi) == -1) die_pipe();
if (pi[0] != FDAUTH) die_pipe();
switch (child = fork()) {
- case -1:
- die_fork();
+ case -1: die_fork();
case 0:
close(pi[1]);
sig_pipedefault();
- execvp(*childargs,childargs);
+ execvp(*childargs, childargs);
_exit(1);
}
close(pi[0]);
- buffer_init(&ba,write,pi[1],authbuf,sizeof(authbuf));
- if (buffer_put(&ba,user,userlen) == -1) die_write();
- if (buffer_put(&ba,pass,str_len(pass) + 1) == -1) die_write();
- if (buffer_puts(&ba,"<") == -1) die_write();
- if (buffer_puts(&ba,unique) == -1) die_write();
- if (buffer_puts(&ba,hostname) == -1) die_write();
- if (buffer_put(&ba,">",2) == -1) die_write();
+ buffer_init(&ba, write, pi[1], authbuf, sizeof(authbuf));
+ if (buffer_put(&ba, user, userlen) == -1) die_write();
+ if (buffer_put(&ba, pass, str_len(pass) + 1) == -1) die_write();
+ if (buffer_puts(&ba, "<") == -1) die_write();
+ if (buffer_puts(&ba, unique) == -1) die_write();
+ if (buffer_puts(&ba, hostname) == -1) die_write();
+ if (buffer_put(&ba, ">", 2) == -1) die_write();
if (buffer_flush(&ba) == -1) die_write();
close(pi[1]);
- byte_zero(pass,str_len(pass));
- byte_zero(authbuf,sizeof(authbuf));
- if (wait_pid(&wstat,child) == -1) die();
+ byte_zero(pass, str_len(pass));
+ byte_zero(authbuf, sizeof(authbuf));
+ if (wait_pid(&wstat, child) == -1) die();
if (wait_crashed(wstat)) die_childcrashed();
if (!stralloc_0(&auth)) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- if (wait_exitcode(wstat)) {
- die_badauth();
- log_pop("Reject::AUTH::",auth.s,protocol.s,remoteip,remotehost,user);
- }
- else
- log_pop("Accept::AUTH::",auth.s,protocol.s,remoteip,remotehost,user);
+ if (wait_exitcode(wstat)) {
+ die_badauth();
+ log_pop("Reject::AUTH::", auth.s, protocol.s, remoteip, remotehost, user);
+ } else
+ log_pop("Accept::AUTH::", auth.s, protocol.s, remoteip, remotehost, user);
die();
}
@@ -181,9 +266,9 @@ void pop3_greet()
{
char *s;
s = unique;
- s += fmt_uint(s,getpid());
+ s += fmt_uint(s, getpid());
*s++ = '.';
- s += fmt_ulong(s,(unsigned long) now());
+ s += fmt_ulong(s, (unsigned long)now());
*s++ = '@';
*s++ = 0;
@@ -201,19 +286,28 @@ void pop3_greet()
void pop3_user(char *arg)
{
if (stls == 2 && !seenstls) die_notls();
- if (!*arg) { err_syntax(); return; }
+ if (!*arg) {
+ err_syntax();
+ return;
+ }
okay();
seenuser = 1;
- if (!stralloc_copys(&username,arg)) die_nomem();
- if (!stralloc_0(&username)) die_nomem();
+ if (!stralloc_copys(&username, arg)) die_nomem();
+ if (!stralloc_0(&username)) die_nomem();
}
void pop3_pass(char *arg)
{
- if (!seenuser) { err_wantuser(); return; }
- if (!*arg) { err_syntax(); return; }
- if (!stralloc_copys(&auth,"User")) die_nomem();
- doanddie(username.s,username.len,arg);
+ if (!seenuser) {
+ err_wantuser();
+ return;
+ }
+ if (!*arg) {
+ err_syntax();
+ return;
+ }
+ if (!stralloc_copys(&auth, "User")) die_nomem();
+ doanddie(username.s, username.len, arg);
}
void pop3_apop(char *arg)
@@ -221,11 +315,14 @@ void pop3_apop(char *arg)
char *space;
if (stls == 2 && !seenstls) die_notls();
- space = arg + str_chr(arg,' ');
- if (!*space) { err_syntax(); return; }
+ space = arg + str_chr(arg, ' ');
+ if (!*space) {
+ err_syntax();
+ return;
+ }
*space++ = 0;
- if (!stralloc_copys(&auth,"Apop")) die_nomem();
- doanddie(arg,space - arg,space);
+ if (!stralloc_copys(&auth, "Apop")) die_nomem();
+ doanddie(arg, space - arg, space);
}
void pop3_capa(char *arg)
@@ -234,49 +331,46 @@ void pop3_capa(char *arg)
outs("TOP\r\n");
outs("USER\r\n");
outs("UIDL\r\n");
- if (apop)
- outs("APOP\r\n");
- if (stls > 0)
- outs("STLS\r\n");
+ if (apop) outs("APOP\r\n");
+ if (stls > 0) outs("STLS\r\n");
outs(".\r\n");
flush();
}
void pop3_stls(char *arg)
{
- if (stls == 0 || seenstls == 1)
- return err("STLS not available");
+ if (stls == 0 || seenstls == 1) return err("STLS not available");
outs("+OK starting TLS negotiation\r\n");
flush();
if (!starttls_init()) die_tls();
- buffer_init(&bi,saferead,FDIN,inbuf,sizeof(inbuf));
+ buffer_init(&bi, saferead, FDIN, inbuf, sizeof(inbuf));
seenstls = 1;
-
-/* reset state */
+
+ /* reset state */
seenuser = 0;
- if (!stralloc_cats(&protocol,"S")) die_nomem();
+ if (!stralloc_cats(&protocol, "S")) die_nomem();
}
struct commands pop3commands[] = {
- { "user", pop3_user, 0 }
-, { "pass", pop3_pass, 0 }
-, { "apop", pop3_apop, 0 }
-, { "quit", pop3_quit, 0 }
-, { "capa", pop3_capa, 0 }
-, { "stls", pop3_stls, 0 }
-, { "noop", okay, 0 }
-, { 0, err_authoriz, 0 }
+ {"user", pop3_user, 0},
+ {"pass", pop3_pass, 0},
+ {"apop", pop3_apop, 0},
+ {"quit", pop3_quit, 0},
+ {"capa", pop3_capa, 0},
+ {"stls", pop3_stls, 0},
+ {"noop", okay, 0},
+ { 0, err_authoriz, 0}
};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
char *pop3auth;
char *ucspitls;
sig_alarmcatch(die);
sig_pipeignore();
-
+
hostname = argv[1];
if (!hostname) die_usage();
childargs = argv + 2;
@@ -285,17 +379,17 @@ int main(int argc,char **argv)
ucspitls = env_get("UCSPITLS");
if (ucspitls) {
stls = 1;
- if (!case_diffs(ucspitls,"-")) stls = 0;
- if (!case_diffs(ucspitls,"!")) stls = 2;
+ if (!case_diffs(ucspitls, "-")) stls = 0;
+ if (!case_diffs(ucspitls, "!")) stls = 2;
}
pop3auth = env_get("POP3AUTH");
if (pop3auth) {
- if (case_starts(pop3auth,"apop")) apop = 2;
- if (case_starts(pop3auth,"+apop")) apop = 1;
+ if (case_starts(pop3auth, "apop")) apop = 2;
+ if (case_starts(pop3auth, "+apop")) apop = 1;
}
- poplog_init();
+ poplog_init();
pop3_greet();
- commands(&bi,pop3commands);
+ commands(&bi, pop3commands);
die();
}
diff --git a/src/qmail-postgrey.c b/src/qmail-postgrey.c
index bd88389..942dee6 100644
--- a/src/qmail-postgrey.c
+++ b/src/qmail-postgrey.c
@@ -1,16 +1,17 @@
-#include <unistd.h>
-#include <sys/socket.h>
#include <netinet/in.h>
-#include "stralloc.h"
-#include "logmsg.h"
-#include "ip.h"
+#include <sys/socket.h>
+#include <unistd.h>
+
#include "case.h"
-#include "str.h"
#include "exit.h"
+#include "ip.h"
+#include "logmsg.h"
#include "scan.h"
+#include "socket_if.h"
+#include "str.h"
+#include "stralloc.h"
#include "timeout.h"
#include "timeoutconn.h"
-#include "socket_if.h"
#define WHO "qmail-postgrey"
@@ -33,73 +34,76 @@ int main(int argc, char **argv)
int i, j, r;
if (argc != 6)
- logmsg(WHO,100,USAGE,"qmail-postgrey ip%ifidx;port sender recipient client_address client_name");
+ logmsg(WHO, 100, USAGE, "qmail-postgrey ip%ifidx;port sender recipient client_address client_name");
remoteip = argv[1];
- i = str_chr(remoteip,':');
+ i = str_chr(remoteip, ':');
if (remoteip[i] == ':') {
- j = str_chr(remoteip,'%'); /* IF index */
+ j = str_chr(remoteip, '%'); /* IF index */
if (remoteip[j] == '%') {
remoteip[j] = 0;
netif = &remoteip[j + 1];
ifidx = socket_getifidx(netif);
}
- if (!ip6_scan(remoteip,(char *)&ip6.d))
- logmsg(WHO,111,FATAL,B("No valid IPv6 address provided: ",remoteip));
- pgfd = socket(AF_INET6,SOCK_STREAM,0);
- if (pgfd == -1)
- logmsg(WHO,111,FATAL,"Can't bind to IPv6 socket.");
- r = timeoutconn6(pgfd,(char *)&ip6.d,port,CT,ifidx);
+ if (!ip6_scan(remoteip, (char *)&ip6.d))
+ logmsg(WHO, 111, FATAL, B("No valid IPv6 address provided: ", remoteip));
+ pgfd = socket(AF_INET6, SOCK_STREAM, 0);
+ if (pgfd == -1) logmsg(WHO, 111, FATAL, "Can't bind to IPv6 socket.");
+ r = timeoutconn6(pgfd, (char *)&ip6.d, port, CT, ifidx);
} else {
- if (!ip4_scan(remoteip,(char *)&ip4.d))
- logmsg(WHO,111,FATAL,B("No valid IPv6 address provided: ",remoteip));
- pgfd = socket(AF_INET,SOCK_STREAM,0);
- if (pgfd == -1)
- logmsg(WHO,111,FATAL,"Can't bind to IPv4 socket.");
- r = timeoutconn4(pgfd,(char *)&ip4.d,port,CT);
+ if (!ip4_scan(remoteip, (char *)&ip4.d))
+ logmsg(WHO, 111, FATAL, B("No valid IPv6 address provided: ", remoteip));
+ pgfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (pgfd == -1) logmsg(WHO, 111, FATAL, "Can't bind to IPv4 socket.");
+ r = timeoutconn4(pgfd, (char *)&ip4.d, port, CT);
}
if (r != 0) {
- if (errno == ETIMEDOUT)
- close(pgfd);
- logmsg(WHO,111,FATAL,B("Can't communicate with postgrey server: ",remoteip));
+ if (errno == ETIMEDOUT) close(pgfd);
+ logmsg(WHO, 111, FATAL, B("Can't communicate with postgrey server: ", remoteip));
_exit(1);
}
/* Provide SMTP connect vector to postgrey server */
- if (!stralloc_copys(&query,"request=smtpd_access_policy\nclient_address=")) _exit(1);
- if (!stralloc_cats(&query,argv[4])) _exit(1);
- if (!stralloc_cats(&query,"\nclient_name=")) _exit(1);
- if (!stralloc_cats(&query,argv[5])) _exit(1);
- if (!stralloc_cats(&query,"\nsender=")) _exit(1);
- if (!stralloc_cats(&query,argv[2])) _exit(1);
- if (!stralloc_cats(&query,"\nrecipient=")) _exit(1);
- if (!stralloc_cats(&query,argv[3])) _exit(1);
- if (!stralloc_cats(&query,"\n\n")) _exit(1);
+ if (!stralloc_copys(&query, "request=smtpd_access_policy\nclient_address=")) _exit(1);
+ if (!stralloc_cats(&query, argv[4])) _exit(1);
+ if (!stralloc_cats(&query, "\nclient_name=")) _exit(1);
+ if (!stralloc_cats(&query, argv[5])) _exit(1);
+ if (!stralloc_cats(&query, "\nsender=")) _exit(1);
+ if (!stralloc_cats(&query, argv[2])) _exit(1);
+ if (!stralloc_cats(&query, "\nrecipient=")) _exit(1);
+ if (!stralloc_cats(&query, argv[3])) _exit(1);
+ if (!stralloc_cats(&query, "\n\n")) _exit(1);
do {
- r = timeoutwrite(WT,pgfd,query.s,query.len);
+ r = timeoutwrite(WT, pgfd, query.s, query.len);
} while (r == -1 && errno == EINTR);
- if (r != query.len) { close(pgfd); _exit(1); }
+ if (r != query.len) {
+ close(pgfd);
+ _exit(1);
+ }
/* Read response */
do {
- r = timeoutread(RT,pgfd,buf,sizeof(buf));
+ r = timeoutread(RT, pgfd, buf, sizeof(buf));
} while (r == -1 && errno == EINTR);
- if (r == -1) { close(pgfd); _exit(1); }
+ if (r == -1) {
+ close(pgfd);
+ _exit(1);
+ }
close(pgfd);
-// logmsg(WHO,0,INFO,buf);
+ // logmsg(WHO,0,INFO,buf);
if (r >= 12)
- if (!case_diffb(buf,12,"action=dunno")) _exit(0);
+ if (!case_diffb(buf, 12, "action=dunno")) _exit(0);
if (r >= 14)
- if (!case_diffb(buf,14,"action=prepend")) _exit(0);
+ if (!case_diffb(buf, 14, "action=prepend")) _exit(0);
if (r >= 22)
- if (!case_diffb(buf,22,"action=defer_if_permit")) _exit(10);
+ if (!case_diffb(buf, 22, "action=defer_if_permit")) _exit(10);
exit(1);
}
diff --git a/src/qmail-pw2u.c b/src/qmail-pw2u.c
index 4ca7d25..9b0a09b 100644
--- a/src/qmail-pw2u.c
+++ b/src/qmail-pw2u.c
@@ -1,78 +1,80 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
-#include "getoptb.h"
-#include "control.h"
+#include "byte.h"
#include "constmap.h"
-#include "stralloc.h"
-#include "fmt.h"
-#include "str.h"
-#include "scan.h"
-#include "open.h"
-#include "logmsg.h"
#include "exit.h"
+#include "fmt.h"
#include "getln.h"
-#include "byte.h"
+#include "getoptb.h"
+#include "logmsg.h"
+#include "open.h"
+#include "scan.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "auto_break.h"
#include "auto_qmail.h"
#include "auto_usera.h"
+#include "control.h"
#define WHO "qmail-pw2u"
void die_chdir()
{
- buffer_putsflush(buffer_2,"qmail-pw2u: fatal: unable to chdir\n");
+ buffer_putsflush(buffer_2, "qmail-pw2u: fatal: unable to chdir\n");
_exit(111);
}
void die_nomem()
{
- buffer_putsflush(buffer_2,"qmail-pw2u: fatal: out of memory\n");
+ buffer_putsflush(buffer_2, "qmail-pw2u: fatal: out of memory\n");
_exit(111);
}
void die_read()
{
- buffer_putsflush(buffer_2,"qmail-pw2u: fatal: unable to read input\n");
+ buffer_putsflush(buffer_2, "qmail-pw2u: fatal: unable to read input\n");
_exit(111);
}
void die_write()
{
- buffer_putsflush(buffer_2,"qmail-pw2u: fatal: unable to write output\n");
+ buffer_putsflush(buffer_2, "qmail-pw2u: fatal: unable to write output\n");
_exit(111);
}
void die_control()
{
- buffer_putsflush(buffer_2,"qmail-pw2u: fatal: unable to read controls\n");
+ buffer_putsflush(buffer_2, "qmail-pw2u: fatal: unable to read controls\n");
_exit(111);
}
void die_alias()
{
- buffer_puts(buffer_2,"qmail-pw2u: fatal: unable to find ");
- buffer_puts(buffer_2,auto_usera);
- buffer_puts(buffer_2," user\n");
+ buffer_puts(buffer_2, "qmail-pw2u: fatal: unable to find ");
+ buffer_puts(buffer_2, auto_usera);
+ buffer_puts(buffer_2, " user\n");
buffer_flush(buffer_2);
_exit(111);
}
void die_home(char *fn)
{
- buffer_puts(buffer_2,"qmail-pw2u: fatal: unable to stat ");
- buffer_puts(buffer_2,fn);
- buffer_puts(buffer_2,"\n");
+ buffer_puts(buffer_2, "qmail-pw2u: fatal: unable to stat ");
+ buffer_puts(buffer_2, fn);
+ buffer_puts(buffer_2, "\n");
buffer_flush(buffer_2);
_exit(111);
}
-void die_user(char *s,unsigned int len)
+void die_user(char *s, unsigned int len)
{
- buffer_puts(buffer_2,"qmail-pw2u: fatal: unable to find ");
- buffer_put(buffer_2,s,len);
- buffer_puts(buffer_2," user for subuser\n");
+ buffer_puts(buffer_2, "qmail-pw2u: fatal: unable to find ");
+ buffer_put(buffer_2, s, len);
+ buffer_puts(buffer_2, " user for subuser\n");
buffer_flush(buffer_2);
_exit(111);
}
@@ -85,11 +87,18 @@ int homestrategy = 2;
/* 1: stop if home does not exist; skip if home is not owned by user */
/* 0: don't worry about home */
-int okincl; stralloc incl = {0}; struct constmap mapincl;
-int okexcl; stralloc excl = {0}; struct constmap mapexcl;
-int okmana; stralloc mana = {0}; struct constmap mapmana;
+int okincl;
+stralloc incl = {0};
+struct constmap mapincl;
+int okexcl;
+stralloc excl = {0};
+struct constmap mapexcl;
+int okmana;
+stralloc mana = {0};
+struct constmap mapmana;
-stralloc allusers = {0}; struct constmap mapuser;
+stralloc allusers = {0};
+struct constmap mapuser;
stralloc uugh = {0};
stralloc user = {0};
@@ -108,37 +117,57 @@ void doaccount()
char *x;
unsigned int xlen;
- if (byte_chr(line.s,line.len,'\0') < line.len) return;
+ if (byte_chr(line.s, line.len, '\0') < line.len) return;
- x = line.s; xlen = line.len; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- if (!stralloc_copyb(&user,x,i)) die_nomem();
+ x = line.s;
+ xlen = line.len;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ if (!stralloc_copyb(&user, x, i)) die_nomem();
if (!stralloc_0(&user)) die_nomem();
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- if (!stralloc_copyb(&uidstr,x,i)) die_nomem();
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ if (!stralloc_copyb(&uidstr, x, i)) die_nomem();
if (!stralloc_0(&uidstr)) die_nomem();
- scan_ulong(uidstr.s,&uid);
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- if (!stralloc_copyb(&gidstr,x,i)) die_nomem();
+ scan_ulong(uidstr.s, &uid);
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ if (!stralloc_copyb(&gidstr, x, i)) die_nomem();
if (!stralloc_0(&gidstr)) die_nomem();
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- if (!stralloc_copyb(&home,x,i)) die_nomem();
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ if (!stralloc_copyb(&home, x, i)) die_nomem();
if (!stralloc_0(&home)) die_nomem();
if (!uid) return;
if (flagnoupper)
for (i = 0; i < user.len; ++i)
- if ((user.s[i] >= 'A') && (user.s[i] <= 'Z'))
- return;
+ if ((user.s[i] >= 'A') && (user.s[i] <= 'Z')) return;
if (okincl)
- if (!constmap(&mapincl,user.s,user.len - 1))
- return;
+ if (!constmap(&mapincl, user.s, user.len - 1)) return;
if (okexcl)
- if (constmap(&mapexcl,user.s,user.len - 1))
- return;
+ if (constmap(&mapexcl, user.s, user.len - 1)) return;
if (homestrategy) {
- if (stat(home.s,&st) == -1) {
+ if (stat(home.s, &st) == -1) {
if (errno != ENOENT) die_home(home.s);
if (homestrategy == 1) die_home(home.s);
return;
@@ -146,54 +175,52 @@ void doaccount()
if (st.st_uid != uid) return;
}
- if (!stralloc_copys(&uugh,":")) die_nomem();
- if (!stralloc_cats(&uugh,user.s)) die_nomem();
- if (!stralloc_cats(&uugh,":")) die_nomem();
- if (!stralloc_cats(&uugh,uidstr.s)) die_nomem();
- if (!stralloc_cats(&uugh,":")) die_nomem();
- if (!stralloc_cats(&uugh,gidstr.s)) die_nomem();
- if (!stralloc_cats(&uugh,":")) die_nomem();
- if (!stralloc_cats(&uugh,home.s)) die_nomem();
- if (!stralloc_cats(&uugh,":")) die_nomem();
+ if (!stralloc_copys(&uugh, ":")) die_nomem();
+ if (!stralloc_cats(&uugh, user.s)) die_nomem();
+ if (!stralloc_cats(&uugh, ":")) die_nomem();
+ if (!stralloc_cats(&uugh, uidstr.s)) die_nomem();
+ if (!stralloc_cats(&uugh, ":")) die_nomem();
+ if (!stralloc_cats(&uugh, gidstr.s)) die_nomem();
+ if (!stralloc_cats(&uugh, ":")) die_nomem();
+ if (!stralloc_cats(&uugh, home.s)) die_nomem();
+ if (!stralloc_cats(&uugh, ":")) die_nomem();
/* XXX: avoid recording in allusers unlein sub actually needs it */
- if (!stralloc_cats(&allusers,user.s)) die_nomem();
- if (!stralloc_cats(&allusers,":")) die_nomem();
- if (!stralloc_catb(&allusers,uugh.s,uugh.len)) die_nomem();
+ if (!stralloc_cats(&allusers, user.s)) die_nomem();
+ if (!stralloc_cats(&allusers, ":")) die_nomem();
+ if (!stralloc_catb(&allusers, uugh.s, uugh.len)) die_nomem();
if (!stralloc_0(&allusers)) die_nomem();
- if (str_equal(user.s,auto_usera)) {
- if (buffer_puts(buffer_1,"+") == -1) die_write();
- if (buffer_put(buffer_1,uugh.s,uugh.len) == -1) die_write();
- if (buffer_puts(buffer_1,dashcolon) == -1) die_write();
- if (buffer_puts(buffer_1,":\n") == -1) die_write();
+ if (str_equal(user.s, auto_usera)) {
+ if (buffer_puts(buffer_1, "+") == -1) die_write();
+ if (buffer_put(buffer_1, uugh.s, uugh.len) == -1) die_write();
+ if (buffer_puts(buffer_1, dashcolon) == -1) die_write();
+ if (buffer_puts(buffer_1, ":\n") == -1) die_write();
flagalias = 1;
}
mailnames = 0;
- if (okmana)
- mailnames = constmap(&mapmana,user.s,user.len - 1);
- if (!mailnames)
- mailnames = user.s;
+ if (okmana) mailnames = constmap(&mapmana, user.s, user.len - 1);
+ if (!mailnames) mailnames = user.s;
for (;;) {
while (*mailnames == ':') ++mailnames;
if (!*mailnames) break;
- i = str_chr(mailnames,':');
+ i = str_chr(mailnames, ':');
+
+ if (buffer_puts(buffer_1, "=") == -1) die_write();
+ if (buffer_put(buffer_1, mailnames, i) == -1) die_write();
+ if (buffer_put(buffer_1, uugh.s, uugh.len) == -1) die_write();
+ if (buffer_puts(buffer_1, "::\n") == -1) die_write();
- if (buffer_puts(buffer_1,"=") == -1) die_write();
- if (buffer_put(buffer_1,mailnames,i) == -1) die_write();
- if (buffer_put(buffer_1,uugh.s,uugh.len) == -1) die_write();
- if (buffer_puts(buffer_1,"::\n") == -1) die_write();
-
if (*auto_break) {
- if (buffer_puts(buffer_1,"+") == -1) die_write();
- if (buffer_put(buffer_1,mailnames,i) == -1) die_write();
- if (buffer_put(buffer_1,auto_break,1) == -1) die_write();
- if (buffer_put(buffer_1,uugh.s,uugh.len) == -1) die_write();
- if (buffer_puts(buffer_1,dashcolon) == -1) die_write();
- if (buffer_puts(buffer_1,":\n") == -1) die_write();
+ if (buffer_puts(buffer_1, "+") == -1) die_write();
+ if (buffer_put(buffer_1, mailnames, i) == -1) die_write();
+ if (buffer_put(buffer_1, auto_break, 1) == -1) die_write();
+ if (buffer_put(buffer_1, uugh.s, uugh.len) == -1) die_write();
+ if (buffer_puts(buffer_1, dashcolon) == -1) die_write();
+ if (buffer_puts(buffer_1, ":\n") == -1) die_write();
}
mailnames += i;
@@ -209,28 +236,39 @@ void dosubuser()
unsigned int xlen;
char *uugh;
- x = line.s; xlen = line.len; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- if (!stralloc_copyb(&sub,x,i)) die_nomem();
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
- uugh = constmap(&mapuser,x,i);
- if (!uugh) die_user(x,i);
- ++i; x += i; xlen -= i; i = byte_chr(x,xlen,':'); if (i == xlen) return;
-
- if (buffer_puts(buffer_1,"=") == -1) die_write();
- if (buffer_put(buffer_1,sub.s,sub.len) == -1) die_write();
- if (buffer_puts(buffer_1,uugh) == -1) die_write();
- if (buffer_puts(buffer_1,dashcolon) == -1) die_write();
- if (buffer_put(buffer_1,x,i) == -1) die_write();
- if (buffer_puts(buffer_1,":\n") == -1) die_write();
+ x = line.s;
+ xlen = line.len;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ if (!stralloc_copyb(&sub, x, i)) die_nomem();
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+ uugh = constmap(&mapuser, x, i);
+ if (!uugh) die_user(x, i);
+ ++i;
+ x += i;
+ xlen -= i;
+ i = byte_chr(x, xlen, ':');
+ if (i == xlen) return;
+
+ if (buffer_puts(buffer_1, "=") == -1) die_write();
+ if (buffer_put(buffer_1, sub.s, sub.len) == -1) die_write();
+ if (buffer_puts(buffer_1, uugh) == -1) die_write();
+ if (buffer_puts(buffer_1, dashcolon) == -1) die_write();
+ if (buffer_put(buffer_1, x, i) == -1) die_write();
+ if (buffer_puts(buffer_1, ":\n") == -1) die_write();
if (*auto_break) {
- if (buffer_puts(buffer_1,"+") == -1) die_write();
- if (buffer_put(buffer_1,sub.s,sub.len) == -1) die_write();
- if (buffer_put(buffer_1,auto_break,1) == -1) die_write();
- if (buffer_puts(buffer_1,uugh) == -1) die_write();
- if (buffer_puts(buffer_1,dashcolon) == -1) die_write();
- if (buffer_put(buffer_1,x,i) == -1) die_write();
- if (buffer_puts(buffer_1,"-:\n") == -1) die_write();
+ if (buffer_puts(buffer_1, "+") == -1) die_write();
+ if (buffer_put(buffer_1, sub.s, sub.len) == -1) die_write();
+ if (buffer_put(buffer_1, auto_break, 1) == -1) die_write();
+ if (buffer_puts(buffer_1, uugh) == -1) die_write();
+ if (buffer_puts(buffer_1, dashcolon) == -1) die_write();
+ if (buffer_put(buffer_1, x, i) == -1) die_write();
+ if (buffer_puts(buffer_1, "-:\n") == -1) die_write();
}
}
@@ -238,13 +276,13 @@ int fd;
char inbuf[BUFFER_INSIZE];
buffer in;
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int opt;
int match;
- while ((opt = getopt(argc,argv,"/ohHuUc:C")) != opteof)
- switch (opt) {
+ while ((opt = getopt(argc, argv, "/ohHuUc:C")) != opteof) switch (opt)
+ {
case '/': dashcolon = "-/:"; break;
case 'o': homestrategy = 2; break;
case 'h': homestrategy = 1; break;
@@ -254,30 +292,32 @@ int main(int argc,char **argv)
case 'c': *auto_break = *optarg; break;
case 'C': *auto_break = 0; break;
case '?':
- default:
- _exit(100);
+ default: _exit(100);
}
if (chdir(auto_qmail) == -1) die_chdir();
/* no need for control_init() */
- okincl = control_readfile(&incl,"users/include",0);
+ okincl = control_readfile(&incl, "users/include", 0);
if (okincl == -1) die_control();
- if (okincl) if (!constmap_init(&mapincl,incl.s,incl.len,0)) die_nomem();
+ if (okincl)
+ if (!constmap_init(&mapincl, incl.s, incl.len, 0)) die_nomem();
- okexcl = control_readfile(&excl,"users/exclude",0);
+ okexcl = control_readfile(&excl, "users/exclude", 0);
if (okexcl == -1) die_control();
- if (okexcl) if (!constmap_init(&mapexcl,excl.s,excl.len,0)) die_nomem();
+ if (okexcl)
+ if (!constmap_init(&mapexcl, excl.s, excl.len, 0)) die_nomem();
- okmana = control_readfile(&mana,"users/mailnames",0);
+ okmana = control_readfile(&mana, "users/mailnames", 0);
if (okmana == -1) die_control();
- if (okmana) if (!constmap_init(&mapmana,mana.s,mana.len,1)) die_nomem();
+ if (okmana)
+ if (!constmap_init(&mapmana, mana.s, mana.len, 1)) die_nomem();
- if (!stralloc_copys(&allusers,"")) die_nomem();
+ if (!stralloc_copys(&allusers, "")) die_nomem();
for (;;) {
- if (getln(buffer_0,&line,&match,'\n') == -1) die_read();
+ if (getln(buffer_0, &line, &match, '\n') == -1) die_read();
doaccount();
if (!match) break;
}
@@ -286,14 +326,13 @@ int main(int argc,char **argv)
fd = open_read("users/subusers");
if (fd == -1) {
if (errno != ENOENT) die_control();
- }
- else {
- buffer_init(&in,read,fd,inbuf,sizeof(inbuf));
+ } else {
+ buffer_init(&in, read, fd, inbuf, sizeof(inbuf));
- if (!constmap_init(&mapuser,allusers.s,allusers.len,1)) die_nomem();
+ if (!constmap_init(&mapuser, allusers.s, allusers.len, 1)) die_nomem();
for (;;) {
- if (getln(&in,&line,&match,'\n') == -1) die_read();
+ if (getln(&in, &line, &match, '\n') == -1) die_read();
dosubuser();
if (!match) break;
}
@@ -304,17 +343,16 @@ int main(int argc,char **argv)
fd = open_read("users/append");
if (fd == -1) {
if (errno != ENOENT) die_control();
- }
- else {
- buffer_init(&in,read,fd,inbuf,sizeof(inbuf));
+ } else {
+ buffer_init(&in, read, fd, inbuf, sizeof(inbuf));
for (;;) {
- if (getln(&in,&line,&match,'\n') == -1) die_read();
- if (buffer_put(buffer_1,line.s,line.len) == -1) die_write();
+ if (getln(&in, &line, &match, '\n') == -1) die_read();
+ if (buffer_put(buffer_1, line.s, line.len) == -1) die_write();
if (!match) break;
}
}
- if (buffer_puts(buffer_1,".\n") == -1) die_write();
+ if (buffer_puts(buffer_1, ".\n") == -1) die_write();
if (buffer_flush(buffer_1) == -1) die_write();
_exit(0);
}
diff --git a/src/qmail-qmaint.c b/src/qmail-qmaint.c
index e83ab6f..70605c8 100644
--- a/src/qmail-qmaint.c
+++ b/src/qmail-qmaint.c
@@ -1,38 +1,40 @@
/*
Based on an implementation of queue-fix 1.2 by Eric Huss
*/
-#include <unistd.h>
-#include <sys/stat.h>
-#include <pwd.h>
#include <grp.h>
-#include "stralloc.h"
+#include <pwd.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "buffer.h"
#include "direntry.h"
-#include "fmt.h"
-#include "fmtqfn.h"
#include "error.h"
-#include "buffer.h"
+#include "exit.h"
+#include "fifo.h"
+#include "fmt.h"
#include "getln.h"
-#include "str.h"
+#include "logmsg.h"
#include "open.h"
-#include "fifo.h"
#include "scan.h"
-#include "readsubdir.h"
-#include "logmsg.h"
-#include "exit.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
#include "auto_split.h"
#include "auto_uids.h"
+#include "fmtqfn.h"
+#include "readsubdir.h"
#define WHO "qmail-qmaint"
-stralloc queue_dir = {0}; /*the root queue dir with trailing slash*/
-stralloc check_dir = {0}; /*the current directory being checked*/
-stralloc temp_dirname = {0}; /*temporary used for checking directories */
+stralloc queue_dir = {0}; /*the root queue dir with trailing slash*/
+stralloc check_dir = {0}; /*the current directory being checked*/
+stralloc temp_dirname = {0}; /*temporary used for checking directories */
stralloc temp_filename = {0}; /*temporary used for checking individuals*/
-stralloc old_name = {0}; /*used in rename*/
-stralloc new_name = {0}; /*used in rename*/
-stralloc mess_dir = {0}; /*used for renaming in mess dir*/
-stralloc query = {0}; /*used in interactive query function*/
+stralloc old_name = {0}; /*used in rename*/
+stralloc new_name = {0}; /*used in rename*/
+stralloc mess_dir = {0}; /*used for renaming in mess dir*/
+stralloc query = {0}; /*used in interactive query function*/
char strnum[FMT_ULONG];
int flag_interactive = 0;
@@ -50,32 +52,41 @@ int split_num;
void die_make(char *name)
{
- logmsg(WHO,111,ERROR,B("Failed to make: ",name));
+ logmsg(WHO, 111, ERROR, B("Failed to make: ", name));
}
void die_user(char *user)
{
- logmsg(WHO,111,ERROR,B("Failed to determine uid of: ",user));
+ logmsg(WHO, 111, ERROR, B("Failed to determine uid of: ", user));
}
void die_group(char *group)
{
- logmsg(WHO,111,ERROR,B("Failed to determine gid of: ",group));
+ logmsg(WHO, 111, ERROR, B("Failed to determine gid of: ", group));
}
void die_check()
{
- logmsg(WHO,111,ERROR,"Failed while checking directory structure. \nEnsure the given queue exists and you have permission to access it.");
+ logmsg(
+ WHO,
+ 111,
+ ERROR,
+ "Failed while checking directory structure. \nEnsure the given queue exists and you have "
+ "permission to access it.");
}
void die_recon()
{
- logmsg(WHO,110,ERROR,"Failed to reconstruct queue. \nEnsure the queue exists and you have permission to modify it.");
+ logmsg(
+ WHO,
+ 110,
+ ERROR,
+ "Failed to reconstruct queue. \nEnsure the queue exists and you have permission to modify it.");
}
void die_nomem()
{
- logmsg(WHO,110,ERROR,"Out of memory.");
+ logmsg(WHO, 110, ERROR, "Out of memory.");
}
/*returns 1==yes, 0==no*/
@@ -84,7 +95,7 @@ int confirm()
{
int match;
- if (getln(buffer_0,&query,&match,'\n')) return 0;
+ if (getln(buffer_0, &query, &match, '\n')) return 0;
if (!match) return 0;
if (query.s[0] == 'y' || query.s[0] == 'Y' || query.s[0] == '\n') return 1;
return 0;
@@ -92,16 +103,19 @@ int confirm()
/*gid may be -1 on files for "unknown*/
-#define DIRS logmsg(WHO,0,WARN,"It looks like some directories don't exist, should I create them? (Y/n)")
-#define FILES logmsg(WHO,0,WARN,"It looks like some files don't exist, should I create them? (Y/n)")
+#define DIRS \
+ logmsg(WHO, 0, WARN, "It looks like some directories don't exist, should I create them? (Y/n)")
+#define FILES logmsg(WHO, 0, WARN, "It looks like some files don't exist, should I create them? (Y/n)")
-#define PERMS logmsg(WHO,0,WARN,B("It looks like permissions are wrong for ",name," should I fix them? (Y/n)"))
-#define CPERMS logmsg(WHO,0,WARN,B("Changing permissions: ",name," => ",pnum))
+#define PERMS \
+ logmsg(WHO, 0, WARN, B("It looks like permissions are wrong for ", name, " should I fix them? (Y/n)"))
+#define CPERMS logmsg(WHO, 0, WARN, B("Changing permissions: ", name, " => ", pnum))
-#define OWNER logmsg(WHO,0,WARN,B("It looks like ownerships are wrong for ",name," should I fix them? (Y/n)"))
-#define COWNER logmsg(WHO,0,WARN,B("Changing ownership: ",name," => ",unum,"/",gnum))
+#define OWNER \
+ logmsg(WHO, 0, WARN, B("It looks like ownerships are wrong for ", name, " should I fix them? (Y/n)"))
+#define COWNER logmsg(WHO, 0, WARN, B("Changing ownership: ", name, " => ", unum, "/", gnum))
-int check_item(char *name,int uid,int gid,int perm,char type,int size)
+int check_item(char *name, int uid, int gid, int perm, char type, int size)
{
struct stat st;
int fd;
@@ -110,131 +124,189 @@ int check_item(char *name,int uid,int gid,int perm,char type,int size)
char gnum[12];
char pnum[12];
- /*check for existence and proper credentials*/
+ /*check for existence and proper credentials*/
- strnum[fmt_ulong(unum,uid)] = 0;
- strnum[fmt_ulong(gnum,gid)] = 0;
- strnum[fmt_ulong(pnum,perm)] = 0;
+ strnum[fmt_ulong(unum, uid)] = 0;
+ strnum[fmt_ulong(gnum, gid)] = 0;
+ strnum[fmt_ulong(pnum, perm)] = 0;
switch (type) {
- case 'd': /*directory*/
- if (stat(name,&st)) {
- if (errno != ENOENT) return -1;
- if (!flag_dircreate && flag_interactive) {
- DIRS; if (!confirm()) return -1;
- flag_dircreate = 1;
- }
- /*create it*/
- logmsg(WHO,0,INFO,B("Creating directory: ",name));
- if (mkdir(name,perm)) die_make(name);
- CPERMS; if (chmod(name,perm)) die_make(name);
- COWNER; if (chown(name,uid,gid)) die_make(name);
- return 0;
- }
- /*check the values*/
- if (st.st_uid != uid || st.st_gid != gid) {
- if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; }
- COWNER; if (chown(name,uid,gid)) die_make(name);
- }
- if ((st.st_mode & 07777) != perm) {
- if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; }
- CPERMS; if (chmod(name,perm)) die_make(name);
- }
- return 0;
- case 'f': /*regular file*/
- if (stat(name,&st)) return -1;
- /*check the values*/
- if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
- if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; }
- COWNER; if (chown(name,uid,gid)) die_make(name);
- }
- if ((st.st_mode & 07777) != perm) {
- if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; }
- CPERMS; if (chmod(name,perm)) die_make(name);
- }
- return 0;
- case 'z': /*regular file with a size*/
- if (stat(name,&st)) {
- if (errno != ENOENT) return -1;
- if (!flag_filecreate && flag_interactive) {
- FILES; if (!confirm()) return -1;
- flag_filecreate = 1;
- }
- /*create it*/
-
- strnum[fmt_ulong(num,size)] = 0;
- logmsg(WHO,0,INFO,B("Creating: ",name," with size ",num));
- fd = open_trunc(name);
- if (fd == -1) die_make(name);
- while (size--) { if (write(fd,"",1)!=1) die_make(name); }
- close(fd);
- CPERMS; if (chmod(name,perm)) die_make(name);
- COWNER; if (chown(name,uid,gid)) die_make(name);
- return 0;
- }
- /*check the values*/
- if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
- if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; }
- COWNER; if (chown(name,uid,gid)) die_make(name);
- }
- if ((st.st_mode & 07777) != perm) {
- if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; }
- CPERMS; if (chmod(name,perm)) die_make(name);
- }
- if (st.st_size != size) {
- logmsg(WHO,0,WARN,B("File ",name," has not the right size. I will not fix it, please investigate."));
- }
- return 0;
+ case 'd': /*directory*/
+ if (stat(name, &st)) {
+ if (errno != ENOENT) return -1;
+ if (!flag_dircreate && flag_interactive) {
+ DIRS;
+ if (!confirm()) return -1;
+ flag_dircreate = 1;
+ }
+ /*create it*/
+ logmsg(WHO, 0, INFO, B("Creating directory: ", name));
+ if (mkdir(name, perm)) die_make(name);
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ return 0;
+ }
+ /*check the values*/
+ if (st.st_uid != uid || st.st_gid != gid) {
+ if (!flag_permfix && flag_interactive) {
+ OWNER;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ }
+ if ((st.st_mode & 07777) != perm) {
+ if (!flag_permfix && flag_interactive) {
+ PERMS;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ }
+ return 0;
+ case 'f': /*regular file*/
+ if (stat(name, &st)) return -1;
+ /*check the values*/
+ if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
+ if (!flag_permfix && flag_interactive) {
+ OWNER;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ }
+ if ((st.st_mode & 07777) != perm) {
+ if (!flag_permfix && flag_interactive) {
+ PERMS;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ }
+ return 0;
+ case 'z': /*regular file with a size*/
+ if (stat(name, &st)) {
+ if (errno != ENOENT) return -1;
+ if (!flag_filecreate && flag_interactive) {
+ FILES;
+ if (!confirm()) return -1;
+ flag_filecreate = 1;
+ }
+ /*create it*/
+
+ strnum[fmt_ulong(num, size)] = 0;
+ logmsg(WHO, 0, INFO, B("Creating: ", name, " with size ", num));
+ fd = open_trunc(name);
+ if (fd == -1) die_make(name);
+ while (size--) {
+ if (write(fd, "", 1) != 1) die_make(name);
+ }
+ close(fd);
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ return 0;
+ }
+ /*check the values*/
+ if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
+ if (!flag_permfix && flag_interactive) {
+ OWNER;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ }
+ if ((st.st_mode & 07777) != perm) {
+ if (!flag_permfix && flag_interactive) {
+ PERMS;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ }
+ if (st.st_size != size) {
+ logmsg(
+ WHO,
+ 0,
+ WARN,
+ B("File ", name, " has not the right size. I will not fix it, please investigate."));
+ }
+ return 0;
case 'p': /*a named pipe*/
- if (stat(name,&st)) {
- if (errno != ENOENT) return -1;
- if (!flag_filecreate && flag_interactive) {
- FILES; if (!confirm()) return -1;
- flag_filecreate = 1;
- }
- /*create it*/
- logmsg(WHO,INFO,0,B("Creating fifo: ",name));
- if (fifo_make(name,perm)) die_make(name);
- CPERMS; if (chmod(name,perm)) die_make(name);
- COWNER; if (chown(name,uid,gid)) die_make(name);
- return 0;
- }
- /*check the values*/
- if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
- if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; }
- COWNER; if (chown(name,uid,gid)) die_make(name);
- }
- if ((st.st_mode & 07777) != perm) {
- if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; }
- CPERMS; if (chmod(name,perm)) die_make(name);
- }
- return 0;
- }
+ if (stat(name, &st)) {
+ if (errno != ENOENT) return -1;
+ if (!flag_filecreate && flag_interactive) {
+ FILES;
+ if (!confirm()) return -1;
+ flag_filecreate = 1;
+ }
+ /*create it*/
+ logmsg(WHO, INFO, 0, B("Creating fifo: ", name));
+ if (fifo_make(name, perm)) die_make(name);
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ return 0;
+ }
+ /*check the values*/
+ if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) {
+ if (!flag_permfix && flag_interactive) {
+ OWNER;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ COWNER;
+ if (chown(name, uid, gid)) die_make(name);
+ }
+ if ((st.st_mode & 07777) != perm) {
+ if (!flag_permfix && flag_interactive) {
+ PERMS;
+ if (!confirm()) return -1;
+ flag_permfix = 1;
+ }
+ CPERMS;
+ if (chmod(name, perm)) die_make(name);
+ }
+ return 0;
+ }
return 0;
}
-int check_files(char * directory,int uid,int gid,int perm)
+int check_files(char *directory, int uid, int gid, int perm)
{
DIR *dir;
direntry *d;
dir = opendir(directory);
-
+
if (!dir) return -1;
while ((d = readdir(dir))) {
if (d->d_name[0] == '.') continue;
- if (!stralloc_copys(&temp_filename,directory)) die_nomem();
- if (!stralloc_append(&temp_filename,"/")) die_nomem();
- if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem();
+ if (!stralloc_copys(&temp_filename, directory)) die_nomem();
+ if (!stralloc_append(&temp_filename, "/")) die_nomem();
+ if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem();
if (!stralloc_0(&temp_filename)) die_nomem();
- if (check_item(temp_filename.s,uid,gid,perm,'f',0)) { closedir(dir); return -1; }
+ if (check_item(temp_filename.s, uid, gid, perm, 'f', 0)) {
+ closedir(dir);
+ return -1;
+ }
}
closedir(dir);
return 0;
}
-void warn_files(char * directory)
+void warn_files(char *directory)
{
DIR *dir;
direntry *d;
@@ -251,71 +323,80 @@ void warn_files(char * directory)
closedir(dir);
- if (found)
- logmsg(WHO,0,WARN,B("Found files in ",directory," that shouldn't be there. I will not remove them. You should consider checking it out."));
+ if (found)
+ logmsg(
+ WHO,
+ 0,
+ WARN,
+ B("Found files in ",
+ directory,
+ " that shouldn't be there. I will not remove them. You should consider checking it out."));
}
-int check_splits(char * directory,int dir_uid,int dir_gid,int dir_perm,int file_gid,int file_perm)
+int check_splits(char *directory, int dir_uid, int dir_gid, int dir_perm, int file_gid, int file_perm)
{
DIR *dir;
direntry *d;
int i;
- for (i = 0; i < split_num ; i++) {
- strnum[fmt_ulong(strnum,i)] = 0;
- if (!stralloc_copys(&temp_dirname,directory)) die_nomem();
- if (!stralloc_append(&temp_dirname,"/")) die_nomem();
- if (!stralloc_cats(&temp_dirname,strnum)) die_nomem();
+ for (i = 0; i < split_num; i++) {
+ strnum[fmt_ulong(strnum, i)] = 0;
+ if (!stralloc_copys(&temp_dirname, directory)) die_nomem();
+ if (!stralloc_append(&temp_dirname, "/")) die_nomem();
+ if (!stralloc_cats(&temp_dirname, strnum)) die_nomem();
if (!stralloc_0(&temp_dirname)) die_nomem();
/*check the split dir*/
- if (check_item(temp_dirname.s,dir_uid,dir_gid,dir_perm,'d',0)) return -1;
+ if (check_item(temp_dirname.s, dir_uid, dir_gid, dir_perm, 'd', 0)) return -1;
/*check its contents*/
dir = opendir(temp_dirname.s);
if (!dir) return -1;
while ((d = readdir(dir))) {
if (d->d_name[0] == '.') continue;
- if (!stralloc_copys(&temp_filename,temp_dirname.s)) die_nomem();
- if (!stralloc_append(&temp_filename,"/")) die_nomem();
- if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem();
+ if (!stralloc_copys(&temp_filename, temp_dirname.s)) die_nomem();
+ if (!stralloc_append(&temp_filename, "/")) die_nomem();
+ if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem();
if (!stralloc_0(&temp_filename)) die_nomem();
- if (check_item(temp_filename.s,dir_uid,file_gid,file_perm,'f',0)) { closedir(dir); return -1; }
+ if (check_item(temp_filename.s, dir_uid, file_gid, file_perm, 'f', 0)) {
+ closedir(dir);
+ return -1;
+ }
}
closedir(dir);
- }
+ }
return 0;
}
int rename_mess(char *dir, char *part, char *new_part, char *old_filename, char *new_filename)
{
-
+
if (flag_interactive && !flag_namefix) {
- logmsg(WHO,0,INFO,"It looks like some files need to be renamed, should I rename them? (Y/n)\n");
+ logmsg(WHO, 0, INFO, "It looks like some files need to be renamed, should I rename them? (Y/n)\n");
if (!confirm()) return -1;
flag_namefix = 1;
}
/*prepare the old filename*/
- if (!stralloc_copy(&old_name,&queue_dir)) die_nomem();
- if (!stralloc_cats(&old_name,dir)) die_nomem();
- if (!stralloc_cats(&old_name,part)) die_nomem();
- if (!stralloc_append(&old_name,"/")) die_nomem();
- if (!stralloc_cats(&old_name,old_filename)) die_nomem();
+ if (!stralloc_copy(&old_name, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&old_name, dir)) die_nomem();
+ if (!stralloc_cats(&old_name, part)) die_nomem();
+ if (!stralloc_append(&old_name, "/")) die_nomem();
+ if (!stralloc_cats(&old_name, old_filename)) die_nomem();
if (!stralloc_0(&old_name)) die_nomem();
/*prepare the new filename*/
- if (!stralloc_copy(&new_name,&queue_dir)) die_nomem();
- if (!stralloc_cats(&new_name,dir)) die_nomem();
- if (!stralloc_cats(&new_name,new_part)) die_nomem();
- if (!stralloc_append(&new_name,"/")) die_nomem();
- if (!stralloc_cats(&new_name,new_filename)) die_nomem();
+ if (!stralloc_copy(&new_name, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&new_name, dir)) die_nomem();
+ if (!stralloc_cats(&new_name, new_part)) die_nomem();
+ if (!stralloc_append(&new_name, "/")) die_nomem();
+ if (!stralloc_cats(&new_name, new_filename)) die_nomem();
if (!stralloc_0(&new_name)) die_nomem();
- logmsg(WHO,0,INFO,B("Renaming ",old_name.s," to ",new_name.s));
- if (rename(old_name.s,new_name.s)) {
- if (errno != ENOENT) return -1;
+ logmsg(WHO, 0, INFO, B("Renaming ", old_name.s, " to ", new_name.s));
+ if (rename(old_name.s, new_name.s)) {
+ if (errno != ENOENT) return -1;
}
return 0;
@@ -332,11 +413,11 @@ int fix_part(char *part)
int part_num;
int correct_part_num;
- scan_uint(part,&part_num);
+ scan_uint(part, &part_num);
- if (!stralloc_copy(&mess_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&mess_dir,"mess/")) die_nomem();
- if (!stralloc_cats(&mess_dir,part)) die_nomem();
+ if (!stralloc_copy(&mess_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&mess_dir, "mess/")) die_nomem();
+ if (!stralloc_cats(&mess_dir, part)) die_nomem();
if (!stralloc_0(&mess_dir)) die_nomem();
dir = opendir(mess_dir.s);
@@ -345,28 +426,52 @@ int fix_part(char *part)
while ((d = readdir(dir))) {
if (d->d_name[0] == '.') continue;
/*check from mess*/
- if (!stralloc_copys(&temp_filename,mess_dir.s)) die_nomem();
- if (!stralloc_append(&temp_filename,"/")) die_nomem();
- if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem();
+ if (!stralloc_copys(&temp_filename, mess_dir.s)) die_nomem();
+ if (!stralloc_append(&temp_filename, "/")) die_nomem();
+ if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem();
if (!stralloc_0(&temp_filename)) die_nomem();
- if (stat(temp_filename.s,&st)) { closedir(dir); return -1; }
+ if (stat(temp_filename.s, &st)) {
+ closedir(dir);
+ return -1;
+ }
/*check that filename == inode number*/
/*check that inode%auto_split == part_num*/
- scan_uint(d->d_name,&old_inode);
+ scan_uint(d->d_name, &old_inode);
correct_part_num = st.st_ino % split_num;
if (st.st_ino != old_inode || part_num != correct_part_num) {
/*rename*/
- inode[fmt_ulong(inode,st.st_ino)] = 0;
- new_part[fmt_ulong(new_part,correct_part_num)] = 0;
- if (rename_mess("mess/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
- if (rename_mess("info/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
- if (rename_mess("local/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
- if (rename_mess("remote/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
- if (rename_mess("todo/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
- if (rename_mess("intd/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; }
-
- if (rename_mess("bounce","","",d->d_name,inode)) { closedir(dir); return -1; }
+ inode[fmt_ulong(inode, st.st_ino)] = 0;
+ new_part[fmt_ulong(new_part, correct_part_num)] = 0;
+ if (rename_mess("mess/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+ if (rename_mess("info/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+ if (rename_mess("local/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+ if (rename_mess("remote/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+ if (rename_mess("todo/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+ if (rename_mess("intd/", part, new_part, d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
+
+ if (rename_mess("bounce", "", "", d->d_name, inode)) {
+ closedir(dir);
+ return -1;
+ }
}
}
@@ -378,102 +483,102 @@ int fix_names()
{
int i;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"mess")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "mess")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
for (i = 0; i < split_num; i++) {
- strnum[fmt_ulong(strnum,i)] = 0;
+ strnum[fmt_ulong(strnum, i)] = 0;
if (fix_part(strnum)) return -1;
}
- return 0;
+ return 0;
}
int check_dirs()
{
/*check root existence*/
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1;
/*check the bigtodo queue */
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"info")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "info")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1;
- if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"mess")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "mess")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
- if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,-1,0644)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, -1, 0644)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"remote")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "remote")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1;
- if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"local")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "local")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1;
- if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"intd")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "intd")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0700,'d',0)) return -1;
- if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0700,qmail_gid,0600)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0700, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"todo")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "todo")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
- if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,-1,0644)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, -1, 0644)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"dkim")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "dkim")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
- if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,qmail_gid,0644)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1;
+ if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, qmail_gid, 0644)) return -1;
/*check the others*/
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"bounce")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "bounce")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1;
- if (check_files(check_dir.s,qmails_uid,qmail_gid,0600)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1;
+ if (check_files(check_dir.s, qmails_uid, qmail_gid, 0600)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"pid")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "pid")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0700,'d',0)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0700, 'd', 0)) return -1;
warn_files(check_dir.s);
/*lock has special files that must exist*/
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"lock")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "lock")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1;
+ if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"lock/sendmutex")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "lock/sendmutex")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0600,'z',0)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0600, 'z', 0)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"lock/tcpto")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "lock/tcpto")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmailr_uid,qmail_gid,0644,'z',1024)) return -1;
+ if (check_item(check_dir.s, qmailr_uid, qmail_gid, 0644, 'z', 1024)) return -1;
- if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem();
- if (!stralloc_cats(&check_dir,"lock/trigger")) die_nomem();
+ if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem();
+ if (!stralloc_cats(&check_dir, "lock/trigger")) die_nomem();
if (!stralloc_0(&check_dir)) die_nomem();
- if (check_item(check_dir.s,qmails_uid,qmail_gid,0622,'p',0)) return -1;
+ if (check_item(check_dir.s, qmails_uid, qmail_gid, 0622, 'p', 0)) return -1;
return 0;
}
@@ -482,31 +587,52 @@ int check_dirs()
stralloc fn = {0};
-void fnmake_init() { while (!stralloc_ready(&fn,FMTQFN)) die_nomem(); }
-void fnmake_local(unsigned long id) { fn.len = fmtqfn(fn.s,"local/",id,1); }
-void fnmake_remote(unsigned long id) { fn.len = fmtqfn(fn.s,"remote/",id,1); }
-void fnmake_mess(unsigned long id) { fn.len = fmtqfn(fn.s,"mess/",id,1); }
-void fnmake_dkim(unsigned long id) { fn.len = fmtqfn(fn.s,"dkim/",id,1); }
-void fnmake_info(unsigned long id) { fn.len = fmtqfn(fn.s,"info/",id,1); }
-void fnmake_bounce(unsigned long id) { fn.len = fmtqfn(fn.s,"bounce/",id,0); }
+void fnmake_init()
+{
+ while (!stralloc_ready(&fn, FMTQFN)) die_nomem();
+}
+void fnmake_local(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "local/", id, 1);
+}
+void fnmake_remote(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "remote/", id, 1);
+}
+void fnmake_mess(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "mess/", id, 1);
+}
+void fnmake_dkim(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "dkim/", id, 1);
+}
+void fnmake_info(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "info/", id, 1);
+}
+void fnmake_bounce(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "bounce/", id, 0);
+}
void warn_unlink(unsigned long id)
{
- char foo[FMT_ULONG];
- foo[fmt_ulong(foo,id)] = 0;
- logmsg(WHO,99,WARN,B("no such file to unlink #",foo));
+ char foo[FMT_ULONG];
+ foo[fmt_ulong(foo, id)] = 0;
+ logmsg(WHO, 99, WARN, B("no such file to unlink #", foo));
}
void err_unlink(unsigned long id)
{
- char foo[FMT_ULONG];
- foo[fmt_ulong(foo,id)] = 0;
- logmsg(WHO,100,ERROR,B("trouble with unlinking #",foo));
+ char foo[FMT_ULONG];
+ foo[fmt_ulong(foo, id)] = 0;
+ logmsg(WHO, 100, ERROR, B("trouble with unlinking #", foo));
}
void err_chdir()
{
- logmsg(WHO,110,FATAL,"unable to chdir");
+ logmsg(WHO, 110, FATAL, "unable to chdir");
}
int delete_msg(unsigned long id)
@@ -514,38 +640,43 @@ int delete_msg(unsigned long id)
struct stat st;
int bounce = 1;
- if (chdir(auto_qmail) == -1) err_chdir();
- if (chdir("queue") == -1) err_chdir();
+ if (chdir(auto_qmail) == -1) err_chdir();
+ if (chdir("queue") == -1) err_chdir();
fnmake_init();
fnmake_mess(id); // regular message pre-processed
- if (stat(fn.s,&st) == -1) err_unlink(id);
- else bounce = 0;
- if (!bounce && unlink(fn.s) == -1)
+ if (stat(fn.s, &st) == -1)
+ err_unlink(id);
+ else
+ bounce = 0;
+ if (!bounce && unlink(fn.s) == -1)
if (errno != ENOENT) err_unlink(id);
fnmake_info(id); // not delivered yet
- if (!stat(fn.s,&st))
- if (unlink(fn.s) == -1)
+ if (!stat(fn.s, &st))
+ if (unlink(fn.s) == -1)
if (errno != ENOENT) err_unlink(id);
-
+
if (bounce) {
fnmake_bounce(id);
- if (!stat(fn.s,&st)) { warn_unlink(id); return 1; }
- if (unlink(fn.s) == -1)
- if (errno != ENOENT) err_unlink(id);
+ if (!stat(fn.s, &st)) {
+ warn_unlink(id);
+ return 1;
+ }
+ if (unlink(fn.s) == -1)
+ if (errno != ENOENT) err_unlink(id);
}
fnmake_remote(id);
- if (!stat(fn.s,&st))
- if (unlink(fn.s) == -1)
- if (errno != ENOENT) err_unlink(id);
-
+ if (!stat(fn.s, &st))
+ if (unlink(fn.s) == -1)
+ if (errno != ENOENT) err_unlink(id);
+
fnmake_local(id);
- if (!stat(fn.s,&st))
- if (unlink(fn.s) == -1)
- if (errno != ENOENT) err_unlink(id);
-
+ if (!stat(fn.s, &st))
+ if (unlink(fn.s) == -1)
+ if (errno != ENOENT) err_unlink(id);
+
return 0;
}
@@ -555,20 +686,20 @@ int main(int argc, char **argv)
unsigned long id = 0;
if (argc > 1) {
- if (!str_diff(argv[1],"-i")) {
+ if (!str_diff(argv[1], "-i")) {
flag_interactive = 1;
- } else if (!str_diff(argv[1],"-d")) {
- if (!argv[2]) logmsg(WHO,111,USAGE,"qmail-qmaint [-i] || [-d messid]");
+ } else if (!str_diff(argv[1], "-d")) {
+ if (!argv[2]) logmsg(WHO, 111, USAGE, "qmail-qmaint [-i] || [-d messid]");
mess = argv[2];
flag_delete = 1;
- scan_ulong(mess,&id);
+ scan_ulong(mess, &id);
}
}
- if (!stralloc_copys(&queue_dir,auto_qmail)) die_nomem();
- if (!stralloc_cats(&queue_dir,"/queue/")) die_nomem();
+ if (!stralloc_copys(&queue_dir, auto_qmail)) die_nomem();
+ if (!stralloc_cats(&queue_dir, "/queue/")) die_nomem();
- logmsg(WHO,0,INFO,B("Checking s/qmail queue at: ",auto_qmail,"/queue/"));
+ logmsg(WHO, 0, INFO, B("Checking s/qmail queue at: ", auto_qmail, "/queue/"));
/* get constants */
@@ -583,12 +714,11 @@ int main(int argc, char **argv)
if (check_dirs()) die_check();
if (flag_delete) {
- if (!delete_msg(id))
- logmsg(WHO,0,INFO,B("file ",mess," from queue deleted."));
- } else
- if (fix_names()) die_check();
-
- logmsg(WHO,0,INFO,"done.");
-
- _exit (0);
+ if (!delete_msg(id)) logmsg(WHO, 0, INFO, B("file ", mess, " from queue deleted."));
+ } else if (fix_names())
+ die_check();
+
+ logmsg(WHO, 0, INFO, "done.");
+
+ _exit(0);
}
diff --git a/src/qmail-qmqpc.c b/src/qmail-qmqpc.c
index c92e072..2bbfdfe 100644
--- a/src/qmail-qmqpc.c
+++ b/src/qmail-qmqpc.c
@@ -1,61 +1,94 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
#include "buffer.h"
-#include "getln.h"
#include "exit.h"
-#include "stralloc.h"
-#include "readclose.h"
-#include "timeoutconn.h"
+#include "fmt.h"
+#include "getln.h"
+#include "ip.h"
#include "logmsg.h"
-#include "str.h"
+#include "readclose.h"
#include "sig.h"
-#include "ip.h"
+#include "socket_if.h"
+#include "str.h"
+#include "stralloc.h"
#include "timeout.h"
+#include "timeoutconn.h"
+#include "uint_t.h"
+
#include "auto_qmail.h"
#include "control.h"
-#include "fmt.h"
-#include "uint_t.h"
-#include "socket_if.h"
#define PORT_QMQP 628
-void die_success() { _exit(0); }
-void die_perm() { _exit(31); }
-void nomem() { _exit(51); }
-void die_read() { if (errno == ENOMEM) nomem(); _exit(54); }
-void die_control() { _exit(55); }
-void die_socket() { _exit(56); }
-void die_home() { _exit(61); }
-void die_temp() { _exit(71); }
-void die_conn() { _exit(74); }
-void die_format() { _exit(91); }
+void die_success()
+{
+ _exit(0);
+}
+void die_perm()
+{
+ _exit(31);
+}
+void nomem()
+{
+ _exit(51);
+}
+void die_read()
+{
+ if (errno == ENOMEM) nomem();
+ _exit(54);
+}
+void die_control()
+{
+ _exit(55);
+}
+void die_socket()
+{
+ _exit(56);
+}
+void die_home()
+{
+ _exit(61);
+}
+void die_temp()
+{
+ _exit(71);
+}
+void die_conn()
+{
+ _exit(74);
+}
+void die_format()
+{
+ _exit(91);
+}
int lasterror = 55;
int qmqpfd;
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
- r = timeoutread(60,qmqpfd,buf,len);
+ r = timeoutread(60, qmqpfd, buf, len);
if (r <= 0) die_conn();
return r;
}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = timeoutwrite(60,qmqpfd,buf,len);
+ r = timeoutwrite(60, qmqpfd, buf, len);
if (r <= 0) die_conn();
return r;
}
char buf[1024];
-buffer bo = BUFFER_INIT(safewrite,-1,buf,sizeof(buf));
-buffer bi = BUFFER_INIT(saferead,-1,buf,sizeof(buf));
-buffer be = BUFFER_INIT(read,1,buf,sizeof(buf)); // envelope
+buffer bo = BUFFER_INIT(safewrite, -1, buf, sizeof(buf));
+buffer bi = BUFFER_INIT(saferead, -1, buf, sizeof(buf));
+buffer be = BUFFER_INIT(read, 1, buf, sizeof(buf)); // envelope
/* WARNING: can use only one of these at a time! */
stralloc beforemessage = {0};
@@ -69,35 +102,35 @@ void getmess()
{
int match;
- if (readclose_append(0,&message,1024) == -1) die_read();
+ if (readclose_append(0, &message, 1024) == -1) die_read();
- strnum[fmt_ulong(strnum,(unsigned long) message.len)] = 0;
- if (!stralloc_copys(&beforemessage,strnum)) nomem();
- if (!stralloc_cats(&beforemessage,":")) nomem();
- if (!stralloc_copys(&aftermessage,",")) nomem();
+ strnum[fmt_ulong(strnum, (unsigned long)message.len)] = 0;
+ if (!stralloc_copys(&beforemessage, strnum)) nomem();
+ if (!stralloc_cats(&beforemessage, ":")) nomem();
+ if (!stralloc_copys(&aftermessage, ",")) nomem();
- if (getln(&be,&line,&match,'\0') == -1) die_read();
+ if (getln(&be, &line, &match, '\0') == -1) die_read();
if (!match) die_format();
if (line.len < 2) die_format();
if (line.s[0] != 'F') die_format();
- strnum[fmt_ulong(strnum,(unsigned long) line.len - 2)] = 0;
- if (!stralloc_cats(&aftermessage,strnum)) nomem();
- if (!stralloc_cats(&aftermessage,":")) nomem();
- if (!stralloc_catb(&aftermessage,line.s + 1,line.len - 2)) nomem();
- if (!stralloc_cats(&aftermessage,",")) nomem();
+ strnum[fmt_ulong(strnum, (unsigned long)line.len - 2)] = 0;
+ if (!stralloc_cats(&aftermessage, strnum)) nomem();
+ if (!stralloc_cats(&aftermessage, ":")) nomem();
+ if (!stralloc_catb(&aftermessage, line.s + 1, line.len - 2)) nomem();
+ if (!stralloc_cats(&aftermessage, ",")) nomem();
for (;;) {
- if (getln(&be,&line,&match,'\0') == -1) die_read();
+ if (getln(&be, &line, &match, '\0') == -1) die_read();
if (!match) die_format();
if (line.len < 2) break;
if (line.s[0] != 'T') die_format();
- strnum[fmt_ulong(strnum,(unsigned long) line.len - 2)] = 0;
- if (!stralloc_cats(&aftermessage,strnum)) nomem();
- if (!stralloc_cats(&aftermessage,":")) nomem();
- if (!stralloc_catb(&aftermessage,line.s + 1,line.len - 2)) nomem();
- if (!stralloc_cats(&aftermessage,",")) nomem();
+ strnum[fmt_ulong(strnum, (unsigned long)line.len - 2)] = 0;
+ if (!stralloc_cats(&aftermessage, strnum)) nomem();
+ if (!stralloc_cats(&aftermessage, ":")) nomem();
+ if (!stralloc_catb(&aftermessage, line.s + 1, line.len - 2)) nomem();
+ if (!stralloc_cats(&aftermessage, ",")) nomem();
}
}
@@ -110,23 +143,23 @@ void doit(char *server)
char ch;
int i, j, r;
- i = str_chr(server,':');
+ i = str_chr(server, ':');
if (server[i] == ':') {
- j = str_chr(server,'%'); /* IF index */
+ j = str_chr(server, '%'); /* IF index */
if (server[j] == '%') {
server[j] = 0;
netif = &server[j + 1];
ifidx = socket_getifidx(netif);
- }
- if (!ip6_scan(server,(char *)&ip6s.d)) return;
- qmqpfd = socket(AF_INET6,SOCK_STREAM,0);
+ }
+ if (!ip6_scan(server, (char *)&ip6s.d)) return;
+ qmqpfd = socket(AF_INET6, SOCK_STREAM, 0);
if (qmqpfd == -1) die_socket();
- r = timeoutconn6(qmqpfd,(char *)&ip6s.d,PORT_QMQP,10,ifidx);
+ r = timeoutconn6(qmqpfd, (char *)&ip6s.d, PORT_QMQP, 10, ifidx);
} else {
- if (!ip4_scan(server,(char *)&ip4s.d)) return;
- qmqpfd = socket(AF_INET,SOCK_STREAM,0);
+ if (!ip4_scan(server, (char *)&ip4s.d)) return;
+ qmqpfd = socket(AF_INET, SOCK_STREAM, 0);
if (qmqpfd == -1) die_socket();
- r = timeoutconn4(qmqpfd,(char *)&ip4s.d,PORT_QMQP,10);
+ r = timeoutconn4(qmqpfd, (char *)&ip4s.d, PORT_QMQP, 10);
}
if (r != 0) {
lasterror = 73;
@@ -135,17 +168,17 @@ void doit(char *server)
return;
}
- strnum[fmt_ulong(strnum,(unsigned long) (beforemessage.len + message.len + aftermessage.len))] = 0;
- buffer_puts(&bo,strnum);
- buffer_puts(&bo,":");
- buffer_put(&bo,beforemessage.s,beforemessage.len);
- buffer_put(&bo,message.s,message.len);
- buffer_put(&bo,aftermessage.s,aftermessage.len);
- buffer_puts(&bo,",");
+ strnum[fmt_ulong(strnum, (unsigned long)(beforemessage.len + message.len + aftermessage.len))] = 0;
+ buffer_puts(&bo, strnum);
+ buffer_puts(&bo, ":");
+ buffer_put(&bo, beforemessage.s, beforemessage.len);
+ buffer_put(&bo, message.s, message.len);
+ buffer_put(&bo, aftermessage.s, aftermessage.len);
+ buffer_puts(&bo, ",");
buffer_flush(&bo);
for (;;) {
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
if (ch == 'K') die_success();
if (ch == 'Z') die_temp();
if (ch == 'D') die_perm();
@@ -163,7 +196,7 @@ int main()
if (chdir(auto_qmail) == -1) die_home();
if (control_init() == -1) die_control();
- if (control_readfile(&servers,"control/qmqpservers",0) != 1) die_control();
+ if (control_readfile(&servers, "control/qmqpservers", 0) != 1) die_control();
getmess();
diff --git a/src/qmail-qmqpd.c b/src/qmail-qmqpd.c
index 86404a9..b949338 100644
--- a/src/qmail-qmqpd.c
+++ b/src/qmail-qmqpd.c
@@ -1,49 +1,54 @@
#include <unistd.h>
-#include "auto_qmail.h"
-#include "qmail.h"
-#include "received.h"
-#include "sig.h"
+
#include "buffer.h"
+#include "byte.h"
+#include "case.h"
+#include "env.h"
#include "exit.h"
-#include "now.h"
#include "fmt.h"
-#include "env.h"
-#include "case.h"
-#include "byte.h"
#include "ip.h"
+#include "sig.h"
#include "str.h"
+#include "auto_qmail.h"
+#include "now.h"
+#include "qmail.h"
+#include "received.h"
+
#define PORT_QMQP "628"
-void resources() { _exit(111); }
+void resources()
+{
+ _exit(111);
+}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = write(fd,buf,len);
+ r = write(fd, buf, len);
if (r <= 0) _exit(0);
return r;
}
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
- r = read(fd,buf,len);
+ r = read(fd, buf, len);
if (r <= 0) _exit(0);
return r;
}
char inbuf[512];
-buffer bi = BUFFER_INIT(saferead,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(saferead, 0, inbuf, sizeof(inbuf));
char outbuf[256];
-buffer bo = BUFFER_INIT(safewrite,1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, 1, outbuf, sizeof(outbuf));
unsigned long bytesleft = 100;
void getbyte(char *ch)
{
if (!bytesleft--) _exit(100);
- buffer_get(&bi,ch,1);
+ buffer_get(&bi, ch, 1);
}
unsigned long getlen()
@@ -82,7 +87,7 @@ void identify()
remoteinfo = env_get("TCP6REMOTEINFO");
if (!remoteinfo) remoteinfo = env_get("TCPREMOTEINFO");
remoteip = env_get("TCP6REMOTEIP");
- if (remoteip && byte_equal(remoteip,7,V4MAPPREFIX)) remoteip=remoteip+7;
+ if (remoteip && byte_equal(remoteip, 7, V4MAPPREFIX)) remoteip = remoteip + 7;
if (!remoteip) remoteip = env_get("TCPREMOTEIP");
if (!remoteip) remoteip = "unknown";
local = env_get("TCP6LOCALHOST");
@@ -91,10 +96,10 @@ void identify()
if (!local) local = env_get("TCPLOCALIP");
if (!local) local = "unknown";
localport = env_get("TCP6LOCALPORT");
- if (!localport) localport = env_get("TCPLOCALPORT");
+ if (!localport) localport = env_get("TCPLOCALPORT");
if (!localport) localport = "0";
- received(&qq,"QMQP",local,remoteip,remotehost,remoteinfo,(char *) 0,(char *) 0,(char *) 0);
+ received(&qq, "QMQP", local, remoteip, remotehost, remoteinfo, (char *)0, (char *)0, (char *)0);
}
char buf[1000];
@@ -116,7 +121,7 @@ int getbuf()
for (i = 0; i < len; ++i) getbyte(buf + i);
getcomma();
buf[len] = 0;
- return byte_chr(buf,len,'\0') == len;
+ return byte_chr(buf, len, '\0') == len;
}
int flagok = 1;
@@ -144,21 +149,21 @@ int main()
while (len > 0) { /* XXX: could speed this up */
getbyte(&ch);
--len;
- qmail_put(&qq,&ch,1);
+ qmail_put(&qq, &ch, 1);
}
getcomma();
if (getbuf())
- qmail_from(&qq,buf);
+ qmail_from(&qq, buf);
else {
- qmail_from(&qq,"");
+ qmail_from(&qq, "");
qmail_fail(&qq);
flagok = 0;
}
while (bytesleft)
if (getbuf())
- qmail_to(&qq,buf);
+ qmail_to(&qq, buf);
else {
qmail_fail(&qq);
flagok = 0;
@@ -170,21 +175,20 @@ int main()
result = qmail_close(&qq);
if (!*result) {
- len = fmt_str(buf,"Kok ");
- len += fmt_ulong(buf + len,(unsigned long) now());
- len += fmt_str(buf + len," qp ");
- len += fmt_ulong(buf + len,qp);
+ len = fmt_str(buf, "Kok ");
+ len += fmt_ulong(buf + len, (unsigned long)now());
+ len += fmt_str(buf + len, " qp ");
+ len += fmt_ulong(buf + len, qp);
buf[len] = 0;
result = buf;
}
- if (!flagok)
- result = "Dsorry, I can't accept addresses like that (#5.1.3)";
+ if (!flagok) result = "Dsorry, I can't accept addresses like that (#5.1.3)";
- buffer_put(&bo,strnum,fmt_ulong(strnum,(unsigned long) str_len(result)));
- buffer_puts(&bo,":");
- buffer_puts(&bo,result);
- buffer_puts(&bo,",");
+ buffer_put(&bo, strnum, fmt_ulong(strnum, (unsigned long)str_len(result)));
+ buffer_puts(&bo, ":");
+ buffer_puts(&bo, result);
+ buffer_puts(&bo, ",");
buffer_flush(&bo);
_exit(0);
}
diff --git a/src/qmail-qmtpd.c b/src/qmail-qmtpd.c
index fbe998b..8ae81e0 100644
--- a/src/qmail-qmtpd.c
+++ b/src/qmail-qmtpd.c
@@ -1,60 +1,68 @@
#include <unistd.h>
-#include "stralloc.h"
+
#include "buffer.h"
-#include "qmail.h"
-#include "now.h"
-#include "str.h"
-#include "fmt.h"
-#include "env.h"
-#include "sig.h"
+#include "byte.h"
#include "case.h"
+#include "env.h"
#include "exit.h"
+#include "fmt.h"
+#include "ip.h"
#include "scan.h"
-#include "rcpthosts.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
#include "control.h"
+#include "now.h"
+#include "qmail.h"
+#include "rcpthosts.h"
#include "received.h"
-#include "ip.h"
-#include "byte.h"
-#define PORT_QMTP "209"
+#define PORT_QMTP "209"
#define PORT_QMTPS "6209"
/** @file qmail-qmtpd.c -- QMTP/QMTPS server
@brief requires sslserver */
-void badproto() { _exit(100); }
-void resources() { _exit(111); }
+void badproto()
+{
+ _exit(100);
+}
+void resources()
+{
+ _exit(111);
+}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = write(fd,buf,len);
+ r = write(fd, buf, len);
if (r <= 0) _exit(0);
return r;
}
char outbuf[256];
-buffer bo = BUFFER_INIT(safewrite,1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, 1, outbuf, sizeof(outbuf));
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
buffer_flush(&bo);
- r = read(fd,buf,len);
+ r = read(fd, buf, len);
if (r <= 0) _exit(0);
return r;
}
char inbuf[512];
-buffer bi = BUFFER_INIT(saferead,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(saferead, 0, inbuf, sizeof(inbuf));
unsigned long getlen()
{
unsigned long len = 0;
char ch;
for (;;) {
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
if (ch == ':') return len;
if (ch < '0' || ch > '9') resources();
if (len > 200000000) resources();
@@ -65,7 +73,7 @@ unsigned long getlen()
void getcomma()
{
char ch;
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
if (ch != ',') badproto();
}
@@ -113,30 +121,31 @@ int modssl_info()
cipherused = env_get("SSL_CIPHER_USEKEYSIZE");
if (!cipherused) cipherused = "unknown";
clientdn = env_get("SSL_CLIENT_S_DN");
- if (clientdn) seentls = 2;
+ if (clientdn)
+ seentls = 2;
else
clientdn = "none";
- if (!stralloc_copys(&tlsinfo,tlsversion)) resources();
- if (!stralloc_cats(&tlsinfo,": ")) resources();
- if (!stralloc_cats(&tlsinfo,cipher)) resources();
- if (!stralloc_cats(&tlsinfo," [")) resources();
- if (!stralloc_cats(&tlsinfo,cipherused)) resources();
- if (!stralloc_cats(&tlsinfo,"/")) resources();
- if (!stralloc_cats(&tlsinfo,cipherperm)) resources();
- if (!stralloc_cats(&tlsinfo,"] \n")) resources();
- if (!stralloc_cats(&tlsinfo," DN=")) resources();
- if (!stralloc_cats(&tlsinfo,clientdn)) resources();
+ if (!stralloc_copys(&tlsinfo, tlsversion)) resources();
+ if (!stralloc_cats(&tlsinfo, ": ")) resources();
+ if (!stralloc_cats(&tlsinfo, cipher)) resources();
+ if (!stralloc_cats(&tlsinfo, " [")) resources();
+ if (!stralloc_cats(&tlsinfo, cipherused)) resources();
+ if (!stralloc_cats(&tlsinfo, "/")) resources();
+ if (!stralloc_cats(&tlsinfo, cipherperm)) resources();
+ if (!stralloc_cats(&tlsinfo, "] \n")) resources();
+ if (!stralloc_cats(&tlsinfo, " DN=")) resources();
+ if (!stralloc_cats(&tlsinfo, clientdn)) resources();
if (!stralloc_0(&tlsinfo)) resources();
- if (!stralloc_append(&protocol,"S")) resources();
+ if (!stralloc_append(&protocol, "S")) resources();
if (seentls == 2) {
clientcn = env_get("SSL_CLIENT_S_DN_CN");
- remoteinfo = clientcn ? clientcn : clientdn;
+ remoteinfo = clientcn ? clientcn : clientdn;
dnemail = env_get("SSL_CLIENT_S_DN_Email");
if (!dnemail) dnemail = "unknown";
- if (!stralloc_append(&protocol,"A")) resources();
+ if (!stralloc_append(&protocol, "A")) resources();
relayclient = "";
}
return 1;
@@ -155,21 +164,24 @@ int main()
char *result;
char *x;
unsigned long u;
-
+
sig_pipeignore();
sig_alarmcatch(resources);
alarm(3600);
-
+
if (chdir(auto_qmail) == -1) resources();
-
+
if (control_init() == -1) resources();
if (rcpthosts_init() == -1) resources();
- if (control_readint(&databytes,"control/databytes") == -1) resources();
+ if (control_readint(&databytes, "control/databytes") == -1) resources();
x = env_get("DATABYTES");
- if (x) { scan_ulong(x,&u); databytes = u; }
+ if (x) {
+ scan_ulong(x, &u);
+ databytes = u;
+ }
if (!(databytes + 1)) --databytes;
-
+
relayclient = env_get("RELAYCLIENT");
remotehost = env_get("TCP6REMOTEHOST");
if (!remotehost) remotehost = env_get("TCPREMOTEHOST");
@@ -178,7 +190,7 @@ int main()
if (!remoteinfo) remoteinfo = env_get("TCPREMOTEINFO");
remoteip = env_get("TCP6REMOTEIP");
if (!remoteip) remoteip = env_get("TCPREMOTEIP");
- if (remoteip && byte_equal(remoteip,7,V4MAPPREFIX)) remoteip = remoteip + 7;
+ if (remoteip && byte_equal(remoteip, 7, V4MAPPREFIX)) remoteip = remoteip + 7;
if (!remoteip) remoteip = "unknown";
local = env_get("TCP6LOCALHOST");
if (!local) local = env_get("TCPLOCALHOST");
@@ -186,52 +198,56 @@ int main()
if (!local) local = env_get("TCPLOCALIP");
if (!local) local = "unknown";
localport = env_get("TCP6LOCALPORT");
- if (!localport) localport = env_get("TCPLOCALPORT");
+ if (!localport) localport = env_get("TCPLOCALPORT");
if (!localport) localport = "0";
-
- if (!stralloc_copys(&protocol,"QMTP")) resources();
- if (!case_diffs(localport,PORT_QMTPS))
+
+ if (!stralloc_copys(&protocol, "QMTP")) resources();
+ if (!case_diffs(localport, PORT_QMTPS))
if (!modssl_info()) resources();
- if (relayclient)
- relayclientlen = str_len(relayclient);
-
+ if (relayclient) relayclientlen = str_len(relayclient);
+
for (;;) {
- if (!stralloc_copys(&failure,"")) resources();
+ if (!stralloc_copys(&failure, "")) resources();
flagsenderok = 1;
-
+
len = getlen();
if (len == 0) badproto();
-
+
if (databytes) bytestooverflow = databytes + 1;
if (qmail_open(&qq) == -1) resources();
qp = qmail_qp(&qq);
-
- buffer_get(&bi,&ch,1);
+
+ buffer_get(&bi, &ch, 1);
--len;
- if (ch == 10) flagdos = 0;
- else if (ch == 13) flagdos = 1;
- else badproto();
+ if (ch == 10)
+ flagdos = 0;
+ else if (ch == 13)
+ flagdos = 1;
+ else
+ badproto();
/* no fakehelo, no spfinfo */
-
- received(&qq,protocol.s,local,remoteip,remotehost,remoteinfo,(char *) 0,tlsinfo.s,(char *) 0);
-
+
+ received(&qq, protocol.s, local, remoteip, remotehost, remoteinfo, (char *)0, tlsinfo.s, (char *)0);
+
/* XXX: check for loops? only if len is big? */
-
+
if (flagdos)
while (len > 0) {
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
--len;
while ((ch == 13) && len) {
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
--len;
if (ch == 10) break;
- if (bytestooverflow) if (!--bytestooverflow) qmail_fail(&qq);
- qmail_put(&qq,"\015",1);
+ if (bytestooverflow)
+ if (!--bytestooverflow) qmail_fail(&qq);
+ qmail_put(&qq, "\015", 1);
}
- if (bytestooverflow) if (!--bytestooverflow) qmail_fail(&qq);
- qmail_put(&qq,&ch,1);
+ if (bytestooverflow)
+ if (!--bytestooverflow) qmail_fail(&qq);
+ qmail_put(&qq, &ch, 1);
}
else {
if (databytes)
@@ -240,42 +256,40 @@ int main()
qmail_fail(&qq);
}
while (len > 0) { /* XXX: could speed this up, obviously */
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
--len;
- qmail_put(&qq,&ch,1);
+ qmail_put(&qq, &ch, 1);
}
}
getcomma();
-
+
len = getlen();
-
+
if (len >= 1000) {
buf[0] = 0;
flagsenderok = 0;
- for (i = 0; i < len; ++i)
- buffer_get(&bi,&ch,1);
- }
- else {
+ for (i = 0; i < len; ++i) buffer_get(&bi, &ch, 1);
+ } else {
for (i = 0; i < len; ++i) {
- buffer_get(&bi,buf + i,1);
+ buffer_get(&bi, buf + i, 1);
if (!buf[i]) flagsenderok = 0;
}
buf[len] = 0;
}
getcomma();
-
+
flagbother = 0;
- qmail_from(&qq,buf);
+ qmail_from(&qq, buf);
if (!flagsenderok) qmail_fail(&qq);
-
+
biglen = getlen();
while (biglen > 0) {
- if (!stralloc_append(&failure,"")) resources();
-
+ if (!stralloc_append(&failure, "")) resources();
+
len = 0;
for (;;) {
if (!biglen) badproto();
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
--biglen;
if (ch == ':') break;
if (ch < '0' || ch > '9') resources();
@@ -285,26 +299,23 @@ int main()
if (len >= biglen) badproto();
if (len + relayclientlen >= 1000) {
failure.s[failure.len - 1] = 'L';
- for (i = 0; i < len; ++i)
- buffer_get(&bi,&ch,1);
- }
- else {
+ for (i = 0; i < len; ++i) buffer_get(&bi, &ch, 1);
+ } else {
for (i = 0; i < len; ++i) {
- buffer_get(&bi,buf + i,1);
+ buffer_get(&bi, buf + i, 1);
if (!buf[i]) failure.s[failure.len - 1] = 'N';
}
buf[len] = 0;
-
- if (relayclientlen)
- str_copy(buf + len,relayclient);
- if (!relayclient)
- switch (rcpthosts(buf,len)) {
+
+ if (relayclientlen) str_copy(buf + len, relayclient);
+ if (!relayclient) switch (rcpthosts(buf, len))
+ {
case -1: resources();
- case 0: failure.s[failure.len - 1] = 'D';
+ case 0: failure.s[failure.len - 1] = 'D';
}
-
+
if (!failure.s[failure.len - 1]) {
- qmail_to(&qq,buf);
+ qmail_to(&qq, buf);
flagbother = 1;
}
}
@@ -312,43 +323,40 @@ int main()
biglen -= (len + 1);
}
getcomma();
-
+
if (!flagbother) qmail_fail(&qq);
result = qmail_close(&qq);
if (!flagsenderok) result = "D Unacceptable sender (#5.1.7)";
- if (databytes) if (!bytestooverflow) result = "D Sorry, that message size exceeds my databytes limit (#5.3.4)";
-
+ if (databytes)
+ if (!bytestooverflow) result = "D Sorry, that message size exceeds my databytes limit (#5.3.4)";
+
if (*result)
len = str_len(result);
else {
/* success! */
len = 0;
- len += fmt_str(buf2 + len,"K Ok ");
- len += fmt_ulong(buf2 + len,(unsigned long) now());
- len += fmt_str(buf2 + len," qp ");
- len += fmt_ulong(buf2 + len,qp);
+ len += fmt_str(buf2 + len, "K Ok ");
+ len += fmt_ulong(buf2 + len, (unsigned long)now());
+ len += fmt_str(buf2 + len, " qp ");
+ len += fmt_ulong(buf2 + len, qp);
buf2[len] = 0;
result = buf2;
}
-
- len = fmt_ulong(buf,len);
+
+ len = fmt_ulong(buf, len);
buf[len++] = ':';
- len += fmt_str(buf + len,result);
+ len += fmt_str(buf + len, result);
buf[len++] = ',';
-
- for (i = 0; i < failure.len; ++i)
- switch (failure.s[i]) {
- case 0:
- buffer_put(&bo,buf,len);
- break;
+
+ for (i = 0; i < failure.len; ++i) switch (failure.s[i])
+ {
+ case 0: buffer_put(&bo, buf, len); break;
case 'D':
- buffer_puts(&bo,"66:D Sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1),");
- break;
- default:
- buffer_puts(&bo,"46:D Sorry, I can't handle that recipient (#5.1.3),");
+ buffer_puts(&bo, "66:D Sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1),");
break;
+ default: buffer_puts(&bo, "46:D Sorry, I can't handle that recipient (#5.1.3),"); break;
}
-
+
/* bo will be flushed when we read from the network again */
}
}
diff --git a/src/qmail-qread.c b/src/qmail-qread.c
index 888c14a..039af0c 100644
--- a/src/qmail-qread.c
+++ b/src/qmail-qread.c
@@ -1,43 +1,61 @@
-#include <unistd.h>
-#include <sys/types.h>
#include <sys/stat.h>
-#include "stralloc.h"
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "error.h"
+#include "exit.h"
#include "fmt.h"
-#include "str.h"
#include "getln.h"
-#include "fmtqfn.h"
-#include "readsubdir.h"
-#include "auto_qmail.h"
#include "open.h"
-#include "datetime.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
#include "date822fmt.h"
-#include "error.h"
-#include "exit.h"
+#include "datetime.h"
+#include "fmtqfn.h"
+#include "readsubdir.h"
readsubdir rs;
-void die(int n) { buffer_flush(buffer_1); _exit(n); }
+void die(int n)
+{
+ buffer_flush(buffer_1);
+ _exit(n);
+}
-void warn(char *s1,char *s2)
+void warn(char *s1, char *s2)
{
- char *x;
- x = error_str(errno);
- buffer_puts(buffer_1,s1);
- buffer_puts(buffer_1,s2);
- buffer_puts(buffer_1,": ");
- buffer_puts(buffer_1,x);
- buffer_puts(buffer_1,"\n");
+ char *x;
+ x = error_str(errno);
+ buffer_puts(buffer_1, s1);
+ buffer_puts(buffer_1, s2);
+ buffer_puts(buffer_1, ": ");
+ buffer_puts(buffer_1, x);
+ buffer_puts(buffer_1, "\n");
}
-void die_nomem() { buffer_puts(buffer_1,"fatal: out of memory\n"); die(111); }
-void die_chdir() { warn("fatal: unable to chdir",""); die(110); }
-void die_opendir(fn) char *fn; { warn("fatal: unable to opendir ",fn); die(110); }
+void die_nomem()
+{
+ buffer_puts(buffer_1, "fatal: out of memory\n");
+ die(111);
+}
+void die_chdir()
+{
+ warn("fatal: unable to chdir", "");
+ die(110);
+}
+void die_opendir(fn) char *fn;
+{
+ warn("fatal: unable to opendir ", fn);
+ die(110);
+}
void err(unsigned long id)
{
- char foo[FMT_ULONG];
- foo[fmt_ulong(foo,id)] = 0;
- warn("warning: trouble with #",foo);
+ char foo[FMT_ULONG];
+ foo[fmt_ulong(foo, id)] = 0;
+ warn("warning: trouble with #", foo);
}
char fnmess[FMTQFN];
@@ -61,40 +79,64 @@ unsigned int fmtstats(char *s)
unsigned int i;
len = 0;
- datetime_tai(&dt,qtime);
- i = date822fmt(s,&dt) - 7/*XXX*/; len += i; if (s) s += i;
- i = fmt_str(s," GMT #"); len += i; if (s) s += i;
- i = fmt_ulong(s,id); len += i; if (s) s += i;
- i = fmt_str(s," "); len += i; if (s) s += i;
- i = fmt_ulong(s,size); len += i; if (s) s += i;
- i = fmt_str(s," <"); len += i; if (s) s += i;
- i = fmt_str(s,sender.s + 1); len += i; if (s) s += i;
- i = fmt_str(s,"> "); len += i; if (s) s += i;
+ datetime_tai(&dt, qtime);
+ i = date822fmt(s, &dt) - 7 /*XXX*/;
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " GMT #");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, id);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " ");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, size);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " <");
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, sender.s + 1);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, "> ");
+ len += i;
+ if (s) s += i;
if (flagbounce) {
- i = fmt_str(s," bouncing"); len += i; if (s) s += i;
+ i = fmt_str(s, " bouncing");
+ len += i;
+ if (s) s += i;
}
- return len;
+ return len;
}
stralloc stats = {0};
-void out(char *s,unsigned int n)
+void out(char *s, unsigned int n)
{
while (n > 0) {
- buffer_put(buffer_1,((*s >= 32) && (*s <= 126)) ? s : "_",1);
+ buffer_put(buffer_1, ((*s >= 32) && (*s <= 126)) ? s : "_", 1);
--n;
++s;
}
}
-void outs(char *s) { out(s,str_len(s)); }
-void outok(char *s) { buffer_puts(buffer_1,s); }
+void outs(char *s)
+{
+ out(s, str_len(s));
+}
+void outok(char *s)
+{
+ buffer_puts(buffer_1, s);
+}
void putstats()
{
- if (!stralloc_ready(&stats,fmtstats(FMT_LEN))) die_nomem();
+ if (!stralloc_ready(&stats, fmtstats(FMT_LEN))) die_nomem();
stats.len = fmtstats(stats.s);
- out(stats.s,stats.len);
+ out(stats.s, stats.len);
outok("\n");
}
@@ -111,25 +153,35 @@ int main()
if (chdir(auto_qmail) == -1) die_chdir();
if (chdir("queue") == -1) die_chdir();
- readsubdir_init(&rs,"info",die_opendir);
+ readsubdir_init(&rs, "info", die_opendir);
- while ((x = readsubdir_next(&rs,&id)))
+ while ((x = readsubdir_next(&rs, &id)))
if (x > 0) {
- fmtqfn(fnmess,"mess/",id,1);
- fmtqfn(fninfo,"info/",id,1);
- fmtqfn(fnlocal,"local/",id,1);
- fmtqfn(fnremote,"remote/",id,1);
- fmtqfn(fnbounce,"bounce/",id,0);
-
- if (stat(fnmess,&st) == -1) { err(id); continue; }
+ fmtqfn(fnmess, "mess/", id, 1);
+ fmtqfn(fninfo, "info/", id, 1);
+ fmtqfn(fnlocal, "local/", id, 1);
+ fmtqfn(fnremote, "remote/", id, 1);
+ fmtqfn(fnbounce, "bounce/", id, 0);
+
+ if (stat(fnmess, &st) == -1) {
+ err(id);
+ continue;
+ }
size = st.st_size;
- flagbounce = !stat(fnbounce,&st);
+ flagbounce = !stat(fnbounce, &st);
fd = open_read(fninfo);
- if (fd == -1) { err(id); continue; }
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
- if (getln(&b,&sender,&match,0) == -1) die_nomem();
- if (fstat(fd,&st) == -1) { close(fd); err(id); continue; }
+ if (fd == -1) {
+ err(id);
+ continue;
+ }
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
+ if (getln(&b, &sender, &match, 0) == -1) die_nomem();
+ if (fstat(fd, &st) == -1) {
+ close(fd);
+ err(id);
+ continue;
+ }
close(fd);
qtime = st.st_mtime;
@@ -141,22 +193,21 @@ int main()
if (errno != ENOENT) err(id);
} else {
for (;;) {
- if (getln(&b,&line,&match,0) == -1) die_nomem();
- if (!match) break;
- switch (line.s[0]) {
- case 'D':
- outok(" done");
- case 'T':
- outok(channel ? "\tremote\t" : "\tlocal\t");
- outs(line.s + 1);
- outok("\n");
- break;
- }
+ if (getln(&b, &line, &match, 0) == -1) die_nomem();
+ if (!match) break;
+ switch (line.s[0]) {
+ case 'D': outok(" done");
+ case 'T':
+ outok(channel ? "\tremote\t" : "\tlocal\t");
+ outs(line.s + 1);
+ outok("\n");
+ break;
+ }
}
close(fd);
}
- }
- }
+ }
+ }
die(0);
}
diff --git a/src/qmail-queue.c b/src/qmail-queue.c
index b1289dc..ee9a3df 100644
--- a/src/qmail-queue.c
+++ b/src/qmail-queue.c
@@ -1,28 +1,30 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <fcntl.h>
-#include "sig.h"
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "alloc.h"
+#include "buffer.h"
+#include "env.h"
#include "exit.h"
+#include "fmt.h"
#include "open.h"
+#include "scan.h"
#include "seek.h"
-#include "fmt.h"
-#include "alloc.h"
-#include "buffer.h"
-#include "datetime.h"
-#include "now.h"
-#include "triggerpull.h"
-#include "extra.h"
+#include "sig.h"
+#include "wait.h"
+
#include "auto_qmail.h"
#include "auto_uids.h"
#include "date822fmt.h"
+#include "datetime.h"
+#include "extra.h"
#include "fmtqfn.h"
-#include "env.h"
-#include "wait.h"
-#include "scan.h"
+#include "now.h"
+#include "triggerpull.h"
#define DEATH 86400 /* 24 hours; _must_ be below q-s's OSSIFIED (36 hours) */
-#define ADDR 1003
+#define ADDR 1003
char inbuf[2048];
struct buffer bi;
@@ -47,21 +49,42 @@ int flagmadeintd = 0;
void cleanup()
{
if (flagmadeintd) {
- seek_trunc(intdfd,0);
- if (unlink(intdfn) == -1) return;
+ seek_trunc(intdfd, 0);
+ if (unlink(intdfn) == -1) return;
}
if (flagmademess) {
- seek_trunc(messfd,0);
+ seek_trunc(messfd, 0);
if (unlink(messfn) == -1) return;
}
}
-void die(int e) { _exit(e); }
-void die_qhpsi() { cleanup(); die(71); }
-void die_write() { cleanup(); die(53); }
-void die_read() { cleanup(); die(54); }
-void sigalrm() { /* thou shalt not clean up here */ die(52); }
-void sigbug() { die(81); }
+void die(int e)
+{
+ _exit(e);
+}
+void die_qhpsi()
+{
+ cleanup();
+ die(71);
+}
+void die_write()
+{
+ cleanup();
+ die(53);
+}
+void die_read()
+{
+ cleanup();
+ die(54);
+}
+void sigalrm()
+{ /* thou shalt not clean up here */
+ die(52);
+}
+void sigbug()
+{
+ die(81);
+}
unsigned int receivedlen;
char *received;
@@ -73,56 +96,89 @@ static unsigned int receivedfmt(char *s)
unsigned int len;
len = 0;
- i = fmt_str(s,"Received: (qmail "); len += i; if (s) s += i;
- i = fmt_ulong(s,mypid); len += i; if (s) s += i;
- i = fmt_str(s," invoked "); len += i; if (s) s += i;
- if (uid == auto_uida) {
- i = fmt_str(s,"by alias"); len += i; if (s) s += i;
- } else if (uid == auto_uidd) {
- i = fmt_str(s,"from network"); len += i; if (s) s += i;
- } else if (uid == auto_uids) {
- i = fmt_str(s,"for bounce"); len += i; if (s) s += i;
+ i = fmt_str(s, "Received: (qmail ");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, mypid);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, " invoked ");
+ len += i;
+ if (s) s += i;
+ if (uid == auto_uida) {
+ i = fmt_str(s, "by alias");
+ len += i;
+ if (s) s += i;
+ } else if (uid == auto_uidd) {
+ i = fmt_str(s, "from network");
+ len += i;
+ if (s) s += i;
+ } else if (uid == auto_uids) {
+ i = fmt_str(s, "for bounce");
+ len += i;
+ if (s) s += i;
} else {
- i = fmt_str(s,"by uid "); len += i; if (s) s += i;
- i = fmt_ulong(s,uid); len += i; if (s) s += i;
+ i = fmt_str(s, "by uid ");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, uid);
+ len += i;
+ if (s) s += i;
}
- i = fmt_str(s,"); "); len += i; if (s) s += i;
- i = date822fmt(s,&dt); len += i; if (s) s += i;
+ i = fmt_str(s, "); ");
+ len += i;
+ if (s) s += i;
+ i = date822fmt(s, &dt);
+ len += i;
+ if (s) s += i;
return len;
}
void received_setup()
{
- receivedlen = receivedfmt((char *) 0);
+ receivedlen = receivedfmt((char *)0);
received = alloc(receivedlen + 1);
if (!received) die(51);
receivedfmt(received);
}
-unsigned int pidfmt(char *s,unsigned long seq)
+unsigned int pidfmt(char *s, unsigned long seq)
{
unsigned int i;
unsigned int len;
len = 0;
- i = fmt_str(s,"pid/"); len += i; if (s) s += i;
- i = fmt_ulong(s,mypid); len += i; if (s) s += i;
- i = fmt_str(s,"."); len += i; if (s) s += i;
- i = fmt_ulong(s,starttime); len += i; if (s) s += i;
- i = fmt_str(s,"."); len += i; if (s) s += i;
- i = fmt_ulong(s,seq); len += i; if (s) s += i;
- ++len; if (s) *s++ = 0;
+ i = fmt_str(s, "pid/");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, mypid);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ".");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, starttime);
+ len += i;
+ if (s) s += i;
+ i = fmt_str(s, ".");
+ len += i;
+ if (s) s += i;
+ i = fmt_ulong(s, seq);
+ len += i;
+ if (s) s += i;
+ ++len;
+ if (s) *s++ = 0;
return len;
}
-char *fnnum(char *dirslash,int flagsplit)
+char *fnnum(char *dirslash, int flagsplit)
{
char *s;
- s = alloc(fmtqfn((char *) 0,dirslash,messnum,flagsplit));
+ s = alloc(fmtqfn((char *)0, dirslash, messnum, flagsplit));
if (!s) die(51);
- fmtqfn(s,dirslash,messnum,flagsplit);
+ fmtqfn(s, dirslash, messnum, flagsplit);
return s;
}
@@ -132,18 +188,18 @@ void pidopen(void)
unsigned long seq;
seq = 1;
- len = pidfmt((char *) 0,seq);
+ len = pidfmt((char *)0, seq);
pidfn = alloc(len);
if (!pidfn) die(51);
for (seq = 1; seq < 10; ++seq) {
- if (pidfmt((char *) 0,seq) > len) die(81); /* paranoia */
- pidfmt(pidfn,seq);
+ if (pidfmt((char *)0, seq) > len) die(81); /* paranoia */
+ pidfmt(pidfn, seq);
messfd = open_excl(pidfn);
if (messfd != -1) return;
}
- die(63);
+ die(63);
}
char *qhpsi;
@@ -152,10 +208,10 @@ void qhpsiprog(char *arg)
{
int wstat;
int child;
- char *qhpsiargs[6] = { 0, 0, 0, 0, 0, 0 };
+ char *qhpsiargs[6] = {0, 0, 0, 0, 0, 0};
char *x;
- unsigned long u;
- int childrc;
+ unsigned long u;
+ int childrc;
int qhpsirc = 1;
unsigned int size;
unsigned int qhpsiminsize = 0;
@@ -163,39 +219,52 @@ void qhpsiprog(char *arg)
struct stat st;
- if (stat(messfn,&st) == -1) die(63);
- size = (unsigned int) st.st_size;
+ if (stat(messfn, &st) == -1) die(63);
+ size = (unsigned int)st.st_size;
x = env_get("QHPSIMINSIZE");
- if (x) { scan_ulong(x,&u); qhpsiminsize = (int) u; }
- if (qhpsiminsize) if (size < qhpsiminsize) return;
+ if (x) {
+ scan_ulong(x, &u);
+ qhpsiminsize = (int)u;
+ }
+ if (qhpsiminsize)
+ if (size < qhpsiminsize) return;
x = env_get("QHPSIMAXSIZE");
- if (x) { scan_ulong(x,&u); qhpsimaxsize = (int) u; }
- if (qhpsimaxsize) if (size > qhpsimaxsize) return;
+ if (x) {
+ scan_ulong(x, &u);
+ qhpsimaxsize = (int)u;
+ }
+ if (qhpsimaxsize)
+ if (size > qhpsimaxsize) return;
if (*arg) {
switch (child = fork()) {
- case -1:
- die_qhpsi();
+ case -1: die_qhpsi();
case 0:
- qhpsiargs[0] = arg;
+ qhpsiargs[0] = arg;
qhpsiargs[1] = messfn;
qhpsiargs[2] = env_get("QHPSIARG1");
- if (!qhpsiargs[2]) qhpsiargs[2] = 0;
+ if (!qhpsiargs[2]) qhpsiargs[2] = 0;
qhpsiargs[3] = env_get("QHPSIARG2");
- if (!qhpsiargs[3]) qhpsiargs[3] = 0;
+ if (!qhpsiargs[3]) qhpsiargs[3] = 0;
qhpsiargs[4] = env_get("QHPSIARG3");
- if (!qhpsiargs[4]) qhpsiargs[4] = 0;
+ if (!qhpsiargs[4]) qhpsiargs[4] = 0;
x = env_get("QHPSIRC");
- if (x) { scan_ulong(x,&u); qhpsirc = (int) u; }
- execvp(*qhpsiargs,qhpsiargs);
+ if (x) {
+ scan_ulong(x, &u);
+ qhpsirc = (int)u;
+ }
+ execvp(*qhpsiargs, qhpsiargs);
die_qhpsi();
}
- if (wait_pid(&wstat,child) == -1) die_qhpsi();
+ if (wait_pid(&wstat, child) == -1) die_qhpsi();
if (wait_crashed(wstat)) die_qhpsi();
- childrc = wait_exitcode(wstat);
- if (childrc == qhpsirc) { cleanup(); die(32); }
- else if (childrc != 0) die_qhpsi();
+ childrc = wait_exitcode(wstat);
+ if (childrc == qhpsirc) {
+ cleanup();
+ die(32);
+ } else if (childrc != 0)
+ die_qhpsi();
}
}
@@ -215,7 +284,7 @@ int main()
mypid = getpid();
uid = getuid();
starttime = now();
- datetime_tai(&dt,starttime);
+ datetime_tai(&dt, starttime);
qhpsi = env_get("QHPSI");
received_setup();
@@ -228,23 +297,23 @@ int main()
alarm(DEATH);
pidopen();
- if (fstat(messfd,&pidst) == -1) die(63);
+ if (fstat(messfd, &pidst) == -1) die(63);
messnum = pidst.st_ino;
- messfn = fnnum("mess/",1);
- todofn = fnnum("todo/",1);
- intdfn = fnnum("intd/",1);
+ messfn = fnnum("mess/", 1);
+ todofn = fnnum("todo/", 1);
+ intdfn = fnnum("intd/", 1);
- if (link(pidfn,messfn) == -1) die(64);
+ if (link(pidfn, messfn) == -1) die(64);
if (unlink(pidfn) == -1) die(63);
flagmademess = 1;
- buffer_init(&bo,write,messfd,outbuf,sizeof(outbuf));
- buffer_init(&bi,read,0,inbuf,sizeof(inbuf));
+ buffer_init(&bo, write, messfd, outbuf, sizeof(outbuf));
+ buffer_init(&bi, read, 0, inbuf, sizeof(inbuf));
- if (buffer_put(&bo,received,receivedlen) == -1) die_write();
+ if (buffer_put(&bo, received, receivedlen) == -1) die_write();
- switch (buffer_copy(&bo,&bi)) {
+ switch (buffer_copy(&bo, &bi)) {
case -2: die_read();
case -3: die_write();
}
@@ -255,38 +324,41 @@ int main()
if (intdfd == -1) die(65);
flagmadeintd = 1;
- buffer_init(&bo,write,intdfd,outbuf,sizeof(outbuf));
- buffer_init(&bi,read,1,inbuf,sizeof(inbuf));
+ buffer_init(&bo, write, intdfd, outbuf, sizeof(outbuf));
+ buffer_init(&bi, read, 1, inbuf, sizeof(inbuf));
- if (buffer_put(&bo,"u",1) == -1) die_write();
- if (buffer_put(&bo,tmp,fmt_ulong(tmp,uid)) == -1) die_write();
- if (buffer_put(&bo,"",1) == -1) die_write();
+ if (buffer_put(&bo, "u", 1) == -1) die_write();
+ if (buffer_put(&bo, tmp, fmt_ulong(tmp, uid)) == -1) die_write();
+ if (buffer_put(&bo, "", 1) == -1) die_write();
- if (buffer_put(&bo,"p",1) == -1) die_write();
- if (buffer_put(&bo,tmp,fmt_ulong(tmp,mypid)) == -1) die_write();
- if (buffer_put(&bo,"",1) == -1) die_write();
+ if (buffer_put(&bo, "p", 1) == -1) die_write();
+ if (buffer_put(&bo, tmp, fmt_ulong(tmp, mypid)) == -1) die_write();
+ if (buffer_put(&bo, "", 1) == -1) die_write();
- if (buffer_get(&bi,&ch,1) < 1) die_read();
+ if (buffer_get(&bi, &ch, 1) < 1) die_read();
if (ch != 'F') die(91);
- if (buffer_put(&bo,&ch,1) == -1) die_write();
+ if (buffer_put(&bo, &ch, 1) == -1) die_write();
for (len = 0; len < ADDR; ++len) {
- if (buffer_get(&bi,&ch,1) < 1) die_read();
- if (buffer_put(&bo,&ch,1) == -1) die_write();
+ if (buffer_get(&bi, &ch, 1) < 1) die_read();
+ if (buffer_put(&bo, &ch, 1) == -1) die_write();
if (!ch) break;
}
if (len >= ADDR) die(11);
- if (buffer_put(&bo,QUEUE_EXTRA,QUEUE_EXTRALEN) == -1) die_write();
+ if (buffer_put(&bo, QUEUE_EXTRA, QUEUE_EXTRALEN) == -1) die_write();
for (;;) {
- if (buffer_get(&bi,&ch,1) < 1) die_read();
+ if (buffer_get(&bi, &ch, 1) < 1) die_read();
if (!ch) break;
- if (ch == 'Q') { qhpsi = 0; break; }
+ if (ch == 'Q') {
+ qhpsi = 0;
+ break;
+ }
if (ch != 'T') die(91);
- if (buffer_put(&bo,&ch,1) == -1) die_write();
+ if (buffer_put(&bo, &ch, 1) == -1) die_write();
for (len = 0; len < ADDR; ++len) {
- if (buffer_get(&bi,&ch,1) < 1) die_read();
- if (buffer_put(&bo,&ch,1) == -1) die_write();
+ if (buffer_get(&bi, &ch, 1) < 1) die_read();
+ if (buffer_put(&bo, &ch, 1) == -1) die_write();
if (!ch) break;
}
if (len >= ADDR) die(11);
@@ -297,8 +369,8 @@ int main()
if (buffer_flush(&bo) == -1) die_write();
if (fsync(intdfd) == -1) die_write();
- if (link(intdfn,todofn) == -1) die(66);
- if ((fd = open(todofn,O_RDONLY)) < 0 || fsync(fd) < 0 || close(fd)) die(66);
+ if (link(intdfn, todofn) == -1) die(66);
+ if ((fd = open(todofn, O_RDONLY)) < 0 || fsync(fd) < 0 || close(fd)) die(66);
triggerpull();
die(0);
diff --git a/src/qmail-recipients.c b/src/qmail-recipients.c
index 058994a..4fb2fb8 100644
--- a/src/qmail-recipients.c
+++ b/src/qmail-recipients.c
@@ -1,26 +1,28 @@
-#include <unistd.h>
#include <sys/stat.h>
-#include "logmsg.h"
-#include "stralloc.h"
+#include <unistd.h>
+
#include "buffer.h"
-#include "getln.h"
+#include "case.h"
+#include "cdbmake.h"
#include "exit.h"
+#include "getln.h"
+#include "logmsg.h"
#include "open.h"
-#include "case.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "cdbmake.h"
#define WHO "qmail-recipients"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void die_read()
{
- logmsg(WHO,111,ERROR,"unable to read users/recipients");
+ logmsg(WHO, 111, ERROR, "unable to read users/recipients");
}
void die_write()
{
- logmsg(WHO,111,ERROR,"unable to write to users/recipients.tmp");
+ logmsg(WHO, 111, ERROR, "unable to write to users/recipients.tmp");
}
char inbuf[1024];
@@ -31,36 +33,43 @@ int fdtemp;
struct cdb_make cdb;
stralloc line = {0};
-stralloc key = {0};
+stralloc key = {0};
int match;
int main()
{
umask(033);
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,110,ERROR,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 110, ERROR, B("unable to chdir to: ", auto_qmail));
fd = open_read("users/recipients");
if (fd == -1) die_read();
- buffer_init(&b,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&b, read, fd, inbuf, sizeof(inbuf));
fdtemp = open_trunc("users/recipients.tmp");
if (fdtemp == -1) die_write();
- if (cdb_make_start(&cdb,fdtemp) == -1) die_write();
+ if (cdb_make_start(&cdb, fdtemp) == -1) die_write();
for (;;) {
- stralloc_copys(&key,":");
- if (getln(&b,&line,&match,'\n') != 0) die_read();
+ stralloc_copys(&key, ":");
+ if (getln(&b, &line, &match, '\n') != 0) die_read();
while (line.len) {
- if (line.s[line.len - 1] == ' ') { --line.len; continue; }
- if (line.s[line.len - 1] == '\n') { --line.len; continue; }
- if (line.s[line.len - 1] == '\t') { --line.len; continue; }
- if (line.s[0] != '#' && stralloc_cat(&key,&line)) {
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,"",0) == -1)
- die_write();
+ if (line.s[line.len - 1] == ' ') {
+ --line.len;
+ continue;
+ }
+ if (line.s[line.len - 1] == '\n') {
+ --line.len;
+ continue;
+ }
+ if (line.s[line.len - 1] == '\t') {
+ --line.len;
+ continue;
+ }
+ if (line.s[0] != '#' && stralloc_cat(&key, &line)) {
+ case_lowerb(key.s, key.len);
+ if (cdb_make_add(&cdb, key.s, key.len, "", 0) == -1) die_write();
}
break;
}
@@ -70,8 +79,8 @@ int main()
if (cdb_make_finish(&cdb) == -1) die_write();
if (fsync(fdtemp) == -1) die_write();
if (close(fdtemp) == -1) die_write(); /* NFS stupidity */
- if (rename("users/recipients.tmp","users/recipients.cdb") == -1)
- logmsg(WHO,111,ERROR,"unable to move users/recipients.tmp to users/recipients.cdb");
+ if (rename("users/recipients.tmp", "users/recipients.cdb") == -1)
+ logmsg(WHO, 111, ERROR, "unable to move users/recipients.tmp to users/recipients.cdb");
_exit(0);
}
diff --git a/src/qmail-remote.c b/src/qmail-remote.c
index 5ef9465..2a7498c 100644
--- a/src/qmail-remote.c
+++ b/src/qmail-remote.c
@@ -1,76 +1,77 @@
#ifdef IDN2
-#include <idn2.h>
+ #include <idn2.h>
#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "sig.h"
-#include "stralloc.h"
+
+#include "alloc.h"
+#include "base64.h"
#include "buffer.h"
-#include "scan.h"
-#include "case.h"
#include "byte.h"
+#include "case.h"
+#include "constmap.h"
+#include "exit.h"
+#include "fmt.h"
+#include "genalloc.h"
+#include "ip.h"
#include "logmsg.h"
+#include "scan.h"
+#include "sig.h"
+#include "socket_if.h"
+#include "str.h"
+#include "stralloc.h"
+#include "timeout.h"
+#include "timeoutconn.h"
+#include "uint_t.h"
+
#include "auto_qmail.h"
#include "control.h"
#include "dns.h"
-#include "alloc.h"
-#include "genalloc.h"
-#include "quote.h"
-#include "fmt.h"
-#include "ip.h"
+#include "hmac_md5.h"
#include "ipalloc.h"
#include "ipme.h"
-#include "str.h"
#include "now.h"
-#include "exit.h"
-#include "constmap.h"
+#include "quote.h"
#include "tcpto.h"
-#include "timeout.h"
-#include "timeoutconn.h"
-#include "base64.h"
-#include "socket_if.h"
-#include "ucspissl.h"
-#include "hmac_md5.h"
-#include "tls_remote.h"
#include "tls_errors.h"
+#include "tls_remote.h"
#include "tls_timeoutio.h"
-#include "uint_t.h"
+#include "ucspissl.h"
#define WHO "qmail-remote"
-#define MAX_SIZE 200000000
-#define HUGESMTPTEXT 1000 /* RFC 5322; was 5000 chars/line */
-#define PORT_SMTP 25 /* silly rabbit, /etc/services is for users */
-#define PORT_QMTP 209
-#define PORT_SMTPS 465
+#define MAX_SIZE 200000000
+#define HUGESMTPTEXT 1000 /* RFC 5322; was 5000 chars/line */
+#define PORT_SMTP 25 /* silly rabbit, /etc/services is for users */
+#define PORT_QMTP 209
+#define PORT_SMTPS 465
#define PORT_SUBMISSION 587
-#define PORT_QMTPS 6209
-#define VERIFYDEPTH 1
+#define PORT_QMTPS 6209
+#define VERIFYDEPTH 1
unsigned long port = PORT_SMTP;
/** @file qmail-remote.c -- versatile SMTP(S)/QMTP(S) client */
-int flagauth = 0; /* 1 = login; 2 = plain; 3 = crammd5 */
-int flagsmtps = 0; /* RFC 8314 - 'implicit TLS' */
-int flagtlsdomain = 0; /* 0 = no; 1 = yes; 2 = cert */
-int flagtls = 0; /* flagtls: XYZ
+int flagauth = 0; /* 1 = login; 2 = plain; 3 = crammd5 */
+int flagsmtps = 0; /* RFC 8314 - 'implicit TLS' */
+int flagtlsdomain = 0; /* 0 = no; 1 = yes; 2 = cert */
+int flagtls = 0; /* flagtls: XYZ
(mode) Z: -2 = rejected; -1 = not; 0 = no, default; Z > 0 see tls_remote.c
(prot) Y: 0 = StartTLS; 1 = SMTPS; 2 = QMTPS
(active) X: 1 = running TLS connection (after DNS lookup)
(done) Z: 1: CA chain; 2: Cert wildname; 3: Cert exactname;
4: Cert fingerprint; 5: TLSA record */
-int flagverify = 0; /* 1 = verify Cert against CA; 2 = verify against Dir; 3 = triggerd by TLSA;
- -2 = Cert pinning; -1 = no TLSA validation */
+int flagverify = 0; /* 1 = verify Cert against CA; 2 = verify against Dir; 3 = triggerd by TLSA;
+ -2 = Cert pinning; -1 = no TLSA validation */
int flagutf8 = 0;
-GEN_ALLOC_typedef(saa,stralloc,sa,len,a)
-GEN_ALLOC_readyplus(saa,stralloc,sa,len,a,i,n,x,10,saa_readyplus)
-static stralloc sauninit = {0};
+GEN_ALLOC_typedef(saa, stralloc, sa, len, a) GEN_ALLOC_readyplus(
+ saa, stralloc, sa, len, a, i, n, x, 10, saa_readyplus) static stralloc sauninit = {0};
stralloc helohost = {0};
stralloc eaihost = {0};
@@ -103,22 +104,20 @@ unsigned long msize = 0;
struct ip_mx partner;
SSL *ssl;
-SSL_CTX *ctx;
+SSL_CTX *ctx;
char smallbuf[BUFFER_SMALL];
-buffer bs = BUFFER_INIT(write,1,smallbuf,sizeof(smallbuf));
-
-void out(char *s)
-{
- if (buffer_puts(&bs,s) == -1)
- _exit(0);
- }
-void zero()
-{
- if (buffer_put(&bs,"\0",1) == -1)
- _exit(0);
+buffer bs = BUFFER_INIT(write, 1, smallbuf, sizeof(smallbuf));
+
+void out(char *s)
+{
+ if (buffer_puts(&bs, s) == -1) _exit(0);
+}
+void zero()
+{
+ if (buffer_put(&bs, "\0", 1) == -1) _exit(0);
}
-void zerodie()
+void zerodie()
{
zero();
buffer_flush(&bs);
@@ -126,127 +125,127 @@ void zerodie()
_exit(0);
}
-void outsafe(stralloc *sa)
-{
- int i;
+void outsafe(stralloc *sa)
+{
+ int i;
char ch;
for (i = 0; i < sa->len; ++i) {
- ch = sa->s[i];
+ ch = sa->s[i];
if (ch == 0) continue;
- if (ch < 33) ch = '?';
+ if (ch < 33) ch = '?';
if (ch > 126) ch = '?';
- if (buffer_put(&bs,&ch,1) == -1) _exit(0);
- }
+ if (buffer_put(&bs, &ch, 1) == -1) _exit(0);
+ }
}
-void temp_noip()
-{
- out("ZInvalid ipaddr in control/domainips (#4.3.0)\n");
- zerodie();
+void temp_noip()
+{
+ out("ZInvalid ipaddr in control/domainips (#4.3.0)\n");
+ zerodie();
}
-void temp_nomem()
-{
- out("ZOut of memory. (#4.3.0)\n");
- zerodie();
+void temp_nomem()
+{
+ out("ZOut of memory. (#4.3.0)\n");
+ zerodie();
}
-void temp_oserr()
-{
- out("ZSystem resources temporarily unavailable. (#4.3.0)\n");
- zerodie();
+void temp_oserr()
+{
+ out("ZSystem resources temporarily unavailable. (#4.3.0)\n");
+ zerodie();
}
-void temp_osip()
-{
- out("ZCan't bind to local ip address: ");
- outsafe(&sendip);
+void temp_osip()
+{
+ out("ZCan't bind to local ip address: ");
+ outsafe(&sendip);
out(". (#4.3.0)\n");
- zerodie();
+ zerodie();
}
-void temp_noconn()
-{
+void temp_noconn()
+{
out("ZSorry, I wasn't able to establish an SMTP connection: ");
- outsafe(&canonhost);
+ outsafe(&canonhost);
out(". (#4.3.0)\n");
- zerodie();
+ zerodie();
}
-void temp_qmtpnoc()
-{
+void temp_qmtpnoc()
+{
out("ZSorry, I wasn't able to establish an QMTP connection: ");
- outsafe(&canonhost);
+ outsafe(&canonhost);
out(". (#4.3.1)\n");
- zerodie();
+ zerodie();
}
-void temp_read()
-{
- out("ZUnable to read message. (#4.3.0)\n");
- zerodie();
+void temp_read()
+{
+ out("ZUnable to read message. (#4.3.0)\n");
+ zerodie();
}
-void temp_dnscanon()
-{
- out("ZCNAME lookup failed temporarily for: ");
- outsafe(&canonhost);
+void temp_dnscanon()
+{
+ out("ZCNAME lookup failed temporarily for: ");
+ outsafe(&canonhost);
out(". (#4.4.3)\n");
- zerodie();
+ zerodie();
}
-void temp_dns()
-{
- out("ZSorry, I couldn't find any host named: ");
- outsafe(&host);
- out(". (#4.1.2)\n");
- zerodie();
+void temp_dns()
+{
+ out("ZSorry, I couldn't find any host named: ");
+ outsafe(&host);
+ out(". (#4.1.2)\n");
+ zerodie();
}
-void temp_nomx()
-{
+void temp_nomx()
+{
out("ZSorry, I couldn't find a mail exchanger or IP address for: ");
- outsafe(&host);
- out(". Will try again. (#4.1.2)\n");
- zerodie();
+ outsafe(&host);
+ out(". Will try again. (#4.1.2)\n");
+ zerodie();
}
-void temp_chdir()
-{
- out("ZUnable to switch to home directory. (#4.3.0)\n");
- zerodie();
+void temp_chdir()
+{
+ out("ZUnable to switch to home directory. (#4.3.0)\n");
+ zerodie();
}
-void temp_control()
-{
- out("ZUnable to read control files. (#4.3.0)\n");
- zerodie();
+void temp_control()
+{
+ out("ZUnable to read control files. (#4.3.0)\n");
+ zerodie();
}
-void perm_partialline()
-{
- out("DSMTP cannot transfer messages with partial final lines. (#5.6.2)\n");
- zerodie();
+void perm_partialline()
+{
+ out("DSMTP cannot transfer messages with partial final lines. (#5.6.2)\n");
+ zerodie();
}
-void temp_proto()
-{
- out("ZRecipient did not talk proper QMTP (#4.3.0)\n");
- zerodie();
+void temp_proto()
+{
+ out("ZRecipient did not talk proper QMTP (#4.3.0)\n");
+ zerodie();
}
-void perm_usage()
-{
- out("Dqmail-remote was invoked improperly. (#5.3.5)\n");
- zerodie();
+void perm_usage()
+{
+ out("Dqmail-remote was invoked improperly. (#5.3.5)\n");
+ zerodie();
}
-void perm_dns()
-{
- out("DSorry, I couldn't find any host named: ");
- outsafe(&host);
- out(". (#5.1.2)\n");
- zerodie();
+void perm_dns()
+{
+ out("DSorry, I couldn't find any host named: ");
+ outsafe(&host);
+ out(". (#5.1.2)\n");
+ zerodie();
}
-void perm_nomx()
-{
+void perm_nomx()
+{
out("DSorry, I couldn't find a mail exchanger or IP address for: ");
- outsafe(&host);
- out(". (#5.4.4)\n");
- zerodie();
+ outsafe(&host);
+ out(". (#5.4.4)\n");
+ zerodie();
}
-void perm_ambigmx()
-{
+void perm_ambigmx()
+{
out("DSorry. Although I'm listed as a best-preference MX or A for that host,\n\
it isn't in my control/locals file, so I don't treat it as local. (#5.4.6)\n");
- zerodie();
+ zerodie();
}
-void err_authprot()
+void err_authprot()
{
out("KNo supported AUTH method found, continuing without authentication.\n");
}
@@ -257,17 +256,15 @@ void outhost()
int len;
switch (partner.af) {
- case AF_INET:
- len = ip4_fmt(ipaddr,(char *)&partner.addr.ip4.d); break;
- case AF_INET6:
- len = ip6_fmt(ipaddr,(char *)&partner.addr.ip6.d); break;
- }
- if (buffer_put(&bs,ipaddr,len) == -1) _exit(0);
+ case AF_INET: len = ip4_fmt(ipaddr, (char *)&partner.addr.ip4.d); break;
+ case AF_INET6: len = ip6_fmt(ipaddr, (char *)&partner.addr.ip6.d); break;
+ }
+ if (buffer_put(&bs, ipaddr, len) == -1) _exit(0);
}
int flagcritical = 0;
-void dropped()
+void dropped()
{
out("ZConnected to ");
outhost();
@@ -281,48 +278,48 @@ int timeoutconnect = 60;
int smtpfd;
int timeout = 1200;
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
if (ssl) {
- r = tls_timeoutread(timeout,smtpfd,smtpfd,ssl,buf,len);
+ r = tls_timeoutread(timeout, smtpfd, smtpfd, ssl, buf, len);
if (r < 0) temp_tlserr();
} else {
- r = timeoutread(timeout,smtpfd,buf,len);
+ r = timeoutread(timeout, smtpfd, buf, len);
}
if (r <= 0) dropped();
return r;
}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
if (ssl) {
- r = tls_timeoutwrite(timeout,smtpfd,smtpfd,ssl,buf,len);
+ r = tls_timeoutwrite(timeout, smtpfd, smtpfd, ssl, buf, len);
if (r < 0) temp_tlserr();
} else {
- r = timeoutwrite(timeout,smtpfd,buf,len);
+ r = timeoutwrite(timeout, smtpfd, buf, len);
}
if (r <= 0) dropped();
return r;
}
char inbuf[BUFFER_MTUSIZE];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
char outbuf[BUFFER_MTUSIZE];
-buffer bo = BUFFER_INIT(safewrite,-1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, -1, outbuf, sizeof(outbuf));
char frombuf[BUFFER_SMALL];
-buffer bf = BUFFER_INIT(saferead,-1,frombuf,sizeof(frombuf));
+buffer bf = BUFFER_INIT(saferead, -1, frombuf, sizeof(frombuf));
static stralloc smtptext = {0};
static stralloc header = {0};
-
+
void get(char *ch)
{
- buffer_get(&bf,ch,1);
+ buffer_get(&bf, ch, 1);
if (*ch != '\r')
if (smtptext.len < HUGESMTPTEXT)
- if (!stralloc_append(&smtptext,ch)) temp_nomem();
+ if (!stralloc_append(&smtptext, ch)) temp_nomem();
}
unsigned long smtpcode()
@@ -330,11 +327,14 @@ unsigned long smtpcode()
unsigned char ch;
unsigned long code;
- if (!stralloc_copys(&smtptext,"")) temp_nomem();
+ if (!stralloc_copys(&smtptext, "")) temp_nomem();
- get(&ch); code = ch - '0';
- get(&ch); code = code * 10 + (ch - '0');
- get(&ch); code = code * 10 + (ch - '0');
+ get(&ch);
+ code = ch - '0';
+ get(&ch);
+ code = code * 10 + (ch - '0');
+ get(&ch);
+ code = code * 10 + (ch - '0');
for (;;) {
get(&ch);
if (ch != '-') break;
@@ -350,19 +350,20 @@ unsigned long smtpcode()
void outsmtptext()
{
- int i;
- if (smtptext.s) if (smtptext.len) {
- out("Remote host said: ");
- for (i = 0; i < smtptext.len; ++i)
- if (!smtptext.s[i]) smtptext.s[i] = '?';
- if (buffer_put(&bs,smtptext.s,smtptext.len) == -1) _exit(0);
- smtptext.len = 0;
- }
+ int i;
+ if (smtptext.s)
+ if (smtptext.len) {
+ out("Remote host said: ");
+ for (i = 0; i < smtptext.len; ++i)
+ if (!smtptext.s[i]) smtptext.s[i] = '?';
+ if (buffer_put(&bs, smtptext.s, smtptext.len) == -1) _exit(0);
+ smtptext.len = 0;
+ }
}
-void quit(char *prepend,char *append)
+void quit(char *prepend, char *append)
{
- buffer_putsflush(&bo,"QUIT\r\n");
+ buffer_putsflush(&bo, "QUIT\r\n");
/* waiting for remote side is just too ridiculous */
out(prepend);
outhost();
@@ -378,23 +379,22 @@ void blast()
char ch;
for (;;) {
- r = buffer_get(&bi,&ch,1);
+ r = buffer_get(&bi, &ch, 1);
if (r == 0) break;
if (r == -1) temp_read();
- if (ch == '.') buffer_put(&bo,".",1);
+ if (ch == '.') buffer_put(&bo, ".", 1);
while (ch != '\n') {
- if (ch != '\r')
- buffer_put(&bo,&ch,1); // DKIM input
- r = buffer_get(&bi,&ch,1);
+ if (ch != '\r') buffer_put(&bo, &ch, 1); // DKIM input
+ r = buffer_get(&bi, &ch, 1);
if (r == 0) perm_partialline();
if (r == -1) temp_read();
}
- buffer_put(&bo,"\r\n",2);
+ buffer_put(&bo, "\r\n", 2);
}
flagcritical = 1;
- buffer_put(&bo,".\r\n",3);
+ buffer_put(&bo, ".\r\n", 3);
buffer_flush(&bo);
}
@@ -422,47 +422,46 @@ void tls_init()
ssl_errstr();
if (!ctx) temp_tlsctx();
-/* Fetch CA infos for dest */
+ /* Fetch CA infos for dest */
- if (flagverify > 0)
- if (cafile.len || cadir.len)
- if (!ssl_ca(ctx,cafile.s,cadir.s,(int) verifydepth)) temp_tlsca();
+ if (flagverify > 0)
+ if (cafile.len || cadir.len)
+ if (!ssl_ca(ctx, cafile.s, cadir.s, (int)verifydepth)) temp_tlsca();
- if (ciphers.len)
- if (!ssl_ciphers(ctx,ciphers.s)) temp_tlscipher();
+ if (ciphers.len)
+ if (!ssl_ciphers(ctx, ciphers.s)) temp_tlscipher();
-/* Prepare for Certificate Request */
+ /* Prepare for Certificate Request */
- if (flagtlsdomain == 2)
- switch (tls_certkey(ctx,certfile.s,keyfile.s,keypwd.s)) {
- case 0: break;
- case -1: temp_tlscert();
+ if (flagtlsdomain == 2) switch (tls_certkey(ctx, certfile.s, keyfile.s, keypwd.s))
+ {
+ case 0: break;
+ case -1: temp_tlscert();
case -2: temp_tlskey();
- case -3: temp_tlschk();
+ case -3: temp_tlschk();
}
-/* Set SSL Context */
+ /* Set SSL Context */
- ssl = ssl_new(ctx,smtpfd);
+ ssl = ssl_new(ctx, smtpfd);
if (!ssl) temp_tlsctx();
-/* Setup SSL FDs */
-
- if (!tls_conn(ssl,smtpfd)) temp_tlscon();
+ /* Setup SSL FDs */
+
+ if (!tls_conn(ssl, smtpfd)) temp_tlscon();
-/* Go on in none-blocking mode */
+ /* Go on in none-blocking mode */
- if (tls_timeoutconn(timeout,smtpfd,smtpfd,ssl) <= 0)
- temp_tlserr();
+ if (tls_timeoutconn(timeout, smtpfd, smtpfd, ssl) <= 0) temp_tlserr();
}
int starttls_peer()
{
int i = 0;
- while ((i += str_chr(smtptext.s+i,'\n') + 1) &&
- (i + 8 < smtptext.len) ) {
- if (!str_diffn(smtptext.s + i + 4,"STARTTLS",8)) return 1; }
+ while ((i += str_chr(smtptext.s + i, '\n') + 1) && (i + 8 < smtptext.len)) {
+ if (!str_diffn(smtptext.s + i + 4, "STARTTLS", 8)) return 1;
+ }
return 0;
}
@@ -470,48 +469,61 @@ int starttls_peer()
void tls_peercheck()
{
X509 *cert;
- STACK_OF(X509) *certs;
-
+ STACK_OF(X509) * certs;
+
cert = SSL_get_peer_certificate(ssl);
- if (!cert) { flagtls = 100; return; }
+ if (!cert) {
+ flagtls = 100;
+ return;
+ }
if ((certs = SSL_get_peer_cert_chain(ssl)) == NULL) {
certs = sk_X509_new_null();
sk_X509_push(certs, cert);
}
- if (flagverify == -2) { // fingerprinting is silent
- if (cafile.len) case_lowerb(cafile.s,cafile.len);
- switch (tls_fingerprint(cert,cafile.s + 1,cafile.len - 2)) {
- case -1: temp_tlspeercert();
- case -2: temp_tlsdigest();
- case -3: temp_invaliddigest();
- case 0: temp_tlscertfp();
- case 1: flagtls = 104; break;
+ if (flagverify == -2) { // fingerprinting is silent
+ if (cafile.len) case_lowerb(cafile.s, cafile.len);
+ switch (tls_fingerprint(cert, cafile.s + 1, cafile.len - 2)) {
+ case -1: temp_tlspeercert();
+ case -2: temp_tlsdigest();
+ case -3: temp_invaliddigest();
+ case 0: temp_tlscertfp();
+ case 1: flagtls = 104; break;
}
- }
-
- if (flagverify >= 0) { // TLSA is default
- switch (tlsa_check(certs,remotehost,port)) {
- case -4: temp_tlsamissing(); break; /* FIXME */
- case -3: temp_tlsainvalid(); break;
- case -2: break; // unsupported type; may happen
- case -1: break; // weird TLSA record
- case 0: break; // no TLSA record given
- case 1: case 2: flagtls = 107; flagverify = 3; break; // full certchain available (-PKIX)
- case 3: flagtls = 106; flagverify = 0; break; // TA-CA; verify wont work
- case 4: flagtls = 105; flagverify = 0; break; // Endpoint only
+ }
+
+ if (flagverify >= 0) { // TLSA is default
+ switch (tlsa_check(certs, remotehost, port)) {
+ case -4: temp_tlsamissing(); break; /* FIXME */
+ case -3: temp_tlsainvalid(); break;
+ case -2: break; // unsupported type; may happen
+ case -1: break; // weird TLSA record
+ case 0: break; // no TLSA record given
+ case 1:
+ case 2:
+ flagtls = 107;
+ flagverify = 3;
+ break; // full certchain available (-PKIX)
+ case 3:
+ flagtls = 106;
+ flagverify = 0;
+ break; // TA-CA; verify wont work
+ case 4:
+ flagtls = 105;
+ flagverify = 0;
+ break; // Endpoint only
}
}
if (flagverify > 0) {
- switch (tls_checkpeer(ssl,cert,remotehost,flagtls,flagverify)) {
+ switch (tls_checkpeer(ssl, cert, remotehost, flagtls, flagverify)) {
case -1: temp_tlspeercert();
- case -2: temp_tlspeerverify();
- case -3: temp_tlspeervalid();
- case 1: flagtls = 101; break;
- case 2: flagtls = 102; break;
- case 3: flagtls = 103; break;
+ case -2: temp_tlspeerverify();
+ case -3: temp_tlspeervalid();
+ case 1: flagtls = 101; break;
+ case 2: flagtls = 102; break;
+ case 3: flagtls = 103; break;
}
}
@@ -519,13 +531,13 @@ void tls_peercheck()
X509_free(cert);
X509_free(certs);
-
+
return;
}
/* this file is too long --------------------------------------- smtp UTF8 */
-int utf8string(unsigned char *ch,int len)
+int utf8string(unsigned char *ch, int len)
{
int i = 0;
while (i < len)
@@ -541,31 +553,31 @@ int utf8received()
char ch;
stralloc receivedline = {0};
-/* we consider only our own last written header */
+ /* we consider only our own last written header */
for (;;) {
- r = buffer_get(&bi,&ch,1);
+ r = buffer_get(&bi, &ch, 1);
if (r == 0) break;
if (r == -1) temp_read();
- if (ch == '\r') continue; // DKIM
+ if (ch == '\r') continue; // DKIM
if (ch == '\n') {
- if (!stralloc_append(&header,"\r")) temp_nomem(); /* received.c does not add '\r' */
- if (!stralloc_append(&header,"\n")) temp_nomem();
- if (case_starts(receivedline.s,"Date:")) return 0; /* header to quit asap */
- if (case_starts(receivedline.s,"Received: from")) received++; /* found Received header */
+ if (!stralloc_append(&header, "\r")) temp_nomem(); /* received.c does not add '\r' */
+ if (!stralloc_append(&header, "\n")) temp_nomem();
+ if (case_starts(receivedline.s, "Date:")) return 0; /* header to quit asap */
+ if (case_starts(receivedline.s, "Received: from")) received++; /* found Received header */
if (received) {
- if (case_starts(receivedline.s," by ")) {
- for (i = 6; i < receivedline.len - 6; ++i)
+ if (case_starts(receivedline.s, " by ")) {
+ for (i = 6; i < receivedline.len - 6; ++i)
if (*(receivedline.s + i) == ' ')
- if (case_starts(receivedline.s + i + 1,"with UTF8")) return 1;
+ if (case_starts(receivedline.s + i + 1, "with UTF8")) return 1;
return 0;
- }
+ }
}
- if (!stralloc_copys(&receivedline,"")) temp_nomem();
+ if (!stralloc_copys(&receivedline, "")) temp_nomem();
} else {
- if (!stralloc_append(&header,&ch)) temp_nomem();
- if (!stralloc_catb(&receivedline,&ch,1)) temp_nomem();
+ if (!stralloc_append(&header, &ch)) temp_nomem();
+ if (!stralloc_catb(&receivedline, &ch, 1)) temp_nomem();
}
}
return 0;
@@ -581,60 +593,59 @@ int smtp_size()
int i;
if (smtptext.len > 10)
for (i = 0; i < smtptext.len; ++i) {
- if (case_starts(smtptext.s + i,"SIZE ")) return 1;
- }
- return 0;;
+ if (case_starts(smtptext.s + i, "SIZE ")) return 1;
+ }
+ return 0;
+ ;
}
void smtp_greeting()
{
- buffer_puts(&bo,"EHLO ");
- buffer_put(&bo,helohost.s,helohost.len);
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "EHLO ");
+ buffer_put(&bo, helohost.s, helohost.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
if (smtpcode() != 250) {
- buffer_puts(&bo,"HELO ");
- buffer_put(&bo,helohost.s,helohost.len);
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "HELO ");
+ buffer_put(&bo, helohost.s, helohost.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
code = smtpcode();
authsender = 0;
- if (code >= 500) quit("DConnected to "," but my name was rejected");
- if (code != 250) quit("ZConnected to "," but my name was rejected");
+ if (code >= 500) quit("DConnected to ", " but my name was rejected");
+ if (code != 250) quit("ZConnected to ", " but my name was rejected");
}
flagsize = smtp_size();
}
void smtp_starttls()
{
- buffer_puts(&bo,"STARTTLS\r\n");
+ buffer_puts(&bo, "STARTTLS\r\n");
buffer_flush(&bo);
if (smtpcode() == 220) {
tls_init();
tls_peercheck();
smtp_greeting();
- }
- else {
+ } else {
flagtls = -2;
- quit("ZConnected to "," but STARTTLS was rejected");
+ quit("ZConnected to ", " but STARTTLS was rejected");
}
}
void mailfrom()
{
- buffer_puts(&bo,"MAIL FROM:<");
- buffer_put(&bo,sender.s,sender.len);
- buffer_puts(&bo,">");
- if (flagutf8 || utf8received())
- buffer_puts(&bo," SMTPUTF8");
+ buffer_puts(&bo, "MAIL FROM:<");
+ buffer_put(&bo, sender.s, sender.len);
+ buffer_puts(&bo, ">");
+ if (flagutf8 || utf8received()) buffer_puts(&bo, " SMTPUTF8");
if (flagsize && msize) {
- buffer_puts(&bo," SIZE=");
- buffer_puts(&bo,msgsize);
+ buffer_puts(&bo, " SIZE=");
+ buffer_puts(&bo, msgsize);
}
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
}
@@ -653,22 +664,22 @@ stralloc xuser = {0};
static const char hextab[] = "0123456789abcdef";
-int xtext(stralloc *sa,char *s,int len)
+int xtext(stralloc *sa, char *s, int len)
{
int i;
unsigned char c;
char xch[2];
- if (!stralloc_copys(sa,"")) temp_nomem();
+ if (!stralloc_copys(sa, "")) temp_nomem();
for (i = 0; i < len; i++) {
c = s[i];
if (c < 33 || c > 126 || c == '=' || c == '+') {
xch[0] = hextab[(c >> 4) & 0x0f];
xch[1] = hextab[c & 0x0f];
- if (!stralloc_catb(sa,xch,2)) temp_nomem();
- } else
- if (!stralloc_catb(sa,s + i,1)) temp_nomem();
+ if (!stralloc_catb(sa, xch, 2)) temp_nomem();
+ } else if (!stralloc_catb(sa, s + i, 1))
+ temp_nomem();
}
return sa->len;
@@ -676,73 +687,72 @@ int xtext(stralloc *sa,char *s,int len)
void mailfrom_xtext()
{
- if (!xtext(&xuser,user.s,user.len)) temp_nomem();
- buffer_puts(&bo,"MAIL FROM:<");
- buffer_put(&bo,sender.s,sender.len);
- buffer_puts(&bo,"> AUTH=");
- buffer_put(&bo,xuser.s,xuser.len);
- if (flagutf8 || utf8received())
- buffer_puts(&bo," SMTPUTF8");
+ if (!xtext(&xuser, user.s, user.len)) temp_nomem();
+ buffer_puts(&bo, "MAIL FROM:<");
+ buffer_put(&bo, sender.s, sender.len);
+ buffer_puts(&bo, "> AUTH=");
+ buffer_put(&bo, xuser.s, xuser.len);
+ if (flagutf8 || utf8received()) buffer_puts(&bo, " SMTPUTF8");
if (flagsize && msize) {
- buffer_puts(&bo," SIZE=");
- buffer_puts(&bo,msgsize);
+ buffer_puts(&bo, " SIZE=");
+ buffer_puts(&bo, msgsize);
}
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
}
-
+
int mailfrom_plain()
{
- buffer_puts(&bo,"AUTH PLAIN\r\n");
+ buffer_puts(&bo, "AUTH PLAIN\r\n");
buffer_flush(&bo);
- if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (AUTH PLAIN)");
+ if (smtpcode() != 334) quit("ZConnected to ", " but authentication was rejected (AUTH PLAIN)");
- if (!stralloc_cats(&plain,"")) temp_nomem(); /* RFC 4616 section 2 */
+ if (!stralloc_cats(&plain, "")) temp_nomem(); /* RFC 4616 section 2 */
if (!stralloc_0(&plain)) temp_nomem();
- if (!stralloc_cat(&plain,&user)) temp_nomem(); /* user-id */
+ if (!stralloc_cat(&plain, &user)) temp_nomem(); /* user-id */
if (!stralloc_0(&plain)) temp_nomem();
- if (!stralloc_cat(&plain,&pass)) temp_nomem(); /* password */
- if (b64encode(&plain,&auth)) quit("ZConnected to "," but unable to base64encode (plain)");
- buffer_put(&bo,auth.s,auth.len);
- buffer_puts(&bo,"\r\n");
+ if (!stralloc_cat(&plain, &pass)) temp_nomem(); /* password */
+ if (b64encode(&plain, &auth)) quit("ZConnected to ", " but unable to base64encode (plain)");
+ buffer_put(&bo, auth.s, auth.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
switch (smtpcode()) {
case 235: mailfrom_xtext(); break;
- case 432: quit("DConnected to "," but password expired");
- case 534: quit("ZConnected to "," but authentication mechamism too weak (plain)");
- default: quit("ZConnected to "," but authentication was rejected (plain)");
+ case 432: quit("DConnected to ", " but password expired");
+ case 534: quit("ZConnected to ", " but authentication mechamism too weak (plain)");
+ default: quit("ZConnected to ", " but authentication was rejected (plain)");
}
return 0;
}
int mailfrom_login()
{
- buffer_puts(&bo,"AUTH LOGIN\r\n");
+ buffer_puts(&bo, "AUTH LOGIN\r\n");
buffer_flush(&bo);
- if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (AUTH LOGIN)");
- if (!stralloc_copys(&auth,"")) temp_nomem();
- if (b64encode(&user,&auth)) quit("ZConnected to "," but unable to base64encode user");
+ if (smtpcode() != 334) quit("ZConnected to ", " but authentication was rejected (AUTH LOGIN)");
+ if (!stralloc_copys(&auth, "")) temp_nomem();
+ if (b64encode(&user, &auth)) quit("ZConnected to ", " but unable to base64encode user");
- buffer_put(&bo,auth.s,auth.len);
- buffer_puts(&bo,"\r\n");
+ buffer_put(&bo, auth.s, auth.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
- if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (username)");
+ if (smtpcode() != 334) quit("ZConnected to ", " but authentication was rejected (username)");
- if (!stralloc_copys(&auth,"")) temp_nomem();
- if (b64encode(&pass,&auth)) quit("ZConnected to "," but unable to base64encode pass");
- buffer_put(&bo,auth.s,auth.len);
- buffer_puts(&bo,"\r\n");
+ if (!stralloc_copys(&auth, "")) temp_nomem();
+ if (b64encode(&pass, &auth)) quit("ZConnected to ", " but unable to base64encode pass");
+ buffer_put(&bo, auth.s, auth.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
switch (smtpcode()) {
case 235: mailfrom_xtext(); break;
- case 432: quit("DConnected to "," but password expired");
- case 534: quit("ZConnected to "," but authentication mechanism is too weak (login)");
- default: quit("ZConnected to "," but authentication was rejected (login)");
+ case 432: quit("DConnected to ", " but password expired");
+ case 534: quit("ZConnected to ", " but authentication mechanism is too weak (login)");
+ default: quit("ZConnected to ", " but authentication was rejected (login)");
}
return 0;
}
@@ -753,41 +763,42 @@ int mailfrom_cram()
unsigned char digest[16];
unsigned char digascii[33];
- buffer_puts(&bo,"AUTH CRAM-MD5\r\n");
+ buffer_puts(&bo, "AUTH CRAM-MD5\r\n");
buffer_flush(&bo);
- if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (AUTH CRAM-MD5)");
- if (str_chr(smtptext.s + 4,' ')) { /* Challenge */
- if (!stralloc_copys(&slop,"")) temp_nomem();
- if (!stralloc_copyb(&slop,smtptext.s + 4,smtptext.len - 5)) temp_nomem();
- if (b64decode(slop.s,slop.len,&chal)) quit("ZConnected to "," but unable to base64decode challenge");
+ if (smtpcode() != 334) quit("ZConnected to ", " but authentication was rejected (AUTH CRAM-MD5)");
+ if (str_chr(smtptext.s + 4, ' ')) { /* Challenge */
+ if (!stralloc_copys(&slop, "")) temp_nomem();
+ if (!stralloc_copyb(&slop, smtptext.s + 4, smtptext.len - 5)) temp_nomem();
+ if (b64decode(slop.s, slop.len, &chal))
+ quit("ZConnected to ", " but unable to base64decode challenge");
}
- hmac_md5((unsigned char *)chal.s,chal.len,pass.s,pass.len,digest);
+ hmac_md5((unsigned char *)chal.s, chal.len, pass.s, pass.len, digest);
- for (j = 0; j < 16; j++) { /* HEX => ASCII */
+ for (j = 0; j < 16; j++) { /* HEX => ASCII */
digascii[2 * j] = hextab[digest[j] >> 4];
digascii[2 * j + 1] = hextab[digest[j] & 0x0f];
}
- digascii[32]=0;
+ digascii[32] = 0;
- if (!stralloc_copys(&slop,"")) temp_nomem();
- if (!stralloc_cat(&slop,&user)) temp_nomem(); /* user-id */
- if (!stralloc_cats(&slop," ")) temp_nomem();
- if (!stralloc_catb(&slop,digascii,32)) temp_nomem(); /* digest */
+ if (!stralloc_copys(&slop, "")) temp_nomem();
+ if (!stralloc_cat(&slop, &user)) temp_nomem(); /* user-id */
+ if (!stralloc_cats(&slop, " ")) temp_nomem();
+ if (!stralloc_catb(&slop, digascii, 32)) temp_nomem(); /* digest */
- if (!stralloc_copys(&auth,"")) temp_nomem();
- if (b64encode(&slop,&auth)) quit("ZConnected to "," but unable to base64encode username+digest");
+ if (!stralloc_copys(&auth, "")) temp_nomem();
+ if (b64encode(&slop, &auth)) quit("ZConnected to ", " but unable to base64encode username+digest");
- buffer_put(&bo,auth.s,auth.len);
- buffer_puts(&bo,"\r\n");
+ buffer_put(&bo, auth.s, auth.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
switch (smtpcode()) {
case 235: mailfrom_xtext(); break;
- case 432: quit("DConnected to "," but password expired");
- case 534: quit("ZConnected to "," but authentication mechamism too weak (cram)");
- default: quit("ZConnected to "," but authentication was rejected (cram)");
+ case 432: quit("DConnected to ", " but password expired");
+ case 534: quit("ZConnected to ", " but authentication mechamism too weak (cram)");
+ default: quit("ZConnected to ", " but authentication was rejected (cram)");
}
return 0;
}
@@ -796,13 +807,13 @@ void smtp_auth()
{
int i;
- if (smtptext.len > 8)
+ if (smtptext.len > 8)
for (i = 4; i < smtptext.len - 5; ++i) {
- if (case_starts(smtptext.s + i,"CRAM"))
+ if (case_starts(smtptext.s + i, "CRAM"))
if (mailfrom_cram() >= 0) return;
- if (case_starts(smtptext.s + i,"LOGIN"))
+ if (case_starts(smtptext.s + i, "LOGIN"))
if (mailfrom_login() >= 0) return;
- if (case_starts(smtptext.s + i,"PLAIN"))
+ if (case_starts(smtptext.s + i, "PLAIN"))
if (mailfrom_plain() >= 0) return;
}
err_authprot();
@@ -816,87 +827,105 @@ void smtp()
int flagbother;
int i;
- if (flagtls > 10 && flagtls < 20) { /* SMTPS */
+ if (flagtls > 10 && flagtls < 20) { /* SMTPS */
tls_init();
- tls_peercheck();
+ tls_peercheck();
}
code = smtpcode();
- if (code >= 500) quit("DConnected to "," but sender was rejected");
- if (code == 421 || code == 450) quit("ZConnected to "," but probably greylisted"); /* RFC 6647 */
- if (code >= 400) quit("ZConnected to "," but sender was rejected");
- if (code != 220) quit("ZConnected to "," but greeting failed");
+ if (code >= 500) quit("DConnected to ", " but sender was rejected");
+ if (code == 421 || code == 450) quit("ZConnected to ", " but probably greylisted"); /* RFC 6647 */
+ if (code >= 400) quit("ZConnected to ", " but sender was rejected");
+ if (code != 220) quit("ZConnected to ", " but greeting failed");
smtp_greeting();
- if (flagtls > 0 && flagtls < 10) { /* STARTTLS */
- if (starttls_peer())
- smtp_starttls();
+ if (flagtls > 0 && flagtls < 10) { /* STARTTLS */
+ if (starttls_peer())
+ smtp_starttls();
else if (flagtls > 3 && flagtls != 9) {
- if (!stralloc_0(&host)) temp_nomem();
- temp_tlshost();
+ if (!stralloc_0(&host)) temp_nomem();
+ temp_tlshost();
}
}
- if (user.len && pass.len) /* AUTH */
+ if (user.len && pass.len) /* AUTH */
smtp_auth();
- else
- mailfrom(); /* Mail From */
+ else
+ mailfrom(); /* Mail From */
code = smtpcode();
- if (code >= 500) quit("DConnected to "," but sender was rejected");
- if (code >= 400) quit("ZConnected to "," but sender was probably greylisted");
+ if (code >= 500) quit("DConnected to ", " but sender was rejected");
+ if (code >= 400) quit("ZConnected to ", " but sender was probably greylisted");
- flagbother = 0; /* Rcpt To */
+ flagbother = 0; /* Rcpt To */
for (i = 0; i < reciplist.len; ++i) {
- buffer_puts(&bo,"RCPT TO:<");
- buffer_put(&bo,reciplist.sa[i].s,reciplist.sa[i].len);
- buffer_puts(&bo,">\r\n");
+ buffer_puts(&bo, "RCPT TO:<");
+ buffer_put(&bo, reciplist.sa[i].s, reciplist.sa[i].len);
+ buffer_puts(&bo, ">\r\n");
buffer_flush(&bo);
- code = smtpcode(); /* Data */
+ code = smtpcode(); /* Data */
if (flagsize) {
- if (code == 552) quit("DConnected to "," but message size is too large");
- if (code == 452) quit("ZConnected to "," however insufficient storage space available");
- }
+ if (code == 552) quit("DConnected to ", " but message size is too large");
+ if (code == 452) quit("ZConnected to ", " however insufficient storage space available");
+ }
if (code == 421 || code == 450) { // Postfix merde ;-)
- out("s"); outhost(); out(" sender is greylisting.\n");
- outsmtptext(); zero();
+ out("s");
+ outhost();
+ out(" sender is greylisting.\n");
+ outsmtptext();
+ zero();
} else if (code >= 500) {
- out("h"); outhost(); out(" does not like recipient.\n");
- outsmtptext(); zero();
+ out("h");
+ outhost();
+ out(" does not like recipient.\n");
+ outsmtptext();
+ zero();
} else if (code >= 400) {
- out("s"); outhost(); out(" does not like recipient.\n");
- outsmtptext(); zero();
+ out("s");
+ outhost();
+ out(" does not like recipient.\n");
+ outsmtptext();
+ zero();
} else {
- out("r"); zero();
+ out("r");
+ zero();
flagbother = 1;
}
}
- if (!flagbother) quit("DGiving up on ","");
+ if (!flagbother) quit("DGiving up on ", "");
- buffer_putsflush(&bo,"DATA\r\n");
+ buffer_putsflush(&bo, "DATA\r\n");
code = smtpcode();
- if (code >= 500) quit("D"," failed on DATA command");
- if (code >= 400) quit("Z"," failed on DATA command");
+ if (code >= 500) quit("D", " failed on DATA command");
+ if (code >= 400) quit("Z", " failed on DATA command");
+
+ buffer_putflush(&bo, header.s, header.len);
- buffer_putflush(&bo,header.s,header.len);
-
blast();
code = smtpcode();
flagcritical = 0;
- if (code >= 500) quit("D"," failed after I sent the message");
- if (code >= 400) quit("Z"," failed after I sent the message");
+ if (code >= 500) quit("D", " failed after I sent the message");
+ if (code >= 400) quit("Z", " failed after I sent the message");
switch (flagtls) { // StartTLS + SMTPS
- case 100: case 110: quit("K"," TLS transmitted message accepted"); break;
- case 101: case 111: quit("K"," TLS (verified CA) transmitted message accepted"); break;
- case 102: case 112: quit("K"," TLS (validated CA+DN*) transmitted message accepted"); break;
- case 103: case 113: quit("K"," TLS (validated CA+DN) transmitted message accepted"); break;
- case 104: case 114: quit("K"," TLS (CERT pinning) transmitted message accepted"); break;
- case 105: case 115: quit("K"," TLS (TLSA EE validated) transmitted message accepted"); break;
- case 106: case 116: quit("K"," TLS (TLSA TA validated) transmitted message accepted"); break;
- case 107: case 117: quit("K"," TLS (TLSA PKIX verified) transmitted message accepted"); break;
- default: quit("K"," accepted message"); break;
+ case 100:
+ case 110: quit("K", " TLS transmitted message accepted"); break;
+ case 101:
+ case 111: quit("K", " TLS (verified CA) transmitted message accepted"); break;
+ case 102:
+ case 112: quit("K", " TLS (validated CA+DN*) transmitted message accepted"); break;
+ case 103:
+ case 113: quit("K", " TLS (validated CA+DN) transmitted message accepted"); break;
+ case 104:
+ case 114: quit("K", " TLS (CERT pinning) transmitted message accepted"); break;
+ case 105:
+ case 115: quit("K", " TLS (TLSA EE validated) transmitted message accepted"); break;
+ case 106:
+ case 116: quit("K", " TLS (TLSA TA validated) transmitted message accepted"); break;
+ case 107:
+ case 117: quit("K", " TLS (TLSA PKIX verified) transmitted message accepted"); break;
+ default: quit("K", " accepted message"); break;
}
}
@@ -914,44 +943,44 @@ void qmtp()
char num[FMT_ULONG];
int flagallok;
- if (qmtpsend == 2) { /* QMTPS */
+ if (qmtpsend == 2) { /* QMTPS */
tls_init();
tls_peercheck();
}
-/* the following code was substantially taken from serialmail's serialqmtp.c */
+ /* the following code was substantially taken from serialmail's serialqmtp.c */
- scan_ulong(msgsize,&len);
- buffer_put(&bo,num,fmt_ulong(num,len + 1));
- buffer_put(&bo,":\n",2);
+ scan_ulong(msgsize, &len);
+ buffer_put(&bo, num, fmt_ulong(num, len + 1));
+ buffer_put(&bo, ":\n", 2);
while (len > 0) {
n = buffer_feed(&bi);
- if (n <= 0) _exit(1); /* wise guy again */
+ if (n <= 0) _exit(1); /* wise guy again */
x = buffer_PEEK(&bi);
- buffer_put(&bo,x,n);
- buffer_SEEK(&bi,n);
+ buffer_put(&bo, x, n);
+ buffer_SEEK(&bi, n);
len -= n;
}
- buffer_put(&bo,",",1);
+ buffer_put(&bo, ",", 1);
len = sender.len;
- buffer_put(&bo,num,fmt_ulong(num,len));
- buffer_put(&bo,":",1);
- buffer_put(&bo,sender.s,sender.len);
- buffer_put(&bo,",",1);
+ buffer_put(&bo, num, fmt_ulong(num, len));
+ buffer_put(&bo, ":", 1);
+ buffer_put(&bo, sender.s, sender.len);
+ buffer_put(&bo, ",", 1);
len = 0;
for (i = 0; i < reciplist.len; ++i)
- len += fmt_ulong(num,reciplist.sa[i].len) + 1 + reciplist.sa[i].len + 1;
- buffer_put(&bo,num,fmt_ulong(num,len));
- buffer_put(&bo,":",1);
+ len += fmt_ulong(num, reciplist.sa[i].len) + 1 + reciplist.sa[i].len + 1;
+ buffer_put(&bo, num, fmt_ulong(num, len));
+ buffer_put(&bo, ":", 1);
for (i = 0; i < reciplist.len; ++i) {
- buffer_put(&bo,num,fmt_ulong(num,reciplist.sa[i].len));
- buffer_put(&bo,":",1);
- buffer_put(&bo,reciplist.sa[i].s,reciplist.sa[i].len);
- buffer_put(&bo,",",1);
+ buffer_put(&bo, num, fmt_ulong(num, reciplist.sa[i].len));
+ buffer_put(&bo, ":", 1);
+ buffer_put(&bo, reciplist.sa[i].s, reciplist.sa[i].len);
+ buffer_put(&bo, ",", 1);
}
- buffer_put(&bo,",",1);
+ buffer_put(&bo, ",", 1);
buffer_flush(&bo);
flagallok = 1;
@@ -966,14 +995,15 @@ void qmtp()
len = 10 * len + (ch - '0');
}
if (!len) temp_proto();
- get(&ch); --len;
+ get(&ch);
+ --len;
if ((ch != 'Z') && (ch != 'D') && (ch != 'K')) temp_proto();
- if (!stralloc_copyb(&smtptext,&ch,1)) temp_proto();
+ if (!stralloc_copyb(&smtptext, &ch, 1)) temp_proto();
if (flagtls == 100) {
- if (!stralloc_cats(&smtptext,"qmtps:")) temp_nomem();
+ if (!stralloc_cats(&smtptext, "qmtps:")) temp_nomem();
} else {
- if (!stralloc_cats(&smtptext,"qmtp:")) temp_nomem();
+ if (!stralloc_cats(&smtptext, "qmtp:")) temp_nomem();
}
while (len > 0) {
@@ -989,22 +1019,26 @@ void qmtp()
if (ch != ',') temp_proto();
smtptext.s[smtptext.len - 1] = '\n';
- if (smtptext.s[0] == 'K') out("r");
+ if (smtptext.s[0] == 'K')
+ out("r");
else if (smtptext.s[0] == 'D') {
out("h");
flagallok = 0;
- }
- else { /* if (smtptext.s[0] == 'Z') */
+ } else { /* if (smtptext.s[0] == 'Z') */
out("s");
flagallok = 0;
}
- if (buffer_put(&bs,smtptext.s + 1,smtptext.len - 1) == -1) temp_qmtpnoc();
+ if (buffer_put(&bs, smtptext.s + 1, smtptext.len - 1) == -1) temp_qmtpnoc();
zero();
}
if (!flagallok) {
- out("DGiving up on "); outhost(); out("\n");
+ out("DGiving up on ");
+ outhost();
+ out("\n");
} else {
- out("KAll received okay by "); outhost(); out("\n");
+ out("KAll received okay by ");
+ outhost();
+ out("\n");
}
zerodie();
}
@@ -1013,86 +1047,108 @@ void qmtp()
/* host has to be canonical [A/AAAA record], box has to be quoted */
-void addrmangle(stralloc *saout,char *address,int *flagalias,int flagcname)
+void addrmangle(stralloc *saout, char *address, int *flagalias, int flagcname)
{
int at;
int r = 0;
stralloc cn = {0};
- *flagalias = flagcname; /* saout + flagalias are output */
- if (!flagutf8)
- flagutf8 = utf8string(address,str_len(address));
+ *flagalias = flagcname; /* saout + flagalias are output */
+ if (!flagutf8) flagutf8 = utf8string(address, str_len(address));
- at = str_rchr(address,'@');
+ at = str_rchr(address, '@');
if (!address[at]) {
- if (!stralloc_copys(saout,address)) temp_nomem();
+ if (!stralloc_copys(saout, address)) temp_nomem();
return;
}
- if (!stralloc_copys(&canonbox,address)) temp_nomem();
+ if (!stralloc_copys(&canonbox, address)) temp_nomem();
canonbox.len = at;
- if (!quote(saout,&canonbox)) temp_nomem(); /* saout = 'inbox' name without quotes ;-) */
- if (!stralloc_cats(saout,"@")) temp_nomem();
+ if (!quote(saout, &canonbox)) temp_nomem(); /* saout = 'inbox' name without quotes ;-) */
+ if (!stralloc_cats(saout, "@")) temp_nomem();
- if (!stralloc_copys(&canonhost,address + at + 1)) temp_nomem();
- if (flagcname) { /* no relayhost */
+ if (!stralloc_copys(&canonhost, address + at + 1)) temp_nomem();
+ if (flagcname) { /* no relayhost */
DNS_INIT
- switch ((r = dns_cname(&cn,&canonhost))) {
- case DNS_MEM: temp_nomem();
+ switch ((r = dns_cname(&cn, &canonhost))) {
+ case DNS_MEM: temp_nomem();
case DNS_SOFT: temp_dnscanon();
case DNS_HARD: ; /* alias loop, not our problem */
- default: if (r > 0) *flagalias = 0;
+ default:
+ if (r > 0) *flagalias = 0;
}
}
- if (!stralloc_cat(saout,&canonhost)) temp_nomem();
+ if (!stralloc_cat(saout, &canonhost)) temp_nomem();
}
void getcontrols()
{
if (control_init() == -1) temp_control();
- if (control_readint(&timeout,"control/timeoutremote") == -1) temp_control();
- if (control_readint(&timeoutconnect,"control/timeoutconnect") == -1)
- temp_control();
- if (control_rldef(&helohost,"control/helohost",1,(char *) 0) != 1)
- temp_control();
- switch (control_readfile(&smtproutes,"control/smtproutes",0)) {
+ if (control_readint(&timeout, "control/timeoutremote") == -1) temp_control();
+ if (control_readint(&timeoutconnect, "control/timeoutconnect") == -1) temp_control();
+ if (control_rldef(&helohost, "control/helohost", 1, (char *)0) != 1) temp_control();
+ switch (control_readfile(&smtproutes, "control/smtproutes", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapsmtproutes,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapsmtproutes,smtproutes.s,smtproutes.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapsmtproutes, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapsmtproutes, smtproutes.s, smtproutes.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&domainips,"control/domainips",0)) {
+ switch (control_readfile(&domainips, "control/domainips", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapdomainips,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapdomainips,domainips.s,domainips.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapdomainips, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapdomainips, domainips.s, domainips.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&authsenders,"control/authsenders",0)) {
+ switch (control_readfile(&authsenders, "control/authsenders", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapauthsenders,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapauthsenders,authsenders.s,authsenders.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapauthsenders, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapauthsenders, authsenders.s, authsenders.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&qmtproutes,"control/qmtproutes",0)) {
+ switch (control_readfile(&qmtproutes, "control/qmtproutes", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapqmtproutes,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapqmtproutes,qmtproutes.s,qmtproutes.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapqmtproutes, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapqmtproutes, qmtproutes.s, qmtproutes.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&domaincerts,"control/domaincerts",0)) {
+ switch (control_readfile(&domaincerts, "control/domaincerts", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapdomaincerts,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapdomaincerts,domaincerts.s,domaincerts.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapdomaincerts, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapdomaincerts, domaincerts.s, domaincerts.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&tlsdestinations,"control/tlsdestinations",0)) {
+ switch (control_readfile(&tlsdestinations, "control/tlsdestinations", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&maptlsdestinations,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&maptlsdestinations,tlsdestinations.s,tlsdestinations.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&maptlsdestinations, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&maptlsdestinations, tlsdestinations.s, tlsdestinations.len, 1)) temp_nomem();
+ break;
}
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
static ipalloc ip = {0};
stralloc netif = {0};
struct stat st;
- int i, j, k;
+ int i, j, k;
int p; /* reserved for port */
int r; /* reserved for return code */
unsigned long random;
@@ -1109,184 +1165,191 @@ int main(int argc,char **argv)
if (chdir(auto_qmail) == -1) temp_chdir();
getcontrols();
- if (!stralloc_copys(&host,argv[1])) temp_nomem();
+ if (!stralloc_copys(&host, argv[1])) temp_nomem();
authsender = 0;
relayhost = 0;
- addrmangle(&sender,argv[2],&flagalias,0);
+ addrmangle(&sender, argv[2], &flagalias, 0);
if (sender.len > 1) {
- i = str_chr(sender.s,'@');
+ i = str_chr(sender.s, '@');
if (sender.s[i] == '@')
- if (!stralloc_copyb(&senddomain,sender.s + i + 1,sender.len - i - 1)) temp_nomem(); // un-terminated
+ if (!stralloc_copyb(&senddomain, sender.s + i + 1, sender.len - i - 1))
+ temp_nomem(); // un-terminated
}
-/* this file is too long -------------------------------------- set domain ip + helohost */
+ /* this file is too long -------------------------------------- set domain ip + helohost */
localip = 0;
-
+
for (i = 0; i <= senddomain.len; ++i)
- if ((i == 0) || (senddomain.s[i] == '.'))
- if ((localip = constmap(&mapdomainips,senddomain.s + i,senddomain.len - i)))
- break;
+ if ((i == 0) || (senddomain.s[i] == '.'))
+ if ((localip = constmap(&mapdomainips, senddomain.s + i, senddomain.len - i))) break;
- if (!localip)
- localip = constmap(&mapdomainips,"*",1); /* one for all */
+ if (!localip) localip = constmap(&mapdomainips, "*", 1); /* one for all */
if (localip) {
- j = str_chr(localip,'%');
+ j = str_chr(localip, '%');
if (localip[j] != '%') j = 0;
- k = str_chr(localip,'|');
+ k = str_chr(localip, '|');
if (localip[k] != '|') k = 0;
- if (k) { /* helohost */
- if (!stralloc_copys(&helohost,localip + k + 1)) temp_nomem();
+ if (k) { /* helohost */
+ if (!stralloc_copys(&helohost, localip + k + 1)) temp_nomem();
if (!stralloc_0(&helohost)) temp_nomem();
localip[k] = 0;
}
- if (j) { /* IF index */
+ if (j) { /* IF index */
localip[j] = 0;
- if (!stralloc_copys(&netif,localip + j + 1)) temp_nomem();
+ if (!stralloc_copys(&netif, localip + j + 1)) temp_nomem();
if (!stralloc_0(&netif)) temp_nomem();
}
}
-/* this file is too long -------------------------------------- authsender routes */
+ /* this file is too long -------------------------------------- authsender routes */
for (i = 0; i <= sender.len; ++i)
if ((i == 0) || (i == sender.len) || (sender.s[i] == '.') || (sender.s[i] == '@'))
- if ((authsender = constmap(&mapauthsenders,sender.s + i,sender.len - i)))
- break;
+ if ((authsender = constmap(&mapauthsenders, sender.s + i, sender.len - i))) break;
if (authsender && !*authsender) authsender = 0;
if (authsender) {
- i = str_chr(authsender,'|');
+ i = str_chr(authsender, '|');
if (authsender[i] == '|') {
- j = str_chr(authsender + i + 1,'|');
+ j = str_chr(authsender + i + 1, '|');
if (authsender[i + j + 1] == '|') {
authsender[i] = 0;
authsender[i + j + 1] = 0;
- if (!stralloc_copys(&user,"")) temp_nomem();
- if (!stralloc_copys(&user,authsender + i + 1)) temp_nomem();
- if (!stralloc_copys(&pass,"")) temp_nomem();
- if (!stralloc_copys(&pass,authsender + i + j + 2)) temp_nomem();
+ if (!stralloc_copys(&user, "")) temp_nomem();
+ if (!stralloc_copys(&user, authsender + i + 1)) temp_nomem();
+ if (!stralloc_copys(&pass, "")) temp_nomem();
+ if (!stralloc_copys(&pass, authsender + i + j + 2)) temp_nomem();
}
}
- p = str_chr(authsender,';');
+ p = str_chr(authsender, ';');
if (authsender[p] == ';') {
- if (authsender[p + 1] == 's') { flagsmtps = 1, p++; }
- scan_ulong(authsender + p + 1,&port);
+ if (authsender[p + 1] == 's') {
+ flagsmtps = 1, p++;
+ }
+ scan_ulong(authsender + p + 1, &port);
authsender[p] = 0;
}
relayhost = authsender;
- if (!stralloc_copys(&host,authsender)) temp_nomem();
+ if (!stralloc_copys(&host, authsender)) temp_nomem();
}
-/* this file is too long -------------------------------------- standard routes */
+ /* this file is too long -------------------------------------- standard routes */
if (!authsender) {
- if (sender.len == 0) { /* bounce routes */
- if ((relayhost = constmap(&mapqmtproutes,"!@",2))) {
- qmtpsend = 1; port = PORT_QMTP;
+ if (sender.len == 0) { /* bounce routes */
+ if ((relayhost = constmap(&mapqmtproutes, "!@", 2))) {
+ qmtpsend = 1;
+ port = PORT_QMTP;
} else
- relayhost = constmap(&mapsmtproutes,"!@",2);
+ relayhost = constmap(&mapsmtproutes, "!@", 2);
}
if (relayhost && !*relayhost) relayhost = 0;
if (!relayhost) {
- for (i = 0; i <= host.len; ++i) { /* qmtproutes */
+ for (i = 0; i <= host.len; ++i) { /* qmtproutes */
if ((i == 0) || (i == host.len) || (host.s[i] == '.'))
- if ((relayhost = constmap(&mapqmtproutes,host.s + i,host.len - i))) {
- qmtpsend = 1; port = PORT_QMTP;
- break;
- } /* default smtproutes */
- if ((relayhost = constmap(&mapsmtproutes,host.s + i,host.len - i)))
+ if ((relayhost = constmap(&mapqmtproutes, host.s + i, host.len - i))) {
+ qmtpsend = 1;
+ port = PORT_QMTP;
break;
+ } /* default smtproutes */
+ if ((relayhost = constmap(&mapsmtproutes, host.s + i, host.len - i))) break;
}
}
if (relayhost && !*relayhost) relayhost = 0;
- if (relayhost) { /* default smtproutes -- authenticated */
- i = str_chr(relayhost,'|');
+ if (relayhost) { /* default smtproutes -- authenticated */
+ i = str_chr(relayhost, '|');
if (relayhost[i] == '|') {
- j = str_chr(relayhost + i + 1,'|'); // authenticate
+ j = str_chr(relayhost + i + 1, '|'); // authenticate
if (relayhost[i + j + 1] == '|') {
relayhost[i] = 0;
relayhost[i + j + 1] = 0;
- if (!stralloc_copys(&user,"")) temp_nomem();
- if (!stralloc_copys(&user,relayhost + i + 1)) temp_nomem();
- if (!stralloc_copys(&pass,"")) temp_nomem();
- k = str_chr(relayhost + i + j + 2,'|'); // local ip
+ if (!stralloc_copys(&user, "")) temp_nomem();
+ if (!stralloc_copys(&user, relayhost + i + 1)) temp_nomem();
+ if (!stralloc_copys(&pass, "")) temp_nomem();
+ k = str_chr(relayhost + i + j + 2, '|'); // local ip
if (relayhost[i + j + k + 2] == '|') {
relayhost[i + j + k + 2] = 0;
localip = relayhost + i + j + k + 3;
}
- if (!stralloc_copys(&pass,relayhost + i + j + 2)) temp_nomem();
+ if (!stralloc_copys(&pass, relayhost + i + j + 2)) temp_nomem();
}
}
- p = str_chr(relayhost,';');
+ p = str_chr(relayhost, ';');
if (relayhost[p] == ';') {
- if (relayhost[p + 1] == 's') { flagsmtps = 1; p++; } // RFC 8314
- scan_ulong(relayhost + p + 1,&port);
+ if (relayhost[p + 1] == 's') {
+ flagsmtps = 1;
+ p++;
+ } // RFC 8314
+ scan_ulong(relayhost + p + 1, &port);
if (qmtpsend && port == PORT_QMTPS) qmtpsend = 2;
relayhost[p] = 0;
}
- if (!stralloc_copys(&host,relayhost)) temp_nomem();
+ if (!stralloc_copys(&host, relayhost)) temp_nomem();
#ifdef IDN2
} else {
char *asciihost = 0;
if (!stralloc_0(&host)) temp_nomem();
- switch (idn2_lookup_u8(host.s,(uint8_t**)&asciihost,IDN2_NFC_INPUT)) {
+ switch (idn2_lookup_u8(host.s, (uint8_t **)&asciihost, IDN2_NFC_INPUT)) {
case IDN2_OK: break;
case IDN2_MALLOC: temp_nomem();
default: perm_dns();
}
- if (!stralloc_copys(&idnhost,asciihost)) temp_nomem();
+ if (!stralloc_copys(&idnhost, asciihost)) temp_nomem();
#endif
}
}
-/* this file is too long -------------------------------------- TLS destinations */
+ /* this file is too long -------------------------------------- TLS destinations */
- flagtls = tls_destination((const stralloc) host); // host may not be 0-terminated
+ flagtls = tls_destination((const stralloc)host); // host may not be 0-terminated
if (flagtls > 0) {
- if (tlsdestinfo) {
- i = str_chr(tlsdestinfo,'|'); /* ca file/dir or cert fingerprint */
+ if (tlsdestinfo) {
+ i = str_chr(tlsdestinfo, '|'); /* ca file/dir or cert fingerprint */
if (tlsdestinfo[i] == '|') {
tlsdestinfo[i] = 0;
- j = str_chr(tlsdestinfo + i + 1,'|'); /* cipher */
+ j = str_chr(tlsdestinfo + i + 1, '|'); /* cipher */
if (tlsdestinfo[i + j + 1] == '|') {
- tlsdestinfo[i + j + 1] = 0;
- k = str_chr(tlsdestinfo + i + j + 2,'|'); /* cone domain */
+ tlsdestinfo[i + j + 1] = 0;
+ k = str_chr(tlsdestinfo + i + j + 2, '|'); /* cone domain */
if (tlsdestinfo[i + j + k + 2] == '|') {
- tlsdestinfo[i + j + k + 2] = 0;
- if (str_diffn(tlsdestinfo + j + k + 3,canonhost.s,canonhost.len)) flagtls = 0;
+ tlsdestinfo[i + j + k + 2] = 0;
+ if (str_diffn(tlsdestinfo + j + k + 3, canonhost.s, canonhost.len)) flagtls = 0;
}
- p = str_chr(tlsdestinfo + i + j + 2,';'); /* verifydepth;port */
+ p = str_chr(tlsdestinfo + i + j + 2, ';'); /* verifydepth;port */
if (tlsdestinfo[i + j + p + 2] == ';') {
tlsdestinfo[i + j + p + 2] = 0;
- if (p > 0) scan_ulong(tlsdestinfo + i + j + 2,&verifydepth);
- if (tlsdestinfo[i + j + p + 3] == 's') { flagsmtps = 1; p++; } /* RFC 8314 */
- scan_ulong(tlsdestinfo + i + j + p + 3,&port);
+ if (p > 0) scan_ulong(tlsdestinfo + i + j + 2, &verifydepth);
+ if (tlsdestinfo[i + j + p + 3] == 's') {
+ flagsmtps = 1;
+ p++;
+ } /* RFC 8314 */
+ scan_ulong(tlsdestinfo + i + j + p + 3, &port);
}
}
if (j)
- if (!stralloc_copys(&ciphers,tlsdestinfo + i + 1)) temp_nomem();
- }
+ if (!stralloc_copys(&ciphers, tlsdestinfo + i + 1)) temp_nomem();
+ }
/* either ':[=]cafile/cadir' -or- ':;port' */
- if (tlsdestinfo[0] == ';')
- scan_ulong(tlsdestinfo + 1,&port);
- else
- if (!stralloc_copys(&cafile,tlsdestinfo)) temp_nomem();
+ if (tlsdestinfo[0] == ';')
+ scan_ulong(tlsdestinfo + 1, &port);
+ else if (!stralloc_copys(&cafile, tlsdestinfo))
+ temp_nomem();
}
-/* cafile starts with '=' => it is a fingerprint
+ /* cafile starts with '=' => it is a fingerprint
cafile ends with '/' => consider it as cadir
cafile and cadir are now 0-terminated
ciphers are alway 0-terminated if given */
@@ -1296,7 +1359,7 @@ int main(int argc,char **argv)
if (cafile.s[cafile.len] == '/') {
cafile.len = 0;
flagverify = 2;
- if (!stralloc_copys(&cadir,tlsdestinfo)) temp_nomem();
+ if (!stralloc_copys(&cadir, tlsdestinfo)) temp_nomem();
if (!stralloc_0(&cadir)) temp_nomem();
} else {
if (cafile.s[0] == '=') flagverify = -2;
@@ -1305,60 +1368,61 @@ int main(int argc,char **argv)
} else
cafile.len = cadir.len = 0;
- if (ciphers.len > 4) /* otherwise garbage */
- if (!stralloc_0(&ciphers)) temp_nomem();
- else
- ciphers.len = 0;
+ if (ciphers.len > 4) /* otherwise garbage */
+ if (!stralloc_0(&ciphers))
+ temp_nomem();
+ else
+ ciphers.len = 0;
if (port == PORT_SMTPS || flagsmtps) flagtls += 10;
if (port == PORT_QMTPS) flagtls += 20;
}
- if (flagtls == 8) flagverify = -1;
- if (!flagtls && qmtpsend == 2) flagtls = 20; /* QMTPS */
+ if (flagtls == 8) flagverify = -1;
+ if (!flagtls && qmtpsend == 2) flagtls = 20; /* QMTPS */
-/* this file is too long -------------------------------------- Our Certs - per senddomain */
+ /* this file is too long -------------------------------------- Our Certs - per senddomain */
if (flagtls > 0) {
- flagtlsdomain = tls_domaincerts((const stralloc) senddomain); // senddomain un-terminated
+ flagtlsdomain = tls_domaincerts((const stralloc)senddomain); // senddomain un-terminated
if (flagtlsdomain && tlsdomaininfo) {
- i = str_chr(tlsdomaininfo,'|');
+ i = str_chr(tlsdomaininfo, '|');
if (tlsdomaininfo[i] == '|') {
tlsdomaininfo[i] = 0;
- j = str_chr(tlsdomaininfo + i + 1,'|');
+ j = str_chr(tlsdomaininfo + i + 1, '|');
if (tlsdomaininfo[i + j + 1] == '|') {
tlsdomaininfo[i + j + 1] = 0;
- if (!stralloc_copys(&keypwd,"")) temp_nomem();
- if (!stralloc_copys(&keypwd,tlsdomaininfo + i + j + 2)) temp_nomem();
+ if (!stralloc_copys(&keypwd, "")) temp_nomem();
+ if (!stralloc_copys(&keypwd, tlsdomaininfo + i + j + 2)) temp_nomem();
if (!stralloc_0(&keypwd)) temp_nomem();
}
- if (!stralloc_copys(&keyfile,tlsdomaininfo + i + 1)) temp_nomem();
+ if (!stralloc_copys(&keyfile, tlsdomaininfo + i + 1)) temp_nomem();
if (!stralloc_0(&keyfile)) temp_nomem();
}
- if (!stralloc_copys(&certfile,tlsdomaininfo)) temp_nomem();
+ if (!stralloc_copys(&certfile, tlsdomaininfo)) temp_nomem();
if (!stralloc_0(&certfile)) temp_nomem();
flagtlsdomain = 2;
}
}
-/* this file is too long -------------------------------------- work thru reciplist */
+ /* this file is too long -------------------------------------- work thru reciplist */
- if (!saa_readyplus(&reciplist,0)) temp_nomem();
+ if (!saa_readyplus(&reciplist, 0)) temp_nomem();
if (ipme_init() != 1) temp_oserr();
-
+
flagallaliases = 1;
recips = argv + 3;
- if (fstat(0,&st) == -1) quit("Z", " unable to fstat stdin");
+ if (fstat(0, &st) == -1) quit("Z", " unable to fstat stdin");
msize = st.st_size;
- fmt_ulong(msgsize,msize);
+ fmt_ulong(msgsize, msize);
while (*recips) {
- if (!saa_readyplus(&reciplist,1)) temp_nomem();
+ if (!saa_readyplus(&reciplist, 1)) temp_nomem();
reciplist.sa[reciplist.len] = sauninit;
- addrmangle(reciplist.sa + reciplist.len,*recips,&flagalias,!relayhost);
+ addrmangle(reciplist.sa + reciplist.len, *recips, &flagalias, !relayhost);
if (!flagalias) flagallaliases = 0;
++reciplist.len;
++recips;
@@ -1366,91 +1430,94 @@ int main(int argc,char **argv)
random = now() + (getpid() << 16);
#ifdef IDN2
- switch (relayhost ? dns_ip(&ip,&host) : dns_mxip(&ip,&idnhost,random)) {
+ switch (relayhost ? dns_ip(&ip, &host) : dns_mxip(&ip, &idnhost, random)) {
#else
- switch (relayhost ? dns_ip(&ip,&host) : dns_mxip(&ip,&host,random)) {
+ switch (relayhost ? dns_ip(&ip, &host) : dns_mxip(&ip, &host, random)) {
#endif
- case DNS_MEM: temp_nomem();
- case DNS_ERR: temp_dns();
- case DNS_COM: temp_dns();
+ case DNS_MEM: temp_nomem();
+ case DNS_ERR: temp_dns();
+ case DNS_COM: temp_dns();
case DNS_SOFT: temp_dns();
#ifdef DEFERREDBOUNCES
- default: if (!ip.len) temp_nomx();
+ default:
+ if (!ip.len) temp_nomx();
#else
- default: if (!ip.len) perm_nomx();
+ default:
+ if (!ip.len) perm_nomx();
#endif
}
prefme = 100000;
for (i = 0; i < ip.len; ++i)
if (ipme_is(&ip.ix[i]))
- if (ip.ix[i].pref < prefme)
- prefme = ip.ix[i].pref;
-
+ if (ip.ix[i].pref < prefme) prefme = ip.ix[i].pref;
+
if (relayhost) prefme = 300000;
if (flagallaliases) prefme = 500000;
-
+
if (localip) {
- i = str_chr(localip,':');
- if (localip[i] == ':') ip6flag = 1;
- else ip6flag = -1;
+ i = str_chr(localip, ':');
+ if (localip[i] == ':')
+ ip6flag = 1;
+ else
+ ip6flag = -1;
}
- for (i = 0; i < ip.len; ++i) { /* MX with smallest distance */
- if (ip6flag == -1 && ip.ix[i].af == AF_INET6) continue;
- if (ip6flag == 1 && ip.ix[i].af == AF_INET) continue;
+ for (i = 0; i < ip.len; ++i) { /* MX with smallest distance */
+ if (ip6flag == -1 && ip.ix[i].af == AF_INET6) continue;
+ if (ip6flag == 1 && ip.ix[i].af == AF_INET) continue;
if (ip.ix[i].pref < prefme) break;
}
- if (i >= ip.len)
- perm_ambigmx();
+ if (i >= ip.len) perm_ambigmx();
- if (!stralloc_copys(&remotehost,ip.ix[i].mxh)) temp_nomem(); /* take MX hostname for TLSA */
+ if (!stralloc_copys(&remotehost, ip.ix[i].mxh)) temp_nomem(); /* take MX hostname for TLSA */
if (!stralloc_0(&remotehost)) temp_nomem();
for (i = 0; i < ip.len; ++i) {
if (ip.ix[i].pref < prefme) {
- if (ip6flag == -1 && ip.ix[i].af == AF_INET6) continue; /* explicit binding */
- if (ip6flag == 1 && ip.ix[i].af == AF_INET) continue;
+ if (ip6flag == -1 && ip.ix[i].af == AF_INET6) continue; /* explicit binding */
+ if (ip6flag == 1 && ip.ix[i].af == AF_INET) continue;
if (tcpto(&ip.ix[i])) continue;
-
- smtpfd = socket(ip.ix[i].af,SOCK_STREAM,0);
+
+ smtpfd = socket(ip.ix[i].af, SOCK_STREAM, 0);
if (smtpfd == -1) continue;
- if (localip) { /* set domain ip */
- if (!stralloc_copyb(&sendip,localip,str_len(localip))) temp_nomem();
- j = str_chr(localip,':');
- if (localip[j] == ':') {
- if (!ip6_scan(localip,ip6)) temp_noip(); /* IPv6 */
- if (byte_equal(ip.ix[i].addr.ip6.d,16,ip6)) continue;
- ifidx = socket_getifidx(netif.s);
- if (socket_bind6(smtpfd,ip6,0,ifidx) < 0) temp_osip();
- } else {
- if (!ip4_scan(localip,ip4)) temp_noip(); /* IPv4 */
- if (byte_equal(ip.ix[i].addr.ip4.d,4,ip4)) continue;
- if (socket_bind4(smtpfd,ip4,0) < 0) temp_osip();
- }
- }
-
-
- AGAIN:
+ if (localip) { /* set domain ip */
+ if (!stralloc_copyb(&sendip, localip, str_len(localip))) temp_nomem();
+ j = str_chr(localip, ':');
+ if (localip[j] == ':') {
+ if (!ip6_scan(localip, ip6)) temp_noip(); /* IPv6 */
+ if (byte_equal(ip.ix[i].addr.ip6.d, 16, ip6)) continue;
+ ifidx = socket_getifidx(netif.s);
+ if (socket_bind6(smtpfd, ip6, 0, ifidx) < 0) temp_osip();
+ } else {
+ if (!ip4_scan(localip, ip4)) temp_noip(); /* IPv4 */
+ if (byte_equal(ip.ix[i].addr.ip4.d, 4, ip4)) continue;
+ if (socket_bind4(smtpfd, ip4, 0) < 0) temp_osip();
+ }
+ }
+
+
+ AGAIN:
if (ip.ix[i].af == AF_INET6)
- r = timeoutconn6(smtpfd,(char *)&ip.ix[i].addr.ip6.d,(unsigned int) port,timeoutconnect,ifidx);
+ r = timeoutconn6(
+ smtpfd, (char *)&ip.ix[i].addr.ip6.d, (unsigned int)port, timeoutconnect, ifidx);
else
- r = timeoutconn4(smtpfd,(char *)&ip.ix[i].addr.ip4.d,(unsigned int) port,timeoutconnect);
+ r = timeoutconn4(smtpfd, (char *)&ip.ix[i].addr.ip4.d, (unsigned int)port, timeoutconnect);
if (r == 0) {
- tcpto_err(&ip.ix[i],0);
+ tcpto_err(&ip.ix[i], 0);
partner = ip.ix[i];
- if (qmtpsend)
- qmtp();
- else
- smtp(); /* read qmail/THOUGHTS; section 6 */
+ if (qmtpsend)
+ qmtp();
+ else
+ smtp(); /* read qmail/THOUGHTS; section 6 */
}
if (flagtls == 9 && errno == EPROTO) {
- flagtls = 0; goto AGAIN;
+ flagtls = 0;
+ goto AGAIN;
}
- if (errno == ETIMEDOUT || errno == ECONNREFUSED || errno == EPROTO)
- tcpto_err(&ip.ix[i],1);
+ if (errno == ETIMEDOUT || errno == ECONNREFUSED || errno == EPROTO) tcpto_err(&ip.ix[i], 1);
close(smtpfd);
}
}
diff --git a/src/qmail-rspawn.c b/src/qmail-rspawn.c
index 66a8b70..939488d 100644
--- a/src/qmail-rspawn.c
+++ b/src/qmail-rspawn.c
@@ -1,44 +1,61 @@
-#include <unistd.h>
#include <sys/stat.h>
-#include "fd.h"
-#include "wait.h"
+#include <unistd.h>
+
#include "buffer.h"
-#include "exit.h"
#include "error.h"
-#include "ipalloc.h"
-#include "tcpto.h"
-#include "auto_qmail.h"
+#include "exit.h"
+#include "fd.h"
#include "open.h"
#include "pathexec.h"
+#include "wait.h"
+
+#include "auto_qmail.h"
+#include "ipalloc.h"
+#include "tcpto.h"
-void initialize(int argc,char **argv) { tcpto_clean(); }
+void initialize(int argc, char **argv)
+{
+ tcpto_clean();
+}
int truncreport = 0;
-void report(buffer *log,int wstat,char *s,int len)
+void report(buffer *log, int wstat, char *s, int len)
{
int j;
int k;
int result;
int orr;
- if (wait_crashed(wstat)) { buffer_putsflush(log,"Zqmail-spawn: qmail-remote crashed.\n"); return; }
+ if (wait_crashed(wstat)) {
+ buffer_putsflush(log, "Zqmail-spawn: qmail-remote crashed.\n");
+ return;
+ }
switch (wait_exitcode(wstat)) {
- case 0: break;
- case 111: buffer_putsflush(log,"Zqmail-rspawn: Unable to run qmail-remote.\n"); break;
- default: buffer_putsflush(log,"Dqmail-rspawn: Unable to run qmail-remote. \n"); return;
+ case 0: break;
+ case 111: buffer_putsflush(log, "Zqmail-rspawn: Unable to run qmail-remote.\n"); break;
+ default: buffer_putsflush(log, "Dqmail-rspawn: Unable to run qmail-remote. \n"); return;
}
- if (!len) { buffer_putsflush(log,"Zqmail-rspawn: qmail-remote produced no output.\n"); return; }
+ if (!len) {
+ buffer_putsflush(log, "Zqmail-rspawn: qmail-remote produced no output.\n");
+ return;
+ }
result = -1;
j = 0;
for (k = 0; k < len; ++k)
if (!s[k]) {
- if (s[j] == 'K') { result = 1; break; }
- if (s[j] == 'Z') { result = 0; break; }
+ if (s[j] == 'K') {
+ result = 1;
+ break;
+ }
+ if (s[j] == 'Z') {
+ result = 0;
+ break;
+ }
if (s[j] == 'D') break;
j = k + 1;
}
@@ -51,34 +68,35 @@ void report(buffer *log,int wstat,char *s,int len)
}
switch (orr) {
- case 1: buffer_put(log,"K",1); break;
- case 0: buffer_put(log,"Z",1); break;
- case -1: buffer_put(log,"D",1); break;
+ case 1: buffer_put(log, "K", 1); break;
+ case 0: buffer_put(log, "Z", 1); break;
+ case -1: buffer_put(log, "D", 1); break;
}
for (k = 1; k < len;)
if (!s[k++]) {
- buffer_puts(log,s + 1);
+ buffer_puts(log, s + 1);
if (result <= orr)
- if (k < len)
- switch (s[k]) {
- case 'Z': case 'D': case 'K':
- buffer_puts(log,s + k + 1);
+ if (k < len) switch (s[k])
+ {
+ case 'Z':
+ case 'D':
+ case 'K': buffer_puts(log, s + k + 1);
}
- break;
- }
+ break;
+ }
}
-int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
+int spawn(int fdmess, int fdout, const char *s, char *r, const int at)
{
int f;
char *(args[5]);
struct stat st;
if (chdir(auto_qmail) == -1) _exit(110);
- if (!stat("control/dkimdomains",&st))
+ if (!stat("control/dkimdomains", &st))
args[0] = "qmail-dksign";
- else
+ else
args[0] = "qmail-remote";
args[1] = r + at + 1;
args[2] = s;
@@ -88,9 +106,9 @@ int spawn(int fdmess,int fdout,const char *s,char *r,const int at)
if (chdir("queue/mess") == -1) _exit(110);
if (!(f = vfork())) {
- if (fd_move(0,fdmess) == -1) _exit(111);
- if (fd_move(1,fdout) == -1) _exit(111);
- if (fd_copy(2,1) == -1) _exit(111);
+ if (fd_move(0, fdmess) == -1) _exit(111);
+ if (fd_move(1, fdout) == -1) _exit(111);
+ if (fd_copy(2, 1) == -1) _exit(111);
pathexec(args);
if (errno) _exit(111);
_exit(100);
diff --git a/src/qmail-send.c b/src/qmail-send.c
index 76925d2..5305d95 100644
--- a/src/qmail-send.c
+++ b/src/qmail-send.c
@@ -1,41 +1,44 @@
-#include <sys/types.h>
#include <sys/stat.h>
-#include <string.h>
+#include <sys/types.h>
#include <unistd.h>
#include <utime.h>
-#include "error.h"
-#include "sig.h"
+
+#include <string.h>
+
+#include "alloc.h"
+#include "buffer.h"
+#include "byte.h"
+#include "case.h"
+#include "constmap.h"
#include "direntry.h"
-#include "control.h"
-#include "select.h"
-#include "open.h"
-#include "seek.h"
+#include "error.h"
#include "exit.h"
-#include "lock.h"
-#include "ndelay.h"
-#include "now.h"
-#include "getln.h"
-#include "buffer.h"
-#include "alloc.h"
+#include "fmt.h"
#include "genalloc.h"
-#include "stralloc.h"
+#include "getln.h"
+#include "lock.h"
#include "logmsg.h"
-#include "str.h"
-#include "byte.h"
-#include "fmt.h"
+#include "ndelay.h"
+#include "open.h"
#include "scan.h"
-#include "case.h"
+#include "seek.h"
+#include "select.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+
#include "auto_qmail.h"
-#include "trigger.h"
+#include "control.h"
+#include "fmtqfn.h"
#include "newfield.h"
-#include "quote.h"
+#include "now.h"
+#include "prioq.h"
#include "qmail.h"
#include "qsutil.h"
-#include "prioq.h"
-#include "constmap.h"
-#include "fmtqfn.h"
+#include "quote.h"
#include "readsubdir.h"
#include "sendtodo.h"
+#include "trigger.h"
int lifetime = 604800;
int bouncemaxbytes = 0;
@@ -56,30 +59,42 @@ char strnum2[FMT_ULONG];
char strnum3[FMT_ULONG];
#define CHANNELS 2
-char *chanaddr[CHANNELS] = { "local/", "remote/" };
-char *chanstatusmsg[CHANNELS] = { " local ", " remote " };
-char *tochan[CHANNELS] = { " to local ", " to remote " };
-int chanfdout[CHANNELS] = { 1, 3 };
-int chanfdin[CHANNELS] = { 2, 4 };
-int chanskip[CHANNELS] = { 10, 20 };
-
-int flagexitasap = 0; void sigterm() { flagexitasap = 1; }
-int flagrunasap = 0; void sigalrm() { flagrunasap = 1; }
-int flagreadasap = 0; void sighup() { flagreadasap = 1; }
-
-void cleandied()
-{
- log1s("alert: lost connection to qmail-clean ... exiting\n");
- flagexitasap = 1;
+char *chanaddr[CHANNELS] = {"local/", "remote/"};
+char *chanstatusmsg[CHANNELS] = {" local ", " remote "};
+char *tochan[CHANNELS] = {" to local ", " to remote "};
+int chanfdout[CHANNELS] = {1, 3};
+int chanfdin[CHANNELS] = {2, 4};
+int chanskip[CHANNELS] = {10, 20};
+
+int flagexitasap = 0;
+void sigterm()
+{
+ flagexitasap = 1;
+}
+int flagrunasap = 0;
+void sigalrm()
+{
+ flagrunasap = 1;
+}
+int flagreadasap = 0;
+void sighup()
+{
+ flagreadasap = 1;
+}
+
+void cleandied()
+{
+ log1s("alert: lost connection to qmail-clean ... exiting\n");
+ flagexitasap = 1;
}
int flagspawnalive[CHANNELS];
-void spawndied(int c)
-{
- log1s("alert: oh no! lost spawn connection! dying...\n");
- flagspawnalive[c] = 0;
- flagexitasap = 1;
+void spawndied(int c)
+{
+ log1s("alert: oh no! lost spawn connection! dying...\n");
+ flagspawnalive[c] = 0;
+ flagexitasap = 1;
}
#define REPORTMAX 10000
@@ -95,22 +110,43 @@ char fnmake_strnum[FMT_ULONG];
void fnmake_init()
{
- while (!stralloc_ready(&fn,FMTQFN)) nomem();
- while (!stralloc_ready(&fn2,FMTQFN)) nomem();
+ while (!stralloc_ready(&fn, FMTQFN)) nomem();
+ while (!stralloc_ready(&fn2, FMTQFN)) nomem();
}
-void fnmake_info(unsigned long id) { fn.len = fmtqfn(fn.s,"info/",id,1); }
-void fnmake_todo(unsigned long id) { fn.len = fmtqfn(fn.s,"todo/",id,1); }
-void fnmake_mess(unsigned long id) { fn.len = fmtqfn(fn.s,"mess/",id,1); }
-void fnmake_foop(unsigned long id) { fn.len = fmtqfn(fn.s,"foop/",id,0); }
-void fnmake_split(unsigned long id) { fn.len = fmtqfn(fn.s,"",id,1); }
-void fnmake2_bounce(unsigned long id) { fn2.len = fmtqfn(fn2.s,"bounce/",id,0); }
-void fnmake_chanaddr(unsigned long id,int c) { fn.len = fmtqfn(fn.s,chanaddr[c],id,1); }
+void fnmake_info(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "info/", id, 1);
+}
+void fnmake_todo(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "todo/", id, 1);
+}
+void fnmake_mess(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "mess/", id, 1);
+}
+void fnmake_foop(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "foop/", id, 0);
+}
+void fnmake_split(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "", id, 1);
+}
+void fnmake2_bounce(unsigned long id)
+{
+ fn2.len = fmtqfn(fn2.s, "bounce/", id, 0);
+}
+void fnmake_chanaddr(unsigned long id, int c)
+{
+ fn.len = fmtqfn(fn.s, chanaddr[c], id, 1);
+}
/* this file is too long ----------------------------------------- REWRITING */
-void senderadd(stralloc *sa,char *sender,char *recip)
+void senderadd(stralloc *sa, char *sender, char *recip)
{
int i;
int j;
@@ -118,27 +154,27 @@ void senderadd(stralloc *sa,char *sender,char *recip)
i = str_len(sender);
if (i >= 4)
- if (str_equal(sender + i - 4,"-@[]")) {
- j = byte_rchr(sender,i - 4,'@');
- k = str_rchr(recip,'@');
+ if (str_equal(sender + i - 4, "-@[]")) {
+ j = byte_rchr(sender, i - 4, '@');
+ k = str_rchr(recip, '@');
if (recip[k] && (j + 5 <= i)) {
/* owner-@host-@[] -> owner-recipbox=reciphost@host */
- while (!stralloc_catb(sa,sender,j)) nomem();
- while (!stralloc_catb(sa,recip,k)) nomem();
- while (!stralloc_cats(sa,"=")) nomem();
- while (!stralloc_cats(sa,recip + k + 1)) nomem();
- while (!stralloc_cats(sa,"@")) nomem();
- while (!stralloc_catb(sa,sender + j + 1,i - 5 - j)) nomem();
+ while (!stralloc_catb(sa, sender, j)) nomem();
+ while (!stralloc_catb(sa, recip, k)) nomem();
+ while (!stralloc_cats(sa, "=")) nomem();
+ while (!stralloc_cats(sa, recip + k + 1)) nomem();
+ while (!stralloc_cats(sa, "@")) nomem();
+ while (!stralloc_catb(sa, sender + j + 1, i - 5 - j)) nomem();
return;
}
}
- while (!stralloc_cats(sa,sender)) nomem();
+ while (!stralloc_cats(sa, sender)) nomem();
}
/* this file is too long ---------------------------------------------- INFO */
-int getinfo(stralloc *sa,datetime_sec *dt,unsigned long id)
+int getinfo(stralloc *sa, datetime_sec *dt, unsigned long id)
{
int fdnumber;
struct stat st;
@@ -150,15 +186,21 @@ int getinfo(stralloc *sa,datetime_sec *dt,unsigned long id)
fnmake_info(id);
fdnumber = open_read(fn.s);
if (fdnumber == -1) return 0;
- if (fstat(fdnumber,&st) == -1) { close(fdnumber); return 0; }
- buffer_init(&b,read,fdnumber,buf,sizeof(buf));
- if (getln(&b,&line,&match,'\0') == -1) { close(fdnumber); return 0; }
+ if (fstat(fdnumber, &st) == -1) {
+ close(fdnumber);
+ return 0;
+ }
+ buffer_init(&b, read, fdnumber, buf, sizeof(buf));
+ if (getln(&b, &line, &match, '\0') == -1) {
+ close(fdnumber);
+ return 0;
+ }
close(fdnumber);
if (!match) return 0;
if (line.s[0] != 'F') return 0;
*dt = st.st_mtime;
- while (!stralloc_copys(sa,line.s + 1)) nomem();
+ while (!stralloc_copys(sa, line.s + 1)) nomem();
while (!stralloc_0(sa)) nomem();
return 1;
}
@@ -166,21 +208,23 @@ int getinfo(stralloc *sa,datetime_sec *dt,unsigned long id)
/* this file is too long ------------------------------------- COMMUNICATION */
-buffer toqc; char toqcbuf[1024];
-buffer fromqc; char fromqcbuf[1024];
-stralloc comm_buf[CHANNELS] = { {0}, {0} };
+buffer toqc;
+char toqcbuf[1024];
+buffer fromqc;
+char fromqcbuf[1024];
+stralloc comm_buf[CHANNELS] = {{0}, {0}};
int comm_pos[CHANNELS];
void comm_init()
{
int c;
- buffer_init(&toqc,write,5,toqcbuf,sizeof(toqcbuf));
- buffer_init(&fromqc,read,6,fromqcbuf,sizeof(fromqcbuf));
+ buffer_init(&toqc, write, 5, toqcbuf, sizeof(toqcbuf));
+ buffer_init(&fromqc, read, 6, fromqcbuf, sizeof(fromqcbuf));
for (c = 0; c < CHANNELS; ++c)
if (ndelay_on(chanfdout[c]) == -1)
- /* this is so stupid: NDELAY semantics should be default on write */
- spawndied(c); /* drastic, but better than risking deadlock */
+ /* this is so stupid: NDELAY semantics should be default on write */
+ spawndied(c); /* drastic, but better than risking deadlock */
}
int comm_canwrite(int c)
@@ -190,34 +234,33 @@ int comm_canwrite(int c)
return 1;
}
-void comm_write(int c,int delnum,unsigned long id,char *sender,char *recip)
+void comm_write(int c, int delnum, unsigned long id, char *sender, char *recip)
{
char ch;
if (comm_buf[c].s && comm_buf[c].len) return;
- while (!stralloc_copys(&comm_buf[c],"")) nomem();
+ while (!stralloc_copys(&comm_buf[c], "")) nomem();
ch = delnum;
- while (!stralloc_append(&comm_buf[c],&ch)) nomem();
+ while (!stralloc_append(&comm_buf[c], &ch)) nomem();
fnmake_split(id);
- while (!stralloc_cats(&comm_buf[c],fn.s)) nomem();
+ while (!stralloc_cats(&comm_buf[c], fn.s)) nomem();
while (!stralloc_0(&comm_buf[c])) nomem();
- senderadd(&comm_buf[c],sender,recip);
+ senderadd(&comm_buf[c], sender, recip);
while (!stralloc_0(&comm_buf[c])) nomem();
- while (!stralloc_cats(&comm_buf[c],recip)) nomem();
+ while (!stralloc_cats(&comm_buf[c], recip)) nomem();
while (!stralloc_0(&comm_buf[c])) nomem();
comm_pos[c] = 0;
}
-void comm_selprep(int *nfds,fd_set *wfds)
+void comm_selprep(int *nfds, fd_set *wfds)
{
int c;
for (c = 0; c < CHANNELS; ++c)
if (flagspawnalive[c])
if (comm_buf[c].s && comm_buf[c].len) {
- FD_SET(chanfdout[c],wfds);
- if (*nfds <= chanfdout[c])
- *nfds = chanfdout[c] + 1;
+ FD_SET(chanfdout[c], wfds);
+ if (*nfds <= chanfdout[c]) *nfds = chanfdout[c] + 1;
}
}
@@ -228,23 +271,22 @@ void comm_do(fd_set *wfds)
for (c = 0; c < CHANNELS; ++c)
if (flagspawnalive[c])
if (comm_buf[c].s && comm_buf[c].len)
- if (FD_ISSET(chanfdout[c],wfds)) {
+ if (FD_ISSET(chanfdout[c], wfds)) {
int w;
int len;
len = comm_buf[c].len;
- w = write(chanfdout[c],comm_buf[c].s + comm_pos[c],len - comm_pos[c]);
+ w = write(chanfdout[c], comm_buf[c].s + comm_pos[c], len - comm_pos[c]);
if (w <= 0) {
if ((w == -1) && (errno == EPIPE))
spawndied(c);
else
- continue; /* kernel select() bug; can't avoid busy-looping */
+ continue; /* kernel select() bug; can't avoid busy-looping */
} else {
- comm_pos[c] += w;
- if (comm_pos[c] == len)
- comm_buf[c].len = 0;
+ comm_pos[c] += w;
+ if (comm_pos[c] == len) comm_buf[c].len = 0;
}
- }
+ }
}
@@ -274,40 +316,45 @@ void cleanup_do()
if (!flagcleanup) {
if (recent < cleanuptime) return;
- readsubdir_init(&cleanupdir,"mess",pausedir);
+ readsubdir_init(&cleanupdir, "mess", pausedir);
flagcleanup = 1;
}
- switch (readsubdir_next(&cleanupdir,&id)) {
- case 1: break;
+ switch (readsubdir_next(&cleanupdir, &id)) {
+ case 1: break;
case 0: flagcleanup = 0; cleanuptime = recent + SLEEP_CLEANUP;
default: return;
}
fnmake_mess(id);
- if (stat(fn.s,&st) == -1) return; /* probably qmail-queue deleted it */
+ if (stat(fn.s, &st) == -1) return; /* probably qmail-queue deleted it */
if (recent <= st.st_atime + OSSIFIED) return;
fnmake_info(id);
- if (stat(fn.s,&st) == 0) return;
+ if (stat(fn.s, &st) == 0) return;
if (errno != ENOENT) return;
fnmake_todo(id);
- if (stat(fn.s,&st) == 0) return;
+ if (stat(fn.s, &st) == 0) return;
if (errno != ENOENT) return;
fnmake_foop(id);
- if (buffer_putflush(&toqc,fn.s,fn.len) == -1) { cleandied(); return; }
- if (buffer_get(&fromqc,&ch,1) != 1) { cleandied(); return; }
- if (ch != '+')
- log3s("warning: qmail-clean unable to clean up ",fn.s,"\n");
+ if (buffer_putflush(&toqc, fn.s, fn.len) == -1) {
+ cleandied();
+ return;
+ }
+ if (buffer_get(&fromqc, &ch, 1) != 1) {
+ cleandied();
+ return;
+ }
+ if (ch != '+') log3s("warning: qmail-clean unable to clean up ", fn.s, "\n");
}
/* this file is too long ----------------------------------- PRIORITY QUEUES */
prioq pqdone = {0}; /* -todo +info; HOPEFULLY -local -remote */
-prioq pqchan[CHANNELS] = { {0}, {0} };
+prioq pqchan[CHANNELS] = {{0}, {0}};
/* pqchan 0: -todo +info +local ?remote */
/* pqchan 1: -todo +info ?local +remote */
prioq pqfail = {0}; /* stat() failure; has to be pqadded again */
@@ -320,42 +367,51 @@ void pqadd(unsigned long id)
struct stat st;
int c;
-#define CHECKSTAT if (errno != ENOENT) goto FAIL;
+#define CHECKSTAT \
+ if (errno != ENOENT) goto FAIL;
fnmake_info(id);
- if (stat(fn.s,&st) == -1) {
+ if (stat(fn.s, &st) == -1) {
CHECKSTAT
return; /* someone yanking our chain */
}
fnmake_todo(id);
- if (stat(fn.s,&st) != -1) return; /* look, ma, dad crashed writing info! */
+ if (stat(fn.s, &st) != -1) return; /* look, ma, dad crashed writing info! */
CHECKSTAT
for (c = 0; c < CHANNELS; ++c) {
- fnmake_chanaddr(id,c);
- if (stat(fn.s,&st) == -1) { flagchan[c] = 0; CHECKSTAT }
- else { flagchan[c] = 1; pechan[c].id = id; pechan[c].dt = st.st_mtime; }
+ fnmake_chanaddr(id, c);
+ if (stat(fn.s, &st) == -1) {
+ flagchan[c] = 0;
+ CHECKSTAT
+ } else {
+ flagchan[c] = 1;
+ pechan[c].id = id;
+ pechan[c].dt = st.st_mtime;
+ }
}
for (c = 0; c < CHANNELS; ++c)
if (flagchan[c])
- while (!prioq_insert(&pqchan[c],&pechan[c])) nomem();
+ while (!prioq_insert(&pqchan[c], &pechan[c])) nomem();
- for (c = 0; c < CHANNELS; ++c)
+ for (c = 0; c < CHANNELS; ++c)
if (flagchan[c]) break;
if (c == CHANNELS) {
- pe.id = id; pe.dt = now();
- while (!prioq_insert(&pqdone,&pe)) nomem();
+ pe.id = id;
+ pe.dt = now();
+ while (!prioq_insert(&pqdone, &pe)) nomem();
}
return;
- FAIL:
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
- pe.id = id; pe.dt = now() + SLEEP_SYSFAIL;
- while (!prioq_insert(&pqfail,&pe)) nomem();
+FAIL:
+ log3s("warning: unable to stat ", fn.s, "; will try again later\n");
+ pe.id = id;
+ pe.dt = now() + SLEEP_SYSFAIL;
+ while (!prioq_insert(&pqfail, &pe)) nomem();
}
void pqstart()
@@ -364,9 +420,9 @@ void pqstart()
int x;
unsigned long id;
- readsubdir_init(&rs,"info",pausedir);
+ readsubdir_init(&rs, "info", pausedir);
- while ((x = readsubdir_next(&rs,&id)))
+ while ((x = readsubdir_next(&rs, &id)))
if (x > 0) pqadd(id);
}
@@ -377,12 +433,12 @@ void pqfinish()
time_t ut[2]; /* XXX: more portable than utimbuf, but still worrisome */
for (c = 0; c < CHANNELS; ++c)
- while (prioq_min(&pqchan[c],&pe)) {
+ while (prioq_min(&pqchan[c], &pe)) {
prioq_delmin(&pqchan[c]);
- fnmake_chanaddr(pe.id,c);
+ fnmake_chanaddr(pe.id, c);
ut[0] = ut[1] = pe.dt;
- if (utime(fn.s,ut) == -1)
- log3s("warning: unable to utime ",fn.s,"; message will be retried too soon\n");
+ if (utime(fn.s, ut) == -1)
+ log3s("warning: unable to utime ", fn.s, "; message will be retried too soon\n");
}
}
@@ -394,16 +450,14 @@ void pqrun()
for (c = 0; c < CHANNELS; ++c)
if (pqchan[c].p)
if (pqchan[c].len)
- for (i = 0; i < pqchan[c].len; ++i)
- pqchan[c].p[i].dt = recent;
+ for (i = 0; i < pqchan[c].len; ++i) pqchan[c].p[i].dt = recent;
}
/* this file is too long ---------------------------------------------- JOBS */
-struct job
-{
- int refs; /* if 0, this struct is unused */
+struct job {
+ int refs; /* if 0, this struct is unused */
unsigned long id;
int channel;
datetime_sec retry;
@@ -420,7 +474,7 @@ void job_init()
{
int j;
- while (!(jo = (struct job *) alloc(numjobs * sizeof(struct job)))) nomem();
+ while (!(jo = (struct job *)alloc(numjobs * sizeof(struct job)))) nomem();
for (j = 0; j < numjobs; ++j) {
jo[j].refs = 0;
jo[j].sender.s = 0;
@@ -431,16 +485,16 @@ int job_avail()
{
int j;
- for (j = 0; j < numjobs; ++j)
+ for (j = 0; j < numjobs; ++j)
if (!jo[j].refs) return 1;
return 0;
}
-int job_open(unsigned long id,int channel)
+int job_open(unsigned long id, int channel)
{
int j;
- for (j = 0; j < numjobs; ++j)
+ for (j = 0; j < numjobs; ++j)
if (!jo[j].refs) break;
if (j == numjobs) return -1;
jo[j].refs = 1;
@@ -463,26 +517,27 @@ void job_close(int j)
pe.dt = jo[j].retry;
if (jo[j].flaghiteof && !jo[j].numtodo) {
- fnmake_chanaddr(jo[j].id,jo[j].channel);
+ fnmake_chanaddr(jo[j].id, jo[j].channel);
if (unlink(fn.s) == -1) {
- log3s("warning: unable to unlink ",fn.s,"; will try again later\n");
+ log3s("warning: unable to unlink ", fn.s, "; will try again later\n");
pe.dt = now() + SLEEP_SYSFAIL;
} else {
- for (c = 0; c < CHANNELS; ++c) if (c != jo[j].channel) {
- fnmake_chanaddr(jo[j].id,c);
- if (stat(fn.s,&st) == 0) return; /* more channels going */
- if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"\n");
- break; /* this is the only reason for HOPEFULLY */
- }
- }
- pe.dt = now();
- while (!prioq_insert(&pqdone,&pe)) nomem();
- return;
+ for (c = 0; c < CHANNELS; ++c)
+ if (c != jo[j].channel) {
+ fnmake_chanaddr(jo[j].id, c);
+ if (stat(fn.s, &st) == 0) return; /* more channels going */
+ if (errno != ENOENT) {
+ log3s("warning: unable to stat ", fn.s, "\n");
+ break; /* this is the only reason for HOPEFULLY */
+ }
+ }
+ pe.dt = now();
+ while (!prioq_insert(&pqdone, &pe)) nomem();
+ return;
}
}
- while (!prioq_insert(&pqchan[jo[j].channel],&pe)) nomem();
+ while (!prioq_insert(&pqchan[jo[j].channel], &pe)) nomem();
}
@@ -495,17 +550,17 @@ char *stripvdomprepend(char *recip)
int domainlen;
char *prepend;
- i = str_rchr(recip,'@');
+ i = str_rchr(recip, '@');
if (!recip[i]) return recip;
domain = recip + i + 1;
domainlen = str_len(domain);
for (i = 0; i <= domainlen; ++i)
if ((i == 0) || (i == domainlen) || (domain[i] == '.'))
- if ((prepend = constmap(&mapvdoms,domain + i,domainlen - i))) {
+ if ((prepend = constmap(&mapvdoms, domain + i, domainlen - i))) {
if (!*prepend) break;
i = str_len(prepend);
- if (str_diffn(recip,prepend,i)) break;
+ if (str_diffn(recip, prepend, i)) break;
if (recip[i] != '-') break;
return recip + i + 1;
}
@@ -515,32 +570,30 @@ char *stripvdomprepend(char *recip)
stralloc bouncetext = {0};
-void addbounce(unsigned long id,char *recip,char *report)
+void addbounce(unsigned long id, char *recip, char *report)
{
int fd;
int pos;
int w;
- while (!stralloc_copys(&bouncetext,"<")) nomem();
- while (!stralloc_cats(&bouncetext,stripvdomprepend(recip))) nomem();
+ while (!stralloc_copys(&bouncetext, "<")) nomem();
+ while (!stralloc_cats(&bouncetext, stripvdomprepend(recip))) nomem();
for (pos = 0; pos < bouncetext.len; ++pos)
- if (bouncetext.s[pos] == '\n')
- bouncetext.s[pos] = '_';
+ if (bouncetext.s[pos] == '\n') bouncetext.s[pos] = '_';
- while (!stralloc_cats(&bouncetext,">:\n")) nomem();
- while (!stralloc_cats(&bouncetext,report)) nomem();
+ while (!stralloc_cats(&bouncetext, ">:\n")) nomem();
+ while (!stralloc_cats(&bouncetext, report)) nomem();
if (report[0])
if (report[str_len(report) - 1] != '\n')
- while (!stralloc_cats(&bouncetext,"\n")) nomem();
+ while (!stralloc_cats(&bouncetext, "\n")) nomem();
for (pos = bouncetext.len - 2; pos > 0; --pos)
if (bouncetext.s[pos] == '\n')
- if (bouncetext.s[pos - 1] == '\n')
- bouncetext.s[pos] = '/';
+ if (bouncetext.s[pos - 1] == '\n') bouncetext.s[pos] = '/';
- while (!stralloc_cats(&bouncetext,"\n")) nomem();
+ while (!stralloc_cats(&bouncetext, "\n")) nomem();
fnmake2_bounce(id);
for (;;) {
@@ -553,12 +606,11 @@ void addbounce(unsigned long id,char *recip,char *report)
pos = 0;
while (pos < bouncetext.len) {
- w = write(fd,bouncetext.s + pos,bouncetext.len - pos);
+ w = write(fd, bouncetext.s + pos, bouncetext.len - pos);
if (w <= 0) {
log1s("alert: unable to append to bounce message; HELP! sleeping...\n");
sleep(10);
- }
- else
+ } else
pos += w;
}
close(fd);
@@ -582,11 +634,11 @@ int injectbounce(unsigned long id)
int bytestogo;
int bytestoget;
- if (!getinfo(&sender,&birth,id)) return 0; /* XXX: print warning */
+ if (!getinfo(&sender, &birth, id)) return 0; /* XXX: print warning */
/* owner-@host-@[] -> owner-@host */
if (sender.len >= 5)
- if (str_equal(sender.s + sender.len - 5,"-@[]")) {
+ if (str_equal(sender.s + sender.len - 5, "-@[]")) {
sender.len -= 4;
sender.s[sender.len - 1] = 0;
}
@@ -594,109 +646,121 @@ int injectbounce(unsigned long id)
fnmake2_bounce(id);
fnmake_mess(id);
- if (stat(fn2.s,&st) == -1) {
+ if (stat(fn2.s, &st) == -1) {
if (errno == ENOENT) return 1;
- log3s("warning: unable to stat ",fn2.s,"\n");
+ log3s("warning: unable to stat ", fn2.s, "\n");
return 0;
}
-
- if (str_equal(sender.s,"#@[]"))
- log3s("triple bounce: discarding ",fn2.s,"\n");
- else if (!*sender.s && *doublebounceto.s == '@')
- log3s("double bounce: discarding ",fn2.s,"\n");
+
+ if (str_equal(sender.s, "#@[]"))
+ log3s("triple bounce: discarding ", fn2.s, "\n");
+ else if (!*sender.s && *doublebounceto.s == '@')
+ log3s("double bounce: discarding ", fn2.s, "\n");
else {
- if (qmail_open(&qqt) == -1)
- { log1s("warning: unable to start qmail-queue, will try later\n"); return 0; }
+ if (qmail_open(&qqt) == -1) {
+ log1s("warning: unable to start qmail-queue, will try later\n");
+ return 0;
+ }
qp = qmail_qp(&qqt);
- if (*sender.s) { bouncesender = ""; bouncerecip = sender.s; }
- else { bouncesender = "#@[]"; bouncerecip = doublebounceto.s; }
+ if (*sender.s) {
+ bouncesender = "";
+ bouncerecip = sender.s;
+ } else {
+ bouncesender = "#@[]";
+ bouncerecip = doublebounceto.s;
+ }
while (!newfield_datemake(now())) nomem();
- qmail_put(&qqt,newfield_date.s,newfield_date.len);
- qmail_puts(&qqt,"From: ");
- while (!quote(&quoted,&bouncefrom)) nomem();
- qmail_put(&qqt,quoted.s,quoted.len);
- qmail_puts(&qqt,"@");
- qmail_put(&qqt,bouncehost.s,bouncehost.len);
- qmail_puts(&qqt,"\nTo: ");
- while (!quote2(&quoted,bouncerecip)) nomem();
- qmail_put(&qqt,quoted.s,quoted.len);
- qmail_puts(&qqt,"\n\
+ qmail_put(&qqt, newfield_date.s, newfield_date.len);
+ qmail_puts(&qqt, "From: ");
+ while (!quote(&quoted, &bouncefrom)) nomem();
+ qmail_put(&qqt, quoted.s, quoted.len);
+ qmail_puts(&qqt, "@");
+ qmail_put(&qqt, bouncehost.s, bouncehost.len);
+ qmail_puts(&qqt, "\nTo: ");
+ while (!quote2(&quoted, bouncerecip)) nomem();
+ qmail_put(&qqt, quoted.s, quoted.len);
+ qmail_puts(
+ &qqt,
+ "\n\
Subject: failure notice\n\
\n\
Hi. This is the qmail-send program at ");
- qmail_put(&qqt,bouncehost.s,bouncehost.len);
- qmail_puts(&qqt,*sender.s ? ".\n\
+ qmail_put(&qqt, bouncehost.s, bouncehost.len);
+ qmail_puts(
+ &qqt,
+ *sender.s ? ".\n\
I'm afraid I wasn't able to deliver your message to the following addresses.\n\
This is a permanent error; I've given up. Sorry it didn't work out.\n\
\n\
-" : ".\n\
+"
+ : ".\n\
I tried to deliver a bounce message to this address, but the bounce bounced!\n\
\n\
");
fd = open_read(fn2.s);
if (fd == -1)
- qmail_fail(&qqt);
+ qmail_fail(&qqt);
else {
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
- while ((r = buffer_get(&bi,buf,sizeof(buf))) > 0)
- qmail_put(&qqt,buf,r);
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
+ while ((r = buffer_get(&bi, buf, sizeof(buf))) > 0) qmail_put(&qqt, buf, r);
close(fd);
if (r == -1) qmail_fail(&qqt);
}
- qmail_puts(&qqt,*sender.s ? "--- Below this line is a copy of the message.\n\n" : "--- Below this line is the original bounce.\n\n");
- qmail_puts(&qqt,"Return-Path: <");
- while (!quote2(&quoted,sender.s)) nomem();
- qmail_put(&qqt,quoted.s,quoted.len);
- qmail_puts(&qqt,">\n");
+ qmail_puts(
+ &qqt,
+ *sender.s ? "--- Below this line is a copy of the message.\n\n"
+ : "--- Below this line is the original bounce.\n\n");
+ qmail_puts(&qqt, "Return-Path: <");
+ while (!quote2(&quoted, sender.s)) nomem();
+ qmail_put(&qqt, quoted.s, quoted.len);
+ qmail_puts(&qqt, ">\n");
fd = open_read(fn.s);
- if (fd == -1)
+ if (fd == -1)
qmail_fail(&qqt);
else {
if (bouncemaxbytes) {
bytestogo = bouncemaxbytes;
bytestoget = (bytestogo < sizeof(buf)) ? bytestogo : sizeof(buf);
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
- while (bytestoget > 0 && (r = buffer_get(&bi,buf,bytestoget)) > 0) {
- qmail_put(&qqt,buf,r);
+ while (bytestoget > 0 && (r = buffer_get(&bi, buf, bytestoget)) > 0) {
+ qmail_put(&qqt, buf, r);
bytestogo -= bytestoget;
bytestoget = (bytestogo < sizeof(buf)) ? bytestogo : sizeof(buf);
}
- if (r > 0)
- qmail_puts(&qqt,"\n\n--- Rest of message truncated.\n");
- } else { /* preserve default behavior */
- buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
+ if (r > 0) qmail_puts(&qqt, "\n\n--- Rest of message truncated.\n");
+ } else { /* preserve default behavior */
+ buffer_init(&bi, read, fd, inbuf, sizeof(inbuf));
- while ((r = buffer_get(&bi,buf,sizeof(buf))) > 0)
- qmail_put(&qqt,buf,r);
+ while ((r = buffer_get(&bi, buf, sizeof(buf))) > 0) qmail_put(&qqt, buf, r);
}
close(fd);
if (r == -1) qmail_fail(&qqt);
}
- qmail_from(&qqt,bouncesender);
- qmail_to(&qqt,bouncerecip);
+ qmail_from(&qqt, bouncesender);
+ qmail_to(&qqt, bouncerecip);
- if (*qmail_close(&qqt)) {
+ if (*qmail_close(&qqt)) {
log1s("warning: trouble injecting bounce message, will try later\n");
- return 0;
+ return 0;
}
- strnum2[fmt_ulong(strnum2,id)] = 0;
- log2s("bounce msg ",strnum2);
- strnum2[fmt_ulong(strnum2,qp)] = 0;
- log3s(" qp ",strnum2,"\n");
+ strnum2[fmt_ulong(strnum2, id)] = 0;
+ log2s("bounce msg ", strnum2);
+ strnum2[fmt_ulong(strnum2, qp)] = 0;
+ log3s(" qp ", strnum2, "\n");
}
if (unlink(fn2.s) != 0) {
- log3s("warning: unable to unlink ",fn2.s,"\n");
+ log3s("warning: unable to unlink ", fn2.s, "\n");
return 0;
}
@@ -715,8 +779,8 @@ struct del {
};
unsigned long masterdelid = 1;
-unsigned int concurrency[CHANNELS] = { 10, 20 };
-unsigned int concurrencyused[CHANNELS] = { 0, 0 };
+unsigned int concurrency[CHANNELS] = {10, 20};
+unsigned int concurrencyused[CHANNELS] = {0, 0};
struct del *d[CHANNELS];
stralloc dline[CHANNELS];
char delbuf[2048];
@@ -727,10 +791,10 @@ void del_status()
log1s("status:");
for (c = 0; c < CHANNELS; ++c) {
- strnum2[fmt_ulong(strnum2,(unsigned long) concurrencyused[c])] = 0;
- strnum3[fmt_ulong(strnum3,(unsigned long) concurrency[c])] = 0;
- log2s(chanstatusmsg[c],strnum2);
- log2s("/",strnum3);
+ strnum2[fmt_ulong(strnum2, (unsigned long)concurrencyused[c])] = 0;
+ strnum3[fmt_ulong(strnum3, (unsigned long)concurrency[c])] = 0;
+ log2s(chanstatusmsg[c], strnum2);
+ log2s("/", strnum3);
}
if (flagexitasap) log1s(" exitasap");
log1s("\n");
@@ -743,12 +807,13 @@ void del_init()
for (c = 0; c < CHANNELS; ++c) {
flagspawnalive[c] = 1;
- while (!(d[c] = (struct del *) alloc(concurrency[c] * sizeof(struct del))))
- nomem();
- for (i = 0; i < concurrency[c]; ++i)
- { d[c][i].used = 0; d[c][i].recip.s = 0; }
- dline[c].s = 0;
- while (!stralloc_copys(&dline[c],"")) nomem();
+ while (!(d[c] = (struct del *)alloc(concurrency[c] * sizeof(struct del)))) nomem();
+ for (i = 0; i < concurrency[c]; ++i) {
+ d[c][i].used = 0;
+ d[c][i].recip.s = 0;
+ }
+ dline[c].s = 0;
+ while (!stralloc_copys(&dline[c], "")) nomem();
}
del_status();
@@ -759,8 +824,8 @@ int del_canexit()
int c;
for (c = 0; c < CHANNELS; ++c)
- if (flagspawnalive[c]) /* if dead, nothing we can do about its jobs */
- if (concurrencyused[c]) return 0;
+ if (flagspawnalive[c]) /* if dead, nothing we can do about its jobs */
+ if (concurrencyused[c]) return 0;
return 1;
}
@@ -769,7 +834,7 @@ int del_avail(int c)
return flagspawnalive[c] && comm_canwrite(c) && (concurrencyused[c] < concurrency[c]);
}
-void del_start(int j,seek_pos mpos,char *recip)
+void del_start(int j, seek_pos mpos, char *recip)
{
int i;
int c;
@@ -778,46 +843,63 @@ void del_start(int j,seek_pos mpos,char *recip)
if (!flagspawnalive[c]) return;
if (!comm_canwrite(c)) return;
- for (i = 0; i < concurrency[c]; ++i)
+ for (i = 0; i < concurrency[c]; ++i)
if (!d[c][i].used) break;
if (i == concurrency[c]) return;
- if (!stralloc_copys(&d[c][i].recip,recip)) { nomem(); return; }
- if (!stralloc_0(&d[c][i].recip)) { nomem(); return; }
- d[c][i].j = j; ++jo[j].refs;
+ if (!stralloc_copys(&d[c][i].recip, recip)) {
+ nomem();
+ return;
+ }
+ if (!stralloc_0(&d[c][i].recip)) {
+ nomem();
+ return;
+ }
+ d[c][i].j = j;
+ ++jo[j].refs;
d[c][i].delid = masterdelid++;
d[c][i].mpos = mpos;
- d[c][i].used = 1; ++concurrencyused[c];
+ d[c][i].used = 1;
+ ++concurrencyused[c];
- comm_write(c,i,jo[j].id,jo[j].sender.s,recip);
+ comm_write(c, i, jo[j].id, jo[j].sender.s, recip);
- strnum2[fmt_ulong(strnum2,d[c][i].delid)] = 0;
- strnum3[fmt_ulong(strnum3,jo[j].id)] = 0;
- log2s("starting delivery ",strnum2);
- log3s(": msg ",strnum3,tochan[c]);
+ strnum2[fmt_ulong(strnum2, d[c][i].delid)] = 0;
+ strnum3[fmt_ulong(strnum3, jo[j].id)] = 0;
+ log2s("starting delivery ", strnum2);
+ log3s(": msg ", strnum3, tochan[c]);
logsafe(recip);
log1s("\n");
del_status();
}
-void markdone(int c,unsigned long id,seek_pos pos)
+void markdone(int c, unsigned long id, seek_pos pos)
{
struct stat st;
int fd;
- fnmake_chanaddr(id,c);
+ fnmake_chanaddr(id, c);
for (;;) {
fd = open_write(fn.s);
if (fd == -1) break;
- if (fstat(fd,&st) == -1) { close(fd); break; }
- if (seek_set(fd,pos) == -1) { close(fd); break; }
- if (write(fd,"D",1) != 1) { close(fd); break; }
+ if (fstat(fd, &st) == -1) {
+ close(fd);
+ break;
+ }
+ if (seek_set(fd, pos) == -1) {
+ close(fd);
+ break;
+ }
+ if (write(fd, "D", 1) != 1) {
+ close(fd);
+ break;
+ }
/* further errors -> double delivery without us knowing about it, oh well */
close(fd);
return;
}
- log3s("warning: trouble marking ",fn.s,"; message will be delivered twice!\n");
+ log3s("warning: trouble marking ", fn.s, "; message will be delivered twice!\n");
}
void del_dochan(int c)
@@ -826,78 +908,80 @@ void del_dochan(int c)
char ch;
int i;
int delnum;
-
- r = read(chanfdin[c],delbuf,sizeof(delbuf));
+
+ r = read(chanfdin[c], delbuf, sizeof(delbuf));
if (r == -1) return;
- if (r == 0) { spawndied(c); return; }
+ if (r == 0) {
+ spawndied(c);
+ return;
+ }
for (i = 0; i < r; ++i) {
ch = delbuf[i];
- while (!stralloc_append(&dline[c],&ch)) nomem();
-
- if (dline[c].len > REPORTMAX)
- dline[c].len = REPORTMAX;
- /* qmail-lspawn and qmail-rspawn are responsible for keeping it short */
- /* but from a security point of view, we don't trust rspawn */
+ while (!stralloc_append(&dline[c], &ch)) nomem();
+
+ if (dline[c].len > REPORTMAX) dline[c].len = REPORTMAX;
+ /* qmail-lspawn and qmail-rspawn are responsible for keeping it short */
+ /* but from a security point of view, we don't trust rspawn */
if (!ch && (dline[c].len > 1)) {
- delnum = (unsigned int) (unsigned char) dline[c].s[0];
+ delnum = (unsigned int)(unsigned char)dline[c].s[0];
if ((delnum < 0) || (delnum >= concurrency[c]) || !d[c][delnum].used)
log1s("warning: internal error: delivery report out of range\n");
else {
- strnum3[fmt_ulong(strnum3,d[c][delnum].delid)] = 0;
+ strnum3[fmt_ulong(strnum3, d[c][delnum].delid)] = 0;
if (dline[c].s[1] == 'Z')
- if (jo[d[c][delnum].j].flagdying) {
- dline[c].s[1] = 'D';
- --dline[c].len;
- while (!stralloc_cats(&dline[c],"I'm not going to try again; this message has been in the queue too long.\n")) nomem();
- while (!stralloc_0(&dline[c])) nomem();
- }
+ if (jo[d[c][delnum].j].flagdying) {
+ dline[c].s[1] = 'D';
+ --dline[c].len;
+ while (!stralloc_cats(
+ &dline[c], "I'm not going to try again; this message has been in the queue too long.\n"))
+ nomem();
+ while (!stralloc_0(&dline[c])) nomem();
+ }
switch (dline[c].s[1]) {
case 'K':
- log3s("delivery ",strnum3,": success: ");
+ log3s("delivery ", strnum3, ": success: ");
logsafe(dline[c].s + 2);
log1s("\n");
- markdone(c,jo[d[c][delnum].j].id,d[c][delnum].mpos);
+ markdone(c, jo[d[c][delnum].j].id, d[c][delnum].mpos);
--jo[d[c][delnum].j].numtodo;
- break;
- case 'Z':
- log3s("delivery ",strnum3,": deferral: ");
- logsafe(dline[c].s + 2);
- log1s("\n");
- break;
- case 'D':
- log3s("delivery ",strnum3,": failure: ");
- logsafe(dline[c].s + 2);
- log1s("\n");
- addbounce(jo[d[c][delnum].j].id,d[c][delnum].recip.s,dline[c].s + 2);
- markdone(c,jo[d[c][delnum].j].id,d[c][delnum].mpos);
- --jo[d[c][delnum].j].numtodo;
- break;
- default:
- log3s("delivery ",strnum3,": report mangled, will defer\n");
- }
-
- job_close(d[c][delnum].j);
- d[c][delnum].used = 0; --concurrencyused[c];
+ break;
+ case 'Z':
+ log3s("delivery ", strnum3, ": deferral: ");
+ logsafe(dline[c].s + 2);
+ log1s("\n");
+ break;
+ case 'D':
+ log3s("delivery ", strnum3, ": failure: ");
+ logsafe(dline[c].s + 2);
+ log1s("\n");
+ addbounce(jo[d[c][delnum].j].id, d[c][delnum].recip.s, dline[c].s + 2);
+ markdone(c, jo[d[c][delnum].j].id, d[c][delnum].mpos);
+ --jo[d[c][delnum].j].numtodo;
+ break;
+ default: log3s("delivery ", strnum3, ": report mangled, will defer\n");
+ }
+
+ job_close(d[c][delnum].j);
+ d[c][delnum].used = 0;
+ --concurrencyused[c];
del_status();
-
}
dline[c].len = 0;
}
}
}
-void del_selprep(int *nfds,fd_set *rfds)
+void del_selprep(int *nfds, fd_set *rfds)
{
int c;
for (c = 0; c < CHANNELS; ++c)
if (flagspawnalive[c]) {
- FD_SET(chanfdin[c],rfds);
- if (*nfds <= chanfdin[c])
- *nfds = chanfdin[c] + 1;
+ FD_SET(chanfdin[c], rfds);
+ if (*nfds <= chanfdin[c]) *nfds = chanfdin[c] + 1;
}
}
@@ -907,23 +991,20 @@ void del_do(fd_set *rfds)
for (c = 0; c < CHANNELS; ++c)
if (flagspawnalive[c])
- if (FD_ISSET(chanfdin[c],rfds))
- del_dochan(c);
+ if (FD_ISSET(chanfdin[c], rfds)) del_dochan(c);
}
/* this file is too long -------------------------------------------- PASSES */
-struct
-{
+struct {
unsigned long id; /* if 0, need a new pass */
int j; /* defined if id; job number */
int fd; /* defined if id; reading from {local,remote} */
seek_pos mpos; /* defined if id; mark position */
buffer b;
char buf[128];
-}
-pass[CHANNELS];
+} pass[CHANNELS];
void pass_init()
{
@@ -937,24 +1018,25 @@ void pass_selprep(datetime_sec *wakeup)
int c;
struct prioq_elt pe;
if (flagexitasap) return;
-
+
for (c = 0; c < CHANNELS; ++c)
if (pass[c].id)
- if (del_avail(c))
- { *wakeup = 0; return; }
-
+ if (del_avail(c)) {
+ *wakeup = 0;
+ return;
+ }
+
if (job_avail())
for (c = 0; c < CHANNELS; ++c)
if (!pass[c].id)
- if (prioq_min(&pqchan[c],&pe))
+ if (prioq_min(&pqchan[c], &pe))
if (*wakeup > pe.dt) *wakeup = pe.dt;
-
- if (prioq_min(&pqfail,&pe))
- if (*wakeup > pe.dt)
- *wakeup = pe.dt;
- if (prioq_min(&pqdone,&pe))
- if (*wakeup > pe.dt)*wakeup = pe.dt;
+ if (prioq_min(&pqfail, &pe))
+ if (*wakeup > pe.dt) *wakeup = pe.dt;
+
+ if (prioq_min(&pqdone, &pe))
+ if (*wakeup > pe.dt) *wakeup = pe.dt;
}
static datetime_sec squareroot(datetime_sec x) /* result^2 <= x < (result + 1)^2 ; assuming: >= 0 */
@@ -964,20 +1046,26 @@ static datetime_sec squareroot(datetime_sec x) /* result^2 <= x < (result + 1)^2
datetime_sec y21;
int j;
- y = 0; yy = 0;
+ y = 0;
+ yy = 0;
for (j = 15; j >= 0; --j) {
y21 = (y << (j + 1)) + (1 << (j + j));
- if (y21 <= x - yy) { y += (1 << j); yy += y21; }
+ if (y21 <= x - yy) {
+ y += (1 << j);
+ yy += y21;
+ }
}
return y;
}
-datetime_sec nextretry(datetime_sec birth,int c)
+datetime_sec nextretry(datetime_sec birth, int c)
{
int n;
- if (birth > recent) n = 0;
- else n = squareroot(recent - birth); /* no need to add fuzz to recent */
+ if (birth > recent)
+ n = 0;
+ else
+ n = squareroot(recent - birth); /* no need to add fuzz to recent */
n += chanskip[c];
return birth + n * n;
@@ -994,28 +1082,31 @@ void pass_dochan(int c)
if (!pass[c].id) {
if (!job_avail()) return;
- if (!prioq_min(&pqchan[c],&pe)) return;
+ if (!prioq_min(&pqchan[c], &pe)) return;
if (pe.dt > recent) return;
- fnmake_chanaddr(pe.id,c);
+ fnmake_chanaddr(pe.id, c);
prioq_delmin(&pqchan[c]);
pass[c].mpos = 0;
pass[c].fd = open_read(fn.s);
if (pass[c].fd == -1) goto trouble;
- if (!getinfo(&line,&birth,pe.id)) { close(pass[c].fd); goto trouble; }
+ if (!getinfo(&line, &birth, pe.id)) {
+ close(pass[c].fd);
+ goto trouble;
+ }
pass[c].id = pe.id;
- buffer_init(&pass[c].b,read,pass[c].fd,pass[c].buf,sizeof(pass[c].buf));
- pass[c].j = job_open(pe.id,c);
- jo[pass[c].j].retry = nextretry(birth,c);
+ buffer_init(&pass[c].b, read, pass[c].fd, pass[c].buf, sizeof(pass[c].buf));
+ pass[c].j = job_open(pe.id, c);
+ jo[pass[c].j].retry = nextretry(birth, c);
jo[pass[c].j].flagdying = (recent > birth + lifetime);
- while (!stralloc_copy(&jo[pass[c].j].sender,&line)) nomem();
+ while (!stralloc_copy(&jo[pass[c].j].sender, &line)) nomem();
}
if (!del_avail(c)) return;
- if (getln(&pass[c].b,&line,&match,'\0') == -1) {
- fnmake_chanaddr(pass[c].id,c);
- log3s("warning: trouble reading ",fn.s,"; will try again later\n");
+ if (getln(&pass[c].b, &line, &match, '\0') == -1) {
+ fnmake_chanaddr(pass[c].id, c);
+ log3s("warning: trouble reading ", fn.s, "; will try again later\n");
close(pass[c].fd);
job_close(pass[c].j);
pass[c].id = 0;
@@ -1033,26 +1124,25 @@ void pass_dochan(int c)
switch (line.s[0]) {
case 'T':
++jo[pass[c].j].numtodo;
- del_start(pass[c].j,pass[c].mpos,line.s + 1);
- break;
- case 'D':
+ del_start(pass[c].j, pass[c].mpos, line.s + 1);
break;
+ case 'D': break;
default:
- fnmake_chanaddr(pass[c].id,c);
- log3s("warning: unknown record type in ",fn.s,"!\n");
+ fnmake_chanaddr(pass[c].id, c);
+ log3s("warning: unknown record type in ", fn.s, "!\n");
close(pass[c].fd);
job_close(pass[c].j);
pass[c].id = 0;
return;
- }
+ }
pass[c].mpos += line.len;
return;
- trouble:
- log3s("warning: trouble opening ",fn.s,"; will try again later\n");
+trouble:
+ log3s("warning: trouble opening ", fn.s, "; will try again later\n");
pe.dt = recent + SLEEP_SYSFAIL;
- while (!prioq_insert(&pqchan[c],&pe)) nomem();
+ while (!prioq_insert(&pqchan[c], &pe)) nomem();
}
void messdone(unsigned long id)
@@ -1063,53 +1153,59 @@ void messdone(unsigned long id)
struct stat st;
for (c = 0; c < CHANNELS; ++c) {
- fnmake_chanaddr(id,c);
- if (stat(fn.s,&st) == 0) return; /* false alarm; consequence of HOPEFULLY */
+ fnmake_chanaddr(id, c);
+ if (stat(fn.s, &st) == 0) return; /* false alarm; consequence of HOPEFULLY */
if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: unable to stat ", fn.s, "; will try again later\n");
goto FAIL;
}
}
fnmake_todo(id);
- if (stat(fn.s,&st) == 0) return;
+ if (stat(fn.s, &st) == 0) return;
if (errno != ENOENT) {
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: unable to stat ", fn.s, "; will try again later\n");
goto FAIL;
- }
-
+ }
+
fnmake_info(id);
- if (stat(fn.s,&st) == -1) {
+ if (stat(fn.s, &st) == -1) {
if (errno == ENOENT) return;
- log3s("warning: unable to stat ",fn.s,"; will try again later\n");
+ log3s("warning: unable to stat ", fn.s, "; will try again later\n");
goto FAIL;
}
-
- /* -todo +info -local -remote ?bounce */
- if (!injectbounce(id))
- goto FAIL; /* injectbounce() produced error message */
- strnum3[fmt_ulong(strnum3,id)] = 0;
- log3s("end msg ",strnum3,"\n");
+ /* -todo +info -local -remote ?bounce */
+ if (!injectbounce(id)) goto FAIL; /* injectbounce() produced error message */
+
+ strnum3[fmt_ulong(strnum3, id)] = 0;
+ log3s("end msg ", strnum3, "\n");
- /* -todo +info -local -remote -bounce */
+ /* -todo +info -local -remote -bounce */
fnmake_info(id);
if (unlink(fn.s) == -1) {
- log3s("warning: unable to unlink ",fn.s,"; will try again later\n");
+ log3s("warning: unable to unlink ", fn.s, "; will try again later\n");
goto FAIL;
}
- /* -todo -info -local -remote -bounce; we can relax */
+ /* -todo -info -local -remote -bounce; we can relax */
fnmake_foop(id);
- if (buffer_putflush(&toqc,fn.s,fn.len) == -1) { cleandied(); return; }
- if (buffer_get(&fromqc,&ch,1) != 1) { cleandied(); return; }
- if (ch != '+') log3s("warning: qmail-clean unable to clean up ",fn.s,"\n");
+ if (buffer_putflush(&toqc, fn.s, fn.len) == -1) {
+ cleandied();
+ return;
+ }
+ if (buffer_get(&fromqc, &ch, 1) != 1) {
+ cleandied();
+ return;
+ }
+ if (ch != '+') log3s("warning: qmail-clean unable to clean up ", fn.s, "\n");
return;
- FAIL:
- pe.id = id; pe.dt = now() + SLEEP_SYSFAIL;
- while (!prioq_insert(&pqdone,&pe)) nomem();
+FAIL:
+ pe.id = id;
+ pe.dt = now() + SLEEP_SYSFAIL;
+ while (!prioq_insert(&pqdone, &pe)) nomem();
}
void pass_do()
@@ -1117,20 +1213,19 @@ void pass_do()
int c;
struct prioq_elt pe;
- for (c = 0; c < CHANNELS; ++c)
- pass_dochan(c);
+ for (c = 0; c < CHANNELS; ++c) pass_dochan(c);
- if (prioq_min(&pqfail,&pe))
+ if (prioq_min(&pqfail, &pe))
if (pe.dt <= recent) {
prioq_delmin(&pqfail);
pqadd(pe.id);
}
- if (prioq_min(&pqdone,&pe))
+ if (prioq_min(&pqdone, &pe))
if (pe.dt <= recent) {
prioq_delmin(&pqdone);
messdone(pe.id);
- }
+ }
}
@@ -1142,10 +1237,11 @@ int todofdin;
int todofdout;
int flagtodoalive;
-void tododied() {
- log1s("alert: lost connection to qmail-todo ... exiting\n");
- flagexitasap = 1;
- flagtodoalive = 0;
+void tododied()
+{
+ log1s("alert: lost connection to qmail-todo ... exiting\n");
+ flagexitasap = 1;
+ flagtodoalive = 0;
}
void todo_init()
@@ -1154,72 +1250,64 @@ void todo_init()
todofdin = 8;
flagtodoalive = 1;
/* sync with external todo */
- if (write(todofdout,"S",1) != 1) tododied();
-
+ if (write(todofdout, "S", 1) != 1) tododied();
+
return;
}
-void todo_selprep(int *nfds,fd_set *rfds,datetime_sec *wakeup)
+void todo_selprep(int *nfds, fd_set *rfds, datetime_sec *wakeup)
{
if (flagexitasap) {
if (flagtodoalive) {
- write(todofdout,"X",1);
+ write(todofdout, "X", 1);
}
}
if (flagtodoalive) {
- FD_SET(todofdin,rfds);
- if (*nfds <= todofdin)
- *nfds = todofdin + 1;
+ FD_SET(todofdin, rfds);
+ if (*nfds <= todofdin) *nfds = todofdin + 1;
}
}
-void todo_del(char* s)
+void todo_del(char *s)
{
- int flagchan[CHANNELS];
- struct prioq_elt pe;
- unsigned long id;
- unsigned int len;
- int c;
-
- for (c = 0; c < CHANNELS; ++c)
- flagchan[c] = 0;
-
- switch (*s++) {
- case 'L':
- flagchan[0] = 1;
- break;
- case 'R':
- flagchan[1] = 1;
- break;
- case 'B':
- flagchan[0] = 1;
- flagchan[1] = 1;
- break;
- case 'X':
- break;
- default:
+ int flagchan[CHANNELS];
+ struct prioq_elt pe;
+ unsigned long id;
+ unsigned int len;
+ int c;
+
+ for (c = 0; c < CHANNELS; ++c) flagchan[c] = 0;
+
+ switch (*s++) {
+ case 'L': flagchan[0] = 1; break;
+ case 'R': flagchan[1] = 1; break;
+ case 'B':
+ flagchan[0] = 1;
+ flagchan[1] = 1;
+ break;
+ case 'X': break;
+ default: log1s("warning: qmail-send unable to understand qmail-todo\n"); return;
+ }
+
+ len = scan_ulong(s, &id);
+ if (!len || s[len]) {
log1s("warning: qmail-send unable to understand qmail-todo\n");
return;
- }
-
- len = scan_ulong(s,&id);
- if (!len || s[len]) {
- log1s("warning: qmail-send unable to understand qmail-todo\n");
- return;
- }
+ }
- pe.id = id; pe.dt = now();
- for (c = 0; c < CHANNELS; ++c)
- if (flagchan[c])
- while (!prioq_insert(&pqchan[c],&pe)) nomem();
+ pe.id = id;
+ pe.dt = now();
+ for (c = 0; c < CHANNELS; ++c)
+ if (flagchan[c])
+ while (!prioq_insert(&pqchan[c], &pe)) nomem();
- for (c = 0; c < CHANNELS; ++c)
- if (flagchan[c]) break;
+ for (c = 0; c < CHANNELS; ++c)
+ if (flagchan[c]) break;
- if (c == CHANNELS)
- while (!prioq_insert(&pqdone,&pe)) nomem();
+ if (c == CHANNELS)
+ while (!prioq_insert(&pqdone, &pe)) nomem();
- return;
+ return;
}
void todo_do(fd_set *rfds)
@@ -1227,11 +1315,11 @@ void todo_do(fd_set *rfds)
int r;
char ch;
int i;
-
+
if (!flagtodoalive) return;
- if (!FD_ISSET(todofdin,rfds)) return;
+ if (!FD_ISSET(todofdin, rfds)) return;
- r = read(todofdin,todobuf,sizeof(todobuf));
+ r = read(todofdin, todobuf, sizeof(todobuf));
if (r == -1) return;
if (r == 0) {
if (flagexitasap)
@@ -1243,28 +1331,23 @@ void todo_do(fd_set *rfds)
for (i = 0; i < r; ++i) {
ch = todobuf[i];
- while (!stralloc_append(&todoline,&ch)) nomem();
- if (todoline.len > REPORTMAX)
- todoline.len = REPORTMAX;
- /* qmail-todo is responsible for keeping it short */
+ while (!stralloc_append(&todoline, &ch)) nomem();
+ if (todoline.len > REPORTMAX) todoline.len = REPORTMAX;
+ /* qmail-todo is responsible for keeping it short */
if (!ch && (todoline.len > 1)) {
switch (todoline.s[0]) {
- case 'D':
- if (flagexitasap) break;
- todo_del(todoline.s + 1);
- break;
- case 'L':
- log1s(todoline.s + 1);
- break;
- case 'X':
- if (flagexitasap)
- flagtodoalive = 0;
- else
- tododied();
- break;
- default:
- log1s("warning: qmail-send unable to understand qmail-todo: report mangled\n");
- break;
+ case 'D':
+ if (flagexitasap) break;
+ todo_del(todoline.s + 1);
+ break;
+ case 'L': log1s(todoline.s + 1); break;
+ case 'X':
+ if (flagexitasap)
+ flagtodoalive = 0;
+ else
+ tododied();
+ break;
+ default: log1s("warning: qmail-send unable to understand qmail-todo: report mangled\n"); break;
}
todoline.len = 0;
}
@@ -1273,34 +1356,42 @@ void todo_do(fd_set *rfds)
/* this file is too long ---------------------------------------------- MAIN */
-int getcontrols()
-{
+int getcontrols()
+{
if (control_init() == -1) return 0;
- if (control_readint(&lifetime,"control/queuelifetime") == -1) return 0;
- if (control_readint(&concurrency[0],"control/concurrencylocal") == -1) return 0;
- if (control_readint(&concurrency[1],"control/concurrencyremote") == -1) return 0;
- if (control_rldef(&envnoathost,"control/envnoathost",1,"envnoathost") != 1) return 0;
- if (control_rldef(&bouncefrom,"control/bouncefrom",0,"MAILER-DAEMON") != 1) return 0;
- if (control_rldef(&bouncehost,"control/bouncehost",1,"bouncehost") != 1) return 0;
- if (control_readint(&bouncemaxbytes,"control/bouncemaxbytes") == -1) return 0;
- if (control_rldef(&doublebouncehost,"control/doublebouncehost",1,"doublebouncehost") != 1) return 0;
- if (control_rldef(&doublebounceto,"control/doublebounceto",0,"postmaster") != 1) return 0;
- if (!stralloc_cats(&doublebounceto,"@")) return 0;
- if (!stralloc_cat(&doublebounceto,&doublebouncehost)) return 0;
+ if (control_readint(&lifetime, "control/queuelifetime") == -1) return 0;
+ if (control_readint(&concurrency[0], "control/concurrencylocal") == -1) return 0;
+ if (control_readint(&concurrency[1], "control/concurrencyremote") == -1) return 0;
+ if (control_rldef(&envnoathost, "control/envnoathost", 1, "envnoathost") != 1) return 0;
+ if (control_rldef(&bouncefrom, "control/bouncefrom", 0, "MAILER-DAEMON") != 1) return 0;
+ if (control_rldef(&bouncehost, "control/bouncehost", 1, "bouncehost") != 1) return 0;
+ if (control_readint(&bouncemaxbytes, "control/bouncemaxbytes") == -1) return 0;
+ if (control_rldef(&doublebouncehost, "control/doublebouncehost", 1, "doublebouncehost") != 1) return 0;
+ if (control_rldef(&doublebounceto, "control/doublebounceto", 0, "postmaster") != 1) return 0;
+ if (!stralloc_cats(&doublebounceto, "@")) return 0;
+ if (!stralloc_cat(&doublebounceto, &doublebouncehost)) return 0;
if (!stralloc_0(&doublebounceto)) return 0;
- if (control_readfile(&locals,"control/locals",1) != 1) return 0;
- if (!constmap_init(&maplocals,locals.s,locals.len,0)) return 0;
- switch (control_readfile(&percenthack,"control/percenthack",0)) {
+ if (control_readfile(&locals, "control/locals", 1) != 1) return 0;
+ if (!constmap_init(&maplocals, locals.s, locals.len, 0)) return 0;
+ switch (control_readfile(&percenthack, "control/percenthack", 0)) {
case -1: return 0;
- case 0: if (!constmap_init(&mappercenthack,"",0,0)) return 0; break;
- case 1: if (!constmap_init(&mappercenthack,percenthack.s,percenthack.len,0)) return 0; break;
+ case 0:
+ if (!constmap_init(&mappercenthack, "", 0, 0)) return 0;
+ break;
+ case 1:
+ if (!constmap_init(&mappercenthack, percenthack.s, percenthack.len, 0)) return 0;
+ break;
}
- switch (control_readfile(&vdoms,"control/virtualdomains",0)) {
+ switch (control_readfile(&vdoms, "control/virtualdomains", 0)) {
case -1: return 0;
- case 0: if (!constmap_init(&mapvdoms,"",0,1)) return 0; break;
- case 1: if (!constmap_init(&mapvdoms,vdoms.s,vdoms.len,1)) return 0; break;
+ case 0:
+ if (!constmap_init(&mapvdoms, "", 0, 1)) return 0;
+ break;
+ case 1:
+ if (!constmap_init(&mapvdoms, vdoms.s, vdoms.len, 1)) return 0;
+ break;
}
- return 1;
+ return 1;
}
stralloc newlocals = {0};
@@ -1310,25 +1401,40 @@ void regetcontrols()
{
int r;
- if (control_readfile(&newlocals,"control/locals",1) != 1) { log1s("alert: unable to reread control/locals\n"); return; }
- if (control_readint(&concurrency[0],"control/concurrencylocal") == -1) { log1s("alert: unable to reread control/concurrencylocal\n"); return; }
- if (control_readint(&concurrency[1],"control/concurrencyremote") == -1) { log1s("alert: unable to reread control/concurrencyremote\n"); return; }
- if (control_readint(&lifetime,"control/queuelifetime") == -1) { log1s("alert: unable to reread control/queuelifetime\n"); return; }
+ if (control_readfile(&newlocals, "control/locals", 1) != 1) {
+ log1s("alert: unable to reread control/locals\n");
+ return;
+ }
+ if (control_readint(&concurrency[0], "control/concurrencylocal") == -1) {
+ log1s("alert: unable to reread control/concurrencylocal\n");
+ return;
+ }
+ if (control_readint(&concurrency[1], "control/concurrencyremote") == -1) {
+ log1s("alert: unable to reread control/concurrencyremote\n");
+ return;
+ }
+ if (control_readint(&lifetime, "control/queuelifetime") == -1) {
+ log1s("alert: unable to reread control/queuelifetime\n");
+ return;
+ }
- r = control_readfile(&newvdoms,"control/virtualdomains",0);
- if (r == -1) { log1s("alert: unable to reread control/virtualdomains\n"); return; }
+ r = control_readfile(&newvdoms, "control/virtualdomains", 0);
+ if (r == -1) {
+ log1s("alert: unable to reread control/virtualdomains\n");
+ return;
+ }
constmap_free(&maplocals);
constmap_free(&mapvdoms);
- while (!stralloc_copy(&locals,&newlocals)) nomem();
- while (!constmap_init(&maplocals,locals.s,locals.len,0)) nomem();
+ while (!stralloc_copy(&locals, &newlocals)) nomem();
+ while (!constmap_init(&maplocals, locals.s, locals.len, 0)) nomem();
if (r) {
- while (!stralloc_copy(&vdoms,&newvdoms)) nomem();
- while (!constmap_init(&mapvdoms,vdoms.s,vdoms.len,1)) nomem();
+ while (!stralloc_copy(&vdoms, &newvdoms)) nomem();
+ while (!constmap_init(&mapvdoms, vdoms.s, vdoms.len, 1)) nomem();
} else
- while (!constmap_init(&mapvdoms,"",0,1)) nomem();
+ while (!constmap_init(&mapvdoms, "", 0, 1)) nomem();
}
void reread()
@@ -1337,7 +1443,7 @@ void reread()
log1s("alert: unable to reread controls: unable to switch to home directory\n");
return;
}
- write(todofdout,"H",1);
+ write(todofdout, "H", 1);
regetcontrols();
while (chdir("queue") == -1) {
@@ -1359,9 +1465,18 @@ int main()
int r;
char ch;
- if (chdir(auto_qmail) == -1) { log1s("alert: cannot start: unable to switch to home directory\n"); _exit(110); }
- if (!getcontrols()) { log1s("alert: cannot start: unable to read controls\n"); _exit(111); }
- if (chdir("queue") == -1) { log1s("alert: cannot start: unable to switch to queue directory\n"); _exit(110); }
+ if (chdir(auto_qmail) == -1) {
+ log1s("alert: cannot start: unable to switch to home directory\n");
+ _exit(110);
+ }
+ if (!getcontrols()) {
+ log1s("alert: cannot start: unable to read controls\n");
+ _exit(111);
+ }
+ if (chdir("queue") == -1) {
+ log1s("alert: cannot start: unable to switch to queue directory\n");
+ _exit(110);
+ }
sig_pipeignore();
sig_termcatch(sigterm);
sig_alarmcatch(sigalrm);
@@ -1370,18 +1485,26 @@ int main()
umask(077);
fd = open_write("lock/sendmutex");
- if (fd == -1) { log1s("alert: cannot start: unable to open mutex\n"); _exit(111); }
- if (lock_exnb(fd) == -1) { log1s("alert: cannot start: qmail-send is already running\n"); _exit(111); }
+ if (fd == -1) {
+ log1s("alert: cannot start: unable to open mutex\n");
+ _exit(111);
+ }
+ if (lock_exnb(fd) == -1) {
+ log1s("alert: cannot start: qmail-send is already running\n");
+ _exit(111);
+ }
numjobs = 0;
- for (c = 0;c < CHANNELS;++c) {
- do
- r = read(chanfdin[c],&ch,1);
+ for (c = 0; c < CHANNELS; ++c) {
+ do r = read(chanfdin[c], &ch, 1);
while ((r == -1) && (errno == EINTR));
- if (r < 1) { log1s("alert: cannot start: hath the daemon spawn no fire?\n"); _exit(111); }
+ if (r < 1) {
+ log1s("alert: cannot start: hath the daemon spawn no fire?\n");
+ _exit(111);
+ }
- u = (unsigned int) (unsigned char) ch;
+ u = (unsigned int)(unsigned char)ch;
if (concurrency[c] > u) concurrency[c] = u;
numjobs += concurrency[c];
}
@@ -1400,25 +1523,33 @@ int main()
while (!flagexitasap || !del_canexit() || flagtodoalive) {
recent = now();
- if (flagrunasap) { flagrunasap = 0; pqrun(); }
- if (flagreadasap) { flagreadasap = 0; reread(); }
+ if (flagrunasap) {
+ flagrunasap = 0;
+ pqrun();
+ }
+ if (flagreadasap) {
+ flagreadasap = 0;
+ reread();
+ }
wakeup = recent + SLEEP_FOREVER;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
nfds = 1;
- comm_selprep(&nfds,&wfds);
- del_selprep(&nfds,&rfds);
+ comm_selprep(&nfds, &wfds);
+ del_selprep(&nfds, &rfds);
pass_selprep(&wakeup);
- todo_selprep(&nfds,&rfds,&wakeup);
+ todo_selprep(&nfds, &rfds, &wakeup);
cleanup_selprep(&wakeup);
- if (wakeup <= recent) tv.tv_sec = 0;
- else tv.tv_sec = wakeup - recent + SLEEP_FUZZ;
+ if (wakeup <= recent)
+ tv.tv_sec = 0;
+ else
+ tv.tv_sec = wakeup - recent + SLEEP_FUZZ;
tv.tv_usec = 0;
- if (select(nfds,&rfds,&wfds,(fd_set *) 0,&tv) == -1)
+ if (select(nfds, &rfds, &wfds, (fd_set *)0, &tv) == -1)
if (errno == EINTR)
;
else
@@ -1433,7 +1564,7 @@ int main()
cleanup_do();
}
}
-
+
pqfinish();
log1s("status: exiting\n");
_exit(0);
diff --git a/src/qmail-showctl.c b/src/qmail-showctl.c
index 2b4cc0a..7aaeb95 100644
--- a/src/qmail-showctl.c
+++ b/src/qmail-showctl.c
@@ -1,21 +1,23 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "spf.h"
+
#include "buffer.h"
+#include "constmap.h"
+#include "direntry.h"
#include "exit.h"
#include "fmt.h"
#include "str.h"
-#include "control.h"
-#include "constmap.h"
#include "stralloc.h"
-#include "direntry.h"
-#include "auto_uids.h"
-#include "auto_qmail.h"
+
#include "auto_break.h"
#include "auto_patrn.h"
+#include "auto_qmail.h"
#include "auto_spawn.h"
#include "auto_split.h"
+#include "auto_uids.h"
+#include "control.h"
+#include "spf.h"
stralloc me = {0};
int meok;
@@ -23,103 +25,97 @@ int meok;
stralloc line = {0};
char num[FMT_ULONG];
-void safeput(char *buf,unsigned int len)
+void safeput(char *buf, unsigned int len)
{
char ch;
while (len > 0) {
ch = *buf;
if ((ch < 32) || (ch > 126)) ch = '?';
- buffer_put(buffer_1,&ch,1);
+ buffer_put(buffer_1, &ch, 1);
++buf;
--len;
}
}
-void do_int(char *fn,char *def,char *pre,char *post)
+void do_int(char *fn, char *def, char *pre, char *post)
{
int i;
- buffer_puts(buffer_1,"\n");
- buffer_puts(buffer_1,fn);
- buffer_puts(buffer_1,": ");
- switch (control_readint(&i,fn)) {
+ buffer_puts(buffer_1, "\n");
+ buffer_puts(buffer_1, fn);
+ buffer_puts(buffer_1, ": ");
+ switch (control_readint(&i, fn)) {
case 0:
- buffer_puts(buffer_1,"(Default.) ");
- buffer_puts(buffer_1,pre);
- buffer_puts(buffer_1,def);
- buffer_puts(buffer_1,post);
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "(Default.) ");
+ buffer_puts(buffer_1, pre);
+ buffer_puts(buffer_1, def);
+ buffer_puts(buffer_1, post);
+ buffer_puts(buffer_1, ".\n");
break;
case 1:
if (i < 0) i = 0;
- buffer_puts(buffer_1,pre);
- buffer_put(buffer_1,num,fmt_uint(num,i));
- buffer_puts(buffer_1,post);
- buffer_puts(buffer_1,".\n");
- break;
- default:
- buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
+ buffer_puts(buffer_1, pre);
+ buffer_put(buffer_1, num, fmt_uint(num, i));
+ buffer_puts(buffer_1, post);
+ buffer_puts(buffer_1, ".\n");
break;
+ default: buffer_puts(buffer_1, "Oops! Trouble reading this file.\n"); break;
}
}
-void do_str(char *fn,int flagme,char *def,char *pre)
+void do_str(char *fn, int flagme, char *def, char *pre)
{
- buffer_puts(buffer_1,"\n");
- buffer_puts(buffer_1,fn);
- buffer_puts(buffer_1,": ");
- switch (control_readline(&line,fn)) {
+ buffer_puts(buffer_1, "\n");
+ buffer_puts(buffer_1, fn);
+ buffer_puts(buffer_1, ": ");
+ switch (control_readline(&line, fn)) {
case 0:
- buffer_puts(buffer_1,"(Default.) ");
- if (!stralloc_copys(&line,def)) {
- buffer_puts(buffer_1,"Oops! Out of memory.\n");
+ buffer_puts(buffer_1, "(Default.) ");
+ if (!stralloc_copys(&line, def)) {
+ buffer_puts(buffer_1, "Oops! Out of memory.\n");
break;
};
if (flagme && meok)
- if (!stralloc_copy(&line,&me)) {
- buffer_puts(buffer_1,"Oops! Out of memory.\n");
+ if (!stralloc_copy(&line, &me)) {
+ buffer_puts(buffer_1, "Oops! Out of memory.\n");
break;
};
case 1:
- buffer_puts(buffer_1,pre);
- safeput(line.s,line.len);
- buffer_puts(buffer_1,".\n");
- break;
- default:
- buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
+ buffer_puts(buffer_1, pre);
+ safeput(line.s, line.len);
+ buffer_puts(buffer_1, ".\n");
break;
+ default: buffer_puts(buffer_1, "Oops! Trouble reading this file.\n"); break;
}
}
-int do_lst(char *fn,char *def,char *pre,char *post)
+int do_lst(char *fn, char *def, char *pre, char *post)
{
int i;
int j;
- buffer_puts(buffer_1,"\n");
- buffer_puts(buffer_1,fn);
- buffer_puts(buffer_1,": ");
- switch (control_readfile(&line,fn,0)) {
+ buffer_puts(buffer_1, "\n");
+ buffer_puts(buffer_1, fn);
+ buffer_puts(buffer_1, ": ");
+ switch (control_readfile(&line, fn, 0)) {
case 0:
- buffer_puts(buffer_1,"(Default.) ");
- buffer_puts(buffer_1,def);
- buffer_puts(buffer_1,"\n");
+ buffer_puts(buffer_1, "(Default.) ");
+ buffer_puts(buffer_1, def);
+ buffer_puts(buffer_1, "\n");
return 0;
case 1:
- buffer_puts(buffer_1,"\n");
+ buffer_puts(buffer_1, "\n");
i = 0;
for (j = 0; j < line.len; ++j)
- if (!line.s[j]) {
- buffer_puts(buffer_1,pre);
- safeput(line.s + i,j - i);
- buffer_puts(buffer_1,post);
- buffer_puts(buffer_1,"\n");
- i = j + 1;
- }
+ if (!line.s[j]) {
+ buffer_puts(buffer_1, pre);
+ safeput(line.s + i, j - i);
+ buffer_puts(buffer_1, post);
+ buffer_puts(buffer_1, "\n");
+ i = j + 1;
+ }
return 1;
- default:
- buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
- return -1;
+ default: buffer_puts(buffer_1, "Oops! Trouble reading this file.\n"); return -1;
}
}
@@ -130,241 +126,257 @@ int main()
struct stat stmrh;
struct stat stmrhcdb;
- buffer_puts(buffer_1,"s/qmail home directory: ");
- buffer_puts(buffer_1,auto_qmail);
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "s/qmail home directory: ");
+ buffer_puts(buffer_1, auto_qmail);
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"user-ext delimiter: ");
- buffer_puts(buffer_1,auto_break);
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "user-ext delimiter: ");
+ buffer_puts(buffer_1, auto_break);
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"paternalism (in decimal): ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_patrn));
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "paternalism (in decimal): ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_patrn));
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"silent concurrency limit: ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_spawn));
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "silent concurrency limit: ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_spawn));
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"subdirectory split: ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_split));
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "subdirectory split: ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_split));
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"user ids: ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uida));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidd));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidl));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uido));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidp));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidq));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidr));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uids));
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "user ids: ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uida));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uidd));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uidl));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uido));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uidp));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uidq));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uidr));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_uids));
+ buffer_puts(buffer_1, ".\n");
- buffer_puts(buffer_1,"group ids: ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_gidn));
- buffer_puts(buffer_1,", ");
- buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_gidq));
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "group ids: ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_gidn));
+ buffer_puts(buffer_1, ", ");
+ buffer_put(buffer_1, num, fmt_ulong(num, (unsigned long)auto_gidq));
+ buffer_puts(buffer_1, ".\n");
if (chdir(auto_qmail) == -1) {
- buffer_puts(buffer_1,"Oops! Unable to chdir to ");
- buffer_puts(buffer_1,auto_qmail);
- buffer_puts(buffer_1,".\n");
+ buffer_puts(buffer_1, "Oops! Unable to chdir to ");
+ buffer_puts(buffer_1, auto_qmail);
+ buffer_puts(buffer_1, ".\n");
buffer_flush(buffer_1);
_exit(110);
}
if (chdir("control") == -1) {
- buffer_puts(buffer_1,"Oops! Unable to chdir to control.\n");
+ buffer_puts(buffer_1, "Oops! Unable to chdir to control.\n");
buffer_flush(buffer_1);
_exit(110);
}
dir = opendir(".");
if (!dir) {
- buffer_puts(buffer_1,"Oops! Unable to open current directory.\n");
+ buffer_puts(buffer_1, "Oops! Unable to open current directory.\n");
buffer_flush(buffer_1);
_exit(110);
}
- meok = control_readline(&me,"me");
+ meok = control_readline(&me, "me");
if (meok == -1) {
- buffer_puts(buffer_1,"Oops! Trouble reading control/me.");
+ buffer_puts(buffer_1, "Oops! Trouble reading control/me.");
buffer_flush(buffer_1);
_exit(112);
}
- do_lst("authsenders","No authenticated SMTP senders.","Authenticated SMTP senders: ","");
- do_lst("badhelo","Any HELO/EHLO greeting is allowed.",""," not accepted in HELO/EHLO; exception token is '!'.");
- do_lst("badmailfrom","Any MAIL FROM is allowed.",""," are rejected or treated special in MAIL FROM depending on tokens: '!', '?', '=', '~', '+'.");
- do_lst("badloadertypes","Any loader types are accepted.",""," not accepted as loader type.");
+ do_lst("authsenders", "No authenticated SMTP senders.", "Authenticated SMTP senders: ", "");
+ do_lst(
+ "badhelo",
+ "Any HELO/EHLO greeting is allowed.",
+ "",
+ " not accepted in HELO/EHLO; exception token is '!'.");
+ do_lst(
+ "badmailfrom",
+ "Any MAIL FROM is allowed.",
+ "",
+ " are rejected or treated special in MAIL FROM depending on tokens: '!', '?', '=', '~', '+'.");
+ do_lst("badloadertypes", "Any loader types are accepted.", "", " not accepted as loader type.");
/* XXX: check badloadertypes.cdb contents */
- buffer_puts(buffer_1,"\nbadloadertypes.cdb: ");
- if (stat("badloadertypes",&stmrh) == -1)
- if (stat("badloadertypes.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"(Default.) No effect.\n");
+ buffer_puts(buffer_1, "\nbadloadertypes.cdb: ");
+ if (stat("badloadertypes", &stmrh) == -1)
+ if (stat("badloadertypes.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "(Default.) No effect.\n");
else
- buffer_puts(buffer_1,"Oops! badloadertypes.cdb exists but badloadertypes doesn't.\n");
+ buffer_puts(buffer_1, "Oops! badloadertypes.cdb exists but badloadertypes doesn't.\n");
+ else if (stat("badloadertypes.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "Oops! badloadertypes exists but badloadertypes.cdb doesn't.\n");
+ else if (stmrh.st_mtime > stmrhcdb.st_mtime)
+ buffer_puts(buffer_1, "Oops! badloadertypes.cdb is older than badloadertypes.\n");
else
- if (stat("badloadertypes.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"Oops! badloadertypes exists but badloadertypes.cdb doesn't.\n");
- else
- if (stmrh.st_mtime > stmrhcdb.st_mtime)
- buffer_puts(buffer_1,"Oops! badloadertypes.cdb is older than badloadertypes.\n");
- else
- buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
- do_lst("badmimetypes","Any MIME types are accepted.",""," not accepted as MIME type.");
+ buffer_puts(buffer_1, "Modified recently enough; hopefully up to date.\n");
+ do_lst("badmimetypes", "Any MIME types are accepted.", "", " not accepted as MIME type.");
/* XXX: check badmimetypes.cdb contents */
- buffer_puts(buffer_1,"\nbadmimetypes.cdb: ");
- if (stat("badmimetypes",&stmrh) == -1)
- if (stat("badmimetypes.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"(Default.) No effect.\n");
+ buffer_puts(buffer_1, "\nbadmimetypes.cdb: ");
+ if (stat("badmimetypes", &stmrh) == -1)
+ if (stat("badmimetypes.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "(Default.) No effect.\n");
else
- buffer_puts(buffer_1,"Oops! badmimetypes.cdb exists but badmimetypes doesn't.\n");
+ buffer_puts(buffer_1, "Oops! badmimetypes.cdb exists but badmimetypes doesn't.\n");
+ else if (stat("badmimetypes.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "Oops! badmimetypes exists but badmimetypes.cdb doesn't.\n");
+ else if (stmrh.st_mtime > stmrhcdb.st_mtime)
+ buffer_puts(buffer_1, "Oops! badmimetypes.cdb is older than badmimetypes.\n");
else
- if (stat("badmimetypes.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"Oops! badmimetypes exists but badmimetypes.cdb doesn't.\n");
- else
- if (stmrh.st_mtime > stmrhcdb.st_mtime)
- buffer_puts(buffer_1,"Oops! badmimetypes.cdb is older than badmimetypes.\n");
- else
- buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
- do_lst("badrcptto","Any RCPT TO is allowed.",""," not accepted in RCPT TO.");
- do_str("bouncefrom",0,"MAILER-DAEMON","Bounce user name is ");
- do_str("bouncehost",1,"bouncehost","Bounce host name is ");
- do_int("bouncemaxbytes","0","Bounce size limit is "," bytes");
- do_int("concurrencylocal","10","Local concurrency is ","");
- do_int("concurrencyremote","20","Remote concurrency is ","");
- do_int("databytes","0","SMTP DATA limit is "," bytes");
- do_str("defaultdomain",1,"defaultdomain","Default domain name is ");
- do_str("defaulthost",1,"defaulthost","Default host name is ");
- do_lst("dkimdomains","No DKIM domains defined for signing.","DKIM domains: ","");
- do_lst("domaincerts","No domain certs defined.","Domain certs: ","");
- do_lst("domainips","No domain ip mappings defined.","Mappping sender domain part to local ip: ","");
- do_str("doublebouncehost",1,"doublebouncehost","2B recipient host: ");
- do_str("doublebounceto",0,"postmaster","2B recipient user: ");
- do_str("envnoathost",1,"envnoathost","Presumed domain name is ");
- do_str("helohost",1,"helohost","SMTP client HELO host name is ");
- do_str("idhost",1,"idhost","Message-ID host name is ");
- do_str("localiphost",1,"localiphost","Local IP address becomes ");
- do_lst("locals","Messages for me are delivered locally.","Messages for "," are delivered locally.");
- do_str("me",0,"undefined! Uh-oh","My name is ");
+ buffer_puts(buffer_1, "Modified recently enough; hopefully up to date.\n");
+ do_lst("badrcptto", "Any RCPT TO is allowed.", "", " not accepted in RCPT TO.");
+ do_str("bouncefrom", 0, "MAILER-DAEMON", "Bounce user name is ");
+ do_str("bouncehost", 1, "bouncehost", "Bounce host name is ");
+ do_int("bouncemaxbytes", "0", "Bounce size limit is ", " bytes");
+ do_int("concurrencylocal", "10", "Local concurrency is ", "");
+ do_int("concurrencyremote", "20", "Remote concurrency is ", "");
+ do_int("databytes", "0", "SMTP DATA limit is ", " bytes");
+ do_str("defaultdomain", 1, "defaultdomain", "Default domain name is ");
+ do_str("defaulthost", 1, "defaulthost", "Default host name is ");
+ do_lst("dkimdomains", "No DKIM domains defined for signing.", "DKIM domains: ", "");
+ do_lst("domaincerts", "No domain certs defined.", "Domain certs: ", "");
+ do_lst("domainips", "No domain ip mappings defined.", "Mappping sender domain part to local ip: ", "");
+ do_str("doublebouncehost", 1, "doublebouncehost", "2B recipient host: ");
+ do_str("doublebounceto", 0, "postmaster", "2B recipient user: ");
+ do_str("envnoathost", 1, "envnoathost", "Presumed domain name is ");
+ do_str("helohost", 1, "helohost", "SMTP client HELO host name is ");
+ do_str("idhost", 1, "idhost", "Message-ID host name is ");
+ do_str("localiphost", 1, "localiphost", "Local IP address becomes ");
+ do_lst("locals", "Messages for me are delivered locally.", "Messages for ", " are delivered locally.");
+ do_str("me", 0, "undefined! Uh-oh", "My name is ");
- do_lst("mailfromrules","Any envelope sender are accepted.",""," (MAV rule).");
+ do_lst("mailfromrules", "Any envelope sender are accepted.", "", " (MAV rule).");
/* XXX: check mailfromrules.cdb contents */
- buffer_puts(buffer_1,"\nmailfromrules.cdb: ");
- if (stat("mailfromrules",&stmrh) == -1)
- if (stat("mailfromrules.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"(Default.) No effect.\n");
+ buffer_puts(buffer_1, "\nmailfromrules.cdb: ");
+ if (stat("mailfromrules", &stmrh) == -1)
+ if (stat("mailfromrules.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "(Default.) No effect.\n");
else
- buffer_puts(buffer_1,"Oops! mailfromrules.cdb exists but mailfromrules doesn't.\n");
+ buffer_puts(buffer_1, "Oops! mailfromrules.cdb exists but mailfromrules doesn't.\n");
+ else if (stat("mailfromrules.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "Oops! mailfromrules exists but mailfromrules.cdb doesn't.\n");
+ else if (stmrh.st_mtime > stmrhcdb.st_mtime)
+ buffer_puts(buffer_1, "Oops! mailfromrules.cdb is older than mailfromrules.\n");
else
- if (stat("mailfromrules.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"Oops! mailfromrules exists but mailfromrules.cdb doesn't.\n");
- else
- if (stmrh.st_mtime > stmrhcdb.st_mtime)
- buffer_puts(buffer_1,"Oops! mailfromrules.cdb is older than mailfromrules.\n");
- else
- buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
+ buffer_puts(buffer_1, "Modified recently enough; hopefully up to date.\n");
- do_lst("percenthack","The percent hack is not allowed.","The percent hack is allowed for user%host@",".");
- do_str("plusdomain",1,"plusdomain","Plus domain name is ");
- do_lst("qmqpservers","No QMQP servers.","QMQP server: ",".");
- do_int("queuelifetime","604800","Message lifetime in the queue is "," seconds");
+ do_lst(
+ "percenthack",
+ "The percent hack is not allowed.",
+ "The percent hack is allowed for user%host@",
+ ".");
+ do_str("plusdomain", 1, "plusdomain", "Plus domain name is ");
+ do_lst("qmqpservers", "No QMQP servers.", "QMQP server: ", ".");
+ do_int("queuelifetime", "604800", "Message lifetime in the queue is ", " seconds");
- if (do_lst("rcpthosts","SMTP clients may send messages to any recipient.","SMTP clients may send messages to recipients at ","."))
- do_lst("morercpthosts","No effect.","SMTP clients may send messages to recipients at ",".");
+ if (do_lst(
+ "rcpthosts",
+ "SMTP clients may send messages to any recipient.",
+ "SMTP clients may send messages to recipients at ",
+ "."))
+ do_lst("morercpthosts", "No effect.", "SMTP clients may send messages to recipients at ", ".");
else
- do_lst("morercpthosts","No rcpthosts; morercpthosts is irrelevant.","No rcpthosts; doesn't matter that morercpthosts has ",".");
+ do_lst(
+ "morercpthosts",
+ "No rcpthosts; morercpthosts is irrelevant.",
+ "No rcpthosts; doesn't matter that morercpthosts has ",
+ ".");
/* XXX: check morercpthosts.cdb contents */
- buffer_puts(buffer_1,"\nmorercpthosts.cdb: ");
- if (stat("morercpthosts",&stmrh) == -1)
- if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"(Default.) No effect.\n");
+ buffer_puts(buffer_1, "\nmorercpthosts.cdb: ");
+ if (stat("morercpthosts", &stmrh) == -1)
+ if (stat("morercpthosts.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "(Default.) No effect.\n");
else
- buffer_puts(buffer_1,"Oops! morercpthosts.cdb exists but morercpthosts doesn't.\n");
+ buffer_puts(buffer_1, "Oops! morercpthosts.cdb exists but morercpthosts doesn't.\n");
+ else if (stat("morercpthosts.cdb", &stmrhcdb) == -1)
+ buffer_puts(buffer_1, "Oops! morercpthosts exists but morercpthosts.cdb doesn't.\n");
+ else if (stmrh.st_mtime > stmrhcdb.st_mtime)
+ buffer_puts(buffer_1, "Oops! morercpthosts.cdb is older than morercpthosts.\n");
else
- if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
- buffer_puts(buffer_1,"Oops! morercpthosts exists but morercpthosts.cdb doesn't.\n");
- else
- if (stmrh.st_mtime > stmrhcdb.st_mtime)
- buffer_puts(buffer_1,"Oops! morercpthosts.cdb is older than morercpthosts.\n");
- else
- buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
- do_lst("recipients","SMTP clients may send messages to any recipient.","SMTP clients may send messages to local recipients listed in ",".");
- do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 ");
- do_lst("qmtproutes","No additional QMTP routes.","QMTP route: ","");
- do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ","");
- do_str("spfexplain",0,SPF_DEFEXP,"SPF default explanation is: 550 ");
- do_str("spflocalrules",0,"(None)","Defined local SPF rules are: ");
- do_lst("srsrdomains","No SRS fowarding rules.","SRS rules: ","");
- do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds");
- do_int("timeoutremote","1200","SMTP client data timeout is "," seconds");
- do_int("timeoutsmtpd","1200","SMTP server data timeout is "," seconds");
- do_lst("tlsdestinations","No TLS destinations defined.","TLS destination: ","");
- do_lst("virtualdomains","No virtual domains.","Virtual domain: ","");
+ buffer_puts(buffer_1, "Modified recently enough; hopefully up to date.\n");
+ do_lst(
+ "recipients",
+ "SMTP clients may send messages to any recipient.",
+ "SMTP clients may send messages to local recipients listed in ",
+ ".");
+ do_str("smtpgreeting", 1, "smtpgreeting", "SMTP greeting: 220 ");
+ do_lst("qmtproutes", "No additional QMTP routes.", "QMTP route: ", "");
+ do_lst("smtproutes", "No artificial SMTP routes.", "SMTP route: ", "");
+ do_str("spfexplain", 0, SPF_DEFEXP, "SPF default explanation is: 550 ");
+ do_str("spflocalrules", 0, "(None)", "Defined local SPF rules are: ");
+ do_lst("srsrdomains", "No SRS fowarding rules.", "SRS rules: ", "");
+ do_int("timeoutconnect", "60", "SMTP client connection timeout is ", " seconds");
+ do_int("timeoutremote", "1200", "SMTP client data timeout is ", " seconds");
+ do_int("timeoutsmtpd", "1200", "SMTP server data timeout is ", " seconds");
+ do_lst("tlsdestinations", "No TLS destinations defined.", "TLS destination: ", "");
+ do_lst("virtualdomains", "No virtual domains.", "Virtual domain: ", "");
while ((d = readdir(dir))) {
- if (str_equal(d->d_name,".")) continue;
- if (str_equal(d->d_name,"..")) continue;
- if (str_equal(d->d_name,"authsenders")) continue;
- if (str_equal(d->d_name,"badhelo")) continue;
- if (str_equal(d->d_name,"badrcptto")) continue;
- if (str_equal(d->d_name,"badmailfrom")) continue;
- if (str_equal(d->d_name,"badloadertypes")) continue;
- if (str_equal(d->d_name,"badloadertypes.cdb")) continue;
- if (str_equal(d->d_name,"badmimetypes")) continue;
- if (str_equal(d->d_name,"badmimetypes.cdb")) continue;
- if (str_equal(d->d_name,"bouncefrom")) continue;
- if (str_equal(d->d_name,"bouncehost")) continue;
- if (str_equal(d->d_name,"bouncemaxbytes")) continue;
- if (str_equal(d->d_name,"concurrencylocal")) continue;
- if (str_equal(d->d_name,"concurrencyremote")) continue;
- if (str_equal(d->d_name,"databytes")) continue;
- if (str_equal(d->d_name,"defaultdomain")) continue;
- if (str_equal(d->d_name,"defaulthost")) continue;
- if (str_equal(d->d_name,"dkimdomains")) continue;
- if (str_equal(d->d_name,"domainips")) continue;
- if (str_equal(d->d_name,"domaincerts")) continue;
- if (str_equal(d->d_name,"doublebouncehost")) continue;
- if (str_equal(d->d_name,"doublebounceto")) continue;
- if (str_equal(d->d_name,"envnoathost")) continue;
- if (str_equal(d->d_name,"helohost")) continue;
- if (str_equal(d->d_name,"idhost")) continue;
- if (str_equal(d->d_name,"localiphost")) continue;
- if (str_equal(d->d_name,"locals")) continue;
- if (str_equal(d->d_name,"me")) continue;
- if (str_equal(d->d_name,"mailfromrules")) continue;
- if (str_equal(d->d_name,"mailfromrules.cdb")) continue;
- if (str_equal(d->d_name,"morercpthosts")) continue;
- if (str_equal(d->d_name,"morercpthosts.cdb")) continue;
- if (str_equal(d->d_name,"percenthack")) continue;
- if (str_equal(d->d_name,"plusdomain")) continue;
- if (str_equal(d->d_name,"qmqpservers")) continue;
- if (str_equal(d->d_name,"queuelifetime")) continue;
- if (str_equal(d->d_name,"rcpthosts")) continue;
- if (str_equal(d->d_name,"recipients")) continue;
- if (str_equal(d->d_name,"smtpgreeting")) continue;
- if (str_equal(d->d_name,"qmtproutes")) continue;
- if (str_equal(d->d_name,"smtproutes")) continue;
- if (str_equal(d->d_name,"spfexplain")) continue;
- if (str_equal(d->d_name,"spflocalrules")) continue;
- if (str_equal(d->d_name,"srsdomains")) continue;
- if (str_equal(d->d_name,"timeoutconnect")) continue;
- if (str_equal(d->d_name,"timeoutremote")) continue;
- if (str_equal(d->d_name,"timeoutsmtpd")) continue;
- if (str_equal(d->d_name,"tlsdestinations")) continue;
- if (str_equal(d->d_name,"virtualdomains")) continue;
- buffer_puts(buffer_1,"\n");
- buffer_puts(buffer_1,d->d_name);
- buffer_puts(buffer_1,": I have no idea what this file does.\n");
+ if (str_equal(d->d_name, ".")) continue;
+ if (str_equal(d->d_name, "..")) continue;
+ if (str_equal(d->d_name, "authsenders")) continue;
+ if (str_equal(d->d_name, "badhelo")) continue;
+ if (str_equal(d->d_name, "badrcptto")) continue;
+ if (str_equal(d->d_name, "badmailfrom")) continue;
+ if (str_equal(d->d_name, "badloadertypes")) continue;
+ if (str_equal(d->d_name, "badloadertypes.cdb")) continue;
+ if (str_equal(d->d_name, "badmimetypes")) continue;
+ if (str_equal(d->d_name, "badmimetypes.cdb")) continue;
+ if (str_equal(d->d_name, "bouncefrom")) continue;
+ if (str_equal(d->d_name, "bouncehost")) continue;
+ if (str_equal(d->d_name, "bouncemaxbytes")) continue;
+ if (str_equal(d->d_name, "concurrencylocal")) continue;
+ if (str_equal(d->d_name, "concurrencyremote")) continue;
+ if (str_equal(d->d_name, "databytes")) continue;
+ if (str_equal(d->d_name, "defaultdomain")) continue;
+ if (str_equal(d->d_name, "defaulthost")) continue;
+ if (str_equal(d->d_name, "dkimdomains")) continue;
+ if (str_equal(d->d_name, "domainips")) continue;
+ if (str_equal(d->d_name, "domaincerts")) continue;
+ if (str_equal(d->d_name, "doublebouncehost")) continue;
+ if (str_equal(d->d_name, "doublebounceto")) continue;
+ if (str_equal(d->d_name, "envnoathost")) continue;
+ if (str_equal(d->d_name, "helohost")) continue;
+ if (str_equal(d->d_name, "idhost")) continue;
+ if (str_equal(d->d_name, "localiphost")) continue;
+ if (str_equal(d->d_name, "locals")) continue;
+ if (str_equal(d->d_name, "me")) continue;
+ if (str_equal(d->d_name, "mailfromrules")) continue;
+ if (str_equal(d->d_name, "mailfromrules.cdb")) continue;
+ if (str_equal(d->d_name, "morercpthosts")) continue;
+ if (str_equal(d->d_name, "morercpthosts.cdb")) continue;
+ if (str_equal(d->d_name, "percenthack")) continue;
+ if (str_equal(d->d_name, "plusdomain")) continue;
+ if (str_equal(d->d_name, "qmqpservers")) continue;
+ if (str_equal(d->d_name, "queuelifetime")) continue;
+ if (str_equal(d->d_name, "rcpthosts")) continue;
+ if (str_equal(d->d_name, "recipients")) continue;
+ if (str_equal(d->d_name, "smtpgreeting")) continue;
+ if (str_equal(d->d_name, "qmtproutes")) continue;
+ if (str_equal(d->d_name, "smtproutes")) continue;
+ if (str_equal(d->d_name, "spfexplain")) continue;
+ if (str_equal(d->d_name, "spflocalrules")) continue;
+ if (str_equal(d->d_name, "srsdomains")) continue;
+ if (str_equal(d->d_name, "timeoutconnect")) continue;
+ if (str_equal(d->d_name, "timeoutremote")) continue;
+ if (str_equal(d->d_name, "timeoutsmtpd")) continue;
+ if (str_equal(d->d_name, "tlsdestinations")) continue;
+ if (str_equal(d->d_name, "virtualdomains")) continue;
+ buffer_puts(buffer_1, "\n");
+ buffer_puts(buffer_1, d->d_name);
+ buffer_puts(buffer_1, ": I have no idea what this file does.\n");
}
buffer_flush(buffer_1);
diff --git a/src/qmail-smtpam.c b/src/qmail-smtpam.c
index c0c6550..89105c3 100644
--- a/src/qmail-smtpam.c
+++ b/src/qmail-smtpam.c
@@ -1,65 +1,67 @@
-#include <sys/types.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/stat.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "sig.h"
-#include "genalloc.h"
-#include "stralloc.h"
+
+#include "alloc.h"
#include "buffer.h"
-#include "scan.h"
-#include "case.h"
#include "byte.h"
+#include "case.h"
+#include "constmap.h"
#include "error.h"
+#include "exit.h"
+#include "genalloc.h"
+#include "ip.h"
+#include "scan.h"
+#include "sig.h"
+#include "socket_if.h"
+#include "str.h"
+#include "stralloc.h"
+#include "timeout.h"
+#include "timeoutconn.h"
+#include "uint_t.h"
+
#include "auto_qmail.h"
#include "control.h"
#include "dns.h"
-#include "alloc.h"
-#include "quote.h"
-#include "ip.h"
#include "ipalloc.h"
#include "ipme.h"
-#include "str.h"
#include "now.h"
-#include "exit.h"
-#include "constmap.h"
+#include "quote.h"
#include "tcpto.h"
-#include "socket_if.h"
-#include "ucspissl.h"
-#include "timeout.h"
-#include "timeoutconn.h"
-#include "tls_remote.h"
#include "tls_errors.h"
+#include "tls_remote.h"
#include "tls_timeoutio.h"
-#include "uint_t.h"
+#include "ucspissl.h"
-#define MAX_SIZE 200000000
+#define MAX_SIZE 200000000
#define HUGESMTPTEXT 5000
-#define PORT_SMTP 25 /* silly rabbit, /etc/services is for users */
-#define PORT_SMTPS 465
-#define VERIFYDEPTH 1
-#define FDPAM 3
+#define PORT_SMTP 25 /* silly rabbit, /etc/services is for users */
+#define PORT_SMTPS 465
+#define VERIFYDEPTH 1
+#define FDPAM 3
#define WHO "qmail-smtpam"
/** @file qmail-smtpam.c -- TLS enabled SMTP PAM to check mailbox at remote MX
*/
-int flagauth = 0; /* 1 = login; 2 = plain; 3 =crammd5 */
-int flagsmtps = 0; /* RFC 8314 - 'implicit TLS' */
-int flagtls = 0; /* -2 = rejected; -1 = not; 0 = no, default;
+int flagauth = 0; /* 1 = login; 2 = plain; 3 =crammd5 */
+int flagsmtps = 0; /* RFC 8314 - 'implicit TLS' */
+int flagtls = 0; /* -2 = rejected; -1 = not; 0 = no, default;
> 0 see tls_remote.c
+10 = SMTPS; +20 = QMTPS; 100 = active TLS connection */
-int flagverify = 0; /* 1 = verify Cert against CA ; -1 = Cert pinning */
+int flagverify = 0; /* 1 = verify Cert against CA ; -1 = Cert pinning */
int flagutf8mail = 0;
unsigned long port = PORT_SMTP;
-GEN_ALLOC_typedef(saa,stralloc,sa,len,a)
-GEN_ALLOC_readyplus(saa,stralloc,sa,len,a,i,n,x,10,saa_readyplus)
+GEN_ALLOC_typedef(saa, stralloc, sa, len, a)
+ GEN_ALLOC_readyplus(saa, stralloc, sa, len, a, i, n, x, 10, saa_readyplus)
-stralloc helohost = {0};
+ stralloc helohost = {0};
stralloc host = {0};
stralloc ports = {0};
stralloc remotehost = {0};
@@ -83,44 +85,55 @@ struct ip_mx partner;
SSL *ssl;
SSL_CTX *ctx;
-void out(char *s) { if (buffer_puts(buffer_1small,s) == -1) _exit(111); }
-void zero() { if (buffer_put(buffer_1small,"\0",1) == -1) _exit(111); }
-void zerodie() { zero(); buffer_flush(buffer_1small); _exit(111); }
-void outsafe(stralloc *sa)
-{
- int i;
+void out(char *s)
+{
+ if (buffer_puts(buffer_1small, s) == -1) _exit(111);
+}
+void zero()
+{
+ if (buffer_put(buffer_1small, "\0", 1) == -1) _exit(111);
+}
+void zerodie()
+{
+ zero();
+ buffer_flush(buffer_1small);
+ _exit(111);
+}
+void outsafe(stralloc *sa)
+{
+ int i;
char ch;
for (i = 0; i < sa->len; ++i) {
- ch = sa->s[i];
- if (ch < 33) ch = '?';
+ ch = sa->s[i];
+ if (ch < 33) ch = '?';
if (ch > 126) ch = '?';
- if (buffer_put(buffer_1small,&ch,1) == -1) _exit(111);
- }
+ if (buffer_put(buffer_1small, &ch, 1) == -1) _exit(111);
+ }
}
-void temp_noip()
+void temp_noip()
{
out("Zinvalid ipaddr in control/domainips (#4.3.0)\n");
zerodie();
}
-void temp_nomem()
+void temp_nomem()
{
out("ZOut of memory. (#4.3.0)\n");
zerodie();
}
-void temp_oserr()
+void temp_oserr()
{
out("ZSystem resources temporarily unavailable. (#4.3.0)\n");
zerodie();
}
-void temp_osip()
+void temp_osip()
{
out("ZCan't bind to local ip address: ");
outsafe(&sendip);
out(". (#4.3.0)\n");
zerodie();
}
-void temp_noconn()
+void temp_noconn()
{
out("ZSorry, I wasn't able to establish an SMTP connection. (#4.4.1)\n");
zerodie();
@@ -132,29 +145,29 @@ void temp_dnscanon()
out(". (#4.4.3)\n");
zerodie();
}
-void temp_dns()
+void temp_dns()
{
out("ZSorry, I couldn't find any host named: ");
outsafe(&host);
out(". (#4.1.2)\n");
zerodie();
}
-void temp_chdir()
+void temp_chdir()
{
out("ZUnable to switch to home directory. (#4.3.0)\n");
zerodie();
}
-void temp_control()
+void temp_control()
{
out("ZUnable to read control files. (#4.3.0)\n");
zerodie();
}
-void perm_usage()
+void perm_usage()
{
out("Dqmail-smtpam was invoked improperly. (#5.3.5)\n");
zerodie();
}
-void perm_dns()
+void perm_dns()
{
out("DSorry, I couldn't find any host named: ");
outsafe(&host);
@@ -167,17 +180,15 @@ void outhost()
int len;
switch (partner.af) {
- case AF_INET:
- len = ip4_fmt(ipaddr,(char *)&partner.addr.ip4.d); break;
- case AF_INET6:
- len = ip6_fmt(ipaddr,(char *)&partner.addr.ip6.d); break;
+ case AF_INET: len = ip4_fmt(ipaddr, (char *)&partner.addr.ip4.d); break;
+ case AF_INET6: len = ip6_fmt(ipaddr, (char *)&partner.addr.ip6.d); break;
}
- if (buffer_put(buffer_1small,ipaddr,len) == -1) _exit(0);
+ if (buffer_put(buffer_1small, ipaddr, len) == -1) _exit(0);
}
int flagcritical = 0;
-void dropped()
+void dropped()
{
out("ZConnected to ");
outhost();
@@ -191,35 +202,35 @@ int timeoutconnect = 60;
int smtpfd;
int timeout = 1200;
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
- r = timeoutread(timeout,smtpfd,buf,len);
+ r = timeoutread(timeout, smtpfd, buf, len);
if (r <= 0) dropped();
return r;
}
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = timeoutwrite(timeout,smtpfd,buf,len);
+ r = timeoutwrite(timeout, smtpfd, buf, len);
if (r <= 0) dropped();
return r;
}
char outbuf[1450];
-buffer bo = BUFFER_INIT(safewrite,-1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(safewrite, -1, outbuf, sizeof(outbuf));
char frombuf[128];
-buffer bi = BUFFER_INIT(saferead,-1,frombuf,sizeof(frombuf));
+buffer bi = BUFFER_INIT(saferead, -1, frombuf, sizeof(frombuf));
stralloc smtptext = {0};
void get(char *ch)
{
- buffer_get(&bi,ch,1);
+ buffer_get(&bi, ch, 1);
if (*ch != '\r')
if (smtptext.len < HUGESMTPTEXT)
- if (!stralloc_append(&smtptext,ch)) temp_nomem();
+ if (!stralloc_append(&smtptext, ch)) temp_nomem();
}
unsigned long smtpcode()
@@ -227,11 +238,14 @@ unsigned long smtpcode()
unsigned char ch;
unsigned long code;
- if (!stralloc_copys(&smtptext,"")) temp_nomem();
+ if (!stralloc_copys(&smtptext, "")) temp_nomem();
- get(&ch); code = ch - '0';
- get(&ch); code = code * 10 + (ch - '0');
- get(&ch); code = code * 10 + (ch - '0');
+ get(&ch);
+ code = ch - '0';
+ get(&ch);
+ code = code * 10 + (ch - '0');
+ get(&ch);
+ code = code * 10 + (ch - '0');
for (;;) {
get(&ch);
if (ch != '-') break;
@@ -247,19 +261,20 @@ unsigned long smtpcode()
void outsmtptext()
{
- int i;
- if (smtptext.s) if (smtptext.len) {
- out("Remote host said: ");
- for (i = 0; i < smtptext.len; ++i)
- if (!smtptext.s[i]) smtptext.s[i] = '?';
- if (buffer_put(buffer_1small,smtptext.s,smtptext.len) == -1) _exit(111);
- smtptext.len = 0;
- }
+ int i;
+ if (smtptext.s)
+ if (smtptext.len) {
+ out("Remote host said: ");
+ for (i = 0; i < smtptext.len; ++i)
+ if (!smtptext.s[i]) smtptext.s[i] = '?';
+ if (buffer_put(buffer_1small, smtptext.s, smtptext.len) == -1) _exit(111);
+ smtptext.len = 0;
+ }
}
-void quit(char *prepend,char *append)
+void quit(char *prepend, char *append)
{
- buffer_putsflush(&bo,"QUIT\r\n");
+ buffer_putsflush(&bo, "QUIT\r\n");
/* waiting for remote side is just too ridiculous */
out(prepend);
outhost();
@@ -292,43 +307,42 @@ unsigned long verifydepth = VERIFYDEPTH;
void tls_init()
{
-/* Client CTX */
+ /* Client CTX */
ctx = ssl_client();
ssl_errstr();
if (!ctx) temp_tlsctx();
-/* Fetch CA infos for dest */
+ /* Fetch CA infos for dest */
if (flagverify > 0)
if (cafile.len || cadir.len)
- if (!ssl_ca(ctx,cafile.s,cadir.s,(int) verifydepth)) temp_tlsca();
+ if (!ssl_ca(ctx, cafile.s, cadir.s, (int)verifydepth)) temp_tlsca();
if (ciphers.len)
- if (!ssl_ciphers(ctx,ciphers.s)) temp_tlscipher();
+ if (!ssl_ciphers(ctx, ciphers.s)) temp_tlscipher();
-/* Set SSL Context */
+ /* Set SSL Context */
- ssl = ssl_new(ctx,smtpfd);
+ ssl = ssl_new(ctx, smtpfd);
if (!ssl) temp_tlsctx();
-/* Setup SSL FDs */
+ /* Setup SSL FDs */
- if (!tls_conn(ssl,smtpfd)) temp_tlscon();
+ if (!tls_conn(ssl, smtpfd)) temp_tlscon();
-/* Go on in none-blocking mode */
+ /* Go on in none-blocking mode */
- if (tls_timeoutconn(timeout,smtpfd,smtpfd,ssl) <= 0)
- temp_tlserr();
+ if (tls_timeoutconn(timeout, smtpfd, smtpfd, ssl) <= 0) temp_tlserr();
}
int starttls_peer()
{
int i = 0;
- while ( (i += str_chr(smtptext.s + i,'\n') + 1) &&
- (i < smtptext.len - 8) ) {
- if (!str_diffn(smtptext.s + i + 4,"STARTTLS",8)) return 1; }
+ while ((i += str_chr(smtptext.s + i, '\n') + 1) && (i < smtptext.len - 8)) {
+ if (!str_diffn(smtptext.s + i + 4, "STARTTLS", 8)) return 1;
+ }
return 0;
}
@@ -336,37 +350,40 @@ int starttls_peer()
void tls_peercheck()
{
X509 *cert;
-
+
cert = SSL_get_peer_certificate(ssl);
- if (!cert) { flagtls = 100; return; }
+ if (!cert) {
+ flagtls = 100;
+ return;
+ }
if (flagverify < 0) {
- if (cafile.len) case_lowerb(cafile.s,cafile.len);
- switch (tls_fingerprint(cert,cafile.s + 1,cafile.len - 1)) {
+ if (cafile.len) case_lowerb(cafile.s, cafile.len);
+ switch (tls_fingerprint(cert, cafile.s + 1, cafile.len - 1)) {
case -1: temp_tlspeercert();
case -2: temp_tlsdigest();
case -3: temp_invaliddigest();
- case 1: temp_tlscertfp();
+ case 1: temp_tlscertfp();
}
} else {
- switch (tls_checkpeer(ssl,cert,remotehost,flagtls,flagverify)) {
+ switch (tls_checkpeer(ssl, cert, remotehost, flagtls, flagverify)) {
case -1: temp_tlspeercert();
case -2: temp_tlspeerverify();
case -3: temp_tlspeervalid();
- case 1: flagtls = 101; break;
- case 2: flagtls = 102; break;
- case 3: flagtls = 103; break;
+ case 1: flagtls = 101; break;
+ case 2: flagtls = 102; break;
+ case 3: flagtls = 103; break;
}
}
if (flagtls < 100) flagtls = 100;
-
+
X509_free(cert);
return;
}
-int utf8flag(unsigned char *ch,int len)
+int utf8flag(unsigned char *ch, int len)
{
int i = 0;
while (i < len)
@@ -380,25 +397,25 @@ unsigned long code;
void smtp_greeting()
{
- buffer_puts(&bo,"EHLO ");
- buffer_put(&bo,helohost.s,helohost.len);
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "EHLO ");
+ buffer_put(&bo, helohost.s, helohost.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
if (smtpcode() != 250) {
- buffer_puts(&bo,"HELO ");
- buffer_put(&bo,helohost.s,helohost.len);
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "HELO ");
+ buffer_put(&bo, helohost.s, helohost.len);
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
code = smtpcode();
- if (code >= 500) quit("DConnected to"," but my name was rejected");
- if (code != 250) quit("ZConnected to"," but my name was rejected");
+ if (code >= 500) quit("DConnected to", " but my name was rejected");
+ if (code != 250) quit("ZConnected to", " but my name was rejected");
}
}
void smtp_starttls()
{
- buffer_puts(&bo,"STARTTLS\r\n");
+ buffer_puts(&bo, "STARTTLS\r\n");
buffer_flush(&bo);
if (smtpcode() == 220) {
tls_init();
@@ -406,45 +423,44 @@ void smtp_starttls()
smtp_greeting();
} else {
flagtls = -2;
- quit("ZConnected to"," but STARTTLS was rejected");
+ quit("ZConnected to", " but STARTTLS was rejected");
}
}
void smtp()
{
- if (flagtls > 10 && flagtls < 20) { /* SMTPS */
+ if (flagtls > 10 && flagtls < 20) { /* SMTPS */
tls_init();
tls_peercheck();
}
code = smtpcode();
- if (code >= 500) quit("DConnected to "," but sender was rejected");
- if (code >= 400) quit("ZConnected to "," but sender was probably greylisted");
+ if (code >= 500) quit("DConnected to ", " but sender was rejected");
+ if (code >= 400) quit("ZConnected to ", " but sender was probably greylisted");
smtp_greeting();
- if (flagutf8mail) buffer_puts(&bo," SMTPUTF8");
+ if (flagutf8mail) buffer_puts(&bo, " SMTPUTF8");
- if (flagtls > 0 && flagtls < 10) /* STARTTLS */
+ if (flagtls > 0 && flagtls < 10) /* STARTTLS */
if (starttls_peer()) {
- smtp_starttls();
+ smtp_starttls();
} else if (flagtls > 2) {
- temp_tlshost();
+ temp_tlshost();
}
- buffer_puts(&bo,"MAIL FROM:<>");
- if (flagutf8mail)
- buffer_puts(&bo," SMTPUTF8");
- buffer_puts(&bo,"\r\n");
+ buffer_puts(&bo, "MAIL FROM:<>");
+ if (flagutf8mail) buffer_puts(&bo, " SMTPUTF8");
+ buffer_puts(&bo, "\r\n");
buffer_flush(&bo);
code = smtpcode();
- if (code >= 500) quit("DConnected to "," but sender was rejected");
- if (code >= 400) quit("ZConnected to "," but sender was rejected");
-
- buffer_puts(&bo,"RCPT TO:<");
- buffer_put(&bo,recipient.s,recipient.len);
- buffer_puts(&bo,">\r\n");
+ if (code >= 500) quit("DConnected to ", " but sender was rejected");
+ if (code >= 400) quit("ZConnected to ", " but sender was rejected");
+
+ buffer_puts(&bo, "RCPT TO:<");
+ buffer_put(&bo, recipient.s, recipient.len);
+ buffer_puts(&bo, ">\r\n");
buffer_flush(&bo);
code = smtpcode();
close(smtpfd);
@@ -455,28 +471,33 @@ void smtp()
void getcontrols()
{
if (control_init() == -1) temp_control();
- if (control_readint(&timeout,"control/timeoutremote") == -1) temp_control();
- if (control_readint(&timeoutconnect,"control/timeoutconnect") == -1)
- temp_control();
- if (control_rldef(&helohost,"control/helohost",1,(char *) 0) != 1)
- temp_control();
- switch (control_readfile(&domainips,"control/domainips",0)) {
+ if (control_readint(&timeout, "control/timeoutremote") == -1) temp_control();
+ if (control_readint(&timeoutconnect, "control/timeoutconnect") == -1) temp_control();
+ if (control_rldef(&helohost, "control/helohost", 1, (char *)0) != 1) temp_control();
+ switch (control_readfile(&domainips, "control/domainips", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&mapdomainips,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&mapdomainips,domainips.s,domainips.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapdomainips, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapdomainips, domainips.s, domainips.len, 1)) temp_nomem();
+ break;
}
- switch (control_readfile(&tlsdestinations,"control/tlsdestinations",0)) {
+ switch (control_readfile(&tlsdestinations, "control/tlsdestinations", 0)) {
case -1: temp_control();
- case 0: if (!constmap_init(&maptlsdestinations,"",0,1)) temp_nomem(); break;
- case 1: if (!constmap_init(&maptlsdestinations,tlsdestinations.s,tlsdestinations.len,1)) temp_nomem(); break;
+ case 0:
+ if (!constmap_init(&maptlsdestinations, "", 0, 1)) temp_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&maptlsdestinations, tlsdestinations.s, tlsdestinations.len, 1)) temp_nomem();
+ break;
}
-
}
char up[513];
int uplen;
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
static ipalloc ip = {0};
stralloc netif = {0};
@@ -485,83 +506,88 @@ int main(int argc,char **argv)
int p; /* reserved for port */
char *localip = 0;
char *tlsdestinfo = 0;
-
+
sig_pipeignore();
if (argc < 2) perm_usage();
if (chdir(auto_qmail) == -1) temp_chdir();
getcontrols();
-
- if (!stralloc_copys(&host,argv[1])) temp_nomem();
+
+ if (!stralloc_copys(&host, argv[1])) temp_nomem();
if (argv[2]) {
- if (!stralloc_copys(&ports,argv[2])) temp_nomem();
- if (*ports.s == 's') { ports.s++; flagsmtps = 1; }
- scan_ulong(ports.s,&port);
+ if (!stralloc_copys(&ports, argv[2])) temp_nomem();
+ if (*ports.s == 's') {
+ ports.s++;
+ flagsmtps = 1;
+ }
+ scan_ulong(ports.s, &port);
}
if (ipme_init() != 1) temp_oserr();
-/* this file is too long -------------------------------------- set domain ip + helohost */
+ /* this file is too long -------------------------------------- set domain ip + helohost */
- if (!localip)
- localip = constmap(&mapdomainips,"*",1); /* one for all */
+ if (!localip) localip = constmap(&mapdomainips, "*", 1); /* one for all */
if (localip) {
- j = str_chr(localip,'%');
+ j = str_chr(localip, '%');
if (localip[j] != '%') j = 0;
- k = str_chr(localip,'|');
+ k = str_chr(localip, '|');
if (localip[k] != '|') k = 0;
- if (k) { /* helohost */
- if (!stralloc_copys(&helohost,localip + k + 1)) temp_nomem();
+ if (k) { /* helohost */
+ if (!stralloc_copys(&helohost, localip + k + 1)) temp_nomem();
localip[k] = 0;
}
- if (j) { /* if index */
+ if (j) { /* if index */
localip[j] = 0;
- if (!stralloc_copys(&netif,localip + j + 1)) temp_nomem();
+ if (!stralloc_copys(&netif, localip + j + 1)) temp_nomem();
if (!stralloc_0(&netif)) temp_nomem();
}
}
-/* this file is too long -------------------------------------- TLS destinations */
+ /* this file is too long -------------------------------------- TLS destinations */
- flagtls = tls_destination((const stralloc) host); // un-terminated
+ flagtls = tls_destination((const stralloc)host); // un-terminated
if (flagtls > 0) {
if (tlsdestinfo) {
- i = str_chr(tlsdestinfo,'|'); /* ca file or cert fingerprint */
+ i = str_chr(tlsdestinfo, '|'); /* ca file or cert fingerprint */
if (tlsdestinfo[i] == '|') {
tlsdestinfo[i] = 0;
- j = str_chr(tlsdestinfo+i+1,'|'); /* cipher */
+ j = str_chr(tlsdestinfo + i + 1, '|'); /* cipher */
if (tlsdestinfo[i + j + 1] == '|') {
tlsdestinfo[i + j + 1] = 0;
- k = str_chr(tlsdestinfo + i + j + 2,'|'); /* cone domain */
+ k = str_chr(tlsdestinfo + i + j + 2, '|'); /* cone domain */
if (tlsdestinfo[i + j + k + 2] == '|') {
tlsdestinfo[i + j + k + 2] = 0;
- if (str_diffn(tlsdestinfo + j + k + 3,canonhost.s,canonhost.len)) flagtls = 0;
+ if (str_diffn(tlsdestinfo + j + k + 3, canonhost.s, canonhost.len)) flagtls = 0;
}
- p = str_chr(tlsdestinfo + i + j + 2,';'); /* verifydepth;port */
+ p = str_chr(tlsdestinfo + i + j + 2, ';'); /* verifydepth;port */
if (tlsdestinfo[i + j + p + 2] == ';') {
- if (tlsdestinfo[i + j + p + 3] == 's') { flagsmtps = 1; p++; }
+ if (tlsdestinfo[i + j + p + 3] == 's') {
+ flagsmtps = 1;
+ p++;
+ }
tlsdestinfo[i + j + p + 2] = 0;
- if (p > 0) scan_ulong(tlsdestinfo+i+j + 2,&verifydepth);
- scan_ulong(tlsdestinfo+i+j + p + 3,&port);
+ if (p > 0) scan_ulong(tlsdestinfo + i + j + 2, &verifydepth);
+ scan_ulong(tlsdestinfo + i + j + p + 3, &port);
}
}
- if (!stralloc_copys(&ciphers,tlsdestinfo + i + 1)) temp_nomem();
+ if (!stralloc_copys(&ciphers, tlsdestinfo + i + 1)) temp_nomem();
}
- if (!stralloc_copys(&cafile,tlsdestinfo)) temp_nomem();
+ if (!stralloc_copys(&cafile, tlsdestinfo)) temp_nomem();
}
-/* cafile starts with '=' => it is a fingerprint
+ /* cafile starts with '=' => it is a fingerprint
cafile ends with '/' => consider it as cadir */
- if (cafile.len) {
+ if (cafile.len) {
flagverify = 1;
if (cafile.s[cafile.len] == '/') {
cafile.len = 0;
flagverify = 2;
- if (!stralloc_copys(&cadir,tlsdestinfo)) temp_nomem();
+ if (!stralloc_copys(&cadir, tlsdestinfo)) temp_nomem();
if (!stralloc_0(&cadir)) temp_nomem();
} else {
if (cafile.s[0] == '%') flagverify = -1;
@@ -574,12 +600,11 @@ int main(int argc,char **argv)
if (port == PORT_SMTPS || flagsmtps) flagtls = flagtls + 10;
}
-/* this file is too long -------------------------------------- Setup connection */
+ /* this file is too long -------------------------------------- Setup connection */
uplen = 0;
for (;;) {
- do
- r = read(FDPAM,up + uplen,sizeof(up) - uplen);
+ do r = read(FDPAM, up + uplen, sizeof(up) - uplen);
while ((r == -1) && (errno == EINTR));
if (r == -1) _exit(111);
if (r == 0) break;
@@ -588,44 +613,45 @@ int main(int argc,char **argv)
}
close(FDPAM);
- if (!stralloc_copyb(&recipient,up,uplen)) temp_nomem();
- if (!stralloc_0(&recipient)) temp_nomem();
- if (!stralloc_0(&host)) temp_nomem();
- if (!stralloc_copys(&remotehost,host.s)) temp_nomem();
+ if (!stralloc_copyb(&recipient, up, uplen)) temp_nomem();
+ if (!stralloc_0(&recipient)) temp_nomem();
+ if (!stralloc_0(&host)) temp_nomem();
+ if (!stralloc_copys(&remotehost, host.s)) temp_nomem();
- flagutf8mail = utf8flag(recipient.s,recipient.len);
+ flagutf8mail = utf8flag(recipient.s, recipient.len);
- switch (dns_ip(&ip,&remotehost)) {
- case DNS_MEM: temp_nomem();
+ switch (dns_ip(&ip, &remotehost)) {
+ case DNS_MEM: temp_nomem();
case DNS_ERR: temp_dns();
case DNS_COM: temp_dnscanon();
- default: if (ip.len <= 0) perm_dns();
+ default:
+ if (ip.len <= 0) perm_dns();
}
- smtpfd = socket(ip.ix[i].af,SOCK_STREAM,0);
+ smtpfd = socket(ip.ix[i].af, SOCK_STREAM, 0);
if (smtpfd == -1) temp_oserr();
-
- if (localip) { /* set domain ip */
- if (!stralloc_copyb(&sendip,localip,str_len(localip))) temp_nomem();
- j = str_chr(localip,':');
- if (j && localip[j] == ':') { /* IPv6 */
- if (!ip6_scan(localip,ip6)) temp_noip();
- ifidx = socket_getifidx(netif.s);
- if (socket_bind6(smtpfd,ip6,0,ifidx) < 0) temp_osip();
- } else { /* IPv4 */
- if (!ip4_scan(localip,ip4)) temp_noip();
- if (socket_bind4(smtpfd,ip4,0) < 0) temp_osip();
- }
- }
-
- r = timeoutconn(smtpfd,&ip.ix[i].addr,(unsigned int) port,timeoutconnect,ifidx);
- if (r == 0) {
- tcpto_err(&ip.ix[i],0);
+
+ if (localip) { /* set domain ip */
+ if (!stralloc_copyb(&sendip, localip, str_len(localip))) temp_nomem();
+ j = str_chr(localip, ':');
+ if (j && localip[j] == ':') { /* IPv6 */
+ if (!ip6_scan(localip, ip6)) temp_noip();
+ ifidx = socket_getifidx(netif.s);
+ if (socket_bind6(smtpfd, ip6, 0, ifidx) < 0) temp_osip();
+ } else { /* IPv4 */
+ if (!ip4_scan(localip, ip4)) temp_noip();
+ if (socket_bind4(smtpfd, ip4, 0) < 0) temp_osip();
+ }
+ }
+
+ r = timeoutconn(smtpfd, &ip.ix[i].addr, (unsigned int)port, timeoutconnect, ifidx);
+ if (r == 0) {
+ tcpto_err(&ip.ix[i], 0);
partner = ip.ix[i];
smtp(); /* does not return */
}
- tcpto_err(&ip.ix[i],errno == ETIMEDOUT);
+ tcpto_err(&ip.ix[i], errno == ETIMEDOUT);
close(smtpfd);
-
+
temp_noconn();
}
diff --git a/src/qmail-smtpd.c b/src/qmail-smtpd.c
index f312c11..6d2d0d4 100644
--- a/src/qmail-smtpd.c
+++ b/src/qmail-smtpd.c
@@ -1,93 +1,102 @@
#include <unistd.h>
-#include "wildmat.h"
-#include "buffer.h"
-#include "stralloc.h"
-#include "genalloc.h"
+
#include "alloc.h"
-#include "auto_qmail.h"
-#include "control.h"
-#include "received.h"
+#include "base64.h"
+#include "buffer.h"
+#include "byte.h"
+#include "case.h"
+#include "cdbread.h"
+#include "close.h"
#include "constmap.h"
-#include "logmsg.h"
-#include "ipme.h"
+#include "env.h"
+#include "exit.h"
#include "fd.h"
-#include "ip.h"
-#include "qmail.h"
-#include "str.h"
#include "fmt.h"
+#include "genalloc.h"
+#include "ip.h"
+#include "logmsg.h"
+#include "open.h"
#include "scan.h"
-#include "byte.h"
-#include "case.h"
-#include "env.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "timeout.h"
+#include "wait.h"
+
+#include "auto_qmail.h"
+#include "commands.h"
+#include "control.h"
+#include "dns.h"
+#include "ipme.h"
+#include "mfrules.h"
#include "now.h"
-#include "exit.h"
+#include "qmail.h"
#include "rcpthosts.h"
+#include "received.h"
#include "recipients.h"
-#include "mfrules.h"
-#include "tls_start.h"
#include "smtpdlog.h"
-#include "timeout.h"
-#include "commands.h"
-#include "cdbread.h"
-#include "dns.h"
-#include "wait.h"
-#include "sig.h"
-#include "close.h"
-#include "open.h"
-#include "base64.h"
#include "spf.h"
+#include "tls_start.h"
+#include "wildmat.h"
/** @file qmail-smtpd.c -- authenticating ESMTP/ESMTPS server
@brief requires sslserver or tcpserver */
#define PAM111421
-#define AUTHSLEEP 5
+#define AUTHSLEEP 5
#define PORT_SMTPS "465"
-#define MIMETYPE_LEN 9
-#define LOADER_LEN 5
+#define MIMETYPE_LEN 9
+#define LOADER_LEN 5
#define BASE64MESSAGE "content-transfer-encoding: base64"
-#define FDIN 0
-#define FDOUT 1
-#define FDLOG 2
-#define FDAUTH 3
+#define FDIN 0
+#define FDOUT 1
+#define FDLOG 2
+#define FDAUTH 3
#define BUFFER_SIZE 1024
-#define MAXHOPS 100
+#define MAXHOPS 100
unsigned long databytes = 0;
int timeout = 1200;
int modssl_info();
-ssize_t safewrite(int fd,char *buf,int len)
+ssize_t safewrite(int fd, char *buf, int len)
{
int r;
- r = timeoutwrite(timeout,fd,buf,len);
+ r = timeoutwrite(timeout, fd, buf, len);
if (r <= 0) _exit(1);
return r;
}
-ssize_t saferead(int fd,char *buf,int len)
+ssize_t saferead(int fd, char *buf, int len)
{
int r;
flush();
- r = timeoutread(timeout,fd,buf,len);
- if (r == -1) if (errno == ETIMEDOUT) die_alarm();
+ r = timeoutread(timeout, fd, buf, len);
+ if (r == -1)
+ if (errno == ETIMEDOUT) die_alarm();
if (r <= 0) die_read();
return r;
}
char inbuf[BUFFER_SIZE];
-buffer bi = BUFFER_INIT(saferead,FDIN,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(saferead, FDIN, inbuf, sizeof(inbuf));
-char outbuf[BUFFER_SIZE/2];
-buffer bo = BUFFER_INIT(safewrite,FDOUT,outbuf,sizeof(outbuf));
+char outbuf[BUFFER_SIZE / 2];
+buffer bo = BUFFER_INIT(safewrite, FDOUT, outbuf, sizeof(outbuf));
char logbuf[256];
-buffer bl = BUFFER_INIT(write,FDLOG,logbuf,sizeof(logbuf));
+buffer bl = BUFFER_INIT(write, FDLOG, logbuf, sizeof(logbuf));
-void flush() { buffer_flush(&bo); } // this triggers writing to STDIO
-void out(char *s) { buffer_puts(&bo,s); }
+void flush()
+{
+ buffer_flush(&bo);
+} // this triggers writing to STDIO
+void out(char *s)
+{
+ buffer_puts(&bo, s);
+}
stralloc sa = {0};
ipalloc ia = {0};
@@ -96,7 +105,7 @@ int bhelocheck(void);
/* this file is too long -------------------------------------- DNS helper */
-int dnsq(char *arg,char type)
+int dnsq(char *arg, char type)
{
unsigned int random;
int at;
@@ -106,26 +115,27 @@ int dnsq(char *arg,char type)
len = str_len(arg);
if (len < 1) return r;
- if (arg[len-1] == ' ') len--; /* trailing blank */
+ if (arg[len - 1] == ' ') len--; /* trailing blank */
if (len < 1) return r;
- at = byte_rchr(arg,len,'@');
+ at = byte_rchr(arg, len, '@');
if (at < len) {
- if (!stralloc_copyb(&sa,arg + at + 1,len - at - 1)) die_nomem();
- } else
- if (!stralloc_copyb(&sa,arg,len)) die_nomem();
+ if (!stralloc_copyb(&sa, arg + at + 1, len - at - 1)) die_nomem();
+ } else if (!stralloc_copyb(&sa, arg, len))
+ die_nomem();
random = now() + (getpid() << 16);
- switch (type) { /* Common for IPv4 and IPv6 */
- case 'A': r = dns_ip(&ia,&sa); break;
- case 'M': r = dns_mxip(&ia,&sa,random); break;
+ switch (type) { /* Common for IPv4 and IPv6 */
+ case 'A': r = dns_ip(&ia, &sa); break;
+ case 'M': r = dns_mxip(&ia, &sa, random); break;
}
switch (r) {
case DNS_ERR: out("451 DNS temporary failure (#4.3.0)\r\n"); return -1;
case DNS_MEM: die_nomem();
- default: if (ia.len) return 0;
+ default:
+ if (ia.len) return 0;
}
return 1;
@@ -137,8 +147,8 @@ static stralloc greeting = {0};
void smtp_greet(char *code)
{
- buffer_puts(&bo,code);
- buffer_put(&bo,greeting.s,greeting.len);
+ buffer_puts(&bo, code);
+ buffer_put(&bo, greeting.s, greeting.len);
}
void smtp_help()
{
@@ -146,7 +156,10 @@ void smtp_help()
}
void smtp_quit()
{
- smtp_greet("221 "); out("\r\n"); flush(); _exit(0);
+ smtp_greet("221 ");
+ out("\r\n");
+ flush();
+ _exit(0);
}
char *remoteip;
@@ -172,33 +185,47 @@ char *badhelocond;
void dohelo(char *helo)
{
- if (!stralloc_copys(&helohost,helo)) die_nomem();
+ if (!stralloc_copys(&helohost, helo)) die_nomem();
if (!stralloc_0(&helohost)) die_nomem();
- fakehelo = case_diffs(remotehost,helohost.s) ? helohost.s : 0;
+ fakehelo = case_diffs(remotehost, helohost.s) ? helohost.s : 0;
if (helocheck) {
if (str_len(helocheck) == 1) {
switch (*helocheck) {
- case '=': flagbadhelo = bhelocheck();
- if (fakehelo) { flagdnshelo = 1; badhelocond = "="; }
- break;
- case 'A': flagbadhelo = bhelocheck();
- if (flagbadhelo == 0) { flagdnshelo = dnsq(helohost.s,'A'); badhelocond = "A"; }
- break;
- case 'M': flagbadhelo = bhelocheck();
- if (flagbadhelo == 0) { flagdnshelo = dnsq(helohost.s,'M'); badhelocond = "M"; }
- break;
- case '.': flagbadhelo = bhelocheck();
- if (!str_len(helo)) flagbadhelo = -2;
- break;
- case '!': if (!str_len(helo)) flagbadhelo = -2;
- break;
+ case '=':
+ flagbadhelo = bhelocheck();
+ if (fakehelo) {
+ flagdnshelo = 1;
+ badhelocond = "=";
+ }
+ break;
+ case 'A':
+ flagbadhelo = bhelocheck();
+ if (flagbadhelo == 0) {
+ flagdnshelo = dnsq(helohost.s, 'A');
+ badhelocond = "A";
+ }
+ break;
+ case 'M':
+ flagbadhelo = bhelocheck();
+ if (flagbadhelo == 0) {
+ flagdnshelo = dnsq(helohost.s, 'M');
+ badhelocond = "M";
+ }
+ break;
+ case '.':
+ flagbadhelo = bhelocheck();
+ if (!str_len(helo)) flagbadhelo = -2;
+ break;
+ case '!':
+ if (!str_len(helo)) flagbadhelo = -2;
+ break;
}
} else {
- flagbadhelo = bhelocheck();
+ flagbadhelo = bhelocheck();
}
if (flagbadhelo == -3) flagbadhelo = 0;
}
- if (!env_put("HELOHOST",helohost.s)) die_nomem();
+ if (!env_put("HELOHOST", helohost.s)) die_nomem();
}
int liphostok = 0;
@@ -208,7 +235,7 @@ int bmfok = 0;
stralloc bmf = {0};
struct constmap mapbmf;
-int brtok= 0;
+int brtok = 0;
stralloc brt = {0};
struct constmap mapbrt;
@@ -220,16 +247,17 @@ static struct cdb cdbm;
static struct cdb cdbl;
static int fdbmt;
-int flagmimetype = 0; /* 1: white; 2: cdb; 3: white+cdb; 4: !relay+white; 6: !relay+white+cdb; -1: found in cdb; -2: found white */
+int flagmimetype =
+ 0; /* 1: white; 2: cdb; 3: white+cdb; 4: !relay+white; 6: !relay+white+cdb; -1: found in cdb; -2: found white */
char *badmimeinit;
static int fdblt;
-int flagloadertype = 0; /* 1: cdb; 2: !relay+cdb; -1: found in cdb */
+int flagloadertype = 0; /* 1: cdb; 2: !relay+cdb; -1: found in cdb */
char *badloaderinit;
static int fdmav;
int flagmav = 0;
-int localmf = 0; /* 1: domainpart->rcpthosts; 2: ->mailformrules; 3: ->remoteinfo; 4: ->DN(Email) */
+int localmf = 0; /* 1: domainpart->rcpthosts; 2: ->mailformrules; 3: ->remoteinfo; 4: ->DN(Email) */
char *localmfcheck;
char *mfdnscheck;
@@ -247,12 +275,14 @@ int greylist = 0;
stralloc pgbind = {0};
char *auth;
-int smtpauth = 0; /* -1:Cert 0:none 1:login/plain 2:cram 3:login/plain/cram 11:must_login/plain 12:must_2 13:must_3 */
+int smtpauth =
+ 0; /* -1:Cert 0:none 1:login/plain 2:cram 3:login/plain/cram 11:must_login/plain 12:must_2 13:must_3 */
int seenauth = 0; /* 1:ESMTPA 2:~CLIENTDN */
stralloc authmethod = {0};
-int starttls = 0; /* -1:TLS 0:none 1:STARTTLS 2:require_STARTTLS 3:relay_if_CLIENTDN 4:require_+_relay_if_CLIENTDN */
-int seentls = 0; /* 1:~STARTTLS 2:~TLS 3:~CLIENTDN */
+int starttls =
+ 0; /* -1:TLS 0:none 1:STARTTLS 2:require_STARTTLS 3:relay_if_CLIENTDN 4:require_+_relay_if_CLIENTDN */
+int seentls = 0; /* 1:~STARTTLS 2:~TLS 3:~CLIENTDN */
char *ucspitls = 0;
char *tlsversion;
char *cipher;
@@ -279,39 +309,47 @@ void setup()
flagip6 = 1; // GCC 10 implicit int declarition if global var
if (control_init() == -1) die_control();
- if (control_rldef(&greeting,"control/smtpgreeting",1,(char *) 0) != 1)
- die_control();
- liphostok = control_rldef(&liphost,"control/localiphost",1,(char *) 0);
+ if (control_rldef(&greeting, "control/smtpgreeting", 1, (char *)0) != 1) die_control();
+ liphostok = control_rldef(&liphost, "control/localiphost", 1, (char *)0);
if (liphostok == -1) die_control();
- if (control_readint(&timeout,"control/timeoutsmtpd") == -1) die_control();
+ if (control_readint(&timeout, "control/timeoutsmtpd") == -1) die_control();
if (timeout <= 0) timeout = 1;
if (rcpthosts_init() == -1) die_control();
if (recipients_init() == -1) die_control();
- bmfok = control_readfile(&bmf,"control/badmailfrom",0);
+ bmfok = control_readfile(&bmf, "control/badmailfrom", 0);
if (bmfok == -1) die_control();
if (bmfok)
- if (!constmap_init(&mapbmf,bmf.s,bmf.len,0)) die_nomem();
+ if (!constmap_init(&mapbmf, bmf.s, bmf.len, 0)) die_nomem();
- brtok = control_readfile(&brt,"control/badrcptto",0);
+ brtok = control_readfile(&brt, "control/badrcptto", 0);
if (brtok == -1) die_control();
if (brtok)
- if (!constmap_init(&mapbrt,brt.s,brt.len,0)) die_nomem();
+ if (!constmap_init(&mapbrt, brt.s, brt.len, 0)) die_nomem();
- if (control_readint(&databytes,"control/databytes") == -1) die_control();
+ if (control_readint(&databytes, "control/databytes") == -1) die_control();
x = env_get("DATABYTES");
- if (x) { scan_ulong(x,&u); databytes = u; }
+ if (x) {
+ scan_ulong(x, &u);
+ databytes = u;
+ }
if (!(databytes + 1)) --databytes;
- if (!stralloc_copys(&protocol,"ESMTP")) die_nomem(); /* RFC 3848 */
- remoteip = env_get("TCP6REMOTEIP"); /* compactified IPv6 */
- if (!remoteip) remoteip = env_get("TCPREMOTEIP"); /* allow other tcpserver/sslserver */
- if (remoteip && (str_chr(remoteip,':') < str_len(remoteip))) {
- if (byte_equal(remoteip,7,V4MAPPREFIX))
- { remoteip = remoteip + 7; flagip6 = 0; }
- } else flagip6 = 0;
- if (!remoteip) { remoteip = "unknown"; flagip6 = -1; }
+ if (!stralloc_copys(&protocol, "ESMTP")) die_nomem(); /* RFC 3848 */
+ remoteip = env_get("TCP6REMOTEIP"); /* compactified IPv6 */
+ if (!remoteip) remoteip = env_get("TCPREMOTEIP"); /* allow other tcpserver/sslserver */
+ if (remoteip && (str_chr(remoteip, ':') < str_len(remoteip))) {
+ if (byte_equal(remoteip, 7, V4MAPPREFIX)) {
+ remoteip = remoteip + 7;
+ flagip6 = 0;
+ }
+ } else
+ flagip6 = 0;
+ if (!remoteip) {
+ remoteip = "unknown";
+ flagip6 = -1;
+ }
local = env_get("TCP6LOCALHOST");
if (!local) local = env_get("TCPLOCALHOST");
if (!local) local = env_get("TCP6LOCALIP");
@@ -327,35 +365,44 @@ void setup()
if (!remoteinfo) remoteinfo = env_get("TCPREMOTEINFO");
relayclient = env_get("RELAYCLIENT");
- if (!case_diffs(localport,PORT_SMTPS)) {
+ if (!case_diffs(localport, PORT_SMTPS)) {
if (!modssl_info()) die_starttls();
starttls = -1;
}
mfdnscheck = env_get("MFDNSCHECK");
x = env_get("MAXRECIPIENTS");
- if (x) { scan_ulong(x,&u); maxrcptcount = u; };
+ if (x) {
+ scan_ulong(x, &u);
+ maxrcptcount = u;
+ };
if (!(maxrcptcount + 1)) --maxrcptcount;
helocheck = env_get("HELOCHECK");
if (helocheck) {
- badhelook = control_readfile(&badhelo,"control/badhelo",0);
+ badhelook = control_readfile(&badhelo, "control/badhelo", 0);
if (badhelook == -1) die_control();
if (badhelook)
- if (!constmap_init(&mapbhlo,badhelo.s,badhelo.len,0)) die_nomem();
+ if (!constmap_init(&mapbhlo, badhelo.s, badhelo.len, 0)) die_nomem();
}
x = env_get("TARPITCOUNT");
- if (x) { scan_ulong(x,&u); tarpitcount = u; };
+ if (x) {
+ scan_ulong(x, &u);
+ tarpitcount = u;
+ };
x = env_get("TARPITDELAY");
- if (x) { scan_ulong(x,&u); tarpitdelay = u; };
+ if (x) {
+ scan_ulong(x, &u);
+ tarpitdelay = u;
+ };
x = env_get("POSTGREY"); // RFC 6647
if (x) {
- if (case_diffs(x,"-")) {
+ if (case_diffs(x, "-")) {
greylist = 1;
- if (!stralloc_copys(&pgbind,x)) die_nomem();
- if (!stralloc_append(&pgbind,"")) die_nomem();
+ if (!stralloc_copys(&pgbind, x)) die_nomem();
+ if (!stralloc_append(&pgbind, "")) die_nomem();
}
}
@@ -365,7 +412,7 @@ void setup()
if (str_len(localmfcheck) == 1 && *localmfcheck == '!') {
localmf = 2;
fdmav = open_read("control/mailfromrules.cdb");
- if (fdmav == -1 ) localmf = 1;
+ if (fdmav == -1) localmf = 1;
}
if (str_len(localmfcheck) == 1 && *localmfcheck == '=') {
localmf = 3;
@@ -386,7 +433,7 @@ void setup()
if (*badmimeinit == '+') flagmimetype = 4;
}
}
- if (fdbmt != -1 ) flagmimetype = flagmimetype + 2;
+ if (fdbmt != -1) flagmimetype = flagmimetype + 2;
}
badloaderinit = env_get("BADLOADERTYPE");
@@ -398,7 +445,7 @@ void setup()
flagloadertype = 1;
if (*badloaderinit == '+') flagloadertype = 2;
fdblt = open_read("control/badloadertypes.cdb");
- if (fdblt == -1 ) flagloadertype = 0;
+ if (fdblt == -1) flagloadertype = 0;
}
}
}
@@ -408,67 +455,69 @@ void setup()
auth = env_get("SMTPAUTH");
if (auth) {
smtpauth = 1;
- if (!case_diffs(auth,"-")) smtpauth = 0;
- if (!case_diffs(auth,"!")) smtpauth = 11;
- if (case_starts(auth,"cram")) smtpauth = 2;
- if (case_starts(auth,"+cram")) smtpauth = 3;
- if (case_starts(auth,"!cram")) smtpauth = 12;
- if (case_starts(auth,"!+cram")) smtpauth = 13;
+ if (!case_diffs(auth, "-")) smtpauth = 0;
+ if (!case_diffs(auth, "!")) smtpauth = 11;
+ if (case_starts(auth, "cram")) smtpauth = 2;
+ if (case_starts(auth, "+cram")) smtpauth = 3;
+ if (case_starts(auth, "!cram")) smtpauth = 12;
+ if (case_starts(auth, "!+cram")) smtpauth = 13;
}
if (!seentls) {
ucspitls = env_get("UCSPITLS");
if (ucspitls) {
starttls = 1;
- if (!case_diffs(ucspitls,"-")) starttls = 0;
- if (!case_diffs(ucspitls,"!")) starttls = 2;
- if (!case_diffs(ucspitls,"?")) starttls = 3;
- if (!case_diffs(ucspitls,"@")) starttls = 4;
+ if (!case_diffs(ucspitls, "-")) starttls = 0;
+ if (!case_diffs(ucspitls, "!")) starttls = 2;
+ if (!case_diffs(ucspitls, "?")) starttls = 3;
+ if (!case_diffs(ucspitls, "@")) starttls = 4;
}
}
delivermailto = env_get("DELIVERTO");
if (delivermailto) {
- if (!stralloc_cats(&mailto,delivermailto)) die_nomem();
- if (!stralloc_cats(&mailto," ")) die_nomem();
+ if (!stralloc_cats(&mailto, delivermailto)) die_nomem();
+ if (!stralloc_cats(&mailto, " ")) die_nomem();
}
rblsmtpd = env_get("RBLSMTPD");
if (rblsmtpd) {
- if (!stralloc_cats(&rblinfo,rblsmtpd)) die_nomem();
+ if (!stralloc_cats(&rblinfo, rblsmtpd)) die_nomem();
if (!stralloc_0(&rblinfo)) die_nomem();
}
x = env_get("SPF");
- if (x) { scan_ulong(x,&u); flagspf = u; }
+ if (x) {
+ scan_ulong(x, &u);
+ flagspf = u;
+ }
if (flagspf < 0 || flagspf > 6) die_control();
if (flagspf) {
- r = control_readline(&spflocalrules,"control/spflocalrules");
+ r = control_readline(&spflocalrules, "control/spflocalrules");
if (r == -1) die_control();
if (!stralloc_0(&spflocalrules)) die_nomem();
- if (control_rldef(&spfexplain,"control/spfexplain",0,SPF_DEFEXP) == -1) die_control();
+ if (control_rldef(&spfexplain, "control/spfexplain", 0, SPF_DEFEXP) == -1) die_control();
if (!stralloc_0(&spfexplain)) die_nomem();
}
x = env_get("UTF8");
if (x) flagutf8 = 1;
- if (!stralloc_copys(&helohost,"")) die_nomem(); // helohost is initially empty
+ if (!stralloc_copys(&helohost, "")) die_nomem(); // helohost is initially empty
if (!stralloc_0(&helohost)) die_nomem();
fakehelo = 0;
-
}
void auth_info(char *method)
{
- if (!env_put("AUTHPROTOCOL",method)) die_nomem();
- if (!env_put("AUTHUSER",remoteinfo)) die_nomem();
- if (!env_unset("TCPREMOTEINFO")) die_read();
- if (!env_put("TCPREMOTEINFO",remoteinfo)) die_nomem();
- if (!env_unset("TCP6REMOTEINFO")) die_read();
- if (!env_put("TCP6REMOTEINFO",remoteinfo)) die_nomem();
-
- if (!stralloc_append(&protocol,"A")) die_nomem();
+ if (!env_put("AUTHPROTOCOL", method)) die_nomem();
+ if (!env_put("AUTHUSER", remoteinfo)) die_nomem();
+ if (!env_unset("TCPREMOTEINFO")) die_read();
+ if (!env_put("TCPREMOTEINFO", remoteinfo)) die_nomem();
+ if (!env_unset("TCP6REMOTEINFO")) die_read();
+ if (!env_put("TCP6REMOTEINFO", remoteinfo)) die_nomem();
+
+ if (!stralloc_append(&protocol, "A")) die_nomem();
}
int modssl_info()
@@ -483,7 +532,8 @@ int modssl_info()
cipherused = env_get("SSL_CIPHER_USEKEYSIZE");
if (!cipherused) cipherused = "unknown";
clientdn = env_get("SSL_CLIENT_S_DN");
- if (!clientdn) clientdn = "none";
+ if (!clientdn)
+ clientdn = "none";
else {
seentls = 3;
seenauth = 2;
@@ -491,26 +541,26 @@ int modssl_info()
relayclient = "";
}
- if (!stralloc_copys(&tlsinfo,tlsversion)) die_nomem();
- if (!stralloc_cats(&tlsinfo,": ")) die_nomem();
- if (!stralloc_cats(&tlsinfo,cipher)) die_nomem();
- if (!stralloc_cats(&tlsinfo," [")) die_nomem();
- if (!stralloc_cats(&tlsinfo,cipherused)) die_nomem();
- if (!stralloc_cats(&tlsinfo,"/")) die_nomem();
- if (!stralloc_cats(&tlsinfo,cipherperm)) die_nomem();
- if (!stralloc_cats(&tlsinfo,"] \n")) die_nomem();
- if (!stralloc_cats(&tlsinfo," DN=")) die_nomem();
- if (!stralloc_cats(&tlsinfo,clientdn)) die_nomem();
+ if (!stralloc_copys(&tlsinfo, tlsversion)) die_nomem();
+ if (!stralloc_cats(&tlsinfo, ": ")) die_nomem();
+ if (!stralloc_cats(&tlsinfo, cipher)) die_nomem();
+ if (!stralloc_cats(&tlsinfo, " [")) die_nomem();
+ if (!stralloc_cats(&tlsinfo, cipherused)) die_nomem();
+ if (!stralloc_cats(&tlsinfo, "/")) die_nomem();
+ if (!stralloc_cats(&tlsinfo, cipherperm)) die_nomem();
+ if (!stralloc_cats(&tlsinfo, "] \n")) die_nomem();
+ if (!stralloc_cats(&tlsinfo, " DN=")) die_nomem();
+ if (!stralloc_cats(&tlsinfo, clientdn)) die_nomem();
if (!stralloc_0(&tlsinfo)) die_nomem();
- if (!stralloc_append(&protocol,"S")) die_nomem();
+ if (!stralloc_append(&protocol, "S")) die_nomem();
if (seentls == 3 && starttls == 4) {
clientcn = env_get("SSL_CLIENT_S_DN_CN");
- remoteinfo = clientcn ? clientcn : clientdn;
+ remoteinfo = clientcn ? clientcn : clientdn;
dnemail = env_get("SSL_CLIENT_S_DN_Email");
if (!dnemail) dnemail = "unknown";
- if (!stralloc_cats(&authmethod,"cert")) die_nomem();
+ if (!stralloc_cats(&authmethod, "cert")) die_nomem();
auth_info(authmethod.s);
}
return 1;
@@ -545,50 +595,52 @@ int addrparse(char *arg)
int flagquoted;
terminator = '>';
- i = str_chr(arg,'<');
+ i = str_chr(arg, '<');
if (arg[i])
arg += i + 1;
else
return 0;
/* strip source route */
- if (*arg == '@') while (*arg) if (*arg++ == ':') break;
+ if (*arg == '@')
+ while (*arg)
+ if (*arg++ == ':') break;
- if (!stralloc_copys(&addr,"")) die_nomem();
+ if (!stralloc_copys(&addr, "")) die_nomem();
flagesc = 0;
flagquoted = 0;
for (i = 0; ch = arg[i]; ++i) { /* copy arg to addr, stripping quotes */
if (flagesc) {
- if (!stralloc_append(&addr,&ch)) die_nomem();
+ if (!stralloc_append(&addr, &ch)) die_nomem();
flagesc = 0;
- }
- else {
+ } else {
if (!flagquoted && (ch == terminator)) break;
switch (ch) {
case '\\': flagesc = 1; break;
- case '"': flagquoted = !flagquoted; break;
- default: if (!stralloc_append(&addr,&ch)) die_nomem();
+ case '"': flagquoted = !flagquoted; break;
+ default:
+ if (!stralloc_append(&addr, &ch)) die_nomem();
}
}
}
/* could check for termination failure here, but why bother? */
- if (!stralloc_append(&addr,"")) die_nomem();
+ if (!stralloc_append(&addr, "")) die_nomem();
if (liphostok) {
- i = byte_rchr(addr.s,addr.len,'@');
+ i = byte_rchr(addr.s, addr.len, '@');
if (i < addr.len) /* if not, partner should go read rfc 821 */
if (addr.s[i + 1] == '[') {
- if (byte_rchr(addr.s + i + 2,addr.len - i - 2,':') < str_len(addr.s)) { /* @[IPv6::] */
- if (!addr.s[i + 1 + ip6_scanbracket(addr.s + i + 1,(char *)&ip6s.d)])
- if (ipme_is6(&ip6s)) {
- addr.len = i + 1;
- if (!stralloc_cat(&addr,&liphost)) die_nomem();
- }
- } else { /* @[IPv4] */
- if (!addr.s[i + 1 + ip4_scanbracket(addr.s + i + 1,(char *)&ip4s.d)])
+ if (byte_rchr(addr.s + i + 2, addr.len - i - 2, ':') < str_len(addr.s)) { /* @[IPv6::] */
+ if (!addr.s[i + 1 + ip6_scanbracket(addr.s + i + 1, (char *)&ip6s.d)])
+ if (ipme_is6(&ip6s)) {
+ addr.len = i + 1;
+ if (!stralloc_cat(&addr, &liphost)) die_nomem();
+ }
+ } else { /* @[IPv4] */
+ if (!addr.s[i + 1 + ip4_scanbracket(addr.s + i + 1, (char *)&ip4s.d)])
if (ipme_is4(&ip4s)) {
addr.len = i + 1;
- if (!stralloc_cat(&addr,&liphost)) die_nomem();
+ if (!stralloc_cat(&addr, &liphost)) die_nomem();
}
}
}
@@ -607,19 +659,19 @@ int bhelocheck()
char subvalue;
if (badhelook && helohost.len > 1) { /* helohost! */
- if (!stralloc_copyb(&eddr,helohost.s,helohost.len - 1)) die_nomem();
- if (!stralloc_append(&eddr,"!")) die_nomem();
+ if (!stralloc_copyb(&eddr, helohost.s, helohost.len - 1)) die_nomem();
+ if (!stralloc_append(&eddr, "!")) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- if (constmap(&mapbhlo,eddr.s,eddr.len - 1)) return -3;
+ if (constmap(&mapbhlo, eddr.s, eddr.len - 1)) return -3;
- if (constmap(&mapbhlo,helohost.s,helohost.len - 1)) return -1;
+ if (constmap(&mapbhlo, helohost.s, helohost.len - 1)) return -1;
i = 0;
for (j = 0; j < badhelo.len; ++j)
if (!badhelo.s[j]) {
subvalue = badhelo.s[i] != '!';
if (!subvalue) i++;
- if ((k != subvalue) && wildmat(helohost.s,badhelo.s + i)) k = subvalue;
+ if ((k != subvalue) && wildmat(helohost.s, badhelo.s + i)) k = subvalue;
i = j + 1;
}
return k;
@@ -639,74 +691,75 @@ int bmfcheck()
if (bmfok && mailfrom.len > 1) {
rlen = str_len(remotehost);
- at = byte_rchr(mailfrom.s,mailfrom.len,'@');
+ at = byte_rchr(mailfrom.s, mailfrom.len, '@');
-/* '?' enhanced address to skip all other tests including MFDNSCHECK */
+ /* '?' enhanced address to skip all other tests including MFDNSCHECK */
- if (!stralloc_copys(&eddr,"?")) die_nomem();
- if (!stralloc_cat(&eddr,&mailfrom)) die_nomem();
- case_lowerb(eddr.s,eddr.len);
- if (constmap(&mapbmf,eddr.s,eddr.len - 1)) return -110;
+ if (!stralloc_copys(&eddr, "?")) die_nomem();
+ if (!stralloc_cat(&eddr, &mailfrom)) die_nomem();
+ case_lowerb(eddr.s, eddr.len);
+ if (constmap(&mapbmf, eddr.s, eddr.len - 1)) return -110;
-/* '+' extended address for none-RELAYCLIENTS */
+ /* '+' extended address for none-RELAYCLIENTS */
if (at && !relayclient) {
- if (!stralloc_copyb(&eddr,mailfrom.s,mailfrom.len - 1)) die_nomem();
- if (!stralloc_append(&eddr,"+")) die_nomem();
+ if (!stralloc_copyb(&eddr, mailfrom.s, mailfrom.len - 1)) die_nomem();
+ if (!stralloc_append(&eddr, "+")) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- case_lowerb(eddr.s,eddr.len);
- if (constmap(&mapbmf,eddr.s + at,eddr.len - at - 1)) return -5;
+ case_lowerb(eddr.s, eddr.len);
+ if (constmap(&mapbmf, eddr.s + at, eddr.len - at - 1)) return -5;
}
-/* '-' extended address from UNKNOWN */
+ /* '-' extended address from UNKNOWN */
- if (at && !case_diffs(remotehost,"unknown")) {
- if (!stralloc_copyb(&eddr,mailfrom.s,mailfrom.len - 1)) die_nomem();
- if (!stralloc_append(&eddr,"-")) die_nomem();
+ if (at && !case_diffs(remotehost, "unknown")) {
+ if (!stralloc_copyb(&eddr, mailfrom.s, mailfrom.len - 1)) die_nomem();
+ if (!stralloc_append(&eddr, "-")) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- case_lowerb(eddr.s,eddr.len);
- if (constmap(&mapbmf,eddr.s + at,eddr.len - at - 1)) return -4;
+ case_lowerb(eddr.s, eddr.len);
+ if (constmap(&mapbmf, eddr.s + at, eddr.len - at - 1)) return -4;
}
-/* '=' extended address for WELLKNOWN senders */
+ /* '=' extended address for WELLKNOWN senders */
- else if (at && rlen >= mailfrom.len - at - 1) {
+ else if (at && rlen >= mailfrom.len - at - 1)
+ {
dlen = mailfrom.len - at - 2;
- if (!stralloc_copyb(&eddr,mailfrom.s,mailfrom.len - 1)) die_nomem();
- if (!stralloc_append(&eddr,"=")) die_nomem();
+ if (!stralloc_copyb(&eddr, mailfrom.s, mailfrom.len - 1)) die_nomem();
+ if (!stralloc_append(&eddr, "=")) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- case_lowerb(eddr.s,eddr.len);
- if (str_diffn(remotehost + rlen - dlen,eddr.s + at + 1,dlen))
- if (constmap(&mapbmf,eddr.s + at,eddr.len - at - 1)) return -3;
+ case_lowerb(eddr.s, eddr.len);
+ if (str_diffn(remotehost + rlen - dlen, eddr.s + at + 1, dlen))
+ if (constmap(&mapbmf, eddr.s + at, eddr.len - at - 1)) return -3;
-/* '~' extended address for MISMATCHED Domains */
+ /* '~' extended address for MISMATCHED Domains */
- if (case_diffrs(remotehost,mailfrom.s + at + 1)) {
+ if (case_diffrs(remotehost, mailfrom.s + at + 1)) {
j = 0;
do {
- if (!stralloc_copys(&eddr,"~")) die_nomem();
- if (!stralloc_cats(&eddr,remotehost + j)) die_nomem();
+ if (!stralloc_copys(&eddr, "~")) die_nomem();
+ if (!stralloc_cats(&eddr, remotehost + j)) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- if (constmap(&mapbmf,eddr.s,eddr.len - 1)) return -2;
- j = byte_chr(remotehost + j,rlen - j,'.') + j + 1;
+ if (constmap(&mapbmf, eddr.s, eddr.len - 1)) return -2;
+ j = byte_chr(remotehost + j, rlen - j, '.') + j + 1;
} while (j > 0 && rlen - j > 0);
}
}
-/* Standard */
+ /* Standard */
- if (constmap(&mapbmf,mailfrom.s,mailfrom.len - 1)) return -1;
+ if (constmap(&mapbmf, mailfrom.s, mailfrom.len - 1)) return -1;
if (at && at < mailfrom.len)
- if (constmap(&mapbmf,mailfrom.s + at,mailfrom.len - at - 1)) return -1;
+ if (constmap(&mapbmf, mailfrom.s + at, mailfrom.len - at - 1)) return -1;
-/* Wildmating */
+ /* Wildmating */
i = k = 0;
for (j = 0; j < bmf.len; ++j) {
if (!bmf.s[j]) {
subvalue = bmf.s[i] != '!';
if (!subvalue) i++;
- if ((k != subvalue) && wildmat(mailfrom.s,bmf.s + i)) k = subvalue;
+ if ((k != subvalue) && wildmat(mailfrom.s, bmf.s + i)) k = subvalue;
i = j + 1;
}
}
@@ -724,20 +777,20 @@ int brtcheck()
char subvalue;
if (brtok) {
- if (constmap(&mapbrt,addr.s,addr.len - 1)) return -2;
+ if (constmap(&mapbrt, addr.s, addr.len - 1)) return -2;
- int at = byte_rchr(addr.s,addr.len,'@');
+ int at = byte_rchr(addr.s, addr.len, '@');
if (at < addr.len)
- if (constmap(&mapbrt,addr.s + at,addr.len - at - j)) return -1;
+ if (constmap(&mapbrt, addr.s + at, addr.len - at - j)) return -1;
-/* '#' enhanced address to consider invalid rcptto addresses for none-relayclients */
+ /* '#' enhanced address to consider invalid rcptto addresses for none-relayclients */
if (!relayclient) {
- if (!stralloc_copys(&eddr,"+")) die_nomem();
- if (!stralloc_cat(&eddr,&addr)) die_nomem();
+ if (!stralloc_copys(&eddr, "+")) die_nomem();
+ if (!stralloc_cat(&eddr, &addr)) die_nomem();
if (!stralloc_0(&eddr)) die_nomem();
- case_lowerb(eddr.s,eddr.len);
- if (constmap(&mapbmf,eddr.s,eddr.len - 1)) return 110;
+ case_lowerb(eddr.s, eddr.len);
+ if (constmap(&mapbmf, eddr.s, eddr.len - 1)) return 110;
}
i = 0;
@@ -745,7 +798,7 @@ int brtcheck()
if (!brt.s[j]) {
subvalue = brt.s[i] != '!';
if (!subvalue) i++;
- if ((k != subvalue) && wildmat(addr.s,brt.s + i)) k = subvalue;
+ if ((k != subvalue) && wildmat(addr.s, brt.s + i)) k = subvalue;
i = j + 1;
}
return k;
@@ -756,7 +809,7 @@ int brtcheck()
int addrallowed(char *arg)
{
int r;
- r = rcpthosts(arg,str_len(arg));
+ r = rcpthosts(arg, str_len(arg));
if (r == -1) die_control();
return r;
}
@@ -764,7 +817,7 @@ int addrallowed(char *arg)
int rcptallowed()
{
int r;
- r = recipients(addr.s,str_len(addr.s));
+ r = recipients(addr.s, str_len(addr.s));
#ifdef PAM111421
if (r == 111) die_recipients();
#endif
@@ -780,24 +833,23 @@ int localaddr(char *mf)
int mflen;
mflen = str_len(mf);
- if (mflen < 1 ) return 0;
+ if (mflen < 1) return 0;
if (localmf == 4) {
- if (!case_diffs(dnemail,mf)) return 2;
+ if (!case_diffs(dnemail, mf)) return 2;
return -4;
}
if (localmf == 3) {
- if (!case_diffs(remoteinfo,mf)) return 2;
+ if (!case_diffs(remoteinfo, mf)) return 2;
return -3;
- }
- else if (localmf == 2)
- return mfrules(fdmav,remoteip,remotehost,remoteinfo,mf);
+ } else if (localmf == 2)
+ return mfrules(fdmav, remoteip, remotehost, remoteinfo, mf);
else {
if (str_len(localmfcheck) > 1) {
- case_lowerb(localmfcheck,str_len(localmfcheck));
- at = byte_rchr(mf,mflen,'@');
+ case_lowerb(localmfcheck, str_len(localmfcheck));
+ at = byte_rchr(mf, mflen, '@');
if (at < mflen)
- if (!str_diffn(localmfcheck,mf + at + 1,mflen - at - 1)) return 2;
+ if (!str_diffn(localmfcheck, mf + at + 1, mflen - at - 1)) return 2;
}
if (addrallowed(mf)) return 3;
return -2;
@@ -808,47 +860,59 @@ int spf_check(int flag6)
{
int r;
- if (mailfrom.len <= 1) { flagspf = 0; return 0; }
+ if (mailfrom.len <= 1) {
+ flagspf = 0;
+ return 0;
+ }
DNS_INIT
- r = spf_query(remoteip,helohost.s,mailfrom.s,local,flag6);
+ r = spf_query(remoteip, helohost.s, mailfrom.s, local, flag6);
if (r == SPF_NOMEM) die_nomem();
if (!stralloc_0(&spfinfo)) die_nomem();
switch (r) {
case SPF_ME:
- case SPF_OK:
- if (!env_put("SPFRESULT","pass")) die_nomem();
+ case SPF_OK:
+ if (!env_put("SPFRESULT", "pass")) die_nomem();
flagspf = 10;
break;
case SPF_LOOP:
- case SPF_ERROR:
+ case SPF_ERROR:
case SPF_SYNTAX:
case SPF_EXHAUST:
- if (!env_put("SPFRESULT","error")) die_nomem();
- if (flagspf < 2) { flagspf = 0; break; }
+ if (!env_put("SPFRESULT", "error")) die_nomem();
+ if (flagspf < 2) {
+ flagspf = 0;
+ break;
+ }
out("451 SPF lookup failure (#4.3.0)\r\n");
return -1;
- case SPF_NONE:
- if (!env_put("SPFRESULT","none")) die_nomem();
+ case SPF_NONE:
+ if (!env_put("SPFRESULT", "none")) die_nomem();
flagspf = 0;
break;
case SPF_UNKNOWN:
- if (!env_put("SPFRESULT","unknown")) die_nomem();
- if (flagspf < 6) break;
- else return 4;
+ if (!env_put("SPFRESULT", "unknown")) die_nomem();
+ if (flagspf < 6)
+ break;
+ else
+ return 4;
case SPF_NEUTRAL:
- if (!env_put("SPFRESULT","neutral")) die_nomem();
- if (flagspf < 5) break;
- else return 3;
+ if (!env_put("SPFRESULT", "neutral")) die_nomem();
+ if (flagspf < 5)
+ break;
+ else
+ return 3;
case SPF_SOFTFAIL:
- if (!env_put("SPFRESULT","softfail")) die_nomem();
- if (flagspf < 4) break;
- else return 2;
+ if (!env_put("SPFRESULT", "softfail")) die_nomem();
+ if (flagspf < 4)
+ break;
+ else
+ return 2;
case SPF_FAIL:
- if (!env_put("SPFRESULT","fail")) die_nomem();
+ if (!env_put("SPFRESULT", "fail")) die_nomem();
if (flagspf < 3) break;
- if (!spf_parse(&spfbounce,spfexpmsg.s,expdomain.s)) die_nomem();
+ if (!spf_parse(&spfbounce, spfexpmsg.s, expdomain.s)) die_nomem();
return 1;
}
@@ -862,32 +926,36 @@ int mailfrom_size(char *arg)
unsigned long r;
unsigned long sizebytes = 0;
- scan_ulong(arg,&r);
+ scan_ulong(arg, &r);
sizebytes = r;
- if (databytes) if (sizebytes > databytes) return 1;
+ if (databytes)
+ if (sizebytes > databytes) return 1;
return 0;
}
-void mailfrom_auth(char *arg,int len)
+void mailfrom_auth(char *arg, int len)
{
- if (!stralloc_copys(&fuser,"")) die_nomem();
- if (case_starts(arg,"<>")) {
- if (!stralloc_cats(&fuser,"unknown")) die_nomem();
+ if (!stralloc_copys(&fuser, "")) die_nomem();
+ if (case_starts(arg, "<>")) {
+ if (!stralloc_cats(&fuser, "unknown")) die_nomem();
} else {
while (len) {
if (*arg == '+') {
- if (case_starts(arg,"+3D")) {
- arg = arg + 2; len = len - 2;
- if (!stralloc_cats(&fuser,"=")) die_nomem();
+ if (case_starts(arg, "+3D")) {
+ arg = arg + 2;
+ len = len - 2;
+ if (!stralloc_cats(&fuser, "=")) die_nomem();
}
- if (case_starts(arg,"+2B")) {
- arg = arg + 2; len = len - 2;
- if (!stralloc_cats(&fuser,"+")) die_nomem();
+ if (case_starts(arg, "+2B")) {
+ arg = arg + 2;
+ len = len - 2;
+ if (!stralloc_cats(&fuser, "+")) die_nomem();
}
} else {
- if (!stralloc_catb(&fuser,arg,1)) die_nomem();
+ if (!stralloc_catb(&fuser, arg, 1)) die_nomem();
}
- arg++; len--;
+ arg++;
+ len--;
}
}
@@ -895,9 +963,9 @@ void mailfrom_auth(char *arg,int len)
if (!remoteinfo) {
remoteinfo = fuser.s;
if (!env_unset("TCPREMOTEINFO")) die_read();
- if (!env_put("TCPREMOTEINFO",remoteinfo)) die_nomem();
+ if (!env_put("TCPREMOTEINFO", remoteinfo)) die_nomem();
if (!env_unset("TCP6REMOTEINFO")) die_read();
- if (!env_put("TCP6REMOTEINFO",remoteinfo)) die_nomem();
+ if (!env_put("TCP6REMOTEINFO", remoteinfo)) die_nomem();
}
}
@@ -906,18 +974,23 @@ void mailfrom_parms(char *arg)
int len;
if ((len = str_len(arg))) {
- if (!stralloc_copys(&mfparms,"")) die_nomem();
- while (len) {
- arg++; len--;
- if (*arg == ' ' || *arg == '\0' ) {
- if (flagutf8) if (case_starts(mfparms.s,"SMTPUTF8")) flagutf8 = 2;
- if (case_starts(mfparms.s,"SIZE=")) if (mailfrom_size(mfparms.s + 5)) { flagsize = 1; return; }
- if (case_starts(mfparms.s,"AUTH=")) mailfrom_auth(mfparms.s + 5,mfparms.len - 5);
- if (!stralloc_copys(&mfparms,"")) die_nomem();
- }
- else
- if (!stralloc_catb(&mfparms,arg,1)) die_nomem();
- }
+ if (!stralloc_copys(&mfparms, "")) die_nomem();
+ while (len) {
+ arg++;
+ len--;
+ if (*arg == ' ' || *arg == '\0') {
+ if (flagutf8)
+ if (case_starts(mfparms.s, "SMTPUTF8")) flagutf8 = 2;
+ if (case_starts(mfparms.s, "SIZE="))
+ if (mailfrom_size(mfparms.s + 5)) {
+ flagsize = 1;
+ return;
+ }
+ if (case_starts(mfparms.s, "AUTH=")) mailfrom_auth(mfparms.s + 5, mfparms.len - 5);
+ if (!stralloc_copys(&mfparms, "")) die_nomem();
+ } else if (!stralloc_catb(&mfparms, arg, 1))
+ die_nomem();
+ }
}
}
@@ -925,8 +998,12 @@ void mailfrom_parms(char *arg)
void smtp_helo(char *arg)
{
- smtp_greet("250 "); out("\r\n"); flush();
- seenmail = 0; rcptcount = 0; seenhelo++;
+ smtp_greet("250 ");
+ out("\r\n");
+ flush();
+ seenmail = 0;
+ rcptcount = 0;
+ seenhelo++;
dohelo(arg);
}
@@ -934,30 +1011,39 @@ void smtp_ehlo(char *arg)
{
char size[FMT_ULONG];
- smtp_greet("250-"); out("\r\n");
+ smtp_greet("250-");
+ out("\r\n");
out("250-PIPELINING\r\n250-8BITMIME\r\n");
if (flagutf8) out("250-SMTPUTF8\r\n");
if (starttls > 0 && !seentls) out("250-STARTTLS\r\n");
-
+
switch (smtpauth) {
- case 1: case 11: out("250-AUTH LOGIN PLAIN\r\n"); break;
- case 2: case 12: out("250-AUTH CRAM-MD5\r\n"); break;
- case 3: case 13: out("250-AUTH LOGIN PLAIN CRAM-MD5\r\n"); break;
+ case 1:
+ case 11: out("250-AUTH LOGIN PLAIN\r\n"); break;
+ case 2:
+ case 12: out("250-AUTH CRAM-MD5\r\n"); break;
+ case 3:
+ case 13: out("250-AUTH LOGIN PLAIN CRAM-MD5\r\n"); break;
}
- size[fmt_ulong(size,(unsigned long) databytes)] = 0;
- out("250 SIZE "); out(size); out("\r\n");
+ size[fmt_ulong(size, (unsigned long)databytes)] = 0;
+ out("250 SIZE ");
+ out(size);
+ out("\r\n");
- seenhelo++; seenmail = 0; rcptcount = 0;
+ seenhelo++;
+ seenmail = 0;
+ rcptcount = 0;
dohelo(arg);
}
void smtp_rset(void)
{
- seenmail = 0; rcptcount = 0; /* RFC 5321: seenauth + seentls stay */
+ seenmail = 0;
+ rcptcount = 0; /* RFC 5321: seenauth + seentls stay */
- if (!stralloc_copys(&mailfrom,"")) die_nomem();
- if (!stralloc_copys(&rcptto,"")) die_nomem();
+ if (!stralloc_copys(&mailfrom, "")) die_nomem();
+ if (!stralloc_copys(&rcptto, "")) die_nomem();
out("250 flushed\r\n");
}
@@ -969,36 +1055,42 @@ void smtp_starttls()
flush();
if (!starttls_init()) die_starttls();
- buffer_init(&bi,saferead,FDIN,inbuf,sizeof(inbuf));
+ buffer_init(&bi, saferead, FDIN, inbuf, sizeof(inbuf));
seentls = 2;
if (!starttls_info()) die_starttls();
if (!modssl_info()) die_starttls();
-/* reset SMTP state */
+ /* reset SMTP state */
- seenhelo = 0; seenmail = 0; rcptcount = 0;
- if (!stralloc_copys(&addr,"")) die_nomem();
- if (!stralloc_copys(&helohost,"")) die_nomem();
- if (!stralloc_copys(&mailfrom,"")) die_nomem();
- if (!stralloc_copys(&rcptto,"")) die_nomem();
+ seenhelo = 0;
+ seenmail = 0;
+ rcptcount = 0;
+ if (!stralloc_copys(&addr, "")) die_nomem();
+ if (!stralloc_copys(&helohost, "")) die_nomem();
+ if (!stralloc_copys(&mailfrom, "")) die_nomem();
+ if (!stralloc_copys(&rcptto, "")) die_nomem();
if (seenauth == 1) seenauth = 0; /* Otherwise Auth by client Cert */
}
void smtp_mail(char *arg)
{
- if (flagutf8) if (!stralloc_cats(&protocol,"UTF8")) die_nomem();
+ if (flagutf8)
+ if (!stralloc_cats(&protocol, "UTF8")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- if ((starttls > 1) && !seentls) {
- err_tlsreq("Reject::TLS::missing",protocol.s,remoteip,remotehost,helohost.s);
+ if ((starttls > 1) && !seentls) {
+ err_tlsreq("Reject::TLS::missing", protocol.s, remoteip, remotehost, helohost.s);
+ return;
+ }
+ if (smtpauth > 10 && !seenauth) {
+ err_authreq("Reject::AUTH::missing", protocol.s, remoteip, remotehost, helohost.s);
return;
}
- if (smtpauth > 10 && !seenauth) {
- err_authreq("Reject::AUTH::missing",protocol.s,remoteip,remotehost,helohost.s);
+ if (!addrparse(arg)) {
+ err_syntax();
return;
}
- if (!addrparse(arg)) { err_syntax(); return; }
flagsize = 0;
rcptcount = 0;
@@ -1006,16 +1098,17 @@ void smtp_mail(char *arg)
seenmail++;
if (relayclient && localmf) {
flagmav = localaddr(addr.s);
- if (flagmav > 0) if (!stralloc_append(&protocol,"M")) die_nomem();
+ if (flagmav > 0)
+ if (!stralloc_append(&protocol, "M")) die_nomem();
}
- if (!stralloc_copys(&rcptto,"")) die_nomem();
- if (!stralloc_copys(&mailfrom,addr.s)) die_nomem();
+ if (!stralloc_copys(&rcptto, "")) die_nomem();
+ if (!stralloc_copys(&mailfrom, addr.s)) die_nomem();
if (!stralloc_0(&mailfrom)) die_nomem();
- if (!env_put("MAILFROM",mailfrom.s)) die_nomem();
+ if (!env_put("MAILFROM", mailfrom.s)) die_nomem();
flagaddr = bmfcheck();
- if (flagaddr != -110)
- if (mfdnscheck) flagdnsmf = dnsq(mailfrom.s,'M');
+ if (flagaddr != -110)
+ if (mfdnscheck) flagdnsmf = dnsq(mailfrom.s, 'M');
out("250 ok\r\n");
}
@@ -1027,17 +1120,15 @@ int postgrey_scanner()
int child;
int wstat;
- char *postgrey_scannerarg[] = {"bin/qmail-postgrey",pgbind.s,mailfrom.s,addr.s,remoteip,remotehost,0};
+ char *postgrey_scannerarg[] = {
+ "bin/qmail-postgrey", pgbind.s, mailfrom.s, addr.s, remoteip, remotehost, 0};
switch (child = fork()) {
- case -1:
- return err_forkgl();
- case 0:
- execv(*postgrey_scannerarg,postgrey_scannerarg);
- _exit(1);
+ case -1: return err_forkgl();
+ case 0: execv(*postgrey_scannerarg, postgrey_scannerarg); _exit(1);
}
- wait_pid(&wstat,child);
+ wait_pid(&wstat, child);
if (wait_crashed(wstat)) return err_postgl();
switch (wait_exitcode(wstat)) {
@@ -1049,89 +1140,164 @@ int postgrey_scanner()
void smtp_rcpt(char *arg)
{
char *rcptok = 0;
- if (!seenmail) { err_wantmail(); return; }
- if (!addrparse(arg)) { err_syntax(); return; }
+ if (!seenmail) {
+ err_wantmail();
+ return;
+ }
+ if (!addrparse(arg)) {
+ err_syntax();
+ return;
+ }
rcptcount++;
-/* this file is too long --------------------------------- Split Horizon envelope checks */
+ /* this file is too long --------------------------------- Split Horizon envelope checks */
if (!relayclient) {
- if (!seenhelo && helocheck) /* Helo rejects */
- if (str_len(helocheck) == 1) {
- err_helo("Reject::SNDR::Bad_Helo",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,"0");
- return;
- }
+ if (!seenhelo && helocheck) /* Helo rejects */
+ if (str_len(helocheck) == 1) {
+ err_helo(
+ "Reject::SNDR::Bad_Helo",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ "0");
+ return;
+ }
if (flagbadhelo) {
- switch (flagbadhelo) {
- case -2: badhelocond = "!"; break;
- case -1: badhelocond = "."; break;
- default: badhelocond = "*"; break;
- }
- err_helo("Reject::SNDR::Bad_Helo",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,badhelocond);
- return;
+ switch (flagbadhelo) {
+ case -2: badhelocond = "!"; break;
+ case -1: badhelocond = "."; break;
+ default: badhelocond = "*"; break;
+ }
+ err_helo(
+ "Reject::SNDR::Bad_Helo",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ badhelocond);
+ return;
}
if (flagdnshelo > 0) {
- err_helo("Reject::SNDR::DNS_Helo",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,badhelocond);
+ err_helo(
+ "Reject::SNDR::DNS_Helo",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ badhelocond);
return;
}
- if (flagdnsmf > 0) { /* Mail from rejects */
- err_mfdns("Reject::ORIG::DNS_MF",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ if (flagdnsmf > 0) { /* Mail from rejects */
+ err_mfdns(
+ "Reject::ORIG::DNS_MF", protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
return;
}
-
- if (!addrallowed(addr.s)) { /* Relaying rejects */
- err_nogateway("Reject::SNDR::Invalid_Relay",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+
+ if (!addrallowed(addr.s)) { /* Relaying rejects */
+ err_nogateway(
+ "Reject::SNDR::Invalid_Relay",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
}
-
- if (greylist && (postgrey_scanner() == 1)) { /* Greylisting */
- postgrey("Deferred::SNDR::Grey_Listed",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+
+ if (greylist && (postgrey_scanner() == 1)) { /* Greylisting */
+ postgrey(
+ "Deferred::SNDR::Grey_Listed",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
}
- if (tarpitcount && flagerrcpts >= tarpitcount) { /* Tarpitting et al. */
+ if (tarpitcount && flagerrcpts >= tarpitcount) { /* Tarpitting et al. */
if (tarpitdelay == 999) flagnotorious++;
- err_rcpts("Reject::RCPT::Toomany_Rcptto",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_rcpts(
+ "Reject::RCPT::Toomany_Rcptto",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
}
if (tarpitcount && rcptcount >= tarpitcount)
if (tarpitdelay > 0 && tarpitdelay < 999) sleep(tarpitdelay);
- flagrcpt = rcptallowed(); /* Rcpt to rejects */
+ flagrcpt = rcptallowed(); /* Rcpt to rejects */
if (!flagrcpt) {
- err_recipient("Reject::RCPT::Failed_Rcptto",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_recipient(
+ "Reject::RCPT::Failed_Rcptto",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
flagerrcpts++;
return;
}
- if (flagspf) /* SPF rejects */
+ if (flagspf) /* SPF rejects */
if (spf_check(flagip6) > 0) {
if (!stralloc_0(&spfbounce)) die_nomem(); // spfbounce is 0-terminated in any case
- err_spf("Reject::SPF::Fail",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,spfbounce.s);
+ err_spf(
+ "Reject::SPF::Fail",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ spfbounce.s);
return;
}
}
-/* this file is too long --------------------------------- Local checks */
+ /* this file is too long --------------------------------- Local checks */
- else {
+ else
+ {
if (flagmimetype == 4 || flagmimetype == 6) flagmimetype = 0;
if (flagloadertype == 2) flagloadertype = 0;
if (flagmav < 0) {
- err_mav("Reject::ORIG::Invalid_Mailfrom",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_mav(
+ "Reject::ORIG::Invalid_Mailfrom",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
}
--addr.len;
- if (!stralloc_cats(&addr,relayclient)) die_nomem();
+ if (!stralloc_cats(&addr, relayclient)) die_nomem();
if (!stralloc_0(&addr)) die_nomem();
}
-/* this file is too long --------------------------------- Common checks */
+ /* this file is too long --------------------------------- Common checks */
- if (flagmimetype == 2 || flagmimetype == 3 || flagmimetype == 6) cdb_init(&cdbm,fdbmt);
- if (flagloadertype == 1) cdb_init(&cdbl,fdblt);
+ if (flagmimetype == 2 || flagmimetype == 3 || flagmimetype == 6) cdb_init(&cdbm, fdbmt);
+ if (flagloadertype == 1) cdb_init(&cdbl, fdblt);
if (flagaddr && flagaddr != -110) {
switch (flagaddr) {
@@ -1142,60 +1308,96 @@ void smtp_rcpt(char *arg)
case -5: badmailcond = "+"; break;
default: badmailcond = "*"; break;
}
- err_bmf("Reject::ORIG::Bad_Mailfrom",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,badmailcond);
+ err_bmf(
+ "Reject::ORIG::Bad_Mailfrom",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ badmailcond);
return;
}
-
+
flagrcpt = brtcheck();
if (flagrcpt == 110) {
- err_brt("Reject::RCPT::Invalid_Rcptto",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_brt(
+ "Reject::RCPT::Invalid_Rcptto",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
} else if (flagrcpt > 0) {
- err_brt("Reject::RCPT::Bad_Rcptto",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_brt(
+ "Reject::RCPT::Bad_Rcptto", protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
return;
}
if (flagsize) {
- err_size("Reject::DATA::Invalid_Size",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_size(
+ "Reject::DATA::Invalid_Size", protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
return;
}
if (maxrcptcount && rcptcount > maxrcptcount) {
- err_rcpts("Reject::RCPT::Toomany_Rcptto",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ err_rcpts(
+ "Reject::RCPT::Toomany_Rcptto",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
return;
}
-/* this file is too long --------------------------------- Checks done; mailfrom/recipient accepted */
+ /* this file is too long --------------------------------- Checks done; mailfrom/recipient accepted */
- if (!stralloc_cats(&rcptto,"T")) die_nomem();
- if (!stralloc_cats(&rcptto,addr.s)) die_nomem();
+ if (!stralloc_cats(&rcptto, "T")) die_nomem();
+ if (!stralloc_cats(&rcptto, addr.s)) die_nomem();
if (!stralloc_0(&rcptto)) die_nomem();
- if (!stralloc_cats(&mailto,addr.s)) die_nomem();
- if (!stralloc_cats(&mailto," ")) die_nomem();
- if (!stralloc_copys(&deliverto,mailto.s)) die_nomem();
+ if (!stralloc_cats(&mailto, addr.s)) die_nomem();
+ if (!stralloc_cats(&mailto, " ")) die_nomem();
+ if (!stralloc_copys(&deliverto, mailto.s)) die_nomem();
if (!stralloc_0(&deliverto)) die_nomem();
- if (!env_put("RCPTTO",deliverto.s)) die_nomem();
+ if (!env_put("RCPTTO", deliverto.s)) die_nomem();
-/* this file is too long --------------------------------- Additional logging */
+ /* this file is too long --------------------------------- Additional logging */
switch (flagrcpt) {
- case 1: rcptok = "Recipients_Cdb"; break;
- case 2: rcptok = "Recipients_Pam"; break;
- case 3: rcptok = "Recipients_Users"; break;
- case 4: rcptok = "Recipients_Wild"; break;
- default: rcptok = "Rcpthosts_Rcptto"; break;
+ case 1: rcptok = "Recipients_Cdb"; break;
+ case 2: rcptok = "Recipients_Pam"; break;
+ case 3: rcptok = "Recipients_Users"; break;
+ case 4: rcptok = "Recipients_Wild"; break;
+ default: rcptok = "Rcpthosts_Rcptto"; break;
}
if (seenauth)
- smtp_loga("Accept::AUTH::",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,remoteinfo,authmethod.s);
+ smtp_loga(
+ "Accept::AUTH::",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ remoteinfo,
+ authmethod.s);
else if (flagmav > 0)
- smtp_logg("Accept::ORIG::Local_Sender",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ smtp_logg(
+ "Accept::ORIG::Local_Sender", protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
else if (relayclient)
- smtp_logg("Accept::SNDR::Relay_Client",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ smtp_logg(
+ "Accept::SNDR::Relay_Client", protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
else if (flagspf == 10)
- smtp_logr("Accept::SPF::",rcptok,protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ smtp_logr("Accept::SPF::", rcptok, protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
else
- smtp_logr("Accept::RCPT::",rcptok,protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
+ smtp_logr(
+ "Accept::RCPT::", rcptok, protocol.s, remoteip, remotehost, helohost.s, mailfrom.s, addr.s);
out("250 ok\r\n");
}
@@ -1209,37 +1411,44 @@ stralloc badmimetype = {0};
stralloc badloadertype = {0};
unsigned int nolines = 0;
-unsigned int flagb64 = 0; /* lineno with BASE64MESSAGE */
-unsigned int flagbase = 0; /* lineno with actual base64 content */
+unsigned int flagb64 = 0; /* lineno with BASE64MESSAGE */
+unsigned int flagbase = 0; /* lineno with actual base64 content */
unsigned int flagblank = 0;
static void queue_put(char *ch)
{
int i;
- if (flagmimetype > 0 || flagloadertype > 0 ) {
+ if (flagmimetype > 0 || flagloadertype > 0) {
if (line.len <= BUFFER_SIZE)
- if (!stralloc_catb(&line,ch,1)) die_nomem(); /* Reassamble chars to line; prepend with 'L' */
+ if (!stralloc_catb(&line, ch, 1)) die_nomem(); /* Reassamble chars to line; prepend with 'L' */
if (*ch == '\n') {
nolines++;
- if (line.len == 2) { flagblank = nolines; flagbase = 0; }
+ if (line.len == 2) {
+ flagblank = nolines;
+ flagbase = 0;
+ }
if (*(line.s + 1) == 'C' || *(line.s + 1) == 'c')
- if (case_startb(line.s + 1,line.len - 2,BASE64MESSAGE)) flagb64 = nolines;
+ if (case_startb(line.s + 1, line.len - 2, BASE64MESSAGE)) flagb64 = nolines;
if (flagb64 && nolines == flagblank + 1 && line.len > MIMETYPE_LEN + 2) flagbase = nolines;
- if (*(line.s + 1) == '-') { flagb64 = 0; flagbase = 0; }
+ if (*(line.s + 1) == '-') {
+ flagb64 = 0;
+ flagbase = 0;
+ }
- if (flagmimetype > 0 && flagbase == nolines) { /* badmimetype */
- if (!stralloc_catb(&base64types,line.s + 1,MIMETYPE_LEN)) die_nomem();
+ if (flagmimetype > 0 && flagbase == nolines) { /* badmimetype */
+ if (!stralloc_catb(&base64types, line.s + 1, MIMETYPE_LEN)) die_nomem();
if (!stralloc_0(&base64types)) die_nomem();
if (flagmimetype == 2 || flagmimetype == 3 || flagmimetype == 6) {
- if (cdb_find(&cdbm,line.s + 1,MIMETYPE_LEN)) {
- cdb_free(&cdbm); close(fdbmt);
- if (!stralloc_copyb(&badmimetype,line.s + 1,MIMETYPE_LEN)) die_nomem();
+ if (cdb_find(&cdbm, line.s + 1, MIMETYPE_LEN)) {
+ cdb_free(&cdbm);
+ close(fdbmt);
+ if (!stralloc_copyb(&badmimetype, line.s + 1, MIMETYPE_LEN)) die_nomem();
if (!stralloc_0(&badmimetype)) die_nomem();
- if (!stralloc_cats(&rcptto,"M")) die_nomem();
+ if (!stralloc_cats(&rcptto, "M")) die_nomem();
if (!stralloc_0(&rcptto)) die_nomem();
qmail_fail(&qqt);
flagmimetype = -1;
@@ -1250,22 +1459,23 @@ static void queue_put(char *ch)
if (flagbase && line.len > LOADER_LEN + 2) {
if (flagloadertype >= 1 || flagmimetype >= 1) {
for (i = 0; i < line.len - LOADER_LEN; ++i) {
- if (flagloadertype == 1 && *(line.s+i) == *badloaderinit) { /* badloadertype */
- if (cdb_find(&cdbl,line.s + i,LOADER_LEN)) {
- cdb_free(&cdbl); close(fdbmt);
- if (!stralloc_copyb(&badloadertype,line.s + i,LOADER_LEN)) die_nomem();
+ if (flagloadertype == 1 && *(line.s + i) == *badloaderinit) { /* badloadertype */
+ if (cdb_find(&cdbl, line.s + i, LOADER_LEN)) {
+ cdb_free(&cdbl);
+ close(fdbmt);
+ if (!stralloc_copyb(&badloadertype, line.s + i, LOADER_LEN)) die_nomem();
if (!stralloc_0(&badloadertype)) die_nomem();
- if (!stralloc_cats(&rcptto,"L")) die_nomem();
+ if (!stralloc_cats(&rcptto, "L")) die_nomem();
if (!stralloc_0(&rcptto)) die_nomem();
qmail_fail(&qqt);
flagloadertype = -1;
}
}
if (flagmimetype == 1 || flagmimetype == 3 || flagmimetype == 4) {
- if (*(line.s + i) == ' ' || *(line.s + i) == '\t') { /* white spaces */
- if (!stralloc_copyb(&badmimetype,line.s + i - 2,MIMETYPE_LEN)) die_nomem();
+ if (*(line.s + i) == ' ' || *(line.s + i) == '\t') { /* white spaces */
+ if (!stralloc_copyb(&badmimetype, line.s + i - 2, MIMETYPE_LEN)) die_nomem();
if (!stralloc_0(&badmimetype)) die_nomem();
- if (!stralloc_cats(&rcptto,"M")) die_nomem();
+ if (!stralloc_cats(&rcptto, "M")) die_nomem();
if (!stralloc_0(&rcptto)) die_nomem();
qmail_fail(&qqt);
flagmimetype = -2;
@@ -1275,14 +1485,13 @@ static void queue_put(char *ch)
}
}
line.len = 0;
- if (!stralloc_copys(&line,"L")) die_nomem();
+ if (!stralloc_copys(&line, "L")) die_nomem();
}
}
if (bytestooverflow)
- if (!--bytestooverflow)
- qmail_fail(&qqt);
- qmail_put(&qqt,ch,1);
+ if (!--bytestooverflow) qmail_fail(&qqt);
+ qmail_put(&qqt, ch, 1);
}
void blast(int *hops)
@@ -1291,7 +1500,7 @@ void blast(int *hops)
int state;
int seencr;
int flaginheader;
- int pos; /* number of bytes since most recent \n, if fih */
+ int pos; /* number of bytes since most recent \n, if fih */
int flagmaybex; /* 1 if this line might match RECEIVED, if fih */
int flagmaybey; /* 1 if this line might match \r\n, if fih */
int flagmaybez; /* 1 if this line might match DELIVERED, if fih */
@@ -1299,52 +1508,90 @@ void blast(int *hops)
state = 1;
*hops = 0;
flaginheader = 1;
- pos = 0; flagmaybex = flagmaybey = flagmaybez = 1; seencr = 0;
+ pos = 0;
+ flagmaybex = flagmaybey = flagmaybez = 1;
+ seencr = 0;
for (;;) {
- buffer_get(&bi,&ch,1);
+ buffer_get(&bi, &ch, 1);
if (ch == '\n') {
- if (seencr == 0) { buffer_seek(&bi,-1); ch = '\r'; }
+ if (seencr == 0) {
+ buffer_seek(&bi, -1);
+ ch = '\r';
+ }
}
- if (ch == '\r') seencr = 1; else seencr = 0;
+ if (ch == '\r')
+ seencr = 1;
+ else
+ seencr = 0;
if (flaginheader) {
if (pos < 9) {
- if (ch != "delivered"[pos]) if (ch != "DELIVERED"[pos]) flagmaybez = 0;
- if (flagmaybez) if (pos == 8) ++*hops;
+ if (ch != "delivered"[pos])
+ if (ch != "DELIVERED"[pos]) flagmaybez = 0;
+ if (flagmaybez)
+ if (pos == 8) ++*hops;
if (pos < 8)
- if (ch != "received"[pos]) if (ch != "RECEIVED"[pos]) flagmaybex = 0;
- if (flagmaybex) if (pos == 7) ++*hops;
- if (pos < 2) if (ch != "\r\n"[pos]) flagmaybey = 0;
- if (flagmaybey) if (pos == 1) flaginheader = 0;
+ if (ch != "received"[pos])
+ if (ch != "RECEIVED"[pos]) flagmaybex = 0;
+ if (flagmaybex)
+ if (pos == 7) ++*hops;
+ if (pos < 2)
+ if (ch != "\r\n"[pos]) flagmaybey = 0;
+ if (flagmaybey)
+ if (pos == 1) flaginheader = 0;
++pos;
}
- if (ch == '\n') { pos = 0; flagmaybex = flagmaybey = flagmaybez = 1; }
+ if (ch == '\n') {
+ pos = 0;
+ flagmaybex = flagmaybey = flagmaybez = 1;
+ }
}
switch (state) {
case 0:
if (ch == '\n') straynewline();
- if (ch == '\r') { state = 4; continue; }
+ if (ch == '\r') {
+ state = 4;
+ continue;
+ }
break;
case 1: /* \r\n */
if (ch == '\n') straynewline();
- if (ch == '.') { state = 2; continue; }
- if (ch == '\r') { state = 4; continue; }
+ if (ch == '.') {
+ state = 2;
+ continue;
+ }
+ if (ch == '\r') {
+ state = 4;
+ continue;
+ }
state = 0;
break;
case 2: /* \r\n + . */
if (ch == '\n') straynewline();
- if (ch == '\r') { state = 3; continue; }
+ if (ch == '\r') {
+ state = 3;
+ continue;
+ }
state = 0;
break;
case 3: /* \r\n + .\r */
if (ch == '\n') return;
queue_put(".");
queue_put("\r");
- if (ch == '\r') { state = 4; continue; }
+ if (ch == '\r') {
+ state = 4;
+ continue;
+ }
state = 0;
break;
case 4: /* + \r */
- if (ch == '\n') { state = 1; break; }
- if (ch != '\r') { queue_put("\r"); state = 0; }
+ if (ch == '\n') {
+ state = 1;
+ break;
+ }
+ if (ch != '\r') {
+ queue_put("\r");
+ state = 0;
+ }
}
queue_put(&ch);
}
@@ -1357,10 +1604,10 @@ void acceptmessage(unsigned long qp)
datetime_sec when;
when = now();
out("250 ok ");
- accept_buf[fmt_ulong(accept_buf,(unsigned long) when)] = 0;
+ accept_buf[fmt_ulong(accept_buf, (unsigned long)when)] = 0;
out(accept_buf);
out(" qp ");
- accept_buf[fmt_ulong(accept_buf,qp)] = 0;
+ accept_buf[fmt_ulong(accept_buf, qp)] = 0;
out(accept_buf);
out("\r\n");
}
@@ -1371,69 +1618,152 @@ void smtp_data()
unsigned long qp;
char *qqx;
- if (!seenmail) { err_wantmail(); return; }
- if (!rcptto.len) { err_wantrcpt(); return; }
- if (flagnotorious) { err_notorious(); }
+ if (!seenmail) {
+ err_wantmail();
+ return;
+ }
+ if (!rcptto.len) {
+ err_wantrcpt();
+ return;
+ }
+ if (flagnotorious) {
+ err_notorious();
+ }
seenmail = 0;
if (databytes) bytestooverflow = databytes + 1;
- if (!stralloc_copys(&addr,"")) die_nomem();
- if (!stralloc_cats(&addr,rcptto.s + 1)) die_nomem();
+ if (!stralloc_copys(&addr, "")) die_nomem();
+ if (!stralloc_cats(&addr, rcptto.s + 1)) die_nomem();
if (!stralloc_0(&addr)) die_nomem();
- if (qmail_open(&qqt) == -1) { err_qqt(); return; }
+ if (qmail_open(&qqt) == -1) {
+ err_qqt();
+ return;
+ }
qp = qmail_qp(&qqt);
out("354 go ahead\r\n");
- if (flagspf && !relayclient) spfheader(&qqt,spfinfo.s,local,remoteip,helohost.s,mailfrom.s);
- received(&qqt,protocol.s,local,remoteip,remotehost,remoteinfo,fakehelo,tlsinfo.s,rblinfo.s);
+ if (flagspf && !relayclient) spfheader(&qqt, spfinfo.s, local, remoteip, helohost.s, mailfrom.s);
+ received(&qqt, protocol.s, local, remoteip, remotehost, remoteinfo, fakehelo, tlsinfo.s, rblinfo.s);
blast(&hops);
hops = (hops >= MAXHOPS);
if (hops) qmail_fail(&qqt);
if (base64 && base64types.len == 0) {
- if (!stralloc_cats(&rcptto,"Q")) die_nomem();
+ if (!stralloc_cats(&rcptto, "Q")) die_nomem();
if (!stralloc_0(&rcptto)) die_nomem();
}
- qmail_from(&qqt,mailfrom.s);
- qmail_put(&qqt,rcptto.s,rcptto.len);
+ qmail_from(&qqt, mailfrom.s);
+ qmail_put(&qqt, rcptto.s, rcptto.len);
qqx = qmail_close(&qqt);
- if (!*qqx) { acceptmessage(qp); return; }
- if (hops) { out("554 too many hops, this message is looping (#5.4.6)\r\n"); return; }
+ if (!*qqx) {
+ acceptmessage(qp);
+ return;
+ }
+ if (hops) {
+ out("554 too many hops, this message is looping (#5.4.6)\r\n");
+ return;
+ }
if (databytes)
if (!bytestooverflow) {
- err_size("Reject::DATA::Invalid_Size",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s);
- return;
+ err_size(
+ "Reject::DATA::Invalid_Size",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s);
+ return;
}
if (flagmimetype < 0) {
- err_data("Reject::DATA::Bad_MIME",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,badmimetype.s);
+ err_data(
+ "Reject::DATA::Bad_MIME",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ badmimetype.s);
return;
}
if (flagloadertype < 0) {
- err_data("Reject::DATA::Bad_Loader",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,badloadertype.s);
+ err_data(
+ "Reject::DATA::Bad_Loader",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ badloadertype.s);
return;
}
if (*qqx == 'I') {
- err_data("Reject::DKIM::Signature",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,"fail");
+ err_data(
+ "Reject::DKIM::Signature",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ "fail");
return;
}
if (*qqx == 'S') {
- err_data("Reject::DATA::Spam_Message",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,"spam");
+ err_data(
+ "Reject::DATA::Spam_Message",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ "spam");
return;
}
if (*qqx == 'A') {
- err_data("Reject::DATA::MIME_Attach",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,"MIME");
+ err_data(
+ "Reject::DATA::MIME_Attach",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ "MIME");
return;
}
if (*qqx == 'V') {
if (qhpsi)
- err_data("Reject::DATA::Virus_Infected",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,qhpsi);
+ err_data(
+ "Reject::DATA::Virus_Infected",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ qhpsi);
else
- err_data("Reject::DATA::Virus_Infected",protocol.s,remoteip,remotehost,helohost.s,mailfrom.s,addr.s,"AV scanner");
+ err_data(
+ "Reject::DATA::Virus_Infected",
+ protocol.s,
+ remoteip,
+ remotehost,
+ helohost.s,
+ mailfrom.s,
+ addr.s,
+ "AV scanner");
return;
}
- if (*qqx == 'D') out("554 "); else out("451 ");
+ if (*qqx == 'D')
+ out("554 ");
+ else
+ out("451 ");
out(qqx + 1);
out("\r\n");
}
@@ -1441,33 +1771,34 @@ void smtp_data()
/* this file is too long --------------------------------- SMTP Auth */
char unique[FMT_ULONG + FMT_ULONG + 3];
-static stralloc authin = {0}; /* input from SMTP client */
-static stralloc pass = {0}; /* plain passwd or digest */
-static stralloc resp = {0}; /* b64 response */
-static stralloc chal = {0}; /* CRAM-MD5 plain challenge */
-static stralloc slop = {0}; /* CRAM-MD5 b64 challenge */
+static stralloc authin = {0}; /* input from SMTP client */
+static stralloc pass = {0}; /* plain passwd or digest */
+static stralloc resp = {0}; /* b64 response */
+static stralloc chal = {0}; /* CRAM-MD5 plain challenge */
+static stralloc slop = {0}; /* CRAM-MD5 b64 challenge */
char **childargs;
char authbuf[512];
-buffer ba = BUFFER_INIT(safewrite,FDAUTH,authbuf,sizeof(authbuf));
+buffer ba = BUFFER_INIT(safewrite, FDAUTH, authbuf, sizeof(authbuf));
int authgetl(void)
{
int i;
- if (!stralloc_copys(&authin,"")) die_nomem();
+ if (!stralloc_copys(&authin, "")) die_nomem();
for (;;) {
- if (!stralloc_readyplus(&authin,1)) die_nomem(); /* XXX */
- i = buffer_get(&bi,authin.s + authin.len,1);
+ if (!stralloc_readyplus(&authin, 1)) die_nomem(); /* XXX */
+ i = buffer_get(&bi, authin.s + authin.len, 1);
if (i != 1) die_read();
if (authin.s[authin.len] == '\n') break;
++authin.len;
}
- if (authin.len > 0) if (authin.s[authin.len - 1] == '\r') --authin.len;
+ if (authin.len > 0)
+ if (authin.s[authin.len - 1] == '\r') --authin.len;
authin.s[authin.len] = 0;
if (*authin.s == '*' && *(authin.s + 1) == 0) return err_authabort();
- if (authin.len == 0) return err_authinput();
+ if (authin.len == 0) return err_authinput();
return authin.len;
}
@@ -1480,35 +1811,37 @@ int authenticate(void)
if (!stralloc_0(&user)) die_nomem();
if (!stralloc_0(&pass)) die_nomem();
if (!stralloc_0(&chal)) die_nomem();
- if (!env_put("AUTHUSER",user.s)) die_nomem();
+ if (!env_put("AUTHUSER", user.s)) die_nomem();
if (pipe(pi) == -1) return err_pipe();
switch (child = fork()) {
- case -1:
- return err_fork();
+ case -1: return err_fork();
case 0:
close(pi[1]);
- if (fd_copy(FDAUTH,pi[0]) == -1) return err_pipe();
+ if (fd_copy(FDAUTH, pi[0]) == -1) return err_pipe();
sig_pipedefault();
- execvp(*childargs,childargs);
+ execvp(*childargs, childargs);
_exit(1);
}
close(pi[0]);
- buffer_init(&ba,write,pi[1],authbuf,sizeof(authbuf));
- if (buffer_put(&ba,user.s,user.len) == -1) return err_write();
- if (buffer_put(&ba,pass.s,pass.len) == -1) return err_write();
+ buffer_init(&ba, write, pi[1], authbuf, sizeof(authbuf));
+ if (buffer_put(&ba, user.s, user.len) == -1) return err_write();
+ if (buffer_put(&ba, pass.s, pass.len) == -1) return err_write();
if (smtpauth == 2 || smtpauth == 3 || smtpauth == 12 || smtpauth == 13)
- if (buffer_put(&ba,chal.s,chal.len) == -1) return err_write();
+ if (buffer_put(&ba, chal.s, chal.len) == -1) return err_write();
if (buffer_flush(&ba) == -1) return err_write();
close(pi[1]);
- if (!stralloc_copys(&chal,"")) die_nomem();
- if (!stralloc_copys(&slop,"")) die_nomem();
- byte_zero(authbuf,sizeof(authbuf));
- if (wait_pid(&wstat,child) == -1) return err_child();
+ if (!stralloc_copys(&chal, "")) die_nomem();
+ if (!stralloc_copys(&slop, "")) die_nomem();
+ byte_zero(authbuf, sizeof(authbuf));
+ if (wait_pid(&wstat, child) == -1) return err_child();
if (wait_crashed(wstat)) return err_child();
- if (wait_exitcode(wstat)) { sleep(AUTHSLEEP); return 1; } /* no */
+ if (wait_exitcode(wstat)) {
+ sleep(AUTHSLEEP);
+ return 1;
+ } /* no */
return 0; /* yes */
}
@@ -1518,19 +1851,20 @@ int auth_login(char *arg)
if (smtpauth == 2 || smtpauth == 12) return 1; /* only login/plain */
if (*arg) {
- if ((r = b64decode((unsigned char *)arg,str_len(arg),&user)) == 1) return err_authinput();
- }
- else {
- out("334 VXNlcm5hbWU6\r\n"); flush(); /* Username: */
+ if ((r = b64decode((unsigned char *)arg, str_len(arg), &user)) == 1) return err_authinput();
+ } else {
+ out("334 VXNlcm5hbWU6\r\n");
+ flush(); /* Username: */
if (authgetl() < 0) return -1;
- if ((r = b64decode((unsigned char *)authin.s,authin.len,&user)) == 1) return err_authinput();
+ if ((r = b64decode((unsigned char *)authin.s, authin.len, &user)) == 1) return err_authinput();
}
if (r == -1) die_nomem();
- out("334 UGFzc3dvcmQ6\r\n"); flush(); /* Password: */
+ out("334 UGFzc3dvcmQ6\r\n");
+ flush(); /* Password: */
if (authgetl() < 0) return -1;
- if ((r = b64decode((unsigned char *)authin.s,authin.len,&pass)) == 1) return err_authinput();
+ if ((r = b64decode((unsigned char *)authin.s, authin.len, &pass)) == 1) return err_authinput();
if (r == -1) die_nomem();
if (!user.len || !pass.len) return err_authinput();
@@ -1543,20 +1877,20 @@ int auth_plain(char *arg)
if (smtpauth == 2 || smtpauth == 12) return 1; /* only login/plain */
if (*arg) {
- if ((r = b64decode((unsigned char *)arg,str_len(arg),&resp)) == 1) return err_authinput();
- }
- else {
- out("334 \r\n"); flush();
+ if ((r = b64decode((unsigned char *)arg, str_len(arg), &resp)) == 1) return err_authinput();
+ } else {
+ out("334 \r\n");
+ flush();
if (authgetl() < 0) return -1;
- if ((r = b64decode((unsigned char *)authin.s,authin.len,&resp)) == 1) return err_authinput();
+ if ((r = b64decode((unsigned char *)authin.s, authin.len, &resp)) == 1) return err_authinput();
}
if (r == -1 || !stralloc_0(&resp)) die_nomem();
- while (resp.s[id]) id++; /* "authorize-id\0userid\0passwd\0" */
+ while (resp.s[id]) id++; /* "authorize-id\0userid\0passwd\0" */
if (resp.len > id + 1)
- if (!stralloc_copys(&user,resp.s + id + 1)) die_nomem();
+ if (!stralloc_copys(&user, resp.s + id + 1)) die_nomem();
if (resp.len > id + user.len + 2)
- if (!stralloc_copys(&pass,resp.s + id + user.len + 2)) die_nomem();
+ if (!stralloc_copys(&pass, resp.s + id + user.len + 2)) die_nomem();
if (!user.len || !pass.len) return err_authinput();
return authenticate();
@@ -1568,34 +1902,34 @@ int auth_cram()
char *s;
if (smtpauth == 1 || smtpauth == 11) return 1; /* no challenge if login/plain */
- s = unique; /* generate challenge */
- s += fmt_uint(s,getpid());
+ s = unique; /* generate challenge */
+ s += fmt_uint(s, getpid());
*s++ = '.';
- s += fmt_ulong(s,(unsigned long) now());
+ s += fmt_ulong(s, (unsigned long)now());
*s++ = '@';
*s++ = 0;
- if (!stralloc_copys(&chal,"<")) die_nomem();
- if (!stralloc_cats(&chal,unique)) die_nomem();
- if (!stralloc_cats(&chal,local)) die_nomem();
- if (!stralloc_cats(&chal,">")) die_nomem();
- if (b64encode(&chal,&slop) < 0) die_nomem();
+ if (!stralloc_copys(&chal, "<")) die_nomem();
+ if (!stralloc_cats(&chal, unique)) die_nomem();
+ if (!stralloc_cats(&chal, local)) die_nomem();
+ if (!stralloc_cats(&chal, ">")) die_nomem();
+ if (b64encode(&chal, &slop) < 0) die_nomem();
if (!stralloc_0(&slop)) die_nomem();
- out("334 "); /* "334 base64_challenge \r\n" */
+ out("334 "); /* "334 base64_challenge \r\n" */
out(slop.s);
out("\r\n");
flush();
- if (authgetl() < 0) return -1; /* got response */
- if ((r = b64decode((unsigned char *)authin.s,authin.len,&resp)) == 1) return err_authinput();
+ if (authgetl() < 0) return -1; /* got response */
+ if ((r = b64decode((unsigned char *)authin.s, authin.len, &resp)) == 1) return err_authinput();
if (r == -1 || !stralloc_0(&resp)) die_nomem();
- i = str_rchr(resp.s,' ');
+ i = str_rchr(resp.s, ' ');
s = resp.s + i;
while (*s == ' ') ++s;
resp.s[i] = 0;
- if (!stralloc_copys(&user,resp.s)) die_nomem();/* userid */
- if (!stralloc_copys(&pass,s)) die_nomem(); /* digest */
+ if (!stralloc_copys(&user, resp.s)) die_nomem(); /* userid */
+ if (!stralloc_copys(&pass, s)) die_nomem(); /* digest */
if (!user.len || !pass.len) return err_authinput();
return authenticate();
@@ -1605,10 +1939,10 @@ struct authcmd {
char *text;
int (*fun)();
} authcmds[] = {
- { "login", auth_login }
-, { "plain", auth_plain }
-, { "cram-md5", auth_cram }
-, { 0, err_noauth }
+ { "login", auth_login},
+ { "plain", auth_plain},
+ {"cram-md5", auth_cram},
+ { 0, err_noauth}
};
void smtp_auth(char *arg)
@@ -1618,49 +1952,60 @@ void smtp_auth(char *arg)
/* prevent users to expose userid + password over unencrypted connection */
- if ((starttls > 1) && !seentls) {
- if (!stralloc_append(&protocol,"A")) die_nomem();
+ if ((starttls > 1) && !seentls) {
+ if (!stralloc_append(&protocol, "A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_authsetup("Reject::TLS::required",protocol.s,remoteip,remotehost,helohost.s);
+ err_authsetup("Reject::TLS::required", protocol.s, remoteip, remotehost, helohost.s);
return;
}
- if ((starttls > 1) && !seenhelo) {
- if (!stralloc_append(&protocol,"A")) die_nomem();
+ if ((starttls > 1) && !seenhelo) {
+ if (!stralloc_append(&protocol, "A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_tlsreq("Reject::AUTH::invalid",protocol.s,remoteip,remotehost,helohost.s);
+ err_tlsreq("Reject::AUTH::invalid", protocol.s, remoteip, remotehost, helohost.s);
return;
}
- if (!smtpauth) { out("503 auth not available (#5.3.3)\r\n"); flush(); _exit(0); }
+ if (!smtpauth) {
+ out("503 auth not available (#5.3.3)\r\n");
+ flush();
+ _exit(0);
+ }
if (smtpauth && !*childargs) {
- err_authsetup("Reject::AUTH::invalid",protocol.s,remoteip,remotehost,helohost.s);
- flush(); _exit(1);
+ err_authsetup("Reject::AUTH::invalid", protocol.s, remoteip, remotehost, helohost.s);
+ flush();
+ _exit(1);
+ }
+ if (seenauth) {
+ err_authd();
+ return;
+ }
+ if (seenmail) {
+ err_authmail();
+ return;
}
- if (seenauth) { err_authd(); return; }
- if (seenmail) { err_authmail(); return; }
- if (!stralloc_copys(&user,"")) die_nomem();
- if (!stralloc_copys(&pass,"")) die_nomem();
- if (!stralloc_copys(&resp,"")) die_nomem();
- if (!stralloc_copys(&chal,"")) die_nomem(); /* only needed for CRAM-MD5 */
+ if (!stralloc_copys(&user, "")) die_nomem();
+ if (!stralloc_copys(&pass, "")) die_nomem();
+ if (!stralloc_copys(&resp, "")) die_nomem();
+ if (!stralloc_copys(&chal, "")) die_nomem(); /* only needed for CRAM-MD5 */
- i = str_chr(cmd,' '); /* get AUTH type */
+ i = str_chr(cmd, ' '); /* get AUTH type */
arg = cmd + i;
while (*arg == ' ') ++arg;
cmd[i] = 0;
for (i = 0; authcmds[i].text; ++i)
- if (case_equals(authcmds[i].text,cmd)) break;
+ if (case_equals(authcmds[i].text, cmd)) break;
- if (!authcmds[i].text) { /* invalid auth cmd */
- if (!stralloc_append(&protocol,"A")) die_nomem();
+ if (!authcmds[i].text) { /* invalid auth cmd */
+ if (!stralloc_append(&protocol, "A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_authinvalid("Reject::AUTH::Method",protocol.s,remoteip,remotehost,helohost.s);
+ err_authinvalid("Reject::AUTH::Method", protocol.s, remoteip, remotehost, helohost.s);
return;
}
- if (!stralloc_copys(&authmethod,authcmds[i].text)) die_nomem();
+ if (!stralloc_copys(&authmethod, authcmds[i].text)) die_nomem();
if (!stralloc_0(&authmethod)) die_nomem();
switch (authcmds[i].fun(arg)) {
@@ -1672,9 +2017,9 @@ void smtp_auth(char *arg)
out("235 ok, go ahead (#2.0.0)\r\n");
break;
case 1:
- if (!stralloc_append(&protocol,"A")) die_nomem();
+ if (!stralloc_append(&protocol, "A")) die_nomem();
if (!stralloc_0(&protocol)) die_nomem();
- err_authfail("Reject::AUTH::",protocol.s,remoteip,remotehost,helohost.s,user.s,authmethod.s);
+ err_authfail("Reject::AUTH::", protocol.s, remoteip, remotehost, helohost.s, user.s, authmethod.s);
return;
}
}
@@ -1682,20 +2027,20 @@ void smtp_auth(char *arg)
/* this file is too long --------------------------------- GO ON */
struct commands smtpcommands[] = {
- { "rcpt", smtp_rcpt, 0 }
-, { "mail", smtp_mail, 0 }
-, { "data", smtp_data, flush }
-, { "auth", smtp_auth, flush }
-, { "quit", smtp_quit, flush }
-, { "helo", smtp_helo, flush }
-, { "ehlo", smtp_ehlo, flush }
-, { "rset", smtp_rset, flush }
-, { "help", smtp_help, flush }
-, { "noop", err_noop, flush }
-, { "vrfy", err_vrfy, flush }
-, { "starttls", smtp_starttls, flush }
-, { 0, err_unimpl, flush }
-} ;
+ { "rcpt", smtp_rcpt, 0},
+ { "mail", smtp_mail, 0},
+ { "data", smtp_data, flush},
+ { "auth", smtp_auth, flush},
+ { "quit", smtp_quit, flush},
+ { "helo", smtp_helo, flush},
+ { "ehlo", smtp_ehlo, flush},
+ { "rset", smtp_rset, flush},
+ { "help", smtp_help, flush},
+ { "noop", err_noop, flush},
+ { "vrfy", err_vrfy, flush},
+ {"starttls", smtp_starttls, flush},
+ { 0, err_unimpl, flush}
+};
int main(int argc, char **argv)
{
@@ -1708,7 +2053,7 @@ int main(int argc, char **argv)
smtp_greet("220 ");
out(" ESMTP\r\n");
flush();
- if (commands(&bi,&smtpcommands) == 0) die_read();
+ if (commands(&bi, &smtpcommands) == 0) die_read();
die_nomem();
return 0;
diff --git a/src/qmail-start.c b/src/qmail-start.c
index 7a7342c..4ad250e 100644
--- a/src/qmail-start.c
+++ b/src/qmail-start.c
@@ -1,17 +1,22 @@
-#include <unistd.h>
#include <sys/stat.h>
+#include <unistd.h>
+
+#include "exit.h"
#include "fd.h"
#include "prot.h"
-#include "exit.h"
+
#include "auto_uids.h"
-char *(qsargs[]) = { "qmail-send", 0 };
-char *(qcargs[]) = { "qmail-clean", 0 };
-char *(qlargs[]) = { "qmail-lspawn", "./Mailbox", 0 };
-char *(qrargs[]) = { "qmail-rspawn", 0 };
-char *(qtargs[]) = { "qmail-todo", 0};
+char *(qsargs[]) = {"qmail-send", 0};
+char *(qcargs[]) = {"qmail-clean", 0};
+char *(qlargs[]) = {"qmail-lspawn", "./Mailbox", 0};
+char *(qrargs[]) = {"qmail-rspawn", 0};
+char *(qtargs[]) = {"qmail-todo", 0};
-void die() { _exit(111); }
+void die()
+{
+ _exit(111);
+}
int pi0[2];
int pi1[2];
@@ -25,34 +30,54 @@ int pi8[2];
int pi9[2];
int pi10[2];
-void closefds()
-{
- close(2); close(3); close(4); close(5); close(6);
- close(7); close(8);
+void closefds()
+{
+ close(2);
+ close(3);
+ close(4);
+ close(5);
+ close(6);
+ close(7);
+ close(8);
}
-void closepipes()
+void closepipes()
{
- close(pi1[0]); close(pi1[1]); close(pi2[0]); close(pi2[1]);
- close(pi3[0]); close(pi3[1]); close(pi4[0]); close(pi4[1]);
- close(pi5[0]); close(pi5[1]); close(pi6[0]); close(pi6[1]);
- close(pi7[0]); close(pi7[1]); close(pi8[0]); close(pi8[1]);
- close(pi9[0]); close(pi9[1]); close(pi10[0]); close(pi10[1]);
+ close(pi1[0]);
+ close(pi1[1]);
+ close(pi2[0]);
+ close(pi2[1]);
+ close(pi3[0]);
+ close(pi3[1]);
+ close(pi4[0]);
+ close(pi4[1]);
+ close(pi5[0]);
+ close(pi5[1]);
+ close(pi6[0]);
+ close(pi6[1]);
+ close(pi7[0]);
+ close(pi7[1]);
+ close(pi8[0]);
+ close(pi8[1]);
+ close(pi9[0]);
+ close(pi9[1]);
+ close(pi10[0]);
+ close(pi10[1]);
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
if (chdir("/") == -1) die();
umask(077);
if (prot_gid(auto_gidq) == -1) die();
- if (fd_copy(2,0) == -1) die();
- if (fd_copy(3,0) == -1) die();
- if (fd_copy(4,0) == -1) die();
- if (fd_copy(5,0) == -1) die();
- if (fd_copy(6,0) == -1) die();
- if (fd_copy(7,0) == -1) die();
- if (fd_copy(8,0) == -1) die();
+ if (fd_copy(2, 0) == -1) die();
+ if (fd_copy(3, 0) == -1) die();
+ if (fd_copy(4, 0) == -1) die();
+ if (fd_copy(5, 0) == -1) die();
+ if (fd_copy(6, 0) == -1) die();
+ if (fd_copy(7, 0) == -1) die();
+ if (fd_copy(8, 0) == -1) die();
if (argv[1]) {
qlargs[1] = argv[1];
@@ -62,21 +87,20 @@ int main(int argc,char **argv)
if (argv[1]) {
if (pipe(pi0) == -1) die();
switch (fork()) {
- case -1:
- die();
+ case -1: die();
case 0:
if (prot_gid(auto_gidn) == -1) die();
if (prot_uid(auto_uidl) == -1) die();
close(pi0[1]);
- if (fd_move(0,pi0[0]) == -1) die();
+ if (fd_move(0, pi0[0]) == -1) die();
closefds();
- execvp(argv[1],argv + 1);
+ execvp(argv[1], argv + 1);
die();
}
close(pi0[0]);
- if (fd_move(1,pi0[1]) == -1) die();
+ if (fd_move(1, pi0[1]) == -1) die();
}
-
+
if (pipe(pi1) == -1) die();
if (pipe(pi2) == -1) die();
if (pipe(pi3) == -1) die();
@@ -87,39 +111,39 @@ int main(int argc,char **argv)
if (pipe(pi8) == -1) die();
if (pipe(pi9) == -1) die();
if (pipe(pi10) == -1) die();
-
+
switch (fork()) {
case -1: die();
case 0:
- if (fd_copy(0,pi1[0]) == -1) die();
- if (fd_copy(1,pi2[1]) == -1) die();
+ if (fd_copy(0, pi1[0]) == -1) die();
+ if (fd_copy(1, pi2[1]) == -1) die();
closefds();
closepipes();
- execvp(*qlargs,qlargs);
+ execvp(*qlargs, qlargs);
die();
}
-
+
switch (fork()) {
case -1: die();
case 0:
if (prot_uid(auto_uidr) == -1) die();
- if (fd_copy(0,pi3[0]) == -1) die();
- if (fd_copy(1,pi4[1]) == -1) die();
+ if (fd_copy(0, pi3[0]) == -1) die();
+ if (fd_copy(1, pi4[1]) == -1) die();
closefds();
closepipes();
- execvp(*qrargs,qrargs);
+ execvp(*qrargs, qrargs);
die();
}
-
+
switch (fork()) {
case -1: die();
case 0:
if (prot_uid(auto_uidq) == -1) die();
- if (fd_copy(0,pi5[0]) == -1) die();
- if (fd_copy(1,pi6[1]) == -1) die();
+ if (fd_copy(0, pi5[0]) == -1) die();
+ if (fd_copy(1, pi6[1]) == -1) die();
closefds();
closepipes();
- execvp(*qcargs,qcargs);
+ execvp(*qcargs, qcargs);
die();
}
@@ -127,13 +151,13 @@ int main(int argc,char **argv)
case -1: die();
case 0:
if (prot_uid(auto_uids) == -1) die();
- if (fd_copy(0,pi7[0]) == -1) die();
- if (fd_copy(1,pi8[1]) == -1) die();
+ if (fd_copy(0, pi7[0]) == -1) die();
+ if (fd_copy(1, pi8[1]) == -1) die();
closefds();
- if (fd_copy(2,pi9[1]) == -1) die();
- if (fd_copy(3,pi10[0]) == -1) die();
+ if (fd_copy(2, pi9[1]) == -1) die();
+ if (fd_copy(3, pi10[0]) == -1) die();
closepipes();
- execvp(*qtargs,qtargs);
+ execvp(*qtargs, qtargs);
die();
}
@@ -141,25 +165,25 @@ int main(int argc,char **argv)
case -1: die();
case 0:
if (prot_uid(auto_uidq) == -1) die();
- if (fd_copy(0,pi9[0]) == -1) die();
- if (fd_copy(1,pi10[1]) == -1) die();
+ if (fd_copy(0, pi9[0]) == -1) die();
+ if (fd_copy(1, pi10[1]) == -1) die();
closefds();
closepipes();
- execvp(*qcargs,qcargs);
+ execvp(*qcargs, qcargs);
die();
}
-
+
if (prot_uid(auto_uids) == -1) die();
- if (fd_copy(0,1) == -1) die();
- if (fd_copy(1,pi1[1]) == -1) die();
- if (fd_copy(2,pi2[0]) == -1) die();
- if (fd_copy(3,pi3[1]) == -1) die();
- if (fd_copy(4,pi4[0]) == -1) die();
- if (fd_copy(5,pi5[1]) == -1) die();
- if (fd_copy(6,pi6[0]) == -1) die();
- if (fd_copy(7,pi7[1]) == -1) die();
- if (fd_copy(8,pi8[0]) == -1) die();
+ if (fd_copy(0, 1) == -1) die();
+ if (fd_copy(1, pi1[1]) == -1) die();
+ if (fd_copy(2, pi2[0]) == -1) die();
+ if (fd_copy(3, pi3[1]) == -1) die();
+ if (fd_copy(4, pi4[0]) == -1) die();
+ if (fd_copy(5, pi5[1]) == -1) die();
+ if (fd_copy(6, pi6[0]) == -1) die();
+ if (fd_copy(7, pi7[1]) == -1) die();
+ if (fd_copy(8, pi8[0]) == -1) die();
closepipes();
- execvp(*qsargs,qsargs);
+ execvp(*qsargs, qsargs);
die();
}
diff --git a/src/qmail-tcpok.c b/src/qmail-tcpok.c
index 2935f17..db37274 100644
--- a/src/qmail-tcpok.c
+++ b/src/qmail-tcpok.c
@@ -1,10 +1,12 @@
-#include "logmsg.h"
+#include <unistd.h>
+
#include "buffer.h"
+#include "exit.h"
#include "lock.h"
+#include "logmsg.h"
#include "open.h"
-#include <unistd.h>
+
#include "auto_qmail.h"
-#include "exit.h"
#define WHO "qmail-tcpok"
@@ -16,21 +18,18 @@ int main()
int fd;
int i;
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
if (chdir("queue/lock") == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to ",auto_qmail,"/queue/lock: "));
+ logmsg(WHO, 111, FATAL, B("unable to chdir to ", auto_qmail, "/queue/lock: "));
fd = open_write("tcpto");
- if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to write ",auto_qmail,"/queue/lock/tcpto: "));
+ if (fd == -1) logmsg(WHO, 111, FATAL, B("unable to write ", auto_qmail, "/queue/lock/tcpto: "));
if (lock_ex(fd) == -1)
- logmsg(WHO,111,FATAL,B("unable to lock ",auto_qmail,"/queue/lock/tcpto: "));
+ logmsg(WHO, 111, FATAL, B("unable to lock ", auto_qmail, "/queue/lock/tcpto: "));
- buffer_init(&bo,write,fd,buf,sizeof(buf));
- for (i = 0; i < sizeof(buf); ++i)
- buffer_put(&bo,"",1);
+ buffer_init(&bo, write, fd, buf, sizeof(buf));
+ for (i = 0; i < sizeof(buf); ++i) buffer_put(&bo, "", 1);
if (buffer_flush(&bo) == -1)
- logmsg(WHO,111,FATAL,B("unable to clear ",auto_qmail,"/queue/lock/tcpto: "));
+ logmsg(WHO, 111, FATAL, B("unable to clear ", auto_qmail, "/queue/lock/tcpto: "));
_exit(0);
}
diff --git a/src/qmail-tcpto.c b/src/qmail-tcpto.c
index e148c55..b5100ef 100644
--- a/src/qmail-tcpto.c
+++ b/src/qmail-tcpto.c
@@ -2,37 +2,55 @@
#include <sys/socket.h>
#include <unistd.h>
+
#include "buffer.h"
-#include "auto_qmail.h"
+#include "error.h"
+#include "exit.h"
#include "fmt.h"
#include "ip.h"
#include "lock.h"
-#include "error.h"
-#include "exit.h"
+#include "logmsg.h"
+#include "open.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
#include "datetime.h"
#include "now.h"
-#include "stralloc.h"
-#include "open.h"
-#include "logmsg.h"
#define WHO "qmail-tcpto"
-void die(n) int n; { buffer_flush(buffer_1); _exit(n); }
+void die(n) int n;
+{
+ buffer_flush(buffer_1);
+ _exit(n);
+}
void warn(s) char *s;
{
char *x;
x = error_str(errno);
- buffer_puts(buffer_1,s);
- buffer_puts(buffer_1,": ");
- buffer_puts(buffer_1,x);
- buffer_puts(buffer_1,"\n");
+ buffer_puts(buffer_1, s);
+ buffer_puts(buffer_1, ": ");
+ buffer_puts(buffer_1, x);
+ buffer_puts(buffer_1, "\n");
}
-void die_chdir() { logmsg(WHO,110,FATAL,"unable to chdir"); }
-void die_open() { logmsg(WHO,112,FATAL,"unable to open tcpto"); }
-void die_lock() { logmsg(WHO,112,FATAL,"unable to lock tcpto"); }
-void die_read() { logmsg(WHO,112,FATAL,"unable to read tcpto"); }
+void die_chdir()
+{
+ logmsg(WHO, 110, FATAL, "unable to chdir");
+}
+void die_open()
+{
+ logmsg(WHO, 112, FATAL, "unable to open tcpto");
+}
+void die_lock()
+{
+ logmsg(WHO, 112, FATAL, "unable to lock tcpto");
+}
+void die_read()
+{
+ logmsg(WHO, 112, FATAL, "unable to read tcpto");
+}
char tcpto_buf[1024];
@@ -58,38 +76,38 @@ int main(void)
fd = open_read("tcpto");
if (fd == -1) die_open();
if (lock_ex(fdlock) == -1) die_lock();
- r = read(fd,tcpto_buf,sizeof(tcpto_buf));
+ r = read(fd, tcpto_buf, sizeof(tcpto_buf));
close(fd);
close(fdlock);
if (r == -1) die_read();
- r >>= 5; /* 32 bit read */
+ r >>= 5; /* 32 bit read */
start = now();
record = tcpto_buf;
for (i = 0; i < r; ++i) {
if (record[4] >= 1) {
- when = (unsigned long) (unsigned char) record[11];
- when = (when << 8) + (unsigned long) (unsigned char) record[10];
- when = (when << 8) + (unsigned long) (unsigned char) record[9];
- when = (when << 8) + (unsigned long) (unsigned char) record[8];
+ when = (unsigned long)(unsigned char)record[11];
+ when = (when << 8) + (unsigned long)(unsigned char)record[10];
+ when = (when << 8) + (unsigned long)(unsigned char)record[9];
+ when = (when << 8) + (unsigned long)(unsigned char)record[8];
if (record[0] == AF_INET) {
- byte_copy(&ip4,4,record + 16);
- buffer_put(buffer_1,tmp,ip4_fmt(tmp,ip4));
+ byte_copy(&ip4, 4, record + 16);
+ buffer_put(buffer_1, tmp, ip4_fmt(tmp, ip4));
} else {
- byte_copy(&ip6,16,record + 16);
- buffer_put(buffer_1,tmp,ip6_fmt(tmp,ip6));
+ byte_copy(&ip6, 16, record + 16);
+ buffer_put(buffer_1, tmp, ip6_fmt(tmp, ip6));
}
- buffer_puts(buffer_1," timed out ");
- buffer_put(buffer_1,tmp,fmt_ulong(tmp,(unsigned long) (start - when)));
- buffer_puts(buffer_1," seconds ago; # recent timeouts: ");
- buffer_put(buffer_1,tmp,fmt_ulong(tmp,(unsigned long) (unsigned char) record[4]));
- buffer_puts(buffer_1,"\n");
- }
- record += 32;
+ buffer_puts(buffer_1, " timed out ");
+ buffer_put(buffer_1, tmp, fmt_ulong(tmp, (unsigned long)(start - when)));
+ buffer_puts(buffer_1, " seconds ago; # recent timeouts: ");
+ buffer_put(buffer_1, tmp, fmt_ulong(tmp, (unsigned long)(unsigned char)record[4]));
+ buffer_puts(buffer_1, "\n");
+ }
+ record += 32;
}
- die(0);
+ die(0);
}
diff --git a/src/qmail-todo.c b/src/qmail-todo.c
index 6e19272..34be551 100644
--- a/src/qmail-todo.c
+++ b/src/qmail-todo.c
@@ -1,30 +1,32 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "alloc.h"
-#include "auto_qmail.h"
+#include "buffer.h"
#include "byte.h"
#include "constmap.h"
-#include "control.h"
#include "direntry.h"
#include "error.h"
#include "exit.h"
#include "fmt.h"
-#include "fmtqfn.h"
#include "getln.h"
-#include "open.h"
#include "ndelay.h"
-#include "now.h"
-#include "readsubdir.h"
-#include "buffer.h"
+#include "open.h"
#include "scan.h"
#include "select.h"
-#include "str.h"
#include "sig.h"
+#include "str.h"
#include "stralloc.h"
-#include "trigger.h"
+
+#include "auto_qmail.h"
+#include "control.h"
+#include "fmtqfn.h"
+#include "now.h"
#include "qsutil.h"
+#include "readsubdir.h"
#include "sendtodo.h"
+#include "trigger.h"
stralloc percenthack = {0};
struct constmap mappercenthack;
@@ -38,26 +40,33 @@ char strnum[FMT_ULONG];
/* XXX not good, if qmail-send.c changes this has to be updated */
#define CHANNELS 2
-char *chanaddr[CHANNELS] = { "local/", "remote/" };
+char *chanaddr[CHANNELS] = {"local/", "remote/"};
datetime_sec recent;
int flagquitasap = 0;
void sendlog1(char *x);
-void sendlog3(char *x,char *y,char *z);
+void sendlog3(char *x, char *y, char *z);
void sigterm(void)
{
- if (flagquitasap == 0)
- sendlog1("status: qmail-todo stop processing asap\n");
+ if (flagquitasap == 0) sendlog1("status: qmail-todo stop processing asap\n");
flagquitasap = 1;
}
-int flagreadasap = 0; void sighup(void) { flagreadasap = 1; }
-int flagsendalive = 1; void senddied(void) { flagsendalive = 0; }
+int flagreadasap = 0;
+void sighup(void)
+{
+ flagreadasap = 1;
+}
+int flagsendalive = 1;
+void senddied(void)
+{
+ flagsendalive = 0;
+}
void cleandied()
-{
+{
sendlog1("alert: qmail-todo lost connection to qmail-clean ... exiting\n");
flagquitasap = 1;
}
@@ -69,13 +78,25 @@ stralloc fn = {0};
void fnmake_init(void)
{
- while (!stralloc_ready(&fn,FMTQFN)) nomem();
+ while (!stralloc_ready(&fn, FMTQFN)) nomem();
}
-void fnmake_info(unsigned long id) { fn.len = fmtqfn(fn.s,"info/",id,1); }
-void fnmake_todo(unsigned long id) { fn.len = fmtqfn(fn.s,"todo/",id,1); }
-void fnmake_mess(unsigned long id) { fn.len = fmtqfn(fn.s,"mess/",id,1); }
-void fnmake_chanaddr(unsigned long id,int c) { fn.len = fmtqfn(fn.s,chanaddr[c],id,1); }
+void fnmake_info(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "info/", id, 1);
+}
+void fnmake_todo(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "todo/", id, 1);
+}
+void fnmake_mess(unsigned long id)
+{
+ fn.len = fmtqfn(fn.s, "mess/", id, 1);
+}
+void fnmake_chanaddr(unsigned long id, int c)
+{
+ fn.len = fmtqfn(fn.s, chanaddr[c], id, 1);
+}
/* this file is not so long ------------------------------------- REWRITING */
@@ -93,100 +114,101 @@ int rewrite(char *recip)
static stralloc addr = {0};
int at;
- if (!stralloc_copys(&rwline,"T")) return 0;
- if (!stralloc_copys(&addr,recip)) return 0;
+ if (!stralloc_copys(&rwline, "T")) return 0;
+ if (!stralloc_copys(&addr, recip)) return 0;
- i = byte_rchr(addr.s,addr.len,'@');
+ i = byte_rchr(addr.s, addr.len, '@');
if (i == addr.len) {
- if (!stralloc_cats(&addr,"@")) return 0;
- if (!stralloc_cat(&addr,&envnoathost)) return 0;
+ if (!stralloc_cats(&addr, "@")) return 0;
+ if (!stralloc_cat(&addr, &envnoathost)) return 0;
}
- while (constmap(&mappercenthack,addr.s + i + 1,addr.len - i - 1)) {
- j = byte_rchr(addr.s,i,'%');
+ while (constmap(&mappercenthack, addr.s + i + 1, addr.len - i - 1)) {
+ j = byte_rchr(addr.s, i, '%');
if (j == i) break;
addr.len = i;
i = j;
addr.s[i] = '@';
}
- at = byte_rchr(addr.s,addr.len,'@');
+ at = byte_rchr(addr.s, addr.len, '@');
- if (constmap(&maplocals,addr.s + at + 1,addr.len - at - 1)) {
- if (!stralloc_cat(&rwline,&addr)) return 0;
+ if (constmap(&maplocals, addr.s + at + 1, addr.len - at - 1)) {
+ if (!stralloc_cat(&rwline, &addr)) return 0;
if (!stralloc_0(&rwline)) return 0;
return 1;
}
for (i = 0; i <= addr.len; ++i)
if (!i || (i == at + 1) || (i == addr.len) || ((i > at) && (addr.s[i] == '.')))
- if ((x = constmap(&mapvdoms,addr.s + i,addr.len - i))) {
+ if ((x = constmap(&mapvdoms, addr.s + i, addr.len - i))) {
if (!*x) break;
- if (!stralloc_cats(&rwline,x)) return 0;
- if (!stralloc_cats(&rwline,"-")) return 0;
- if (!stralloc_cat(&rwline,&addr)) return 0;
+ if (!stralloc_cats(&rwline, x)) return 0;
+ if (!stralloc_cats(&rwline, "-")) return 0;
+ if (!stralloc_cat(&rwline, &addr)) return 0;
if (!stralloc_0(&rwline)) return 0;
return 1;
}
-
- if (!stralloc_cat(&rwline,&addr)) return 0;
+
+ if (!stralloc_cat(&rwline, &addr)) return 0;
if (!stralloc_0(&rwline)) return 0;
return 2;
}
/* this file is not so long --------------------------------- COMMUNICATION */
-buffer toqc; char toqcbuf[1024];
-buffer fromqc; char fromqcbuf[1024];
+buffer toqc;
+char toqcbuf[1024];
+buffer fromqc;
+char fromqcbuf[1024];
stralloc comm_buf = {0};
int comm_pos;
int fdout = -1;
int fdin = -1;
-void sendlog1(char* x)
+void sendlog1(char *x)
{
int pos;
pos = comm_buf.len;
- if (!stralloc_cats(&comm_buf,"L")) goto FAIL;
- if (!stralloc_cats(&comm_buf,x)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, "L")) goto FAIL;
+ if (!stralloc_cats(&comm_buf, x)) goto FAIL;
if (!stralloc_0(&comm_buf)) goto FAIL;
return;
- FAIL:
+FAIL:
/* either all or nothing */
comm_buf.len = pos;
}
-void sendlog3(char* x, char *y, char *z)
+void sendlog3(char *x, char *y, char *z)
{
int pos;
pos = comm_buf.len;
- if (!stralloc_cats(&comm_buf,"L")) goto FAIL;
- if (!stralloc_cats(&comm_buf,x)) goto FAIL;
- if (!stralloc_cats(&comm_buf,y)) goto FAIL;
- if (!stralloc_cats(&comm_buf,z)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, "L")) goto FAIL;
+ if (!stralloc_cats(&comm_buf, x)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, y)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, z)) goto FAIL;
if (!stralloc_0(&comm_buf)) goto FAIL;
return;
- FAIL:
+FAIL:
/* either all or nothing */
comm_buf.len = pos;
}
void comm_init(void)
{
- buffer_init(&toqc,write,2,toqcbuf,sizeof(toqcbuf));
- buffer_init(&fromqc,read,3,fromqcbuf,sizeof(fromqcbuf));
+ buffer_init(&toqc, write, 2, toqcbuf, sizeof(toqcbuf));
+ buffer_init(&fromqc, read, 3, fromqcbuf, sizeof(fromqcbuf));
- fdout = 1; /* stdout */
- fdin = 0; /* stdin */
- if (ndelay_on(fdout) == -1)
- /* this is so stupid: NDELAY semantics should be default on write */
- senddied(); /* drastic, but better than risking deadlock */
+ fdout = 1; /* stdout */
+ fdin = 0; /* stdin */
+ if (ndelay_on(fdout) == -1) /* this is so stupid: NDELAY semantics should be default on write */
+ senddied(); /* drastic, but better than risking deadlock */
- while (!stralloc_ready(&comm_buf,1024)) nomem();
+ while (!stralloc_ready(&comm_buf, 1024)) nomem();
}
int comm_canwrite(void)
@@ -202,59 +224,62 @@ void comm_write(unsigned long id, int local, int remote)
{
int pos;
char *s;
-
- if (local && remote) s="B";
- else if (local) s="L";
- else if (remote) s="R";
- else s="X";
-
+
+ if (local && remote)
+ s = "B";
+ else if (local)
+ s = "L";
+ else if (remote)
+ s = "R";
+ else
+ s = "X";
+
pos = comm_buf.len;
- strnum[fmt_ulong(strnum,id)] = 0;
- if (!stralloc_cats(&comm_buf,"D")) goto FAIL;
- if (!stralloc_cats(&comm_buf,s)) goto FAIL;
- if (!stralloc_cats(&comm_buf,strnum)) goto FAIL;
+ strnum[fmt_ulong(strnum, id)] = 0;
+ if (!stralloc_cats(&comm_buf, "D")) goto FAIL;
+ if (!stralloc_cats(&comm_buf, s)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, strnum)) goto FAIL;
if (!stralloc_0(&comm_buf)) goto FAIL;
return;
-
- FAIL:
+
+FAIL:
/* either all or nothing */
comm_buf.len = pos;
}
-void comm_info(unsigned long id, unsigned long size, char* from, unsigned long pid, unsigned long uid)
+void comm_info(unsigned long id, unsigned long size, char *from, unsigned long pid, unsigned long uid)
{
int pos;
int i;
pos = comm_buf.len;
- if (!stralloc_cats(&comm_buf,"Linfo msg ")) goto FAIL;
- strnum[fmt_ulong(strnum,id)] = 0;
- if (!stralloc_cats(&comm_buf,strnum)) goto FAIL;
- if (!stralloc_cats(&comm_buf,": bytes ")) goto FAIL;
- strnum[fmt_ulong(strnum,size)] = 0;
- if (!stralloc_cats(&comm_buf,strnum)) goto FAIL;
- if (!stralloc_cats(&comm_buf," from <")) goto FAIL;
+ if (!stralloc_cats(&comm_buf, "Linfo msg ")) goto FAIL;
+ strnum[fmt_ulong(strnum, id)] = 0;
+ if (!stralloc_cats(&comm_buf, strnum)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, ": bytes ")) goto FAIL;
+ strnum[fmt_ulong(strnum, size)] = 0;
+ if (!stralloc_cats(&comm_buf, strnum)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, " from <")) goto FAIL;
i = comm_buf.len;
- if (!stralloc_cats(&comm_buf,from)) goto FAIL;
-
+ if (!stralloc_cats(&comm_buf, from)) goto FAIL;
+
for (; i < comm_buf.len; ++i)
if (comm_buf.s[i] == '\n')
comm_buf.s[i] = '/';
- else
- if (!issafe(comm_buf.s[i]))
- comm_buf.s[i] = '_';
-
- if (!stralloc_cats(&comm_buf,"> qp ")) goto FAIL;
- strnum[fmt_ulong(strnum,pid)] = 0;
- if (!stralloc_cats(&comm_buf,strnum)) goto FAIL;
- if (!stralloc_cats(&comm_buf," uid ")) goto FAIL;
- strnum[fmt_ulong(strnum,uid)] = 0;
- if (!stralloc_cats(&comm_buf,strnum)) goto FAIL;
- if (!stralloc_cats(&comm_buf,"\n")) goto FAIL;
+ else if (!issafe(comm_buf.s[i]))
+ comm_buf.s[i] = '_';
+
+ if (!stralloc_cats(&comm_buf, "> qp ")) goto FAIL;
+ strnum[fmt_ulong(strnum, pid)] = 0;
+ if (!stralloc_cats(&comm_buf, strnum)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, " uid ")) goto FAIL;
+ strnum[fmt_ulong(strnum, uid)] = 0;
+ if (!stralloc_cats(&comm_buf, strnum)) goto FAIL;
+ if (!stralloc_cats(&comm_buf, "\n")) goto FAIL;
if (!stralloc_0(&comm_buf)) goto FAIL;
return;
- FAIL:
+FAIL:
/* either all or nothing */
comm_buf.len = pos;
}
@@ -262,23 +287,20 @@ void comm_info(unsigned long id, unsigned long size, char* from, unsigned long p
void comm_exit(void)
{
/* if it FAILs exit, we have already stoped */
- if (!stralloc_cats(&comm_buf,"X")) _exit(1);
+ if (!stralloc_cats(&comm_buf, "X")) _exit(1);
if (!stralloc_0(&comm_buf)) _exit(1);
}
void comm_selprep(int *nfds, fd_set *wfds, fd_set *rfds)
{
if (flagsendalive) {
- if (flagquitasap && comm_canwrite() == 0)
- comm_exit();
+ if (flagquitasap && comm_canwrite() == 0) comm_exit();
if (comm_canwrite()) {
- FD_SET(fdout,wfds);
- if (*nfds <= fdout)
- *nfds = fdout + 1;
+ FD_SET(fdout, wfds);
+ if (*nfds <= fdout) *nfds = fdout + 1;
}
- FD_SET(fdin,rfds);
- if (*nfds <= fdin)
- *nfds = fdin + 1;
+ FD_SET(fdin, rfds);
+ if (*nfds <= fdin) *nfds = fdin + 1;
}
}
@@ -287,43 +309,35 @@ void comm_do(fd_set *wfds, fd_set *rfds)
/* first write then read */
if (flagsendalive)
if (comm_canwrite())
- if (FD_ISSET(fdout,wfds)) {
- int w;
- int len;
- len = comm_buf.len;
- w = write(fdout,comm_buf.s + comm_pos,len - comm_pos);
- if (w <= 0) {
- if ((w == -1) && (errno == EPIPE))
- senddied();
- } else {
- comm_pos += w;
- if (comm_pos == len) {
- comm_buf.len = 0;
- comm_pos = 0;
- }
- }
+ if (FD_ISSET(fdout, wfds)) {
+ int w;
+ int len;
+ len = comm_buf.len;
+ w = write(fdout, comm_buf.s + comm_pos, len - comm_pos);
+ if (w <= 0) {
+ if ((w == -1) && (errno == EPIPE)) senddied();
+ } else {
+ comm_pos += w;
+ if (comm_pos == len) {
+ comm_buf.len = 0;
+ comm_pos = 0;
+ }
+ }
}
if (flagsendalive)
- if (FD_ISSET(fdin,rfds)) {
+ if (FD_ISSET(fdin, rfds)) {
/* there are only two messages 'H' and 'X' */
char c;
int r;
r = read(fdin, &c, 1);
if (r <= 0) {
- if ((r == -1) && (errno != EINTR))
- senddied();
+ if ((r == -1) && (errno != EINTR)) senddied();
} else {
- switch (c) {
- case 'H':
- sighup();
- break;
- case 'X':
- sigterm();
- break;
- default:
- sendlog1("warning: qmail-todo: qmail-send speaks an obscure dialect\n");
- break;
- }
+ switch (c) {
+ case 'H': sighup(); break;
+ case 'X': sigterm(); break;
+ default: sendlog1("warning: qmail-todo: qmail-send speaks an obscure dialect\n"); break;
+ }
}
}
}
@@ -348,7 +362,7 @@ void todo_init(void)
void todo_selprep(int *nfds, fd_set *rfds, datetime_sec *wakeup)
{
if (flagquitasap) return;
- trigger_selprep(nfds,rfds);
+ trigger_selprep(nfds, rfds);
if (flagtododir) *wakeup = 0;
if (*wakeup > nexttodorun) *wakeup = nexttodorun;
}
@@ -356,9 +370,9 @@ void todo_selprep(int *nfds, fd_set *rfds, datetime_sec *wakeup)
void todo_do(fd_set *rfds)
{
struct stat st;
- buffer bi;
+ buffer bi;
int fd;
- buffer bo;
+ buffer bo;
int fdnumber;
buffer bchan[CHANNELS];
int fdchan[CHANNELS];
@@ -372,8 +386,7 @@ void todo_do(fd_set *rfds)
fd = -1;
fdnumber = -1;
- for (c = 0; c < CHANNELS; ++c)
- fdchan[c] = -1;
+ for (c = 0; c < CHANNELS; ++c) fdchan[c] = -1;
if (flagquitasap) return;
@@ -382,12 +395,12 @@ void todo_do(fd_set *rfds)
if (recent < nexttodorun) return;
}
trigger_set();
- readsubdir_init(&todosubdir,"todo",pausedir);
+ readsubdir_init(&todosubdir, "todo", pausedir);
flagtododir = 1;
nexttodorun = recent + SLEEP_TODO;
}
- switch (readsubdir_next(&todosubdir,&id)) {
+ switch (readsubdir_next(&todosubdir, &id)) {
case 1: break;
case 0: flagtododir = 0;
default: return;
@@ -396,114 +409,149 @@ void todo_do(fd_set *rfds)
fnmake_todo(id);
fd = open_read(fn.s);
- if (fd == -1) { sendlog3("warning: qmail-todo: unable to open ",fn.s,"\n"); return; }
+ if (fd == -1) {
+ sendlog3("warning: qmail-todo: unable to open ", fn.s, "\n");
+ return;
+ }
fnmake_mess(id);
/* just for the statistics */
- if (stat(fn.s,&st) == -1)
- { sendlog3("warning: qmail-todo: unable to stat ",fn.s," for mess\n"); goto FAIL; }
+ if (stat(fn.s, &st) == -1) {
+ sendlog3("warning: qmail-todo: unable to stat ", fn.s, " for mess\n");
+ goto FAIL;
+ }
for (c = 0; c < CHANNELS; ++c) {
- fnmake_chanaddr(id,c);
- if (unlink(fn.s) == -1) if (errno != ENOENT)
- { sendlog3("warning: qmail-todo: unable to unlink ",fn.s," for mess\n"); goto FAIL; }
+ fnmake_chanaddr(id, c);
+ if (unlink(fn.s) == -1)
+ if (errno != ENOENT) {
+ sendlog3("warning: qmail-todo: unable to unlink ", fn.s, " for mess\n");
+ goto FAIL;
+ }
}
fnmake_info(id);
- if (unlink(fn.s) == -1) if (errno != ENOENT)
- { sendlog3("warning: qmail-todo: unable to unlink ",fn.s," for info\n"); goto FAIL; }
+ if (unlink(fn.s) == -1)
+ if (errno != ENOENT) {
+ sendlog3("warning: qmail-todo: unable to unlink ", fn.s, " for info\n");
+ goto FAIL;
+ }
fdnumber = open_excl(fn.s);
- if (fdnumber == -1)
- { sendlog3("warning: qmail-todo: unable to create ",fn.s," for info\n"); goto FAIL; }
+ if (fdnumber == -1) {
+ sendlog3("warning: qmail-todo: unable to create ", fn.s, " for info\n");
+ goto FAIL;
+ }
- strnum[fmt_ulong(strnum,id)] = 0;
- sendlog3("new msg ",strnum,"\n");
+ strnum[fmt_ulong(strnum, id)] = 0;
+ sendlog3("new msg ", strnum, "\n");
- for (c = 0; c < CHANNELS; ++c)
- flagchan[c] = 0;
+ for (c = 0; c < CHANNELS; ++c) flagchan[c] = 0;
- buffer_init(&bi,read,fd,todobuf,sizeof(todobuf));
- buffer_init(&bo,write,fdnumber,todobufinfo,sizeof(todobufinfo));
+ buffer_init(&bi, read, fd, todobuf, sizeof(todobuf));
+ buffer_init(&bo, write, fdnumber, todobufinfo, sizeof(todobufinfo));
uid = 0;
pid = 0;
for (;;) {
- if (getln(&bi,&todoline,&match,'\0') == -1) {
+ if (getln(&bi, &todoline, &match, '\0') == -1) {
/* perhaps we're out of memory, perhaps an I/O error */
fnmake_todo(id);
- sendlog3("warning: qmail-todo: trouble reading ",fn.s,"\n"); goto FAIL;
+ sendlog3("warning: qmail-todo: trouble reading ", fn.s, "\n");
+ goto FAIL;
}
if (!match) break;
switch (todoline.s[0]) {
- case 'u':
- scan_ulong(todoline.s + 1,&uid); break;
- case 'p':
- scan_ulong(todoline.s + 1,&pid); break;
- case 'F':
- if (buffer_putflush(&bo,todoline.s,todoline.len) == -1) {
- fnmake_info(id);
- sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for todo\n"); goto FAIL;
- }
- comm_info(id,(unsigned long) st.st_size,todoline.s + 1,pid,uid);
- break;
- case 'T':
- switch (rewrite(todoline.s + 1)) {
- case 0: nomem(); goto FAIL;
- case 2: c = 1; break;
- default: c = 0; break;
- }
- if (fdchan[c] == -1) {
- fnmake_chanaddr(id,c);
- fdchan[c] = open_excl(fn.s);
- if (fdchan[c] == -1)
- { sendlog3("warning: qmail-todo: unable to create ",fn.s," for delivery\n"); goto FAIL; }
- buffer_init(&bchan[c],write,fdchan[c],todobufchan[c],sizeof(todobufchan[c]));
- flagchan[c] = 1;
- }
- if (buffer_put(&bchan[c],rwline.s,rwline.len) == -1) {
- fnmake_chanaddr(id,c);
- sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for delivery\n"); goto FAIL;
- }
- break;
- default:
- fnmake_todo(id);
- sendlog3("warning: qmail-todo: unknown record type in ",fn.s,"\n"); goto FAIL;
+ case 'u': scan_ulong(todoline.s + 1, &uid); break;
+ case 'p': scan_ulong(todoline.s + 1, &pid); break;
+ case 'F':
+ if (buffer_putflush(&bo, todoline.s, todoline.len) == -1) {
+ fnmake_info(id);
+ sendlog3("warning: qmail-todo: trouble writing to ", fn.s, " for todo\n");
+ goto FAIL;
+ }
+ comm_info(id, (unsigned long)st.st_size, todoline.s + 1, pid, uid);
+ break;
+ case 'T':
+ switch (rewrite(todoline.s + 1)) {
+ case 0: nomem(); goto FAIL;
+ case 2: c = 1; break;
+ default: c = 0; break;
+ }
+ if (fdchan[c] == -1) {
+ fnmake_chanaddr(id, c);
+ fdchan[c] = open_excl(fn.s);
+ if (fdchan[c] == -1) {
+ sendlog3("warning: qmail-todo: unable to create ", fn.s, " for delivery\n");
+ goto FAIL;
+ }
+ buffer_init(&bchan[c], write, fdchan[c], todobufchan[c], sizeof(todobufchan[c]));
+ flagchan[c] = 1;
+ }
+ if (buffer_put(&bchan[c], rwline.s, rwline.len) == -1) {
+ fnmake_chanaddr(id, c);
+ sendlog3("warning: qmail-todo: trouble writing to ", fn.s, " for delivery\n");
+ goto FAIL;
+ }
+ break;
+ default:
+ fnmake_todo(id);
+ sendlog3("warning: qmail-todo: unknown record type in ", fn.s, "\n");
+ goto FAIL;
}
}
- close(fd); fd = -1;
+ close(fd);
+ fd = -1;
fnmake_info(id);
- if (buffer_flush(&bo) == -1)
- { sendlog3("warning: qmail-todo: trouble writing to ",fn.s," for info\n"); goto FAIL; }
- if (fsync(fdnumber) == -1)
- { sendlog3("warning: qmail-todo: trouble fsyncing ",fn.s," for info\n"); goto FAIL; }
- close(fdnumber); fdnumber = -1;
+ if (buffer_flush(&bo) == -1) {
+ sendlog3("warning: qmail-todo: trouble writing to ", fn.s, " for info\n");
+ goto FAIL;
+ }
+ if (fsync(fdnumber) == -1) {
+ sendlog3("warning: qmail-todo: trouble fsyncing ", fn.s, " for info\n");
+ goto FAIL;
+ }
+ close(fdnumber);
+ fdnumber = -1;
for (c = 0; c < CHANNELS; ++c)
if (fdchan[c] != -1) {
- fnmake_chanaddr(id,c);
- if (buffer_flush(&bchan[c]) == -1) { sendlog3("warning: qmail-todo: trouble writing to ",fn.s," in channel\n"); goto FAIL; }
- if (fsync(fdchan[c]) == -1) { sendlog3("warning: qmail-todo: trouble fsyncing ",fn.s," in channel\n"); goto FAIL; }
- close(fdchan[c]); fdchan[c] = -1;
+ fnmake_chanaddr(id, c);
+ if (buffer_flush(&bchan[c]) == -1) {
+ sendlog3("warning: qmail-todo: trouble writing to ", fn.s, " in channel\n");
+ goto FAIL;
+ }
+ if (fsync(fdchan[c]) == -1) {
+ sendlog3("warning: qmail-todo: trouble fsyncing ", fn.s, " in channel\n");
+ goto FAIL;
+ }
+ close(fdchan[c]);
+ fdchan[c] = -1;
}
fnmake_todo(id);
- if (buffer_putflush(&toqc,fn.s,fn.len) == -1) { cleandied(); return; }
- if (buffer_get(&fromqc,&ch,1) != 1) { cleandied(); return; }
+ if (buffer_putflush(&toqc, fn.s, fn.len) == -1) {
+ cleandied();
+ return;
+ }
+ if (buffer_get(&fromqc, &ch, 1) != 1) {
+ cleandied();
+ return;
+ }
if (ch != '+') {
- sendlog3("warning: qmail-clean unable to clean up ",fn.s,"\n");
+ sendlog3("warning: qmail-clean unable to clean up ", fn.s, "\n");
return;
}
- comm_write(id,flagchan[0],flagchan[1]);
+ comm_write(id, flagchan[0], flagchan[1]);
return;
-
- FAIL:
+
+FAIL:
if (fd != -1) close(fd);
if (fdnumber != -1) close(fdnumber);
for (c = 0; c < CHANNELS; ++c)
@@ -515,18 +563,26 @@ void todo_do(fd_set *rfds)
int getcontrols(void)
{
if (control_init() == -1) return 0;
- if (control_rldef(&envnoathost,"control/envnoathost",1,"envnoathost") != 1) return 0;
- if (control_readfile(&locals,"control/locals",1) != 1) return 0;
- if (!constmap_init(&maplocals,locals.s,locals.len,0)) return 0;
- switch (control_readfile(&percenthack,"control/percenthack",0)) {
+ if (control_rldef(&envnoathost, "control/envnoathost", 1, "envnoathost") != 1) return 0;
+ if (control_readfile(&locals, "control/locals", 1) != 1) return 0;
+ if (!constmap_init(&maplocals, locals.s, locals.len, 0)) return 0;
+ switch (control_readfile(&percenthack, "control/percenthack", 0)) {
case -1: return 0;
- case 0: if (!constmap_init(&mappercenthack,"",0,0)) return 0; break;
- case 1: if (!constmap_init(&mappercenthack,percenthack.s,percenthack.len,0)) return 0; break;
+ case 0:
+ if (!constmap_init(&mappercenthack, "", 0, 0)) return 0;
+ break;
+ case 1:
+ if (!constmap_init(&mappercenthack, percenthack.s, percenthack.len, 0)) return 0;
+ break;
}
- switch (control_readfile(&vdoms,"control/virtualdomains",0)) {
+ switch (control_readfile(&vdoms, "control/virtualdomains", 0)) {
case -1: return 0;
- case 0: if (!constmap_init(&mapvdoms,"",0,1)) return 0; break;
- case 1: if (!constmap_init(&mapvdoms,vdoms.s,vdoms.len,1)) return 0; break;
+ case 0:
+ if (!constmap_init(&mapvdoms, "", 0, 1)) return 0;
+ break;
+ case 1:
+ if (!constmap_init(&mapvdoms, vdoms.s, vdoms.len, 1)) return 0;
+ break;
}
return 1;
}
@@ -538,24 +594,27 @@ void regetcontrols(void)
{
int r;
- if (control_readfile(&newlocals,"control/locals",1) != 1)
- { sendlog1("alert: qmail-todo: unable to reread control/locals\n"); return; }
- r = control_readfile(&newvdoms,"control/virtualdomains",0);
- if (r == -1)
- { sendlog1("alert: qmail-todo: unable to reread control/virtualdomains\n"); return; }
+ if (control_readfile(&newlocals, "control/locals", 1) != 1) {
+ sendlog1("alert: qmail-todo: unable to reread control/locals\n");
+ return;
+ }
+ r = control_readfile(&newvdoms, "control/virtualdomains", 0);
+ if (r == -1) {
+ sendlog1("alert: qmail-todo: unable to reread control/virtualdomains\n");
+ return;
+ }
constmap_free(&maplocals);
constmap_free(&mapvdoms);
- while (!stralloc_copy(&locals,&newlocals)) nomem();
- while (!constmap_init(&maplocals,locals.s,locals.len,0)) nomem();
+ while (!stralloc_copy(&locals, &newlocals)) nomem();
+ while (!constmap_init(&maplocals, locals.s, locals.len, 0)) nomem();
if (r) {
- while (!stralloc_copy(&vdoms,&newvdoms)) nomem();
- while (!constmap_init(&mapvdoms,vdoms.s,vdoms.len,1)) nomem();
- }
- else
- while (!constmap_init(&mapvdoms,"",0,1)) nomem();
+ while (!stralloc_copy(&vdoms, &newvdoms)) nomem();
+ while (!constmap_init(&mapvdoms, vdoms.s, vdoms.len, 1)) nomem();
+ } else
+ while (!constmap_init(&mapvdoms, "", 0, 1)) nomem();
}
void reread(void)
@@ -582,28 +641,36 @@ int main()
int r;
char c;
- if (chdir(auto_qmail) == -1)
- { sendlog1("alert: qmail-todo: cannot start: unable to switch to home directory\n"); _exit(110); }
- if (!getcontrols())
- { sendlog1("alert: qmail-todo: cannot start: unable to read controls\n"); _exit(112); }
- if (chdir("queue") == -1)
- { sendlog1("alert: qmail-todo: cannot start: unable to switch to queue directory\n"); _exit(110); }
+ if (chdir(auto_qmail) == -1) {
+ sendlog1("alert: qmail-todo: cannot start: unable to switch to home directory\n");
+ _exit(110);
+ }
+ if (!getcontrols()) {
+ sendlog1("alert: qmail-todo: cannot start: unable to read controls\n");
+ _exit(112);
+ }
+ if (chdir("queue") == -1) {
+ sendlog1("alert: qmail-todo: cannot start: unable to switch to queue directory\n");
+ _exit(110);
+ }
sig_pipeignore();
umask(077);
fnmake_init();
todo_init();
comm_init();
-
+
do {
r = read(fdin, &c, 1);
- if ((r == -1) && (errno != EINTR))
- _exit(100); /* read failed probably qmail-send died */
- } while ((r =! 1)); /* we assume it is a 'S' */
-
+ if ((r == -1) && (errno != EINTR)) _exit(100); /* read failed probably qmail-send died */
+ } while ((r = !1)); /* we assume it is a 'S' */
+
for (;;) {
recent = now();
- if (flagreadasap) { flagreadasap = 0; reread(); }
+ if (flagreadasap) {
+ flagreadasap = 0;
+ reread();
+ }
if (!flagsendalive) {
/* qmail-send finaly exited, so do the same. */
if (flagquitasap) _exit(0);
@@ -616,14 +683,16 @@ int main()
FD_ZERO(&wfds);
nfds = 1;
- todo_selprep(&nfds,&rfds,&wakeup);
- comm_selprep(&nfds,&wfds,&rfds);
+ todo_selprep(&nfds, &rfds, &wakeup);
+ comm_selprep(&nfds, &wfds, &rfds);
- if (wakeup <= recent) tv.tv_sec = 0;
- else tv.tv_sec = wakeup - recent + SLEEP_FUZZ;
+ if (wakeup <= recent)
+ tv.tv_sec = 0;
+ else
+ tv.tv_sec = wakeup - recent + SLEEP_FUZZ;
tv.tv_usec = 0;
- if (select(nfds,&rfds,&wfds,(fd_set *) 0,&tv) == -1)
+ if (select(nfds, &rfds, &wfds, (fd_set *)0, &tv) == -1)
if (errno == EINTR)
;
else
@@ -638,4 +707,3 @@ int main()
/* NOTREACHED */
_exit(1);
}
-
diff --git a/src/qmail-vmailuser.c b/src/qmail-vmailuser.c
index 27dc85d..82cb243 100644
--- a/src/qmail-vmailuser.c
+++ b/src/qmail-vmailuser.c
@@ -1,24 +1,25 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include "global.h"
-#include "auto_qmail.h"
-#include "stralloc.h"
+
+#include "byte.h"
#include "case.h"
-#include "control.h"
#include "constmap.h"
#include "direntry.h"
#include "error.h"
-#include "str.h"
#include "fmt.h"
#include "open.h"
-#include "byte.h"
#include "scan.h"
#include "str.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
+#include "control.h"
+#include "global.h"
-#define FDAUTH 3
+#define FDAUTH 3
#define RESPECT_CASE "-C"
-#define BUFFER_SIZE 128
+#define BUFFER_SIZE 128
/** @file qmail-vmailuser.c
@return 0: virtual user exists
@@ -44,10 +45,10 @@ void pam_exit(int fail)
_exit(fail);
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
DIR *dir;
- char *vdomuser;
+ char *vdomuser;
char *domain = 0;
int buflen = 0;
int domlen = 0;
@@ -56,29 +57,30 @@ int main(int argc,char **argv)
char ch;
char *homedir = "/home";
- if (argv[1])
- if (!case_diffs(argv[1],RESPECT_CASE)) {
- flagrespect = 1;
+ if (argv[1])
+ if (!case_diffs(argv[1], RESPECT_CASE)) {
+ flagrespect = 1;
} else {
homedir = argv[1];
dir = opendir(homedir);
if (!dir) pam_exit(2);
}
- if (argv[2])
- if (!case_diffs(argv[2],RESPECT_CASE)) flagrespect = 1;
+ if (argv[2])
+ if (!case_diffs(argv[2], RESPECT_CASE)) flagrespect = 1;
if (chdir(auto_qmail) == -1) pam_exit(110);
-
- switch (control_readfile(&vdoms,"control/virtualdomains",0)) {
+
+ switch (control_readfile(&vdoms, "control/virtualdomains", 0)) {
case -1: pam_exit(110);
- case 0: if (!constmap_init(&mapvdoms,"",0,1)) pam_exit(111);
- case 1: if (!constmap_init(&mapvdoms,vdoms.s,vdoms.len,1)) pam_exit(111);
+ case 0:
+ if (!constmap_init(&mapvdoms, "", 0, 1)) pam_exit(111);
+ case 1:
+ if (!constmap_init(&mapvdoms, vdoms.s, vdoms.len, 1)) pam_exit(111);
}
- for (;;) { /* read input */
- do
- r = read(FDAUTH,inputbuf + buflen,sizeof(inputbuf) - buflen);
+ for (;;) { /* read input */
+ do r = read(FDAUTH, inputbuf + buflen, sizeof(inputbuf) - buflen);
while ((r == -1) && (errno == EINTR));
if (r == -1) pam_exit(111);
if (r == 0) break;
@@ -87,62 +89,62 @@ int main(int argc,char **argv)
}
close(FDAUTH);
- if ((r = byte_rchr(inputbuf,buflen,'@'))) /* @domain */
+ if ((r = byte_rchr(inputbuf, buflen, '@'))) /* @domain */
if (r < buflen && inputbuf[r] == '@') {
domain = inputbuf + r + 1;
domlen = str_len(domain);
if (!flagrespect)
- case_lowerb(inputbuf,buflen);
+ case_lowerb(inputbuf, buflen);
else
- case_lowerb(domain,domlen);
+ case_lowerb(domain, domlen);
}
- vdomuser = constmap(&mapvdoms,domain,domlen);
+ vdomuser = constmap(&mapvdoms, domain, domlen);
if (!vdomuser) pam_exit(1);
- if (!stralloc_copys(&vuser,"")) pam_exit(111); /* user */
+ if (!stralloc_copys(&vuser, "")) pam_exit(111); /* user */
for (i = 0; i < r; ++i) {
ch = inputbuf[i];
if (ch == '.') ch = ':';
- if (!stralloc_append(&vuser,&ch)) pam_exit(111);
+ if (!stralloc_append(&vuser, &ch)) pam_exit(111);
}
- if (!stralloc_0(&vuser)) pam_exit(111);
+ if (!stralloc_0(&vuser)) pam_exit(111);
- if (!stralloc_copys(&vdomdir,homedir)) pam_exit(111); /* vpopmail */
- if (!stralloc_cats(&vdomdir,"/")) pam_exit(111);
- if (!stralloc_cats(&vdomdir,"vpopmail")) pam_exit(111);
- if (!stralloc_copy(&vuserdir,&vdomdir)) pam_exit(111);
- if (!stralloc_cats(&vuserdir,"/domains/")) pam_exit(111);
- if (!stralloc_cats(&vuserdir,vdomuser)) pam_exit(111);
- if (!stralloc_copy(&vdomdir,&vuserdir)) pam_exit(111);
- if (!stralloc_0(&vdomdir)) pam_exit(111);
+ if (!stralloc_copys(&vdomdir, homedir)) pam_exit(111); /* vpopmail */
+ if (!stralloc_cats(&vdomdir, "/")) pam_exit(111);
+ if (!stralloc_cats(&vdomdir, "vpopmail")) pam_exit(111);
+ if (!stralloc_copy(&vuserdir, &vdomdir)) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, "/domains/")) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, vdomuser)) pam_exit(111);
+ if (!stralloc_copy(&vdomdir, &vuserdir)) pam_exit(111);
+ if (!stralloc_0(&vdomdir)) pam_exit(111);
dir = opendir(vdomdir.s);
if (dir) {
- if (!stralloc_cats(&vuserdir,"/")) pam_exit(111);
- if (!stralloc_cat(&vuserdir,&vuser)) pam_exit(111);
- if (!stralloc_0(&vuserdir)) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, "/")) pam_exit(111);
+ if (!stralloc_cat(&vuserdir, &vuser)) pam_exit(111);
+ if (!stralloc_0(&vuserdir)) pam_exit(111);
dir = opendir(vuserdir.s);
if (dir) pam_exit(0);
}
- if (!stralloc_copys(&vdomdir,homedir)) pam_exit(111); /* vmailmgr */
- if (!stralloc_cats(&vdomdir,"/")) pam_exit(111);
- if (!stralloc_copy(&vuserdir,&vdomdir)) pam_exit(111);
- if (!stralloc_cats(&vuserdir,vdomuser)) pam_exit(111);
- if (!stralloc_cats(&vuserdir,"/users")) pam_exit(111);
- if (!stralloc_copy(&vdomdir,&vuserdir)) pam_exit(111);
- if (!stralloc_0(&vdomdir)) pam_exit(111);
+ if (!stralloc_copys(&vdomdir, homedir)) pam_exit(111); /* vmailmgr */
+ if (!stralloc_cats(&vdomdir, "/")) pam_exit(111);
+ if (!stralloc_copy(&vuserdir, &vdomdir)) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, vdomuser)) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, "/users")) pam_exit(111);
+ if (!stralloc_copy(&vdomdir, &vuserdir)) pam_exit(111);
+ if (!stralloc_0(&vdomdir)) pam_exit(111);
dir = opendir(vdomdir.s);
if (dir) {
- if (!stralloc_cats(&vuserdir,"/")) pam_exit(111);
- if (!stralloc_cat(&vuserdir,&vuser)) pam_exit(111);
- if (!stralloc_0(&vuserdir)) pam_exit(111);
+ if (!stralloc_cats(&vuserdir, "/")) pam_exit(111);
+ if (!stralloc_cat(&vuserdir, &vuser)) pam_exit(111);
+ if (!stralloc_0(&vuserdir)) pam_exit(111);
dir = opendir(vuserdir.s);
if (dir) pam_exit(0);
}
-
+
pam_exit(1);
}
diff --git a/src/qmail.c b/src/qmail.c
index 7bdfd29..f143af1 100644
--- a/src/qmail.c
+++ b/src/qmail.c
@@ -1,21 +1,22 @@
+#include "qmail.h"
+
#include <unistd.h>
-#include "readwrite.h"
+
#include "buffer.h"
-#include "wait.h"
+#include "env.h"
#include "exit.h"
#include "fd.h"
-#include "qmail.h"
+#include "readwrite.h"
+#include "wait.h"
+
#include "auto_qmail.h"
-#include "env.h"
-static char *binqqargs[2] = { 0, 0 } ;
+static char *binqqargs[2] = {0, 0};
static void setup_qqargs()
{
- if (!binqqargs[0])
- binqqargs[0] = env_get("QMAILQUEUE");
- if (!binqqargs[0])
- binqqargs[0] = "bin/qmail-queue";
+ if (!binqqargs[0]) binqqargs[0] = env_get("QMAILQUEUE");
+ if (!binqqargs[0]) binqqargs[0] = "bin/qmail-queue";
}
int qmail_open(struct qmail *qq)
@@ -26,26 +27,34 @@ int qmail_open(struct qmail *qq)
setup_qqargs();
if (pipe(pim) == -1) return -1;
- if (pipe(pie) == -1) { close(pim[0]); close(pim[1]); return -1; }
-
+ if (pipe(pie) == -1) {
+ close(pim[0]);
+ close(pim[1]);
+ return -1;
+ }
+
switch (qq->pid = vfork()) {
case -1:
- close(pim[0]); close(pim[1]);
- close(pie[0]); close(pie[1]);
+ close(pim[0]);
+ close(pim[1]);
+ close(pie[0]);
+ close(pie[1]);
return -1;
case 0:
close(pim[1]);
close(pie[1]);
- if (fd_move(0,pim[0]) == -1) _exit(120);
- if (fd_move(1,pie[0]) == -1) _exit(120);
+ if (fd_move(0, pim[0]) == -1) _exit(120);
+ if (fd_move(1, pie[0]) == -1) _exit(120);
if (chdir(auto_qmail) == -1) _exit(61);
- execv(*binqqargs,binqqargs);
+ execv(*binqqargs, binqqargs);
_exit(120);
}
- qq->fdm = pim[1]; close(pim[0]);
- qq->fde = pie[1]; close(pie[0]);
- buffer_init(&qq->ss,write,qq->fdm,qq->buf,sizeof(qq->buf));
+ qq->fdm = pim[1];
+ close(pim[0]);
+ qq->fde = pie[1];
+ close(pie[0]);
+ buffer_init(&qq->ss, write, qq->fdm, qq->buf, sizeof(qq->buf));
qq->flagerr = 0;
return 0;
}
@@ -60,31 +69,33 @@ void qmail_fail(struct qmail *qq)
qq->flagerr = 1;
}
-void qmail_put(struct qmail *qq,char *s,int len)
+void qmail_put(struct qmail *qq, char *s, int len)
{
- if (!qq->flagerr) if (buffer_put(&qq->ss,s,len) == -1) qq->flagerr = 1;
+ if (!qq->flagerr)
+ if (buffer_put(&qq->ss, s, len) == -1) qq->flagerr = 1;
}
-void qmail_puts(struct qmail *qq,char *s)
+void qmail_puts(struct qmail *qq, char *s)
{
- if (!qq->flagerr) if (buffer_puts(&qq->ss,s) == -1) qq->flagerr = 1;
+ if (!qq->flagerr)
+ if (buffer_puts(&qq->ss, s) == -1) qq->flagerr = 1;
}
-void qmail_from(struct qmail *qq,char *s)
+void qmail_from(struct qmail *qq, char *s)
{
if (buffer_flush(&qq->ss) == -1) qq->flagerr = 1;
close(qq->fdm);
- buffer_init(&qq->ss,write,qq->fde,qq->buf,sizeof(qq->buf));
- qmail_put(qq,"F",1);
- qmail_puts(qq,s);
- qmail_put(qq,"",1);
+ buffer_init(&qq->ss, write, qq->fde, qq->buf, sizeof(qq->buf));
+ qmail_put(qq, "F", 1);
+ qmail_puts(qq, s);
+ qmail_put(qq, "", 1);
}
-void qmail_to(struct qmail *qq,char *s)
+void qmail_to(struct qmail *qq, char *s)
{
- qmail_put(qq,"T",1);
- qmail_puts(qq,s);
- qmail_put(qq,"",1);
+ qmail_put(qq, "T", 1);
+ qmail_puts(qq, s);
+ qmail_put(qq, "", 1);
}
char *qmail_close(struct qmail *qq)
@@ -92,48 +103,46 @@ char *qmail_close(struct qmail *qq)
int wstat;
int exitcode;
- qmail_put(qq,"",1);
- if (!qq->flagerr)
+ qmail_put(qq, "", 1);
+ if (!qq->flagerr)
if (buffer_flush(&qq->ss) == -1) qq->flagerr = 1;
close(qq->fde);
- if (wait_pid(&wstat,qq->pid) != qq->pid)
- return "Zqq waitpid surprise (#4.3.0)";
- if (wait_crashed(wstat))
- return "Zqq crashed (#4.3.0)";
+ if (wait_pid(&wstat, qq->pid) != qq->pid) return "Zqq waitpid surprise (#4.3.0)";
+ if (wait_crashed(wstat)) return "Zqq crashed (#4.3.0)";
exitcode = wait_exitcode(wstat);
switch (exitcode) {
- case 0: if (!qq->flagerr) return ""; /* fall through */
- case 11: return "Denvelope address too long for qq (#5.1.3)";
- case 31: return "Dmail server permanently rejected message (#5.3.0)";
- case 32: return "Vmail server does not accept message (#5.3.0)";
- case 33: return "Smail server does not accept message (#5.3.0)";
- case 34: return "Amail server does not accept message (#5.3.0)";
- case 35: return "Imail server fails to verify DKIM signed message (#5.3.0)";
- case 51: return "Zqq out of memory (#4.3.0)";
- case 52: return "Zqq timeout (#4.3.0)";
- case 53: return "Zqq write error or disk full (#4.3.0)";
- case 54: return "Zqq read error (#4.3.0)";
- case 55: return "Zqq unable to read configuration (#4.3.0)";
- case 56: return "Zqq trouble making network connection (#4.3.0)";
- case 61: return "Zqq trouble in home directory (#4.3.0)";
- case 62: return "Zqq trouble creating files in queue (#4.3.0)";
- case 63: /* qmail-queue: fstat/unlinking problem */
- case 64: /* qmail-queue: linking pidfn -> messfn */
- case 65: /* qmail-queue: exclusive open failed */
- case 66: /* qmail-queue: linking intdfn -> todofn */
- case 71: return "Zmail server temporarily rejected message (#4.3.0)";
- case 72: return "Zconnection to mail server timed out (#4.4.1)";
- case 73: return "Zconnection to mail server rejected (#4.4.1)";
- case 74: return "Zcommunication with mail server failed (#4.4.2)";
- case 91: /* fall through */
- case 81: return "Zqq internal bug (#4.3.0)";
+ case 0:
+ if (!qq->flagerr) return ""; /* fall through */
+ case 11: return "Denvelope address too long for qq (#5.1.3)";
+ case 31: return "Dmail server permanently rejected message (#5.3.0)";
+ case 32: return "Vmail server does not accept message (#5.3.0)";
+ case 33: return "Smail server does not accept message (#5.3.0)";
+ case 34: return "Amail server does not accept message (#5.3.0)";
+ case 35: return "Imail server fails to verify DKIM signed message (#5.3.0)";
+ case 51: return "Zqq out of memory (#4.3.0)";
+ case 52: return "Zqq timeout (#4.3.0)";
+ case 53: return "Zqq write error or disk full (#4.3.0)";
+ case 54: return "Zqq read error (#4.3.0)";
+ case 55: return "Zqq unable to read configuration (#4.3.0)";
+ case 56: return "Zqq trouble making network connection (#4.3.0)";
+ case 61: return "Zqq trouble in home directory (#4.3.0)";
+ case 62: return "Zqq trouble creating files in queue (#4.3.0)";
+ case 63: /* qmail-queue: fstat/unlinking problem */
+ case 64: /* qmail-queue: linking pidfn -> messfn */
+ case 65: /* qmail-queue: exclusive open failed */
+ case 66: /* qmail-queue: linking intdfn -> todofn */
+ case 71: return "Zmail server temporarily rejected message (#4.3.0)";
+ case 72: return "Zconnection to mail server timed out (#4.4.1)";
+ case 73: return "Zconnection to mail server rejected (#4.4.1)";
+ case 74: return "Zcommunication with mail server failed (#4.4.2)";
+ case 91: /* fall through */
+ case 81: return "Zqq internal bug (#4.3.0)";
case 115: /* compatibility */
case 120: return "Zunable to exec qq (#4.3.0)";
default:
- if ((exitcode >= 11) && (exitcode <= 40))
- return "Dqq permanent problem (#5.3.0)";
+ if ((exitcode >= 11) && (exitcode <= 40)) return "Dqq permanent problem (#5.3.0)";
return "Zqq temporary problem (#4.3.0)";
}
}
diff --git a/src/qreceipt.c b/src/qreceipt.c
index 8dacf40..6b629ba 100644
--- a/src/qreceipt.c
+++ b/src/qreceipt.c
@@ -1,43 +1,76 @@
#include <unistd.h>
-#include "sig.h"
+
+#include "alloc.h"
+#include "buffer.h"
#include "env.h"
#include "error.h"
-#include "buffer.h"
-#include "stralloc.h"
+#include "exit.h"
#include "getln.h"
-#include "alloc.h"
+#include "open.h"
+#include "sig.h"
#include "str.h"
-#include "hfield.h"
-#include "token822.h"
+#include "stralloc.h"
+
#include "headerbody.h"
-#include "exit.h"
-#include "open.h"
-#include "quote.h"
+#include "hfield.h"
#include "qmail.h"
+#include "quote.h"
+#include "token822.h"
#define WHO "qreceipt"
-void die_noreceipt() { _exit(0); }
-void die() { _exit(100); }
-void die_temp() { _exit(111); }
-void die_nomem() {
- buffer_putsflush(buffer_2,"qreceipt: fatal: out of memory\n"); die_temp(); }
-void die_fork() {
- buffer_putsflush(buffer_2,"qreceipt: fatal: unable to fork\n"); die_temp(); }
-void die_qqperm() {
- buffer_putsflush(buffer_2,"qreceipt: fatal: permanent qmail-queue error\n"); die(); }
-void die_qqtemp() {
- buffer_putsflush(buffer_2,"qreceipt: fatal: temporary qmail-queue error\n"); die_temp(); }
-void die_usage() {
- buffer_putsflush(buffer_2,
- "qreceipt: usage: qreceipt deliveryaddress\n"); die(); }
-void die_read() {
- if (errno == ENOMEM) die_nomem();
- buffer_putsflush(buffer_2,"qreceipt: fatal: read error\n"); die_temp(); }
-void doordie(sa,r) stralloc *sa; int r; {
- if (r == 1) return; if (r == -1) die_nomem();
- buffer_putsflush(buffer_2,"qreceipt: fatal: unable to parse this: ");
- buffer_putflush(buffer_2,sa->s,sa->len); die(); }
+void die_noreceipt()
+{
+ _exit(0);
+}
+void die()
+{
+ _exit(100);
+}
+void die_temp()
+{
+ _exit(111);
+}
+void die_nomem()
+{
+ buffer_putsflush(buffer_2, "qreceipt: fatal: out of memory\n");
+ die_temp();
+}
+void die_fork()
+{
+ buffer_putsflush(buffer_2, "qreceipt: fatal: unable to fork\n");
+ die_temp();
+}
+void die_qqperm()
+{
+ buffer_putsflush(buffer_2, "qreceipt: fatal: permanent qmail-queue error\n");
+ die();
+}
+void die_qqtemp()
+{
+ buffer_putsflush(buffer_2, "qreceipt: fatal: temporary qmail-queue error\n");
+ die_temp();
+}
+void die_usage()
+{
+ buffer_putsflush(buffer_2, "qreceipt: usage: qreceipt deliveryaddress\n");
+ die();
+}
+void die_read()
+{
+ if (errno == ENOMEM) die_nomem();
+ buffer_putsflush(buffer_2, "qreceipt: fatal: read error\n");
+ die_temp();
+}
+void doordie(sa, r) stralloc *sa;
+int r;
+{
+ if (r == 1) return;
+ if (r == -1) die_nomem();
+ buffer_putsflush(buffer_2, "qreceipt: fatal: unable to parse this: ");
+ buffer_putflush(buffer_2, sa->s, sa->len);
+ die();
+}
char *target;
@@ -50,12 +83,11 @@ stralloc sanotice = {0};
int rwnotice(token822_alloc *addr)
{
token822_reverse(addr);
- if (token822_unquote(&sanotice,addr) != 1) die_nomem();
+ if (token822_unquote(&sanotice, addr) != 1) die_nomem();
if (sanotice.len == str_len(target))
- if (!str_diffn(sanotice.s,target,sanotice.len))
- flagreceipt = 1;
- token822_reverse(addr);
- return 1;
+ if (!str_diffn(sanotice.s, target, sanotice.len)) flagreceipt = 1;
+ token822_reverse(addr);
+ return 1;
}
struct qmail qqt;
@@ -67,37 +99,41 @@ void finishheader()
char *qqx;
if (!flagreceipt) die_noreceipt();
- if (str_equal(returnpath,"")) die_noreceipt();
- if (str_equal(returnpath,"#@[]")) die_noreceipt();
+ if (str_equal(returnpath, "")) die_noreceipt();
+ if (str_equal(returnpath, "#@[]")) die_noreceipt();
- if (!quote2(&quoted,returnpath)) die_nomem();
+ if (!quote2(&quoted, returnpath)) die_nomem();
if (qmail_open(&qqt) == -1) die_fork();
- qmail_puts(&qqt,"From: DELIVERY NOTICE SYSTEM <");
- qmail_put(&qqt,quoted.s,quoted.len);
- qmail_puts(&qqt,">\n");
- qmail_puts(&qqt,"To: <");
- qmail_put(&qqt,quoted.s,quoted.len);
- qmail_puts(&qqt,">\n");
- qmail_puts(&qqt,"Subject: success notice\n\
+ qmail_puts(&qqt, "From: DELIVERY NOTICE SYSTEM <");
+ qmail_put(&qqt, quoted.s, quoted.len);
+ qmail_puts(&qqt, ">\n");
+ qmail_puts(&qqt, "To: <");
+ qmail_put(&qqt, quoted.s, quoted.len);
+ qmail_puts(&qqt, ">\n");
+ qmail_puts(
+ &qqt,
+ "Subject: success notice\n\
\n\
Hi! This is the qreceipt program. Your message was delivered to the\n\
following address: ");
- qmail_puts(&qqt,target);
- qmail_puts(&qqt,". Thanks for asking.\n");
+ qmail_puts(&qqt, target);
+ qmail_puts(&qqt, ". Thanks for asking.\n");
if (messageid.s) {
- qmail_puts(&qqt,"Your ");
- qmail_put(&qqt,messageid.s,messageid.len);
+ qmail_puts(&qqt, "Your ");
+ qmail_put(&qqt, messageid.s, messageid.len);
}
- qmail_from(&qqt,"");
- qmail_to(&qqt,returnpath);
+ qmail_from(&qqt, "");
+ qmail_to(&qqt, returnpath);
qqx = qmail_close(&qqt);
if (*qqx)
- if (*qqx == 'D') die_qqperm();
- else die_qqtemp();
+ if (*qqx == 'D')
+ die_qqperm();
+ else
+ die_qqtemp();
}
stralloc hfbuf = {0};
@@ -107,24 +143,27 @@ token822_alloc hfaddr = {0};
void doheaderfield(stralloc *h)
{
- switch (hfield_known(h->s,h->len)) {
+ switch (hfield_known(h->s, h->len)) {
case H_MESSAGEID:
- if (!stralloc_copy(&messageid,h)) die_nomem();
+ if (!stralloc_copy(&messageid, h)) die_nomem();
break;
case H_NOTICEREQUESTEDUPONDELIVERYTO:
- doordie(h,token822_parse(&hfin,h,&hfbuf));
- doordie(h,token822_addrlist(&hfrewrite,&hfaddr,&hfin,rwnotice));
+ doordie(h, token822_parse(&hfin, h, &hfbuf));
+ doordie(h, token822_addrlist(&hfrewrite, &hfaddr, &hfin, rwnotice));
break;
}
}
-void dobody(stralloc *h) { ; }
+void dobody(stralloc *h)
+{
+ ;
+}
int main(int argc, char **argv)
{
sig_pipeignore();
if (!(target = argv[1])) die_usage();
if (!(returnpath = env_get("SENDER"))) die_usage();
- if (headerbody(buffer_0,doheaderfield,finishheader,dobody) == -1) die_read();
+ if (headerbody(buffer_0, doheaderfield, finishheader, dobody) == -1) die_read();
die_noreceipt();
}
diff --git a/src/qsutil.c b/src/qsutil.c
index 9c438ea..1d3c9c3 100644
--- a/src/qsutil.c
+++ b/src/qsutil.c
@@ -1,64 +1,66 @@
+#include "qsutil.h"
+
#include <unistd.h>
-#include "stralloc.h"
+
#include "buffer.h"
-#include "qsutil.h"
+#include "stralloc.h"
static stralloc foo = {0};
static char errbuf[1];
-static struct buffer be = BUFFER_INIT(write,0,errbuf,1);
+static struct buffer be = BUFFER_INIT(write, 0, errbuf, 1);
-void logsa(stralloc *sa)
+void logsa(stralloc *sa)
{
- buffer_putflush(&be,sa->s,sa->len);
+ buffer_putflush(&be, sa->s, sa->len);
}
-void log1s(char *s1)
+void log1s(char *s1)
{
- buffer_putsflush(&be,s1);
+ buffer_putsflush(&be, s1);
}
-void log2s(char *s1,char *s2)
+void log2s(char *s1, char *s2)
{
- buffer_putsflush(&be,s1);
- buffer_putsflush(&be,s2);
+ buffer_putsflush(&be, s1);
+ buffer_putsflush(&be, s2);
}
-void log3s(char *s1,char *s2,char *s3)
+void log3s(char *s1, char *s2, char *s3)
{
- buffer_putsflush(&be,s1);
- buffer_putsflush(&be,s2);
- buffer_putsflush(&be,s3);
+ buffer_putsflush(&be, s1);
+ buffer_putsflush(&be, s2);
+ buffer_putsflush(&be, s3);
}
-void log4s(char *s1,char *s2,char *s3,char *s4)
+void log4s(char *s1, char *s2, char *s3, char *s4)
{
- buffer_putsflush(&be,s1);
- buffer_putsflush(&be,s2);
- buffer_putsflush(&be,s3);
- buffer_putsflush(&be,s4);
+ buffer_putsflush(&be, s1);
+ buffer_putsflush(&be, s2);
+ buffer_putsflush(&be, s3);
+ buffer_putsflush(&be, s4);
}
-void log5s(char *s1,char *s2,char *s3,char *s4,char *s5)
+void log5s(char *s1, char *s2, char *s3, char *s4, char *s5)
{
- buffer_putsflush(&be,s1);
- buffer_putsflush(&be,s2);
- buffer_putsflush(&be,s3);
- buffer_putsflush(&be,s4);
- buffer_putsflush(&be,s5);
+ buffer_putsflush(&be, s1);
+ buffer_putsflush(&be, s2);
+ buffer_putsflush(&be, s3);
+ buffer_putsflush(&be, s4);
+ buffer_putsflush(&be, s5);
}
-void nomem()
-{
- log1s("alert: out of memory, sleeping...\n");
- sleep(10);
+void nomem()
+{
+ log1s("alert: out of memory, sleeping...\n");
+ sleep(10);
}
void pausedir(char *dir)
-{
- log3s("alert: unable to opendir ",dir,", sleeping...\n");
- sleep(10);
+{
+ log3s("alert: unable to opendir ", dir, ", sleeping...\n");
+ sleep(10);
}
int issafe(char ch)
@@ -73,13 +75,12 @@ void logsafe(char *s)
{
int i;
- while (!stralloc_copys(&foo,s)) nomem();
+ while (!stralloc_copys(&foo, s)) nomem();
for (i = 0; i < foo.len; ++i)
if (foo.s[i] == '\n')
foo.s[i] = '/';
- else
- if (!issafe(foo.s[i]))
- foo.s[i] = '_';
+ else if (!issafe(foo.s[i]))
+ foo.s[i] = '_';
logsa(&foo);
}
diff --git a/src/quote.c b/src/quote.c
index ef1bf45..0a3efc3 100644
--- a/src/quote.c
+++ b/src/quote.c
@@ -1,7 +1,8 @@
-#include "stralloc.h"
-#include "str.h"
#include "quote.h"
+#include "str.h"
+#include "stralloc.h"
+
/*
quote() encodes a box as per rfc 821 and rfc 822,
while trying to do as little quoting as possible.
@@ -10,26 +11,24 @@ no special encoding here for bytes above 127.
*/
static char ok[128] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-,0,7,0,7,7,7,7,7,0,0,7,7,0,7,7,7 ,7,7,7,7,7,7,7,7,7,7,0,0,0,7,0,7
-,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ,7,7,7,7,7,7,7,7,7,7,7,0,0,0,7,7
-,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0
-} ;
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 7, 7, 7, 7, 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 0, 7,
+ 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0};
-static int doit(stralloc *saout,stralloc *sain)
+static int doit(stralloc *saout, stralloc *sain)
{
char ch;
int i;
int j;
- if (!stralloc_ready(saout,sain->len * 2 + 2)) return 0;
+ if (!stralloc_ready(saout, sain->len * 2 + 2)) return 0;
j = 0;
saout->s[j++] = '"';
for (i = 0; i < sain->len; ++i) {
ch = sain->s[i];
- if ((ch == '\r') || (ch == '\n') || (ch == '"') || (ch == '\\'))
- saout->s[j++] = '\\';
+ if ((ch == '\r') || (ch == '\n') || (ch == '"') || (ch == '\\')) saout->s[j++] = '\\';
saout->s[j++] = ch;
}
saout->s[j++] = '"';
@@ -38,7 +37,7 @@ static int doit(stralloc *saout,stralloc *sain)
return 1;
}
-int quote_need(char *s,unsigned int n)
+int quote_need(char *s, unsigned int n)
{
unsigned char uch;
int i;
@@ -52,30 +51,30 @@ int quote_need(char *s,unsigned int n)
if (s[0] == '.') return 1;
if (s[n - 1] == '.') return 1;
- for (i = 0; i < n - 1; ++i)
- if (s[i] == '.')
+ for (i = 0; i < n - 1; ++i)
+ if (s[i] == '.')
if (s[i + 1] == '.') return 1;
return 0;
}
-int quote(stralloc *saout,stralloc *sain)
+int quote(stralloc *saout, stralloc *sain)
{
- if (quote_need(sain->s,sain->len)) return doit(saout,sain);
- return stralloc_copy(saout,sain);
+ if (quote_need(sain->s, sain->len)) return doit(saout, sain);
+ return stralloc_copy(saout, sain);
}
static stralloc foo = {0};
-int quote2(stralloc *sa,char *s)
+int quote2(stralloc *sa, char *s)
{
int j;
- if (!*s) return stralloc_copys(sa,s);
- j = str_rchr(s,'@');
- if (!stralloc_copys(&foo,s)) return 0;
- if (!s[j]) return quote(sa,&foo);
+ if (!*s) return stralloc_copys(sa, s);
+ j = str_rchr(s, '@');
+ if (!stralloc_copys(&foo, s)) return 0;
+ if (!s[j]) return quote(sa, &foo);
foo.len = j;
- if (!quote(sa,&foo)) return 0;
+ if (!quote(sa, &foo)) return 0;
- return stralloc_cats(sa,s + j);
+ return stralloc_cats(sa, s + j);
}
diff --git a/src/rcpthosts.c b/src/rcpthosts.c
index 2242249..f69f4f9 100644
--- a/src/rcpthosts.c
+++ b/src/rcpthosts.c
@@ -1,15 +1,17 @@
-#include "cdbread.h"
+#include "rcpthosts.h"
+
#include "byte.h"
-#include "open.h"
-#include "error.h"
-#include "exit.h"
-#include "control.h"
-#include "constmap.h"
-#include "stralloc.h"
#include "case.h"
+#include "cdbread.h"
#include "close.h"
+#include "constmap.h"
+#include "error.h"
+#include "exit.h"
#include "fd.h"
-#include "rcpthosts.h"
+#include "open.h"
+#include "stralloc.h"
+
+#include "control.h"
static int flagrh = 0;
static int flagmrh = 0;
@@ -21,11 +23,12 @@ static struct cdb cdb;
int rcpthosts_init()
{
- flagrh = control_readfile(&rh,"control/rcpthosts",0);
+ flagrh = control_readfile(&rh, "control/rcpthosts", 0);
if (flagrh != 1) return flagrh;
- if (!constmap_init(&maprh,rh.s,rh.len,0)) return flagrh = -1;
+ if (!constmap_init(&maprh, rh.s, rh.len, 0)) return flagrh = -1;
fdmrh = open_read("control/morercpthosts.cdb");
- if (fdmrh == -1) if (errno != ENOENT) return flagmrh = -1;
+ if (fdmrh == -1)
+ if (errno != ENOENT) return flagmrh = -1;
if (fdmrh > 0) flagmrh = 1;
return 0;
}
@@ -39,28 +42,35 @@ int rcpthosts(char *buf, int len)
if (flagrh != 1) return 1;
- j = byte_rchr(buf,len,'@');
+ j = byte_rchr(buf, len, '@');
if (j >= len) return 1; /* presumably envnoathost is acceptable */
- ++j; buf += j; len -= j;
+ ++j;
+ buf += j;
+ len -= j;
- if (!stralloc_copyb(&host,buf,len)) return -1;
+ if (!stralloc_copyb(&host, buf, len)) return -1;
buf = host.s;
- case_lowerb(buf,len);
+ case_lowerb(buf, len);
for (j = 0; j < len; ++j)
if (!j || (buf[j] == '.'))
- if (constmap(&maprh,buf + j,len - j)) return 1;
+ if (constmap(&maprh, buf + j, len - j)) return 1;
if (flagmrh == 1) {
fdmrh = open_read("control/morercpthosts.cdb");
- if (fdmrh == -1) if (errno == ENOENT) return 0;
- cdb_init(&cdb,fdmrh);
+ if (fdmrh == -1)
+ if (errno == ENOENT) return 0;
+ cdb_init(&cdb, fdmrh);
- for (j = 0; j < len ;++j)
+ for (j = 0; j < len; ++j)
if (!j || (buf[j] == '.')) {
- r = cdb_find(&cdb,buf + j,len - j);
- if (r) { cdb_free(&cdb); close(fdmrh); return r; }
+ r = cdb_find(&cdb, buf + j, len - j);
+ if (r) {
+ cdb_free(&cdb);
+ close(fdmrh);
+ return r;
+ }
}
cdb_free(&cdb);
close(fdmrh);
diff --git a/src/readsubdir.c b/src/readsubdir.c
index 754aa36..72b83e6 100644
--- a/src/readsubdir.c
+++ b/src/readsubdir.c
@@ -1,7 +1,9 @@
#include "readsubdir.h"
+
#include "fmt.h"
#include "scan.h"
#include "str.h"
+
#include "auto_split.h"
void readsubdir_init(readsubdir *rs, char *name, void (*pause)())
@@ -21,11 +23,14 @@ int readsubdir_next(readsubdir *rs, unsigned long *id)
if (!rs->dir) {
if (rs->pos >= auto_split) return 0;
- if (str_len(rs->name) > READSUBDIR_NAMELEN) { rs->pos++; return -1; }
+ if (str_len(rs->name) > READSUBDIR_NAMELEN) {
+ rs->pos++;
+ return -1;
+ }
len = 0;
- len += fmt_str(namepos + len,rs->name);
+ len += fmt_str(namepos + len, rs->name);
namepos[len++] = '/';
- len += fmt_ulong(namepos + len,(unsigned long) rs->pos);
+ len += fmt_ulong(namepos + len, (unsigned long)rs->pos);
namepos[len] = 0;
while (!(rs->dir = opendir(namepos))) rs->pause(namepos);
rs->pos++;
@@ -33,11 +38,15 @@ int readsubdir_next(readsubdir *rs, unsigned long *id)
}
d = readdir(rs->dir);
- if (!d) { closedir(rs->dir); rs->dir = 0; return -1; }
+ if (!d) {
+ closedir(rs->dir);
+ rs->dir = 0;
+ return -1;
+ }
- if (str_equal(d->d_name,".")) return -1;
- if (str_equal(d->d_name,"..")) return -1;
- len = scan_ulong(d->d_name,id);
+ if (str_equal(d->d_name, ".")) return -1;
+ if (str_equal(d->d_name, "..")) return -1;
+ len = scan_ulong(d->d_name, id);
if (!len || d->d_name[len]) return -2;
return 1;
diff --git a/src/received.c b/src/received.c
index 51339a9..b564fd4 100644
--- a/src/received.c
+++ b/src/received.c
@@ -1,17 +1,18 @@
-#include "fmt.h"
-#include "qmail.h"
-#include "now.h"
-#include "datetime.h"
-#include "date822fmt.h"
#include "received.h"
-#include "str.h"
-#include "stralloc.h"
+
#include "byte.h"
+#include "fmt.h"
#include "str.h"
+#include "stralloc.h"
+
+#include "date822fmt.h"
+#include "datetime.h"
+#include "now.h"
+#include "qmail.h"
static int issafe(char ch)
{
- if (ch == ' ') return 1; /* accept empty spaces */
+ if (ch == ' ') return 1; /* accept empty spaces */
if (ch == '.') return 1;
if (ch == '@') return 1;
if (ch == '%') return 1;
@@ -26,12 +27,12 @@ static int issafe(char ch)
return 0;
}
-void safeput(struct qmail *qqt,char *s)
+void safeput(struct qmail *qqt, char *s)
{
char ch;
while ((ch = *s++)) {
if (!issafe(ch)) ch = '?';
- qmail_put(qqt,&ch,1);
+ qmail_put(qqt, &ch, 1);
}
}
@@ -42,44 +43,53 @@ static char buf[DATE822FMT];
/* " by silverton.berkeley.edu with [UTF8][E]SMTP[SA]; 26 Sep 1995 04:46:54 -0000" */
/* "X-RBL-Info: http://www.spamhaus.org/query/bl?ip=127.0.0.2 */
-void received(struct qmail *qqt,char *protocol,char *local,char *remoteip,char *remotehost,char *remoteinfo,char *helo,char *tlsinfo,char *rblinfo)
+void received(
+ struct qmail *qqt,
+ char *protocol,
+ char *local,
+ char *remoteip,
+ char *remotehost,
+ char *remoteinfo,
+ char *helo,
+ char *tlsinfo,
+ char *rblinfo)
{
struct datetime dt;
int i;
- qmail_puts(qqt,"Received: from ");
- safeput(qqt,remotehost);
+ qmail_puts(qqt, "Received: from ");
+ safeput(qqt, remotehost);
if (helo) {
- qmail_puts(qqt," (HELO ");
- safeput(qqt,helo);
- qmail_puts(qqt,")");
+ qmail_puts(qqt, " (HELO ");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ")");
}
- qmail_puts(qqt," (");
+ qmail_puts(qqt, " (");
if (remoteinfo) {
- safeput(qqt,remoteinfo);
- qmail_puts(qqt,"@");
+ safeput(qqt, remoteinfo);
+ qmail_puts(qqt, "@");
}
- safeput(qqt,remoteip);
- qmail_puts(qqt,")");
+ safeput(qqt, remoteip);
+ qmail_puts(qqt, ")");
if (tlsinfo) {
- qmail_puts(qqt,"\n de/crypted with ");
- qmail_puts(qqt,tlsinfo);
+ qmail_puts(qqt, "\n de/crypted with ");
+ qmail_puts(qqt, tlsinfo);
}
- qmail_puts(qqt,"\n by ");
- safeput(qqt,local);
- qmail_puts(qqt," with ");
- qmail_puts(qqt,protocol);
- qmail_puts(qqt,"; ");
- datetime_tai(&dt,now());
- qmail_put(qqt,buf,date822fmt(buf,&dt));
+ qmail_puts(qqt, "\n by ");
+ safeput(qqt, local);
+ qmail_puts(qqt, " with ");
+ qmail_puts(qqt, protocol);
+ qmail_puts(qqt, "; ");
+ datetime_tai(&dt, now());
+ qmail_put(qqt, buf, date822fmt(buf, &dt));
if (rblinfo) {
- i = str_chr(rblinfo,']');
- if (rblinfo[i] == ']') {
- qmail_puts(qqt,"X-RBL-Info: ");
- safeput(qqt,rblinfo + i + 2);
- qmail_puts(qqt,"\n");
+ i = str_chr(rblinfo, ']');
+ if (rblinfo[i] == ']') {
+ qmail_puts(qqt, "X-RBL-Info: ");
+ safeput(qqt, rblinfo + i + 2);
+ qmail_puts(qqt, "\n");
}
}
}
@@ -88,7 +98,8 @@ void received(struct qmail *qqt,char *protocol,char *local,char *remoteip,char *
/* " designates Clientip as permitted sender) receiver=Hostname " */
/* " client-ip=Clientip; envelope-from=Mailfrom; " */
-void spfheader(struct qmail *qqt,char *spfinfo,char *local,char *remoteip,char *helohost,char *mailfrom)
+void spfheader(
+ struct qmail *qqt, char *spfinfo, char *local, char *remoteip, char *helohost, char *mailfrom)
{
char *result = 0;
char *identity = 0;
@@ -105,21 +116,23 @@ void spfheader(struct qmail *qqt,char *spfinfo,char *local,char *remoteip,char *
if (!len) return;
for (i = 0; i < len; i++)
- if (spfinfo[i] == ' ') spfinfo[i] = '\0';
-
+ if (spfinfo[i] == ' ') spfinfo[i] = '\0';
+
for (i = 0; i < len; i++) {
if (spfinfo[i] == '\0') {
- switch (spfinfo[i + 1]) {
+ switch (spfinfo[i + 1]) {
case 'S': clientip = spfinfo + i + 3; break;
case 'O': envelopefrom = spfinfo + i + 3; break;
case 'C': identity = spfinfo + i + 3; break;
case 'H': helo = spfinfo + i + 3; break;
case 'T': receiver = spfinfo + i + 3; break;
case 'P': problem = spfinfo + i + 3; break;
- case 'M': if ((j = str_chr(spfinfo + i,'='))) spfinfo[i + j] = '\0';
- mechanism = spfinfo + i + 1; break;
+ case 'M':
+ if ((j = str_chr(spfinfo + i, '='))) spfinfo[i + j] = '\0';
+ mechanism = spfinfo + i + 1;
+ break;
case 'R': result = spfinfo + i + 3; break;
- default: break;
+ default: break;
}
}
}
@@ -132,41 +145,102 @@ void spfheader(struct qmail *qqt,char *spfinfo,char *local,char *remoteip,char *
if (!problem || *problem == 0) problem = "unknown";
if (!mechanism || *mechanism == 0) mechanism = "unknown";
if (!identity || *identity == 0) {
- j = str_rchr(envelopefrom,'@');
- if (envelopefrom[j] == '@') identity = envelopefrom + j + 1;
- else identity = "unknown";
+ j = str_rchr(envelopefrom, '@');
+ if (envelopefrom[j] == '@')
+ identity = envelopefrom + j + 1;
+ else
+ identity = "unknown";
}
- qmail_puts(qqt,"Received-SPF: ");
+ qmail_puts(qqt, "Received-SPF: ");
switch (*result) {
- case '+': qmail_puts(qqt," pass ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt,"\n");
- qmail_puts(qqt," designates "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n");
- qmail_puts(qqt," receiver="); safeput(qqt,receiver);
- qmail_puts(qqt,"; client-ip="); safeput(qqt,clientip); qmail_puts(qqt,"\n");
- qmail_puts(qqt," envelope-from="); safeput(qqt,envelopefrom); qmail_puts(qqt,";\n"); break;
- case '-': qmail_puts(qqt," fail ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt,"\n");
- qmail_puts(qqt," does not designate "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n"); break;
- case '~': qmail_puts(qqt," softfail ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of transitioning "); safeput(qqt,identity); qmail_puts(qqt,"\n");
- qmail_puts(qqt," does not designate "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n"); break;
- case '?': qmail_puts(qqt," neutral ("); safeput(qqt,helo); qmail_puts(qqt,"; client-ip="); safeput(qqt,clientip);
- qmail_puts(qqt," is neither permitted \n"); qmail_puts(qqt," nor denied by domain of "); safeput(qqt,identity),
- qmail_puts(qqt,")\n"); break;
- case 'o': qmail_puts(qqt," none ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," does\n");
- qmail_puts(qqt," not designate permitted sender hosts)\n"); break;
- case 't': qmail_puts(qqt," temperror ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," evaluated\n");
- qmail_puts(qqt," with error: "); safeput(qqt,problem); qmail_puts(qqt," for mechanism: "); safeput(qqt,mechanism);
- qmail_puts(qqt,")\n"); break;
- case 'e': qmail_puts(qqt," permerror ("); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," evaluated\n");
- qmail_puts(qqt," with error: "); safeput(qqt,problem); qmail_puts(qqt," for mechanism: "); safeput(qqt,mechanism);
- qmail_puts(qqt,")\n"); break;
- default: qmail_puts(qqt," unknown (results for "); safeput(qqt,helo);
- qmail_puts(qqt,": domain of "); safeput(qqt,identity);
- qmail_puts(qqt," follow an unknown mechanism: "); safeput(qqt,mechanism); qmail_puts(qqt,")\n"); break;
+ case '+':
+ qmail_puts(qqt, " pass (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, "\n");
+ qmail_puts(qqt, " designates ");
+ safeput(qqt, clientip);
+ qmail_puts(qqt, " as permitted sender)\n");
+ qmail_puts(qqt, " receiver=");
+ safeput(qqt, receiver);
+ qmail_puts(qqt, "; client-ip=");
+ safeput(qqt, clientip);
+ qmail_puts(qqt, "\n");
+ qmail_puts(qqt, " envelope-from=");
+ safeput(qqt, envelopefrom);
+ qmail_puts(qqt, ";\n");
+ break;
+ case '-':
+ qmail_puts(qqt, " fail (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, "\n");
+ qmail_puts(qqt, " does not designate ");
+ safeput(qqt, clientip);
+ qmail_puts(qqt, " as permitted sender)\n");
+ break;
+ case '~':
+ qmail_puts(qqt, " softfail (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of transitioning ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, "\n");
+ qmail_puts(qqt, " does not designate ");
+ safeput(qqt, clientip);
+ qmail_puts(qqt, " as permitted sender)\n");
+ break;
+ case '?':
+ qmail_puts(qqt, " neutral (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, "; client-ip=");
+ safeput(qqt, clientip);
+ qmail_puts(qqt, " is neither permitted \n");
+ qmail_puts(qqt, " nor denied by domain of ");
+ safeput(qqt, identity), qmail_puts(qqt, ")\n");
+ break;
+ case 'o':
+ qmail_puts(qqt, " none (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, " does\n");
+ qmail_puts(qqt, " not designate permitted sender hosts)\n");
+ break;
+ case 't':
+ qmail_puts(qqt, " temperror (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, " evaluated\n");
+ qmail_puts(qqt, " with error: ");
+ safeput(qqt, problem);
+ qmail_puts(qqt, " for mechanism: ");
+ safeput(qqt, mechanism);
+ qmail_puts(qqt, ")\n");
+ break;
+ case 'e':
+ qmail_puts(qqt, " permerror (");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, " evaluated\n");
+ qmail_puts(qqt, " with error: ");
+ safeput(qqt, problem);
+ qmail_puts(qqt, " for mechanism: ");
+ safeput(qqt, mechanism);
+ qmail_puts(qqt, ")\n");
+ break;
+ default:
+ qmail_puts(qqt, " unknown (results for ");
+ safeput(qqt, helo);
+ qmail_puts(qqt, ": domain of ");
+ safeput(qqt, identity);
+ qmail_puts(qqt, " follow an unknown mechanism: ");
+ safeput(qqt, mechanism);
+ qmail_puts(qqt, ")\n");
+ break;
}
}
diff --git a/src/recipients.c b/src/recipients.c
index ce29e19..bf70fd7 100644
--- a/src/recipients.c
+++ b/src/recipients.c
@@ -1,18 +1,21 @@
+#include "recipients.h"
+
#include <unistd.h>
-#include "cdbread.h"
+
+#include "buffer.h"
#include "byte.h"
-#include "open.h"
-#include "control.h"
+#include "case.h"
+#include "cdbread.h"
#include "constmap.h"
-#include "stralloc.h"
-#include "recipients.h"
-#include "wait.h"
-#include "str.h"
#include "fd.h"
+#include "open.h"
#include "sig.h"
-#include "case.h"
-#include "buffer.h"
+#include "str.h"
+#include "stralloc.h"
+#include "wait.h"
+
#include "auto_break.h"
+#include "control.h"
#include "qmail.h"
#define FDAUTH 3
@@ -47,21 +50,21 @@ static struct cdb cdb;
int recipients_init()
{
- flagrcpts = control_readfile(&rcptline,"control/recipients",0);
+ flagrcpts = control_readfile(&rcptline, "control/recipients", 0);
if (flagrcpts != 1) return flagrcpts;
return 0;
}
char rcptbuf[512];
-buffer br = BUFFER_INIT(safewrite,FDAUTH,rcptbuf,sizeof(rcptbuf));
+buffer br = BUFFER_INIT(safewrite, FDAUTH, rcptbuf, sizeof(rcptbuf));
-int callapam(char *pam,char *addr)
+int callapam(char *pam, char *addr)
{
int i;
- int j=0;
+ int j = 0;
int wstat;
int pi[2];
- int child;
+ int child;
char ch;
static stralloc mailaddress = {0};
@@ -74,73 +77,82 @@ int callapam(char *pam,char *addr)
stralloc pamarg4 = {0};
stralloc pamarg5 = {0};
- for (i = 0; (ch = pam[i]); i++) {
+ for (i = 0; (ch = pam[i]); i++) {
if (j < 6) {
- if (ch != ' ')
- if (!stralloc_append(&pamarg,&ch)) return -2;
+ if (ch != ' ')
+ if (!stralloc_append(&pamarg, &ch)) return -2;
if (ch == ' ' || ch == '\n' || i == str_len(pam) - 1) {
if (!stralloc_0(&pamarg)) return -2;
switch (j) {
case 0:
- if (!stralloc_copy(&pamname,&pamarg)) return -2;
+ if (!stralloc_copy(&pamname, &pamarg)) return -2;
childargs[0] = pamname.s;
case 1:
- if (!stralloc_copy(&pamarg1,&pamarg)) return -2;
+ if (!stralloc_copy(&pamarg1, &pamarg)) return -2;
childargs[1] = pamarg1.s;
case 2:
- if (!stralloc_copy(&pamarg2,&pamarg)) return -2;
+ if (!stralloc_copy(&pamarg2, &pamarg)) return -2;
childargs[2] = pamarg2.s;
case 3:
- if (!stralloc_copy(&pamarg3,&pamarg)) return -2;
- childargs[3] = pamarg3.s;
+ if (!stralloc_copy(&pamarg3, &pamarg)) return -2;
+ childargs[3] = pamarg3.s;
case 4:
- if (!stralloc_copy(&pamarg4,&pamarg)) return -2;
- childargs[4] = pamarg4.s;
+ if (!stralloc_copy(&pamarg4, &pamarg)) return -2;
+ childargs[4] = pamarg4.s;
case 5:
- if (!stralloc_copy(&pamarg5,&pamarg)) return -2;
- childargs[5] = pamarg5.s;
+ if (!stralloc_copy(&pamarg5, &pamarg)) return -2;
+ childargs[5] = pamarg5.s;
}
j++;
- if (!stralloc_copys(&pamarg,"")) return -2;
- }
+ if (!stralloc_copys(&pamarg, "")) return -2;
+ }
}
}
- childargs[j] = 0;
+ childargs[j] = 0;
close(FDAUTH);
if (pipe(pi) == -1) return -3;
if (pi[0] != FDAUTH) return -3;
switch (child = fork()) {
- case -1:
- return -3;
+ case -1: return -3;
case 0:
close(pi[1]);
- if (fd_copy(FDAUTH,pi[0]) == -1) return -3;
+ if (fd_copy(FDAUTH, pi[0]) == -1) return -3;
sig_pipedefault();
- execvp(childargs[0],childargs);
+ execvp(childargs[0], childargs);
return 111;
}
close(pi[0]);
-/* checkpassword compliant form: address\0\0\0 */
-
- if (!stralloc_copys(&mailaddress,addr)) return -2;
+ /* checkpassword compliant form: address\0\0\0 */
+
+ if (!stralloc_copys(&mailaddress, addr)) return -2;
if (!stralloc_0(&mailaddress)) return -2;
if (!stralloc_0(&mailaddress)) return -2;
if (!stralloc_0(&mailaddress)) return -2;
- buffer_init(&br,write,pi[1],rcptbuf,sizeof(rcptbuf));
- if (buffer_put(&br,mailaddress.s,mailaddress.len) == -1) return -3;
+ buffer_init(&br, write, pi[1], rcptbuf, sizeof(rcptbuf));
+ if (buffer_put(&br, mailaddress.s, mailaddress.len) == -1) return -3;
if (buffer_flush(&br) == -1) return -3;
close(pi[1]);
-
- if (wait_pid(&wstat,child) == -1) return -3;
+
+ if (wait_pid(&wstat, child) == -1) return -3;
if (wait_crashed(wstat)) return -3;
return wait_exitcode(wstat);
}
-int recipients_parse(char *rhost,int rlen,char *addr,char *rkey,int klen,char *vaddr,char *vkey,int vlen,char *ukey,int ulen)
+int recipients_parse(
+ char *rhost,
+ int rlen,
+ char *addr,
+ char *rkey,
+ int klen,
+ char *vaddr,
+ char *vkey,
+ int vlen,
+ char *ukey,
+ int ulen)
{
int i;
int r;
@@ -150,92 +162,89 @@ int recipients_parse(char *rhost,int rlen,char *addr,char *rkey,int klen,char *v
static stralloc line = {0};
int seenhost = 0;
- if (!stralloc_copys(&line,"")) return -2;
- if (!stralloc_copys(&wildhost,"!")) return -2;
- if (!stralloc_cats(&wildhost,rhost)) return -2;
+ if (!stralloc_copys(&line, "")) return -2;
+ if (!stralloc_copys(&wildhost, "!")) return -2;
+ if (!stralloc_cats(&wildhost, rhost)) return -2;
if (!stralloc_0(&wildhost)) return -2;
-
- for (i = 0; i < rcptline.len; ++i) {
- if (!stralloc_append(&line,&rcptline.s[i])) return -2;
+
+ for (i = 0; i < rcptline.len; ++i) {
+ if (!stralloc_append(&line, &rcptline.s[i])) return -2;
if (rcptline.s[i] == '\0') {
if (!stralloc_0(&line)) return -2;
- j = byte_chr(line.s,line.len,':'); /* cdb */
- k = byte_chr(line.s,line.len,'|'); /* pam */
- u = byte_chr(line.s,line.len,'='); /* assign users */
+ j = byte_chr(line.s, line.len, ':'); /* cdb */
+ k = byte_chr(line.s, line.len, '|'); /* pam */
+ u = byte_chr(line.s, line.len, '='); /* assign users */
- if (!str_diffn(line.s,wildhost.s,wildhost.len - 1)) return 4; /* wilddomain */
+ if (!str_diffn(line.s, wildhost.s, wildhost.len - 1)) return 4; /* wilddomain */
if ((j && j < line.len) || (k && k < line.len) || (u && u < line.len))
- if (!str_diffn(line.s,"@",1)) /* exact */
- if (!str_diffn(line.s + 1,rhost,rlen - 1)) seenhost = 1;
+ if (!str_diffn(line.s, "@", 1)) /* exact */
+ if (!str_diffn(line.s + 1, rhost, rlen - 1)) seenhost = 1;
- if (!seenhost) { /* domain */
+ if (!seenhost) { /* domain */
if (j && rlen >= j)
- if (!str_diffn(line.s,rhost + rlen - j - 1,j - 1)) seenhost = 2;
+ if (!str_diffn(line.s, rhost + rlen - j - 1, j - 1)) seenhost = 2;
if (k && rlen >= k)
- if (!str_diffn(line.s,rhost + rlen - k - 1,k - 1)) seenhost = 3;
+ if (!str_diffn(line.s, rhost + rlen - k - 1, k - 1)) seenhost = 3;
if (u && rlen >= u)
- if (!str_diffn(line.s,rhost + rlen - u - 1,u - 1)) seenhost = 4;
+ if (!str_diffn(line.s, rhost + rlen - u - 1, u - 1)) seenhost = 4;
}
- if (!seenhost) /* pass-thru */
- if (!str_diffn(line.s,"!*",2)) return 5;
-
- if (k && k < line.len) /* pam */
- if (seenhost || !str_diffn(line.s,"*",1)) {
- r = callapam(line.s + k + 1,addr);
- if (vlen > 0 && r != 0)
- r = callapam(line.s + k + 1,vaddr);
+ if (!seenhost) /* pass-thru */
+ if (!str_diffn(line.s, "!*", 2)) return 5;
+
+ if (k && k < line.len) /* pam */
+ if (seenhost || !str_diffn(line.s, "*", 1)) {
+ r = callapam(line.s + k + 1, addr);
+ if (vlen > 0 && r != 0) r = callapam(line.s + k + 1, vaddr);
if (r == 0) return 2;
if (r == 111) return r;
}
- if (u && u < line.len) /* qmail-users */
- if (seenhost || !str_diffn(line.s,"*",1)) {
+ if (u && u < line.len) /* qmail-users */
+ if (seenhost || !str_diffn(line.s, "*", 1)) {
fdrcps = open_read("users/assign.cdb");
if (fdrcps != -1) {
- cdb_init(&cdb,fdrcps);
- r = cdb_find(&cdb,ukey,ulen - 1);
+ cdb_init(&cdb, fdrcps);
+ r = cdb_find(&cdb, ukey, ulen - 1);
cdb_free(&cdb);
close(fdrcps);
if (r) return 3;
- }
+ }
}
-
- if (j && j < line.len) /* cdb */
- if (seenhost || !str_diffn(line.s,"*",1)) {
+
+ if (j && j < line.len) /* cdb */
+ if (seenhost || !str_diffn(line.s, "*", 1)) {
fdrcps = open_read(line.s + j + 1);
if (fdrcps != -1) {
- cdb_init(&cdb,fdrcps);
- r = cdb_find(&cdb,rkey,klen - 2);
- if (vlen > 0 && r == 0)
- r = cdb_find(&cdb,vkey,vlen - 2);
+ cdb_init(&cdb, fdrcps);
+ r = cdb_find(&cdb, rkey, klen - 2);
+ if (vlen > 0 && r == 0) r = cdb_find(&cdb, vkey, vlen - 2);
cdb_free(&cdb);
close(fdrcps);
if (r) return 1;
- }
+ }
}
-
+
if (!seenhost) {
- fdrcps = open_read(line.s); /* legacy cdb */
+ fdrcps = open_read(line.s); /* legacy cdb */
if (fdrcps != -1) {
- cdb_init(&cdb,fdrcps);
- r = cdb_find(&cdb,rkey,klen - 2);
- if (vlen > 0 && r == 0)
- r = cdb_find(&cdb,vkey,vlen - 2);
+ cdb_init(&cdb, fdrcps);
+ r = cdb_find(&cdb, rkey, klen - 2);
+ if (vlen > 0 && r == 0) r = cdb_find(&cdb, vkey, vlen - 2);
cdb_free(&cdb);
close(fdrcps);
if (r) return 1;
}
}
- if (!stralloc_copys(&line,"")) return -2;
+ if (!stralloc_copys(&line, "")) return -2;
}
}
return 0;
}
-int recipients(char *buf,int len)
+int recipients(char *buf, int len)
{
int at;
int i;
@@ -243,48 +252,49 @@ int recipients(char *buf,int len)
if (flagrcpts != 1) return 10;
- at = byte_rchr(buf,len,'@');
+ at = byte_rchr(buf, len, '@');
if (at && at < len) {
- if (!stralloc_copyb(&domain,buf + at + 1,len - at - 1)) return -2;
- if (!stralloc_copyb(&address,buf,len)) return -2;
+ if (!stralloc_copyb(&domain, buf + at + 1, len - at - 1)) return -2;
+ if (!stralloc_copyb(&address, buf, len)) return -2;
} else {
- if (!stralloc_copyb(&address,buf,len)) return -2;
- if (!stralloc_append(&address,"@")) return -2;
- if (!stralloc_copys(&domain,"localhost")) return -2;
- if (!stralloc_cat(&address,&domain)) return -2;
+ if (!stralloc_copyb(&address, buf, len)) return -2;
+ if (!stralloc_append(&address, "@")) return -2;
+ if (!stralloc_copys(&domain, "localhost")) return -2;
+ if (!stralloc_cat(&address, &domain)) return -2;
}
- if (!stralloc_copyb(&user,buf,at - 1)) return -2;
+ if (!stralloc_copyb(&user, buf, at - 1)) return -2;
if (!stralloc_0(&user)) return -2;
if (!stralloc_0(&address)) return -2;
if (!stralloc_0(&domain)) return -2;
- if (!stralloc_copys(&key,":")) return -2;
- if (!stralloc_cat(&key,&address)) return -2;
- if (!stralloc_0(&key)) return -2; /* \0\0 terminated */
- case_lowerb(key.s,key.len);
- case_lowerb(domain.s,domain.len);
+ if (!stralloc_copys(&key, ":")) return -2;
+ if (!stralloc_cat(&key, &address)) return -2;
+ if (!stralloc_0(&key)) return -2; /* \0\0 terminated */
+ case_lowerb(key.s, key.len);
+ case_lowerb(domain.s, domain.len);
- if (!stralloc_copys(&ukey,"!")) return -2;
- if (!stralloc_cat(&ukey,&user)) return -2;
- if (!stralloc_0(&ukey)) return -2; /* \0 terminated */
- case_lowerb(ukey.s,ukey.len);
+ if (!stralloc_copys(&ukey, "!")) return -2;
+ if (!stralloc_cat(&ukey, &user)) return -2;
+ if (!stralloc_0(&ukey)) return -2; /* \0 terminated */
+ case_lowerb(ukey.s, ukey.len);
- for (i = 0; i < at; i++) { /* VERP addresses */
+ for (i = 0; i < at; i++) { /* VERP addresses */
if (buf[i] == *auto_break || buf[i] == '=' || buf[i] == '+') { /* SRS delimiter */
- if (!stralloc_copyb(&verp,buf,i + 1)) return -2;
- if (!stralloc_append(&verp,"@")) return -2;
- if (!stralloc_cat(&verp,&domain)) return -2;
- if (!stralloc_copys(&vkey,":")) return -2;
- if (!stralloc_cat(&vkey,&verp)) return -2;
- if (!stralloc_0(&vkey)) return -2; /* \0\0 terminated */
- case_lowerb(vkey.s,vkey.len);
+ if (!stralloc_copyb(&verp, buf, i + 1)) return -2;
+ if (!stralloc_append(&verp, "@")) return -2;
+ if (!stralloc_cat(&verp, &domain)) return -2;
+ if (!stralloc_copys(&vkey, ":")) return -2;
+ if (!stralloc_cat(&vkey, &verp)) return -2;
+ if (!stralloc_0(&vkey)) return -2; /* \0\0 terminated */
+ case_lowerb(vkey.s, vkey.len);
break;
- }
+ }
}
- r = recipients_parse(domain.s,domain.len,address.s,key.s,key.len,verp.s,vkey.s,vkey.len,ukey.s,ukey.len);
+ r = recipients_parse(
+ domain.s, domain.len, address.s, key.s, key.len, verp.s, vkey.s, vkey.len, ukey.s, ukey.len);
if (r) return r;
return 0;
-}
+}
diff --git a/src/sendmail.c b/src/sendmail.c
index 69971e3..801c019 100644
--- a/src/sendmail.c
+++ b/src/sendmail.c
@@ -1,26 +1,28 @@
#include <unistd.h>
-#include "getoptb.h"
-#include "buffer.h"
+
#include "alloc.h"
-#include "auto_qmail.h"
-#include "exit.h"
+#include "buffer.h"
#include "env.h"
-#include "str.h"
+#include "exit.h"
+#include "getoptb.h"
#include "logmsg.h"
+#include "str.h"
+
+#include "auto_qmail.h"
#define WHO "sendmail"
void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory\n");
+ logmsg(WHO, 111, FATAL, "out of memory\n");
}
void die_usage()
{
- logmsg(WHO,100,USAGE,"sendmail [ -t ] [ -fsender ] [ -Fname ] [ -bp ] [ -bs ] [ arg ... ]\n");
+ logmsg(WHO, 100, USAGE, "sendmail [ -t ] [ -fsender ] [ -Fname ] [ -bp ] [ -bs ] [ arg ... ]\n");
}
-char *smtpdarg[] = { "bin/qmail-smtpd", 0 };
+char *smtpdarg[] = {"bin/qmail-smtpd", 0};
void smtpd()
{
@@ -36,15 +38,15 @@ void smtpd()
if (!env_puts("TCPREMOTEHOST=localhost")) nomem();
if (!env_puts("TCPREMOTEINFO=sendmail-bs")) nomem();
}
- execv(*smtpdarg,smtpdarg);
- logmsg(WHO,111,FATAL,"unable to run qmail-smtpd\n");
+ execv(*smtpdarg, smtpdarg);
+ logmsg(WHO, 111, FATAL, "unable to run qmail-smtpd\n");
}
-char *qreadarg[] = { "bin/qmail-qread", 0 };
+char *qreadarg[] = {"bin/qmail-qread", 0};
void mailq()
{
- execv(*qreadarg,qreadarg);
- logmsg(WHO,111,FATAL,"unable to run qmail-qread\n");
+ execv(*qreadarg, qreadarg);
+ logmsg(WHO, 111, FATAL, "unable to run qmail-qread\n");
}
void do_sender(const char *s)
@@ -61,20 +63,18 @@ void do_sender(const char *s)
env_unset("MAILHOST");
n = str_len(s);
- a = str_rchr(s,'@');
- if (a == n)
- {
- env_put("QMAILUSER",s);
+ a = str_rchr(s, '@');
+ if (a == n) {
+ env_put("QMAILUSER", s);
return;
}
- env_put("QMAILHOST",s + a + 1);
+ env_put("QMAILHOST", s + a + 1);
- x = (char *) alloc((a + 1) * sizeof(char));
+ x = (char *)alloc((a + 1) * sizeof(char));
if (!x) nomem();
- for (i = 0; i < a; i++)
- x[i] = s[i];
+ for (i = 0; i < a; i++) x[i] = s[i];
x[i] = 0;
- env_put("QMAILUSER",x);
+ env_put("QMAILUSER", x);
alloc_free(x);
}
@@ -87,21 +87,23 @@ int main(int argc, char **argv)
char **qiargv;
char **arg;
int i;
-
+
if (chdir(auto_qmail) == -1) {
- buffer_putsflush(buffer_2,"sendmail: fatal: unable to switch to qmail home directory\n");
+ buffer_putsflush(buffer_2, "sendmail: fatal: unable to switch to qmail home directory\n");
_exit(111);
}
flagh = 0;
sender = 0;
- while ((opt = getopt(argc,argv,"vimte:f:p:o:B:F:EJxb:")) != opteof) {
+ while ((opt = getopt(argc, argv, "vimte:f:p:o:B:F:EJxb:")) != opteof) {
switch (opt) {
case 'N': break; /* ignore DSN option */
case 'B': break;
case 't': flagh = 1; break;
case 'f': sender = optarg; break;
- case 'F': if (!env_put("MAILNAME",optarg)) nomem(); break;
+ case 'F':
+ if (!env_put("MAILNAME", optarg)) nomem();
+ break;
case 'p': break; /* could generate a Received line from optarg */
case 'v': break;
case 'i': break; /* what an absurd concept */
@@ -116,7 +118,8 @@ int main(int argc, char **argv)
case 'm': break; /* see 'm' above */
}
break;
- case 'E': case 'J': /* Sony NEWS-OS */
+ case 'E':
+ case 'J': /* Sony NEWS-OS */
while (argv[optind][optpos]) ++optpos; /* skip optional argument */
break;
case 'b':
@@ -124,26 +127,24 @@ int main(int argc, char **argv)
case 'm': break;
case 'p': mailq();
case 's': smtpd();
- default: die_usage();
+ default: die_usage();
}
break;
- default:
- die_usage();
+ default: die_usage();
}
}
argc -= optind;
argv += optind;
-
- if (str_equal(optprogname,"mailq"))
- mailq();
- if (str_equal(optprogname,"newaliases")) {
- logmsg(WHO,100,FATAL,"please use fastforward/newaliases instead\n");
+ if (str_equal(optprogname, "mailq")) mailq();
+
+ if (str_equal(optprogname, "newaliases")) {
+ logmsg(WHO, 100, FATAL, "please use fastforward/newaliases instead\n");
}
- qiargv = (char **) alloc((argc + 10) * sizeof(char *));
+ qiargv = (char **)alloc((argc + 10) * sizeof(char *));
if (!qiargv) nomem();
-
+
arg = qiargv;
*arg++ = "bin/qmail-inject";
*arg++ = (flagh ? "-H" : "-a");
@@ -155,7 +156,7 @@ int main(int argc, char **argv)
*arg++ = "--";
for (i = 0; i < argc; ++i) *arg++ = argv[i];
*arg = 0;
-
- execv(*qiargv,qiargv);
- logmsg(WHO,111,FATAL,"unable to run qmail-inject\n");
+
+ execv(*qiargv, qiargv);
+ logmsg(WHO, 111, FATAL, "unable to run qmail-inject\n");
}
diff --git a/src/setforward.c b/src/setforward.c
index fe17f74..356ec78 100644
--- a/src/setforward.c
+++ b/src/setforward.c
@@ -1,43 +1,43 @@
#include <unistd.h>
+
#include "buffer.h"
-#include "logmsg.h"
-#include "stralloc.h"
-#include "open.h"
#include "case.h"
#include "cdbmake.h"
#include "logmsg.h"
+#include "open.h"
+#include "stralloc.h"
#define WHO "setforward"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void usage()
{
- logmsg(WHO,100,USAGE,"setforward data.cdb data.tmp");
+ logmsg(WHO, 100, USAGE, "setforward data.cdb data.tmp");
}
void nomem()
{
- logmsg(WHO,111,FATAL,"out of memory");
+ logmsg(WHO, 111, FATAL, "out of memory");
}
void missingsemicolon()
{
- logmsg(WHO,100,FATAL,"final instruction must end with semicolon");
+ logmsg(WHO, 100, FATAL, "final instruction must end with semicolon");
}
void extracolon()
{
- logmsg(WHO,100,FATAL,"double colons are not permitted");
+ logmsg(WHO, 100, FATAL, "double colons are not permitted");
}
void extracomma()
{
- logmsg(WHO,100,FATAL,"commas are not permitted before colons");
+ logmsg(WHO, 100, FATAL, "commas are not permitted before colons");
}
void nulbyte()
{
- logmsg(WHO,100,FATAL,"NUL bytes are not permitted");
+ logmsg(WHO, 100, FATAL, "NUL bytes are not permitted");
}
void longaddress()
{
- logmsg(WHO,100,FATAL,"addresses over 800 bytes are not permitted");
+ logmsg(WHO, 100, FATAL, "addresses over 800 bytes are not permitted");
}
char *fncdb;
@@ -46,9 +46,9 @@ int fd;
struct cdb_make cdb;
stralloc key = {0};
-stralloc target = {0}; /* always initialized; no NUL */
+stralloc target = {0}; /* always initialized; no NUL */
stralloc command = {0}; /* always initialized; no NUL */
-stralloc instr = {0}; /* always initialized */
+stralloc instr = {0}; /* always initialized */
int flagtarget = 0;
/* 0: reading target; command is empty; instr is empty */
@@ -56,19 +56,17 @@ int flagtarget = 0;
void writeerr()
{
- logmsg(WHO,111,FATAL,B("unable to write to: ",fntmp));
+ logmsg(WHO, 111, FATAL, B("unable to write to: ", fntmp));
}
-void doit(prepend,data,datalen)
-char *prepend;
+void doit(prepend, data, datalen) char *prepend;
char *data;
int datalen;
{
- if (!stralloc_copys(&key,prepend)) nomem();
- if (!stralloc_cat(&key,&target)) nomem();
- case_lowerb(key.s,key.len);
- if (cdb_make_add(&cdb,key.s,key.len,data,datalen) == -1)
- writeerr();
+ if (!stralloc_copys(&key, prepend)) nomem();
+ if (!stralloc_cat(&key, &target)) nomem();
+ case_lowerb(key.s, key.len);
+ if (cdb_make_add(&cdb, key.s, key.len, data, datalen) == -1) writeerr();
}
int getch(ch)
@@ -76,9 +74,8 @@ char *ch;
{
int r;
- r = buffer_get(buffer_0small,ch,1);
- if (r == -1)
- logmsg(WHO,111,FATAL,"unable to read input: ");
+ r = buffer_get(buffer_0small, ch, 1);
+ if (r == -1) logmsg(WHO, 111, FATAL, "unable to read input: ");
return r;
}
@@ -86,24 +83,26 @@ int main(int argc, char **argv)
{
char ch;
- if (!stralloc_copys(&target,"")) nomem();
- if (!stralloc_copys(&command,"")) nomem();
- if (!stralloc_copys(&instr,"")) nomem();
+ if (!stralloc_copys(&target, "")) nomem();
+ if (!stralloc_copys(&command, "")) nomem();
+ if (!stralloc_copys(&instr, "")) nomem();
- fncdb = argv[1]; if (!fncdb) usage();
- fntmp = argv[2]; if (!fntmp) usage();
+ fncdb = argv[1];
+ if (!fncdb) usage();
+ fntmp = argv[2];
+ if (!fntmp) usage();
fd = open_trunc(fntmp);
- if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to create: ",fntmp));
+ if (fd == -1) logmsg(WHO, 111, FATAL, B("unable to create: ", fntmp));
- if (cdb_make_start(&cdb,fd) == -1) writeerr();
+ if (cdb_make_start(&cdb, fd) == -1) writeerr();
for (;;) {
if (!getch(&ch)) goto EOF;
if (ch == '#') {
- while (ch != '\n') if (!getch(&ch)) goto EOF;
+ while (ch != '\n')
+ if (!getch(&ch)) goto EOF;
continue;
}
@@ -121,53 +120,48 @@ int main(int argc, char **argv)
if (!flagtarget) extracomma();
if (command.len) {
if (command.s[0] == '?') {
- doit("?",command.s + 1,command.len - 1);
- }
- else if ((command.s[0] == '|') || (command.s[0] == '!')) {
- if (!stralloc_cat(&instr,&command)) nomem();
+ doit("?", command.s + 1, command.len - 1);
+ } else if ((command.s[0] == '|') || (command.s[0] == '!')) {
+ if (!stralloc_cat(&instr, &command)) nomem();
if (!stralloc_0(&instr)) nomem();
- }
- else if ((command.s[0] == '.') || (command.s[0] == '/')) {
- if (!stralloc_cat(&instr,&command)) nomem();
+ } else if ((command.s[0] == '.') || (command.s[0] == '/')) {
+ if (!stralloc_cat(&instr, &command)) nomem();
if (!stralloc_0(&instr)) nomem();
- }
- else {
+ } else {
if (command.len > 800) longaddress();
if (command.s[0] != '&')
- if (!stralloc_cats(&instr,"&")) nomem();
- if (!stralloc_cat(&instr,&command)) nomem();
+ if (!stralloc_cats(&instr, "&")) nomem();
+ if (!stralloc_cat(&instr, &command)) nomem();
if (!stralloc_0(&instr)) nomem();
}
}
- if (!stralloc_copys(&command,"")) nomem();
+ if (!stralloc_copys(&command, "")) nomem();
if (ch == ';') {
- if (instr.len)
- doit(":",instr.s,instr.len);
+ if (instr.len) doit(":", instr.s, instr.len);
- if (!stralloc_copys(&target,"")) nomem();
- if (!stralloc_copys(&instr,"")) nomem();
+ if (!stralloc_copys(&target, "")) nomem();
+ if (!stralloc_copys(&instr, "")) nomem();
flagtarget = 0;
}
continue;
}
- if (ch == '\\') if (!getch(&ch)) goto EOF;
+ if (ch == '\\')
+ if (!getch(&ch)) goto EOF;
if (ch == 0) nulbyte();
- if (!stralloc_append(flagtarget ? &command : &target,&ch)) nomem();
+ if (!stralloc_append(flagtarget ? &command : &target, &ch)) nomem();
}
- EOF:
- if (flagtarget || target.len)
- missingsemicolon();
+EOF:
+ if (flagtarget || target.len) missingsemicolon();
if (cdb_make_finish(&cdb) == -1) writeerr();
if (fsync(fd) == -1) writeerr();
if (close(fd) == -1) writeerr(); /* NFS stupidity */
- if (rename(fntmp,fncdb) == -1)
- logmsg(WHO,111,FATAL,B("unable to move ",fntmp," to: ",fncdb));
-
+ if (rename(fntmp, fncdb) == -1) logmsg(WHO, 111, FATAL, B("unable to move ", fntmp, " to: ", fncdb));
+
_exit(0);
}
diff --git a/src/setmaillist.c b/src/setmaillist.c
index f7ac89b..a32e86b 100644
--- a/src/setmaillist.c
+++ b/src/setmaillist.c
@@ -1,19 +1,20 @@
-#include <unistd.h>
#include <sys/stat.h>
+#include <unistd.h>
+
#include "buffer.h"
-#include "logmsg.h"
-#include "stralloc.h"
+#include "byte.h"
#include "getln.h"
+#include "logmsg.h"
#include "open.h"
-#include "byte.h"
+#include "stralloc.h"
#define WHO "setmaillist"
-int rename(const char *,const char *); // stdio.h
+int rename(const char *, const char *); // stdio.h
void usage()
{
- logmsg(WHO,100,USAGE,"setmaillist list.bin list.tmp");
+ logmsg(WHO, 100, USAGE, "setmaillist list.bin list.tmp");
}
stralloc line = {0};
@@ -27,56 +28,52 @@ buffer bo;
void writeerr()
{
- logmsg(WHO,111,FATAL,B("unable to write to: ",fntmp));
+ logmsg(WHO, 111, FATAL, B("unable to write to: ", fntmp));
}
-static void out(char *s,int len)
+static void out(char *s, int len)
{
- if (buffer_put(&bo,s,len) == -1) writeerr();
+ if (buffer_put(&bo, s, len) == -1) writeerr();
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
umask(033);
- fnbin = argv[1]; if (!fnbin) usage();
- fntmp = argv[2]; if (!fntmp) usage();
+ fnbin = argv[1];
+ if (!fnbin) usage();
+ fntmp = argv[2];
+ if (!fntmp) usage();
fd = open_trunc(fntmp);
- if (fd == -1)
- logmsg(WHO,111,FATAL,B("unable to create: ",fntmp));
+ if (fd == -1) logmsg(WHO, 111, FATAL, B("unable to create: ", fntmp));
- buffer_init(&bo,write,fd,buf,sizeof(buf));
+ buffer_init(&bo, write, fd, buf, sizeof(buf));
do {
- if (getln(buffer_0small,&line,&match,'\n') == -1)
- logmsg(WHO,111,FATAL,"unable to read input: ");
+ if (getln(buffer_0small, &line, &match, '\n') == -1)
+ logmsg(WHO, 111, FATAL, "unable to read input: ");
while (line.len) {
if (line.s[line.len - 1] != '\n')
if (line.s[line.len - 1] != ' ')
- if (line.s[line.len - 1] != '\t')
- break;
+ if (line.s[line.len - 1] != '\t') break;
--line.len;
}
- if (byte_chr(line.s,line.len,'\0') != line.len)
- logmsg(WHO,111,FATAL,"NUL in input");
+ if (byte_chr(line.s, line.len, '\0') != line.len) logmsg(WHO, 111, FATAL, "NUL in input");
if (line.len)
if (line.s[0] != '#') {
if ((line.s[0] == '.') || (line.s[0] == '/')) {
- out(line.s,line.len);
- out("",1);
- }
- else {
- if (line.len > 800)
- logmsg(WHO,111,FATAL,"addresses must be under 800 bytes");
- if (line.s[0] != '&')
- out("&",1);
- out(line.s,line.len);
- out("",1);
+ out(line.s, line.len);
+ out("", 1);
+ } else {
+ if (line.len > 800) logmsg(WHO, 111, FATAL, "addresses must be under 800 bytes");
+ if (line.s[0] != '&') out("&", 1);
+ out(line.s, line.len);
+ out("", 1);
}
}
@@ -86,8 +83,7 @@ int main(int argc,char **argv)
if (fsync(fd) == -1) writeerr();
if (close(fd) == -1) writeerr(); /* NFS stupidity */
- if (rename(fntmp,fnbin) == -1)
- logmsg(WHO,111,FATAL,B("unable to move ",fntmp," to: ",fnbin));
-
+ if (rename(fntmp, fnbin) == -1) logmsg(WHO, 111, FATAL, B("unable to move ", fntmp, " to: ", fnbin));
+
_exit(0);
}
diff --git a/src/sha1.c b/src/sha1.c
index ee06e92..d050c3b 100644
--- a/src/sha1.c
+++ b/src/sha1.c
@@ -15,8 +15,10 @@ Still 100% Public Domain; though requiring fehQlibs-14
*/
-#include <string.h>
#include "sha1.h"
+
+#include <string.h>
+
#include "byte.h"
// #define SHA1HANDSOFF
@@ -27,39 +29,51 @@ Still 100% Public Domain; though requiring fehQlibs-14
/* I got the idea of expanding during the round function from SSLeay */
/* FIXME: can we do this in an endian-proof way? */
#ifndef WORDS_BIGENDIAN
-#define blk0(i) (block->l[i] = (rol(block->l[i],24) & 0xFF00FF00) \
- | (rol(block->l[i],8) & 0x00FF00FF))
+ #define blk0(i) \
+ (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF))
#else
-#define blk0(i) block->l[i]
+ #define blk0(i) block->l[i]
#endif
-#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \
- ^block->l[(i+2)&15]^block->l[i&15],1))
+#define blk(i) \
+ (block->l[i & 15] = rol( \
+ block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], \
+ 1))
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
-#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
-#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30);
-#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
-#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
-#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
+#define R0(v, w, x, y, z, i) \
+ z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
+ w = rol(w, 30);
+#define R1(v, w, x, y, z, i) \
+ z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
+ w = rol(w, 30);
+#define R2(v, w, x, y, z, i) \
+ z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \
+ w = rol(w, 30);
+#define R3(v, w, x, y, z, i) \
+ z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
+ w = rol(w, 30);
+#define R4(v, w, x, y, z, i) \
+ z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
+ w = rol(w, 30);
/* Hash a single 512-bit block. This is the core of the algorithm. */
-void sha1_transform(uint32_t state[5],const uint8_t buffer[SHA1_BLOCKSIZE])
+void sha1_transform(uint32_t state[5], const uint8_t buffer[SHA1_BLOCKSIZE])
{
uint32_t a, b, c, d, e;
typedef union {
- uint8_t c[SHA1_BLOCKSIZE];
- uint32_t l[16];
+ uint8_t c[SHA1_BLOCKSIZE];
+ uint32_t l[16];
} CHAR64LONG16;
CHAR64LONG16 *block;
#ifdef SHA1HANDSOFF
static uint8_t workspace[SHA1_BLOCKSIZE];
- block = (CHAR64LONG16 *) workspace;
- byte_copy(block,SHA1_BLOCKSIZE,buffer);
+ block = (CHAR64LONG16 *)workspace;
+ byte_copy(block, SHA1_BLOCKSIZE, buffer);
#else
- block = (CHAR64LONG16 *) buffer;
+ block = (CHAR64LONG16 *)buffer;
#endif
/* Copy context->state[] to working vars */
@@ -70,26 +84,86 @@ void sha1_transform(uint32_t state[5],const uint8_t buffer[SHA1_BLOCKSIZE])
e = state[4];
/* 4 rounds of 20 operations each. Loop unrolled. */
- R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
- R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
- R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
- R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
- R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
- R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
- R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
- R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
- R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
- R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
- R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
- R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
- R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
- R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
- R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
- R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
- R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
- R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
- R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
- R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
+ R0(a, b, c, d, e, 0);
+ R0(e, a, b, c, d, 1);
+ R0(d, e, a, b, c, 2);
+ R0(c, d, e, a, b, 3);
+ R0(b, c, d, e, a, 4);
+ R0(a, b, c, d, e, 5);
+ R0(e, a, b, c, d, 6);
+ R0(d, e, a, b, c, 7);
+ R0(c, d, e, a, b, 8);
+ R0(b, c, d, e, a, 9);
+ R0(a, b, c, d, e, 10);
+ R0(e, a, b, c, d, 11);
+ R0(d, e, a, b, c, 12);
+ R0(c, d, e, a, b, 13);
+ R0(b, c, d, e, a, 14);
+ R0(a, b, c, d, e, 15);
+ R1(e, a, b, c, d, 16);
+ R1(d, e, a, b, c, 17);
+ R1(c, d, e, a, b, 18);
+ R1(b, c, d, e, a, 19);
+ R2(a, b, c, d, e, 20);
+ R2(e, a, b, c, d, 21);
+ R2(d, e, a, b, c, 22);
+ R2(c, d, e, a, b, 23);
+ R2(b, c, d, e, a, 24);
+ R2(a, b, c, d, e, 25);
+ R2(e, a, b, c, d, 26);
+ R2(d, e, a, b, c, 27);
+ R2(c, d, e, a, b, 28);
+ R2(b, c, d, e, a, 29);
+ R2(a, b, c, d, e, 30);
+ R2(e, a, b, c, d, 31);
+ R2(d, e, a, b, c, 32);
+ R2(c, d, e, a, b, 33);
+ R2(b, c, d, e, a, 34);
+ R2(a, b, c, d, e, 35);
+ R2(e, a, b, c, d, 36);
+ R2(d, e, a, b, c, 37);
+ R2(c, d, e, a, b, 38);
+ R2(b, c, d, e, a, 39);
+ R3(a, b, c, d, e, 40);
+ R3(e, a, b, c, d, 41);
+ R3(d, e, a, b, c, 42);
+ R3(c, d, e, a, b, 43);
+ R3(b, c, d, e, a, 44);
+ R3(a, b, c, d, e, 45);
+ R3(e, a, b, c, d, 46);
+ R3(d, e, a, b, c, 47);
+ R3(c, d, e, a, b, 48);
+ R3(b, c, d, e, a, 49);
+ R3(a, b, c, d, e, 50);
+ R3(e, a, b, c, d, 51);
+ R3(d, e, a, b, c, 52);
+ R3(c, d, e, a, b, 53);
+ R3(b, c, d, e, a, 54);
+ R3(a, b, c, d, e, 55);
+ R3(e, a, b, c, d, 56);
+ R3(d, e, a, b, c, 57);
+ R3(c, d, e, a, b, 58);
+ R3(b, c, d, e, a, 59);
+ R4(a, b, c, d, e, 60);
+ R4(e, a, b, c, d, 61);
+ R4(d, e, a, b, c, 62);
+ R4(c, d, e, a, b, 63);
+ R4(b, c, d, e, a, 64);
+ R4(a, b, c, d, e, 65);
+ R4(e, a, b, c, d, 66);
+ R4(d, e, a, b, c, 67);
+ R4(c, d, e, a, b, 68);
+ R4(b, c, d, e, a, 69);
+ R4(a, b, c, d, e, 70);
+ R4(e, a, b, c, d, 71);
+ R4(d, e, a, b, c, 72);
+ R4(c, d, e, a, b, 73);
+ R4(b, c, d, e, a, 74);
+ R4(a, b, c, d, e, 75);
+ R4(e, a, b, c, d, 76);
+ R4(d, e, a, b, c, 77);
+ R4(c, d, e, a, b, 78);
+ R4(b, c, d, e, a, 79);
/* Add the working vars back into context.state[] */
state[0] += a;
@@ -102,7 +176,7 @@ void sha1_transform(uint32_t state[5],const uint8_t buffer[SHA1_BLOCKSIZE])
a = b = c = d = e = 0;
#ifdef SHA1HANDSOFF
- byte_zero(block,64);
+ byte_zero(block, 64);
#endif
}
@@ -121,68 +195,65 @@ void sha1_init(sha1_ctx *context)
/* Run your data through this. */
-void sha1_update(sha1_ctx *context,const uint8_t *data,uint32_t len)
+void sha1_update(sha1_ctx *context, const uint8_t *data, uint32_t len)
{
uint32_t i, j;
j = (context->count[0] >> 3) & 63;
- if ((context->count[0] += len << 3) < (len << 3))
- context->count[1]++;
+ if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
context->count[1] += (len >> 29);
if ((j + len) > 63) {
- byte_copy(&context->buffer[j],(i = 64 - j),data);
- sha1_transform(context->state,context->buffer);
+ byte_copy(&context->buffer[j], (i = 64 - j), data);
+ sha1_transform(context->state, context->buffer);
for (; i + 63 < len; i += 64) {
- sha1_transform(context->state,data + i);
+ sha1_transform(context->state, data + i);
}
j = 0;
} else
i = 0;
- byte_copy(&context->buffer[j],len - i,&data[i]);
+ byte_copy(&context->buffer[j], len - i, &data[i]);
}
/* Add padding and return the message digest. */
-void sha1_final(uint8_t digest[SHA1_DIGESTSIZE],sha1_ctx *context)
+void sha1_final(uint8_t digest[SHA1_DIGESTSIZE], sha1_ctx *context)
{
uint32_t i;
uint8_t finalcount[8];
for (i = 0; i < 8; i++) {
- finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)]
- >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */
+ finalcount[i] = (uint8_t)((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8))
+ & 255); /* Endian independent */
}
- sha1_update(context,(uint8_t *) "\200",1);
+ sha1_update(context, (uint8_t *)"\200", 1);
+
+ while ((context->count[0] & 504) != 448) sha1_update(context, (uint8_t *)"\0", 1);
- while ((context->count[0] & 504) != 448)
- sha1_update(context,(uint8_t *) "\0",1);
-
- sha1_update(context,finalcount,8); /* Should cause a SHA1_Transform() */
+ sha1_update(context, finalcount, 8); /* Should cause a SHA1_Transform() */
- for (i = 0; i < SHA1_DIGESTSIZE; i++)
- digest[i] = (uint8_t) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
+ for (i = 0; i < SHA1_DIGESTSIZE; i++)
+ digest[i] = (uint8_t)((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
/* Wipe variables */
i = 0;
- byte_zero(context->buffer,64);
- byte_zero(context->state,20);
- byte_zero(context->count,8);
- byte_zero(finalcount,8);
+ byte_zero(context->buffer, 64);
+ byte_zero(context->state, 20);
+ byte_zero(context->count, 8);
+ byte_zero(finalcount, 8);
-#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */
- sha1_transform(context->state,context->buffer);
+#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */
+ sha1_transform(context->state, context->buffer);
#endif
}
-void sha1_hash(char *hash,const char *str,uint32_t len)
+void sha1_hash(char *hash, const char *str, uint32_t len)
{
sha1_ctx context;
int i;
sha1_init(&context);
- for (i = 0; i < len; i++)
- sha1_update(&context,(uint8_t *)str + i,1);
+ for (i = 0; i < len; i++) sha1_update(&context, (uint8_t *)str + i, 1);
- sha1_final((uint8_t *)hash,&context);
+ sha1_final((uint8_t *)hash, &context);
hash[20] = '\0';
}
diff --git a/src/sha256.c b/src/sha256.c
index e5ba5dd..0bb29af 100644
--- a/src/sha256.c
+++ b/src/sha256.c
@@ -6,46 +6,43 @@
* clean-up and argument order for sha256_hash (feh).
*/
+#include "sha256.h"
+
#include <stdint.h>
#include <string.h>
-#include "sha256.h"
// DBL_INT_ADD treats two unsigned ints a and b as one 64-bit integer and adds c to it
-#define DBL_INT_ADD(a,b,c) if (a > 0xffffffff - (c)) ++b; a += c;
-#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
-#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
+#define DBL_INT_ADD(a, b, c) \
+ if (a > 0xffffffff - (c)) ++b; \
+ a += c;
+#define ROTLEFT(a, b) (((a) << (b)) | ((a) >> (32 - (b))))
+#define ROTRIGHT(a, b) (((a) >> (b)) | ((a) << (32 - (b))))
-#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
-#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
-#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
-#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
-#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
-#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
+#define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z)))
+#define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+#define EP0(x) (ROTRIGHT(x, 2) ^ ROTRIGHT(x, 13) ^ ROTRIGHT(x, 22))
+#define EP1(x) (ROTRIGHT(x, 6) ^ ROTRIGHT(x, 11) ^ ROTRIGHT(x, 25))
+#define SIG0(x) (ROTRIGHT(x, 7) ^ ROTRIGHT(x, 18) ^ ((x) >> 3))
+#define SIG1(x) (ROTRIGHT(x, 17) ^ ROTRIGHT(x, 19) ^ ((x) >> 10))
-uint32_t k[64] =
-{
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
- 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
- 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
- 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
- 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
- 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
-};
+uint32_t k[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};
static void sha256_transform(sha256_ctx *ctx, uint8_t *data)
-{
+{
uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
-
+
for (i = 0, j = 0; i < 16; ++i, j += 4)
- m[i] = (data[j] << 24) | (data[j+1] << 16) | (data[j+2] << 8) | (data[j+3]);
- for (; i < 64; ++i)
- m[i] = SIG1(m[i-2]) + m[i-7] + SIG0(m[i-15]) + m[i-16];
+ m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);
+ for (; i < 64; ++i) m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
a = ctx->state[0];
b = ctx->state[1];
@@ -55,10 +52,10 @@ static void sha256_transform(sha256_ctx *ctx, uint8_t *data)
f = ctx->state[5];
g = ctx->state[6];
h = ctx->state[7];
-
+
for (i = 0; i < 64; ++i) {
- t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
- t2 = EP0(a) + MAJ(a,b,c);
+ t1 = h + EP1(e) + CH(e, f, g) + k[i] + m[i];
+ t2 = EP0(a) + MAJ(a, b, c);
h = g;
g = f;
f = e;
@@ -68,7 +65,7 @@ static void sha256_transform(sha256_ctx *ctx, uint8_t *data)
b = a;
a = t1 + t2;
}
-
+
ctx->state[0] += a;
ctx->state[1] += b;
ctx->state[2] += c;
@@ -80,10 +77,10 @@ static void sha256_transform(sha256_ctx *ctx, uint8_t *data)
}
static void sha256_init(sha256_ctx *ctx)
-{
- ctx->datalen = 0;
- ctx->bitlen[0] = 0;
- ctx->bitlen[1] = 0;
+{
+ ctx->datalen = 0;
+ ctx->bitlen[0] = 0;
+ ctx->bitlen[1] = 0;
ctx->state[0] = 0x6a09e667;
ctx->state[1] = 0xbb67ae85;
ctx->state[2] = 0x3c6ef372;
@@ -95,73 +92,70 @@ static void sha256_init(sha256_ctx *ctx)
}
static void sha256_update(sha256_ctx *ctx, uint8_t *data, uint32_t len)
-{
+{
uint32_t i;
-
- for (i=0; i < len; ++i) {
- ctx->data[ctx->datalen] = data[i];
- ctx->datalen++;
- if (ctx->datalen == 64) {
- sha256_transform(ctx,ctx->data);
- DBL_INT_ADD(ctx->bitlen[0],ctx->bitlen[1],512);
- ctx->datalen = 0;
- }
- }
-}
-
-static void sha256_final(uint8_t *hash,sha256_ctx *ctx)
-{
- uint32_t i;
-
- i = ctx->datalen;
-
-// Pad whatever data is left in the buffer.
-
- if (ctx->datalen < 56) {
- ctx->data[i++] = 0x80;
- while (i < 56)
- ctx->data[i++] = 0x00;
+
+ for (i = 0; i < len; ++i) {
+ ctx->data[ctx->datalen] = data[i];
+ ctx->datalen++;
+ if (ctx->datalen == 64) {
+ sha256_transform(ctx, ctx->data);
+ DBL_INT_ADD(ctx->bitlen[0], ctx->bitlen[1], 512);
+ ctx->datalen = 0;
+ }
}
- else {
- ctx->data[i++] = 0x80;
- while (i < 64)
- ctx->data[i++] = 0x00;
- sha256_transform(ctx,ctx->data);
- memset(ctx->data,0,56);
- }
-
-// Append to the padding the total message's length in bits and transform.
-
- DBL_INT_ADD(ctx->bitlen[0],ctx->bitlen[1],ctx->datalen * 8);
- ctx->data[63] = ctx->bitlen[0];
- ctx->data[62] = ctx->bitlen[0] >> 8;
- ctx->data[61] = ctx->bitlen[0] >> 16;
- ctx->data[60] = ctx->bitlen[0] >> 24;
- ctx->data[59] = ctx->bitlen[1];
- ctx->data[58] = ctx->bitlen[1] >> 8;
- ctx->data[57] = ctx->bitlen[1] >> 16;
- ctx->data[56] = ctx->bitlen[1] >> 24;
- sha256_transform(ctx,ctx->data);
-
-// Since this implementation uses little endian byte ordering and SHA uses
-// big endian, reverse all the bytes when copying the final state to the output hash.
-
- for (i = 0; i < 4; ++i) {
- hash[i] = (ctx->state[0] >> (24-i*8)) & 0x000000ff;
- hash[i+4] = (ctx->state[1] >> (24-i*8)) & 0x000000ff;
- hash[i+8] = (ctx->state[2] >> (24-i*8)) & 0x000000ff;
- hash[i+12] = (ctx->state[3] >> (24-i*8)) & 0x000000ff;
- hash[i+16] = (ctx->state[4] >> (24-i*8)) & 0x000000ff;
- hash[i+20] = (ctx->state[5] >> (24-i*8)) & 0x000000ff;
- hash[i+24] = (ctx->state[6] >> (24-i*8)) & 0x000000ff;
- hash[i+28] = (ctx->state[7] >> (24-i*8)) & 0x000000ff;
+}
+
+static void sha256_final(uint8_t *hash, sha256_ctx *ctx)
+{
+ uint32_t i;
+
+ i = ctx->datalen;
+
+ // Pad whatever data is left in the buffer.
+
+ if (ctx->datalen < 56) {
+ ctx->data[i++] = 0x80;
+ while (i < 56) ctx->data[i++] = 0x00;
+ } else {
+ ctx->data[i++] = 0x80;
+ while (i < 64) ctx->data[i++] = 0x00;
+ sha256_transform(ctx, ctx->data);
+ memset(ctx->data, 0, 56);
+ }
+
+ // Append to the padding the total message's length in bits and transform.
+
+ DBL_INT_ADD(ctx->bitlen[0], ctx->bitlen[1], ctx->datalen * 8);
+ ctx->data[63] = ctx->bitlen[0];
+ ctx->data[62] = ctx->bitlen[0] >> 8;
+ ctx->data[61] = ctx->bitlen[0] >> 16;
+ ctx->data[60] = ctx->bitlen[0] >> 24;
+ ctx->data[59] = ctx->bitlen[1];
+ ctx->data[58] = ctx->bitlen[1] >> 8;
+ ctx->data[57] = ctx->bitlen[1] >> 16;
+ ctx->data[56] = ctx->bitlen[1] >> 24;
+ sha256_transform(ctx, ctx->data);
+
+ // Since this implementation uses little endian byte ordering and SHA uses
+ // big endian, reverse all the bytes when copying the final state to the output hash.
+
+ for (i = 0; i < 4; ++i) {
+ hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
+ hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
}
}
-extern void sha256_hash(char *hash,const char *data,size_t len)
+extern void sha256_hash(char *hash, const char *data, size_t len)
{
sha256_ctx ctx;
sha256_init(&ctx);
- sha256_update(&ctx,(uint8_t *)data,(int)len);
- sha256_final((uint8_t *)hash,&ctx);
+ sha256_update(&ctx, (uint8_t *)data, (int)len);
+ sha256_final((uint8_t *)hash, &ctx);
}
diff --git a/src/smtpdlog.c b/src/smtpdlog.c
index 1b44af1..c7505af 100755..100644
--- a/src/smtpdlog.c
+++ b/src/smtpdlog.c
@@ -1,11 +1,13 @@
+#include "smtpdlog.h"
+
#include <unistd.h>
+
#include "buffer.h"
-#include "str.h"
#include "byte.h"
#include "env.h"
-#include "fmt.h"
#include "exit.h"
-#include "smtpdlog.h"
+#include "fmt.h"
+#include "str.h"
#define FDLOG 2
char *reply421pgl;
@@ -21,7 +23,7 @@ char *reply554cnt;
static char strnum[FMT_ULONG];
static char logbuf[512];
-buffer bo2 = BUFFER_INIT(write,FDLOG,logbuf,sizeof(logbuf));
+buffer bo2 = BUFFER_INIT(write, FDLOG, logbuf, sizeof(logbuf));
void smtpdlog_init()
{
@@ -37,150 +39,317 @@ void smtpdlog_init()
reply554cnt = env_get("REPLY_CONTENT");
}
-static void logs(char *s) { if (buffer_puts(&bo2,s) == -1) _exit(1); } /* single string */
-static void logp(char *s) { logs(" P:"); logs(s); } /* protocol */
-static void logh(char *s1,char *s2,char *s3) { logs(" S:"); logs(s1); logs(":"); logs(s2); logs(" H:"); logs(s3); } /* host */
-static void logm(char *s) { logs(" F:"); logs(s); } /* mailfrom */
-static void logt(char *s) { logs(" T:"); logs(s); } /* rcptto */
-static void logi(char *s) { logs(" '"); logs(s); logs("'"); } /* information */
-static void logn(char *s) { if (buffer_puts(&bo2,s) == -1 ) _exit(1); if (buffer_flush(&bo2) == -1) _exit(1); } /* end */
-static void logpid() { strnum[fmt_ulong(strnum,getpid())] = 0; logs("qmail-smtpd: pid "); logs(strnum); logs(" "); }
+static void logs(char *s)
+{
+ if (buffer_puts(&bo2, s) == -1) _exit(1);
+} /* single string */
+static void logp(char *s)
+{
+ logs(" P:");
+ logs(s);
+} /* protocol */
+static void logh(char *s1, char *s2, char *s3)
+{
+ logs(" S:");
+ logs(s1);
+ logs(":");
+ logs(s2);
+ logs(" H:");
+ logs(s3);
+} /* host */
+static void logm(char *s)
+{
+ logs(" F:");
+ logs(s);
+} /* mailfrom */
+static void logt(char *s)
+{
+ logs(" T:");
+ logs(s);
+} /* rcptto */
+static void logi(char *s)
+{
+ logs(" '");
+ logs(s);
+ logs("'");
+} /* information */
+static void logn(char *s)
+{
+ if (buffer_puts(&bo2, s) == -1) _exit(1);
+ if (buffer_flush(&bo2) == -1) _exit(1);
+} /* end */
+static void logpid()
+{
+ strnum[fmt_ulong(strnum, getpid())] = 0;
+ logs("qmail-smtpd: pid ");
+ logs(strnum);
+ logs(" ");
+}
-void smtp_loga(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8,char *s9)
- { logpid(); logs(s1); logs(s9); logp(s2); logh(s3,s4,s5); logm(s6); logt(s7), logs(" ?~"); logi(s8); logn("\n"); } /* Auth info */
-void smtp_logb(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
- { logpid(); logs(s1); logs(s7); logp(s2); logh(s3,s4,s5); logs(" ?~"); logi(s6); logn("\n"); } /* Auth info */
-void smtp_logg(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
- { logpid(); logs(s1); logp(s2); logh(s3,s4,s5); logm(s6); logt(s7); logn("\n"); } /* Generic */
-void smtp_logh(char *s1,char *s2,char *s3,char *s4,char *s5)
- { logpid(); logs(s1); logp(s2); logh(s3,s4,s5); logn("\n"); } /* Host */
-void smtp_logi(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8)
- { logpid(); logs(s1); logp(s2); logh(s3,s4,s5); logm(s6); logt(s7); logi(s8); logn("\n"); } /* Generic + Info */
-void smtp_logr(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8)
- { logpid(); logs(s1); logs(s2); logp(s3); logh(s4,s5,s6); logm(s7); logt(s8); logn("\n"); } /* Recipient */
+void smtp_loga(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8, char *s9)
+{
+ logpid();
+ logs(s1);
+ logs(s9);
+ logp(s2);
+ logh(s3, s4, s5);
+ logm(s6);
+ logt(s7), logs(" ?~");
+ logi(s8);
+ logn("\n");
+} /* Auth info */
+void smtp_logb(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
+{
+ logpid();
+ logs(s1);
+ logs(s7);
+ logp(s2);
+ logh(s3, s4, s5);
+ logs(" ?~");
+ logi(s6);
+ logn("\n");
+} /* Auth info */
+void smtp_logg(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
+{
+ logpid();
+ logs(s1);
+ logp(s2);
+ logh(s3, s4, s5);
+ logm(s6);
+ logt(s7);
+ logn("\n");
+} /* Generic */
+void smtp_logh(char *s1, char *s2, char *s3, char *s4, char *s5)
+{
+ logpid();
+ logs(s1);
+ logp(s2);
+ logh(s3, s4, s5);
+ logn("\n");
+} /* Host */
+void smtp_logi(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
+{
+ logpid();
+ logs(s1);
+ logp(s2);
+ logh(s3, s4, s5);
+ logm(s6);
+ logt(s7);
+ logi(s8);
+ logn("\n");
+} /* Generic + Info */
+void smtp_logr(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
+{
+ logpid();
+ logs(s1);
+ logs(s2);
+ logp(s3);
+ logh(s4, s5, s6);
+ logm(s7);
+ logt(s8);
+ logn("\n");
+} /* Recipient */
-void die_read() { _exit(1); }
-void die_alarm() { out("451 timeout (#4.4.2)\r\n"); flush(); _exit(1); }
-void die_nomem() { out("421 out of memory (#4.3.0)\r\n"); flush(); _exit(1); }
-void die_control() { out("421 unable to read controls (#4.3.0)\r\n"); flush(); _exit(1); }
-void die_ipme() { out("421 unable to figure out my IP addresses (#4.3.0)\r\n"); flush(); _exit(1); }
-void die_starttls() { out("454 TLS not available due to temporary reason (#5.7.3)\r\n"); flush(); _exit(1); }
-void die_recipients() { out("421 unable to check recipients (#4.3.0)\r\n"); flush(); _exit(1); }
+void die_read()
+{
+ _exit(1);
+}
+void die_alarm()
+{
+ out("451 timeout (#4.4.2)\r\n");
+ flush();
+ _exit(1);
+}
+void die_nomem()
+{
+ out("421 out of memory (#4.3.0)\r\n");
+ flush();
+ _exit(1);
+}
+void die_control()
+{
+ out("421 unable to read controls (#4.3.0)\r\n");
+ flush();
+ _exit(1);
+}
+void die_ipme()
+{
+ out("421 unable to figure out my IP addresses (#4.3.0)\r\n");
+ flush();
+ _exit(1);
+}
+void die_starttls()
+{
+ out("454 TLS not available due to temporary reason (#5.7.3)\r\n");
+ flush();
+ _exit(1);
+}
+void die_recipients()
+{
+ out("421 unable to check recipients (#4.3.0)\r\n");
+ flush();
+ _exit(1);
+}
-void err_unimpl() { out("500 unimplemented (#5.5.1)\r\n"); }
-void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); }
-void err_noop() { out("250 ok\r\n"); }
-void err_vrfy() { out("252 send some mail, i'll try my best\r\n"); }
-void err_qqt() { out("451 qqt failure (#4.3.0)\r\n"); }
+void err_unimpl()
+{
+ out("500 unimplemented (#5.5.1)\r\n");
+}
+void err_syntax()
+{
+ out("555 syntax error (#5.5.4)\r\n");
+}
+void err_noop()
+{
+ out("250 ok\r\n");
+}
+void err_vrfy()
+{
+ out("252 send some mail, i'll try my best\r\n");
+}
+void err_qqt()
+{
+ out("451 qqt failure (#4.3.0)\r\n");
+}
-int err_child() { out("454 problem with child and I can't auth (#4.3.0)\r\n"); return -1; }
-int err_fork() { out("454 child won't start and I can't auth (#4.3.0)\r\n"); return -1; }
-int err_pipe() { out("454 unable to open pipe and I can't auth (#4.3.0)\r\n"); return -1; }
-int err_write() { out("454 unable to write pipe and I can't auth (#4.3.0)\r\n"); return -1; }
+int err_child()
+{
+ out("454 problem with child and I can't auth (#4.3.0)\r\n");
+ return -1;
+}
+int err_fork()
+{
+ out("454 child won't start and I can't auth (#4.3.0)\r\n");
+ return -1;
+}
+int err_pipe()
+{
+ out("454 unable to open pipe and I can't auth (#4.3.0)\r\n");
+ return -1;
+}
+int err_write()
+{
+ out("454 unable to write pipe and I can't auth (#4.3.0)\r\n");
+ return -1;
+}
-int err_postgl() { out("454 problem with child and I can't greylist (#4.3.0)\r\n"); return -1; }
-int err_forkgl() { out("454 problem with child and I can't greylist (#4.3.0)\r\n"); return -1; }
+int err_postgl()
+{
+ out("454 problem with child and I can't greylist (#4.3.0)\r\n");
+ return -1;
+}
+int err_forkgl()
+{
+ out("454 problem with child and I can't greylist (#4.3.0)\r\n");
+ return -1;
+}
/* TLS */
-int err_starttls()
-{
+int err_starttls()
+{
out("454 TLS not available due to temporary reason (#5.7.3)\r\n");
- _exit(1);
+ _exit(1);
}
-void err_tlsreq(char *s1,char *s2,char *s3,char *s4,char *s5)
+void err_tlsreq(char *s1, char *s2, char *s3, char *s4, char *s5)
{
- out("535 STARTTLS required (#5.7.1)\r\n");
- smtp_logh(s1,s2,s3,s4,s5);
+ out("535 STARTTLS required (#5.7.1)\r\n");
+ smtp_logh(s1, s2, s3, s4, s5);
}
/* Helo */
-void err_helo(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8)
+void err_helo(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
{
out("550 sorry, invalid HELO/EHLO greeting ");
if (reply550hlo) out(reply550hlo);
out(" (#5.7.1)\r\n");
- smtp_logi(s1,s2,s3,s4,s5,s6,s7,s8);
- }
+ smtp_logi(s1, s2, s3, s4, s5, s6, s7, s8);
+}
/* Auth */
-void err_authsetup(char *s1,char *s2,char *s3,char *s4,char *s5)
+void err_authsetup(char *s1, char *s2, char *s3, char *s4, char *s5)
+{
+ out("530 Auth not available (#5.7.1)\r\n");
+ smtp_logh(s1, s2, s3, s4, s5);
+}
+void err_authd()
{
- out("530 Auth not available (#5.7.1)\r\n");
- smtp_logh(s1,s2,s3,s4,s5);
-}
-void err_authd()
-{
out("503 you're already authenticated (#5.5.0)\r\n");
}
-void err_authmail()
-{
+void err_authmail()
+{
out("503 no auth during mail transaction (#5.5.0)\r\n");
}
-void err_authfail(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_authfail(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
- out("535 authentication failed (#5.7.1)\r\n"); smtp_logb(s1,s2,s3,s4,s5,s6,s7);
+ out("535 authentication failed (#5.7.1)\r\n");
+ smtp_logb(s1, s2, s3, s4, s5, s6, s7);
}
-void err_authreq(char *s1,char *s2,char *s3,char *s4,char *s5)
+void err_authreq(char *s1, char *s2, char *s3, char *s4, char *s5)
{
- out("535 authentication required (#5.7.1)\r\n"); smtp_logh(s1,s2,s3,s4,s5);
+ out("535 authentication required (#5.7.1)\r\n");
+ smtp_logh(s1, s2, s3, s4, s5);
}
-void err_submission(char *s1,char *s2,char *s3,char *s4,char *s5)
-{
- out("530 Authorization required (#5.7.1) \r\n"); smtp_logh(s1,s2,s3,s4,s5);
+void err_submission(char *s1, char *s2, char *s3, char *s4, char *s5)
+{
+ out("530 Authorization required (#5.7.1) \r\n");
+ smtp_logh(s1, s2, s3, s4, s5);
}
-int err_authabort()
-{
+int err_authabort()
+{
out("501 auth exchange canceled (#5.0.0)\r\n");
return -1;
}
-int err_authinput()
-{
+int err_authinput()
+{
out("501 malformed auth input (#5.5.4)\r\n");
return -1;
}
-void err_authinvalid(char *s1,char *s2,char *s3,char *s4,char *s5)
-{
+void err_authinvalid(char *s1, char *s2, char *s3, char *s4, char *s5)
+{
out("504 auth type unimplemented (#5.5.1)\r\n");
- smtp_logh(s1,s2,s3,s4,s5);
+ smtp_logh(s1, s2, s3, s4, s5);
}
-int err_noauth()
-{
+int err_noauth()
+{
out("504 auth type unimplemented (#5.5.1)\r\n");
return -1;
}
/* Mail From: */
-void err_wantmail() { out("503 MAIL first (#5.5.1)\r\n"); }
+void err_wantmail()
+{
+ out("503 MAIL first (#5.5.1)\r\n");
+}
-void err_mav(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_mav(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("553 sorry, invalid sender address specified ");
if (reply553inv) out(reply553inv);
out(" (#5.7.1)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_bmf(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8)
+void err_bmf(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
{
out("553 sorry, your envelope sender is in my badmailfrom list ");
if (reply553bmf) out(reply553bmf);
out(" (#5.7.1)\r\n");
- smtp_logi(s1,s2,s3,s4,s5,s6,s7,s8);
+ smtp_logi(s1, s2, s3, s4, s5, s6, s7, s8);
}
-void err_mfdns(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_mfdns(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("553 sorry, your envelope sender must exist ");
if (reply553env) out(reply553env);
out(" (#5.7.1)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
/* SPF */
-void err_spf(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *msg)
+void err_spf(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *msg)
{
int i, j;
int len = str_len(msg);
@@ -196,76 +365,80 @@ void err_spf(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char
out("550 ");
out(msg);
}
- }
+ }
out(" (#5.7.1)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
/* Rcpt To: */
-void err_wantrcpt() { out("503 RCPT first (#5.5.1)\r\n"); }
+void err_wantrcpt()
+{
+ out("503 RCPT first (#5.5.1)\r\n");
+}
-void postgrey(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void postgrey(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("421 greylisted");
if (reply421pgl) out(reply421pgl);
out(" (#4.3.0)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_nogateway(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_nogateway(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("553 sorry, that domain isn't in my list of allowed rcpthosts ");
if (reply553ngw) out(reply553ngw);
out(" (#5.7.1)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_brt(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_brt(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("553 sorry, your envelope recipient is in my badrcptto list ");
if (reply553brt) out(reply553brt);
out(" (#5.7.1)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_rcpts(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_rcpts(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
- out("452 sorry, too many recipients (#4.5.3)\r\n"); /* RFC 5321 */
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ out("452 sorry, too many recipients (#4.5.3)\r\n"); /* RFC 5321 */
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_recipient(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_recipient(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
if (env_get("RECIPIENTS450"))
out("450 sorry, mailbox currently unavailable (#4.2.1)\r\n");
else {
out("550 sorry, no mailbox by that name ");
- if (reply550mbx) out(reply550mbx); out(" (#5.7.1)\r\n");
+ if (reply550mbx) out(reply550mbx);
+ out(" (#5.7.1)\r\n");
}
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
/* Data */
-void straynewline()
+void straynewline()
{
out("451 Bare Line Feeds (LF) are not accepted in SMTP; CRLF is required according to RFC 2822.\r\n");
- flush();
- _exit(1);
+ flush();
+ _exit(1);
}
-void err_notorious()
-{
+void err_notorious()
+{
out("503 DATA command not accepted at this time (#5.5.1)\r\n");
flush();
_exit(1);
}
-void err_size(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7)
+void err_size(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7)
{
out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n");
- smtp_logg(s1,s2,s3,s4,s5,s6,s7);
+ smtp_logg(s1, s2, s3, s4, s5, s6, s7);
}
-void err_data(char *s1,char *s2,char *s3,char *s4,char *s5,char *s6,char *s7,char *s8)
+void err_data(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
{
out("554 sorry, invalid message content ");
if (reply554cnt) out(reply554cnt);
out(" (#5.3.2)\r\n");
- smtp_logi(s1,s2,s3,s4,s5,s6,s7,s8);
+ smtp_logi(s1, s2, s3, s4, s5, s6, s7, s8);
}
diff --git a/src/spawn.c b/src/spawn.c
index effcb26..5315637 100644
--- a/src/spawn.c
+++ b/src/spawn.c
@@ -1,37 +1,37 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
+
#include "alloc.h"
-#include "sig.h"
-#include "wait.h"
#include "buffer.h"
#include "byte.h"
-#include "str.h"
-#include "stralloc.h"
-#include "select.h"
+#include "error.h"
#include "exit.h"
#include "fd.h"
#include "open.h"
-#include "error.h"
+#include "select.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+#include "wait.h"
+
#include "auto_qmail.h"
-#include "auto_uids.h"
#include "auto_spawn.h"
+#include "auto_uids.h"
extern int truncreport;
extern int spawn();
extern void report();
extern void initialize();
-struct delivery
- {
+struct delivery {
int used;
- int fdin; /* pipe input */
- int pid; /* zero if child is dead */
+ int fdin; /* pipe input */
+ int pid; /* zero if child is dead */
int wstat; /* if !pid: status of child */
int fdout; /* pipe output, -1 if !pid; delays eof until after death */
stralloc output;
- }
-;
+};
struct delivery *d;
@@ -42,32 +42,35 @@ void sigchld()
int i;
while ((pid = wait_nohang(&wstat)) > 0)
- for (i = 0; i < auto_spawn; ++i)
+ for (i = 0; i < auto_spawn; ++i)
if (d[i].used)
if (d[i].pid == pid) {
- close(d[i].fdout); d[i].fdout = -1;
- d[i].wstat = wstat; d[i].pid = 0;
+ close(d[i].fdout);
+ d[i].fdout = -1;
+ d[i].wstat = wstat;
+ d[i].pid = 0;
}
-}
+}
int flagwriting = 1;
-ssize_t okwrite(int fd,char *buf,int n)
+ssize_t okwrite(int fd, char *buf, int n)
{
int w;
if (!flagwriting) return n;
- w = write(fd,buf,n);
+ w = write(fd, buf, n);
if (w != -1) return w;
if (errno == EINTR) return -1;
- flagwriting = 0; close(fd);
+ flagwriting = 0;
+ close(fd);
return n;
}
int flagreading = 1;
-char outbuf[1024];
+char outbuf[1024];
buffer bo;
-int stage = 0; /* reading 0:delnum 1:messid 2:sender 3:recip */
+int stage = 0; /* reading 0:delnum 1:messid 2:sender 3:recip */
int flagabort = 0; /* if 1, everything except delnum is garbage */
int delnum;
stralloc messid = {0};
@@ -76,12 +79,12 @@ stralloc recip = {0};
void err(char *s)
{
- char ch;
-
- ch = delnum;
- buffer_put(&bo,&ch,1);
- buffer_puts(&bo,s);
- buffer_putflush(&bo,"",1);
+ char ch;
+
+ ch = delnum;
+ buffer_put(&bo, &ch, 1);
+ buffer_puts(&bo, s);
+ buffer_putflush(&bo, "", 1);
}
void docmd()
@@ -93,57 +96,105 @@ void docmd()
int pi[2];
struct stat st;
- if (flagabort) { err("Zqmail-spawn: Out of memory. (#4.3.0)\n"); return; }
- if (delnum < 0) { err("Zqmail-spawn: Internal error: delnum negative. (#4.3.5)\n"); return; }
- if (delnum >= auto_spawn) { err("Zqmail-spawn: Internal error: delnum too big. (#4.3.5)\n"); return; }
- if (d[delnum].used) { err("Zqmail-spawn: Internal error: delnum in use. (#4.3.5)\n"); return; }
-
+ if (flagabort) {
+ err("Zqmail-spawn: Out of memory. (#4.3.0)\n");
+ return;
+ }
+ if (delnum < 0) {
+ err("Zqmail-spawn: Internal error: delnum negative. (#4.3.5)\n");
+ return;
+ }
+ if (delnum >= auto_spawn) {
+ err("Zqmail-spawn: Internal error: delnum too big. (#4.3.5)\n");
+ return;
+ }
+ if (d[delnum].used) {
+ err("Zqmail-spawn: Internal error: delnum in use. (#4.3.5)\n");
+ return;
+ }
+
for (i = 0; i < messid.len; ++i)
if (messid.s[i])
if (!i || (messid.s[i] != '/'))
- if ((unsigned char) (messid.s[i] - '0') > 9)
- { err("Dqmail-spawn: Internal error: messid has nonnumerics. (#5.3.5)\n"); return; }
+ if ((unsigned char)(messid.s[i] - '0') > 9) {
+ err("Dqmail-spawn: Internal error: messid has nonnumerics. (#5.3.5)\n");
+ return;
+ }
- if (messid.len > 100) { err("Dqmail-spawn: Internal error: messid too long. (#5.3.5)\n"); return; }
- if (!messid.s[0]) { err("Dqmail-spawn: Internal error: messid too short. (#5.3.5)\n"); return; }
+ if (messid.len > 100) {
+ err("Dqmail-spawn: Internal error: messid too long. (#5.3.5)\n");
+ return;
+ }
+ if (!messid.s[0]) {
+ err("Dqmail-spawn: Internal error: messid too short. (#5.3.5)\n");
+ return;
+ }
- if (!stralloc_copys(&d[delnum].output,""))
- { err("Zqmail-spawn: Out of memory. (#4.3.0)\n"); return; }
+ if (!stralloc_copys(&d[delnum].output, "")) {
+ err("Zqmail-spawn: Out of memory. (#4.3.0)\n");
+ return;
+ }
- j = byte_rchr(recip.s,recip.len,'@');
- if (j >= recip.len) { err("DSorry, address must include host name. (#5.1.3)\n"); return; }
+ j = byte_rchr(recip.s, recip.len, '@');
+ if (j >= recip.len) {
+ err("DSorry, address must include host name. (#5.1.3)\n");
+ return;
+ }
fdmess = open_read(messid.s);
- if (fdmess == -1) { err("Zqmail-spawn: Unable to open message. (#4.3.0)\n"); return; }
+ if (fdmess == -1) {
+ err("Zqmail-spawn: Unable to open message. (#4.3.0)\n");
+ return;
+ }
- if (fstat(fdmess,&st) == -1)
- { close(fdmess); err("Zqmail-spawn: Unable to fstat message. (#4.3.0)\n"); return; }
- if ((st.st_mode & S_IFMT) != S_IFREG)
- { close(fdmess); err("ZSorry, message has wrong type. (#4.3.5)\n"); return; }
+ if (fstat(fdmess, &st) == -1) {
+ close(fdmess);
+ err("Zqmail-spawn: Unable to fstat message. (#4.3.0)\n");
+ return;
+ }
+ if ((st.st_mode & S_IFMT) != S_IFREG) {
+ close(fdmess);
+ err("ZSorry, message has wrong type. (#4.3.5)\n");
+ return;
+ }
if (st.st_uid != auto_uidq) /* aaack! qmailq has to be trusted! */
- /* your security is already toast at this point. damage control... */
- { close(fdmess); err("ZSorry, message has wrong owner. (#4.3.5)\n"); return; }
+ /* your security is already toast at this point. damage control... */
+ {
+ close(fdmess);
+ err("ZSorry, message has wrong owner. (#4.3.5)\n");
+ return;
+ }
if (pipe(pi) == -1) {
- if (errno == EFAULT) err("Zqmail-spawn: Unable to create pipe (wrong fildes). (#4.3.0)\n");
- else if (errno == EMFILE) err("Zqmail-spawn: Unable to create pipe (too many FDS). (#4.3.0)\n");
- else if (errno == ENFILE) err("Zqmail-spawn: Unable to create pipe (system file table full). (#4.3.0)\n");
- else if (errno == ENOMEM) err("Zqmail-spawn: Unable to create pipe (out of memory). (#4.3.0)\n");
- else err("Zqmail-spawn: Unable to create pipe (unkown reason). (#4.3.0)\n");
- close(fdmess);
- return;
+ if (errno == EFAULT)
+ err("Zqmail-spawn: Unable to create pipe (wrong fildes). (#4.3.0)\n");
+ else if (errno == EMFILE)
+ err("Zqmail-spawn: Unable to create pipe (too many FDS). (#4.3.0)\n");
+ else if (errno == ENFILE)
+ err("Zqmail-spawn: Unable to create pipe (system file table full). (#4.3.0)\n");
+ else if (errno == ENOMEM)
+ err("Zqmail-spawn: Unable to create pipe (out of memory). (#4.3.0)\n");
+ else
+ err("Zqmail-spawn: Unable to create pipe (unkown reason). (#4.3.0)\n");
+ close(fdmess);
+ return;
}
fd_coe(pi[0]);
- f = spawn(fdmess,pi[1],sender.s,recip.s,j);
+ f = spawn(fdmess, pi[1], sender.s, recip.s, j);
close(fdmess);
- if (f == -1)
- { close(pi[0]); close(pi[1]); err("Zqmail-spawn: Unable to fork. (#4.3.0)\n"); return; }
+ if (f == -1) {
+ close(pi[0]);
+ close(pi[1]);
+ err("Zqmail-spawn: Unable to fork. (#4.3.0)\n");
+ return;
+ }
d[delnum].fdin = pi[0];
- d[delnum].fdout = pi[1]; fd_coe(pi[1]);
+ d[delnum].fdout = pi[1];
+ fd_coe(pi[1]);
d[delnum].pid = f;
d[delnum].used = 1;
}
@@ -156,41 +207,50 @@ void getcmd()
int r;
char ch;
- r = read(0,cmdbuf,sizeof(cmdbuf));
- if (r == 0)
- { flagreading = 0; return; }
+ r = read(0, cmdbuf, sizeof(cmdbuf));
+ if (r == 0) {
+ flagreading = 0;
+ return;
+ }
if (r == -1) {
- if (errno != EINTR)
- flagreading = 0;
+ if (errno != EINTR) flagreading = 0;
return;
}
-
+
for (i = 0; i < r; ++i) {
ch = cmdbuf[i];
switch (stage) {
case 0:
- delnum = (unsigned int) (unsigned char) ch;
- messid.len = 0; stage = 1; break;
+ delnum = (unsigned int)(unsigned char)ch;
+ messid.len = 0;
+ stage = 1;
+ break;
case 1:
- if (!stralloc_append(&messid,&ch)) flagabort = 1;
+ if (!stralloc_append(&messid, &ch)) flagabort = 1;
if (ch) break;
- sender.len = 0; stage = 2; break;
+ sender.len = 0;
+ stage = 2;
+ break;
case 2:
- if (!stralloc_append(&sender,&ch)) flagabort = 1;
+ if (!stralloc_append(&sender, &ch)) flagabort = 1;
if (ch) break;
- recip.len = 0; stage = 3; break;
+ recip.len = 0;
+ stage = 3;
+ break;
case 3:
- if (!stralloc_append(&recip,&ch)) flagabort = 1;
+ if (!stralloc_append(&recip, &ch)) flagabort = 1;
if (ch) break;
docmd();
- flagabort = 0; stage = 0; break;
+ flagabort = 0;
+ stage = 0;
+ break;
}
}
}
char inbuf[128];
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
char ch;
int i;
@@ -200,77 +260,78 @@ int main(int argc,char **argv)
if (chdir(auto_qmail) == -1) _exit(110);
if (chdir("queue/mess") == -1) _exit(110);
- if (!stralloc_copys(&messid,"")) _exit(111);
- if (!stralloc_copys(&sender,"")) _exit(111);
- if (!stralloc_copys(&recip,"")) _exit(111);
+ if (!stralloc_copys(&messid, "")) _exit(111);
+ if (!stralloc_copys(&sender, "")) _exit(111);
+ if (!stralloc_copys(&recip, "")) _exit(111);
- d = (struct delivery *) alloc((auto_spawn + 10) * sizeof(struct delivery));
+ d = (struct delivery *)alloc((auto_spawn + 10) * sizeof(struct delivery));
if (!d) _exit(111);
- buffer_init(&bo,okwrite,1,outbuf,sizeof(outbuf));
+ buffer_init(&bo, okwrite, 1, outbuf, sizeof(outbuf));
sig_pipeignore();
sig_childcatch(sigchld);
- initialize(argc,argv);
+ initialize(argc, argv);
- ch = auto_spawn;
- buffer_putflush(&bo,&ch,1);
+ ch = auto_spawn;
+ buffer_putflush(&bo, &ch, 1);
- for (i = 0; i < auto_spawn; ++i)
- { d[i].used = 0; d[i].output.s = 0; }
+ for (i = 0; i < auto_spawn; ++i) {
+ d[i].used = 0;
+ d[i].output.s = 0;
+ }
for (;;) {
if (!flagreading) {
- for (i = 0; i < auto_spawn; ++i) if (d[i].used) break;
+ for (i = 0; i < auto_spawn; ++i)
+ if (d[i].used) break;
if (i >= auto_spawn) _exit(0);
}
sig_childunblock();
FD_ZERO(&rfds);
- if (flagreading) FD_SET(0,&rfds);
+ if (flagreading) FD_SET(0, &rfds);
nfds = 1;
- for (i = 0; i < auto_spawn; ++i)
- if (d[i].used) {
- FD_SET(d[i].fdin,&rfds);
- if (d[i].fdin >= nfds)
- nfds = d[i].fdin + 1;
+ for (i = 0; i < auto_spawn; ++i)
+ if (d[i].used) {
+ FD_SET(d[i].fdin, &rfds);
+ if (d[i].fdin >= nfds) nfds = d[i].fdin + 1;
}
- r = select(nfds,&rfds,(fd_set *) 0,(fd_set *) 0,(struct timeval *) 0);
+ r = select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
sig_childblock();
if (r != -1) {
if (flagreading)
- if (FD_ISSET(0,&rfds)) getcmd();
- for (i = 0; i < auto_spawn; ++i)
+ if (FD_ISSET(0, &rfds)) getcmd();
+ for (i = 0; i < auto_spawn; ++i)
if (d[i].used)
- if (FD_ISSET(d[i].fdin,&rfds)) {
- r = read(d[i].fdin,inbuf,128);
- if (r == -1)
- continue; /* read error on a readable pipe? be serious */
- if (r == 0) {
- ch = i;
- buffer_put(&bo,&ch,1);
- report(&bo,d[i].wstat,d[i].output.s,d[i].output.len);
- buffer_put(&bo,"",1);
- buffer_flush(&bo);
- close(d[i].fdin); d[i].used = 0;
- continue;
- }
- while (!stralloc_readyplus(&d[i].output,r))
- sleep(10); /*XXX*/
- byte_copy(d[i].output.s + d[i].output.len,r,inbuf);
- d[i].output.len += r;
- if (truncreport > 100)
- if (d[i].output.len > truncreport) {
- char *truncmess = "\nError report too long, sorry.\n";
- d[i].output.len = truncreport - str_len(truncmess) - 3;
- stralloc_cats(&d[i].output,truncmess);
+ if (FD_ISSET(d[i].fdin, &rfds)) {
+ r = read(d[i].fdin, inbuf, 128);
+ if (r == -1) continue; /* read error on a readable pipe? be serious */
+ if (r == 0) {
+ ch = i;
+ buffer_put(&bo, &ch, 1);
+ report(&bo, d[i].wstat, d[i].output.s, d[i].output.len);
+ buffer_put(&bo, "", 1);
+ buffer_flush(&bo);
+ close(d[i].fdin);
+ d[i].used = 0;
+ continue;
+ }
+ while (!stralloc_readyplus(&d[i].output, r)) sleep(10); /*XXX*/
+ byte_copy(d[i].output.s + d[i].output.len, r, inbuf);
+ d[i].output.len += r;
+ if (truncreport > 100)
+ if (d[i].output.len > truncreport) {
+ char *truncmess = "\nError report too long, sorry.\n";
+ d[i].output.len = truncreport - str_len(truncmess) - 3;
+ stralloc_cats(&d[i].output, truncmess);
+ }
}
- }
}
}
}
diff --git a/src/spf.c b/src/spf.c
index 2b61ba1..a4d31d3 100644
--- a/src/spf.c
+++ b/src/spf.c
@@ -1,34 +1,36 @@
-#include "stralloc.h"
+#include "spf.h"
+
#include "alloc.h"
+#include "byte.h"
+#include "case.h"
+#include "fmt.h"
#include "ip.h"
+#include "scan.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
#include "ipalloc.h"
#include "ipme.h"
-#include "str.h"
-#include "fmt.h"
-#include "scan.h"
-#include "byte.h"
#include "now.h"
-#include "dns.h"
-#include "case.h"
-#include "spf.h"
/* long lived SPF variables (output) */
-stralloc spfinfo = {0}; /* SPF results - see spf.h */
-stralloc spfrecord = {0}; /* Used for diagnostics */
+stralloc spfinfo = {0}; /* SPF results - see spf.h */
+stralloc spfrecord = {0}; /* Used for diagnostics */
/* s/qmail control SPF variables (input) */
-stralloc spflocalrules; /* Local rules provided here */
-stralloc spfexplain; /* Default SPF_EXPMSG in spf.h */
+stralloc spflocalrules; /* Local rules provided here */
+stralloc spfexplain; /* Default SPF_EXPMSG in spf.h */
-stralloc spfmf = {0}; /* aka envelopefrom = clientid */
-stralloc spfhelo = {0}; /* helo or domain part for spfmf */
-stralloc dnsname = {0}; /* FQDN of client host in DNS */
-stralloc spflocal = {0}; /* Receiving host */
+stralloc spfmf = {0}; /* aka envelopefrom = clientid */
+stralloc spfhelo = {0}; /* helo or domain part for spfmf */
+stralloc dnsname = {0}; /* FQDN of client host in DNS */
+stralloc spflocal = {0}; /* Receiving host */
-stralloc spfexpmsg = {0}; /* additional explanation given as 5xx SMTP response */
-stralloc expdomain = {0}; /* the domain, for which explanation is given */
+stralloc spfexpmsg = {0}; /* additional explanation given as 5xx SMTP response */
+stralloc expdomain = {0}; /* the domain, for which explanation is given */
int flagip6;
stralloc domain = {0};
@@ -55,75 +57,81 @@ Exists+Expand: exists.com TXT "v=spf1 exists:%{ir}.%{l1r+-}._spf.%{d} -all"
*/
-int spf_query(const char *remoteip,const char *helo,const char *mf,const char *local,const int flagip)
+int spf_query(
+ const char *remoteip, const char *helo, const char *mf, const char *local, const int flagip)
{
int at;
int r = SPF_INIT;
flagip6 = flagip;
- if (!stralloc_copys(&spfinfo," ")) return SPF_NOMEM;
-
+ if (!stralloc_copys(&spfinfo, " ")) return SPF_NOMEM;
+
switch (flagip6) {
- case -1: if (!spf_info("MLocal=",remoteip)) return SPF_NOMEM;
- if (!spf_info("R:","+")) return SPF_NOMEM;
- break;
- case 0: if (!ip4_scan(remoteip,ip4remote)) return SPF_SYNTAX;
- if (ipme_is4(ip4remote) == 1) {
- if (!spf_info("MLocal=",remoteip)) return SPF_NOMEM;
- if (!spf_info("R:","+")) return SPF_NOMEM;
- return SPF_ME;
- } break;
- case 1: if (!ip6_scan(remoteip,ip6remote)) return SPF_SYNTAX;
- if (ipme_is6(ip6remote) == 1) {
- if (!spf_info("MLocal=",remoteip)) return SPF_NOMEM;
- if (!spf_info("R:","+")) return SPF_NOMEM;
- return SPF_ME;
- } break;
+ case -1:
+ if (!spf_info("MLocal=", remoteip)) return SPF_NOMEM;
+ if (!spf_info("R:", "+")) return SPF_NOMEM;
+ break;
+ case 0:
+ if (!ip4_scan(remoteip, ip4remote)) return SPF_SYNTAX;
+ if (ipme_is4(ip4remote) == 1) {
+ if (!spf_info("MLocal=", remoteip)) return SPF_NOMEM;
+ if (!spf_info("R:", "+")) return SPF_NOMEM;
+ return SPF_ME;
+ }
+ break;
+ case 1:
+ if (!ip6_scan(remoteip, ip6remote)) return SPF_SYNTAX;
+ if (ipme_is6(ip6remote) == 1) {
+ if (!spf_info("MLocal=", remoteip)) return SPF_NOMEM;
+ if (!spf_info("R:", "+")) return SPF_NOMEM;
+ return SPF_ME;
+ }
+ break;
}
if (helo && str_len(helo)) {
- if (!stralloc_copys(&spfhelo,helo)) return SPF_NOMEM;
+ if (!stralloc_copys(&spfhelo, helo)) return SPF_NOMEM;
} else {
- if (!stralloc_copys(&spfhelo,"unknown")) return SPF_NOMEM;
+ if (!stralloc_copys(&spfhelo, "unknown")) return SPF_NOMEM;
}
if (!stralloc_0(&spfhelo)) return SPF_NOMEM;
if (mf && str_len(mf)) {
- if (!stralloc_copys(&spfmf,mf)) return SPF_NOMEM;
+ if (!stralloc_copys(&spfmf, mf)) return SPF_NOMEM;
if (!stralloc_0(&spfmf)) return SPF_NOMEM;
- at = str_rchr(spfmf.s,'@');
+ at = str_rchr(spfmf.s, '@');
if (spfmf.s[at] == '@') {
- if (!stralloc_copys(&domain,spfmf.s + at + 1)) return SPF_NOMEM;
+ if (!stralloc_copys(&domain, spfmf.s + at + 1)) return SPF_NOMEM;
} else {
-// if (!stralloc_0(&spfhelo)) return SPF_NOMEM;
- if (!stralloc_copys(&domain,&spfhelo)) return SPF_NOMEM;
+ // if (!stralloc_0(&spfhelo)) return SPF_NOMEM;
+ if (!stralloc_copys(&domain, &spfhelo)) return SPF_NOMEM;
}
- if (!stralloc_copy(&identity,&domain)) return SPF_NOMEM;
+ if (!stralloc_copy(&identity, &domain)) return SPF_NOMEM;
}
if (!stralloc_0(&identity)) return SPF_NOMEM;
if (local && str_len(local)) {
- if (!stralloc_copys(&spflocal,local)) return SPF_NOMEM;
+ if (!stralloc_copys(&spflocal, local)) return SPF_NOMEM;
} else {
- if (!stralloc_copys(&spflocal,"localhost")) return SPF_NOMEM;
+ if (!stralloc_copys(&spflocal, "localhost")) return SPF_NOMEM;
}
if (!stralloc_0(&spflocal)) return SPF_NOMEM;
- if (!spf_info("S=",remoteip)) return SPF_NOMEM;
- if (!spf_info("O=",spfmf.s)) return SPF_NOMEM;
- if (!spf_info("C=",identity.s)) return SPF_NOMEM;
- if (!spf_info("H=",spfhelo.s)) return SPF_NOMEM;
+ if (!spf_info("S=", remoteip)) return SPF_NOMEM;
+ if (!spf_info("O=", spfmf.s)) return SPF_NOMEM;
+ if (!spf_info("C=", identity.s)) return SPF_NOMEM;
+ if (!spf_info("H=", spfhelo.s)) return SPF_NOMEM;
- if (!stralloc_copy(&spfexpmsg,&spfexplain)) return SPF_NOMEM;
- if (!stralloc_0(&spfexpmsg)) return SPF_NOMEM;
+ if (!stralloc_copy(&spfexpmsg, &spfexplain)) return SPF_NOMEM;
+ if (!stralloc_0(&spfexpmsg)) return SPF_NOMEM;
recursion = 0;
dnsname.len = 0;
if (r == SPF_INIT) r = spf_lookup(&domain);
if (r == SPF_LOOP) {
- if (!spf_info("P=","Maximum nesting level exceeded; possible loop")) return SPF_NOMEM;
- if (!spf_info("R:","e")) return SPF_NOMEM;
+ if (!spf_info("P=", "Maximum nesting level exceeded; possible loop")) return SPF_NOMEM;
+ if (!spf_info("R:", "e")) return SPF_NOMEM;
}
if (r < 0) r = SPF_UNKNOWN; /* return 2main */
@@ -136,14 +144,14 @@ static struct spf_aliases {
char *alias;
int defrc;
} spf_aliases[] = {
- { "allow", SPF_OK }
-, { "pass", SPF_OK }
-, { "deny", SPF_FAIL }
-, { "softdeny",SPF_SOFTFAIL }
-, { "fail", SPF_FAIL }
-, { "softfail",SPF_SOFTFAIL }
-, { "unknown", SPF_NEUTRAL }
-, { 0, SPF_UNKNOWN }
+ { "allow", SPF_OK},
+ { "pass", SPF_OK},
+ { "deny", SPF_FAIL},
+ {"softdeny", SPF_SOFTFAIL},
+ { "fail", SPF_FAIL},
+ {"softfail", SPF_SOFTFAIL},
+ { "unknown", SPF_NEUTRAL},
+ { 0, SPF_UNKNOWN}
};
/**
@@ -155,7 +163,7 @@ static struct spf_aliases {
@return int r = SPF return code
*/
-int spf_lookup(stralloc *domain)
+int spf_lookup(stralloc *domain)
{
stralloc spfdata = {0};
stralloc sa = {0};
@@ -164,7 +172,7 @@ int spf_lookup(stralloc *domain)
int local_pos = -1;
int localrules = 0;
int q = -1;
- int i, r;
+ int i, r;
int begin, pos;
int spfrc;
int done;
@@ -172,64 +180,64 @@ int spf_lookup(stralloc *domain)
/* Fallthrough result */
- REDIRECT:
- if (++recursion > LOOKUP_LIMIT) return SPF_EXHAUST;
+REDIRECT:
+ if (++recursion > LOOKUP_LIMIT) return SPF_EXHAUST;
- if (!stralloc_copys(&expdomain,domain->s)) return SPF_NOMEM; // *FIXME */
+ if (!stralloc_copys(&expdomain, domain->s)) return SPF_NOMEM; // *FIXME */
- if (!stralloc_copys(&spfdata,"")) return SPF_NOMEM;
- r = spf_records(&spfdata,domain);
+ if (!stralloc_copys(&spfdata, "")) return SPF_NOMEM;
+ r = spf_records(&spfdata, domain);
if (!stralloc_0(domain)) return SPF_NOMEM;
- if (first) if (!stralloc_copys(&spfrecord,"")) return SPF_NOMEM;
- if (!stralloc_cats(&spfrecord,"(")) return SPF_NOMEM;
- if (!stralloc_cat(&spfrecord,domain)) return SPF_NOMEM;
- if (!stralloc_cats(&spfrecord,")")) return SPF_NOMEM;
- if (!stralloc_cats(&spfrecord," => ")) return SPF_NOMEM;
- if (!stralloc_cat(&spfrecord,&spfdata)) return SPF_NOMEM;
- if (!stralloc_cats(&spfrecord,"\n")) return SPF_NOMEM;
+ if (first)
+ if (!stralloc_copys(&spfrecord, "")) return SPF_NOMEM;
+ if (!stralloc_cats(&spfrecord, "(")) return SPF_NOMEM;
+ if (!stralloc_cat(&spfrecord, domain)) return SPF_NOMEM;
+ if (!stralloc_cats(&spfrecord, ")")) return SPF_NOMEM;
+ if (!stralloc_cats(&spfrecord, " => ")) return SPF_NOMEM;
+ if (!stralloc_cat(&spfrecord, &spfdata)) return SPF_NOMEM;
+ if (!stralloc_cats(&spfrecord, "\n")) return SPF_NOMEM;
if (!stralloc_0(&spfrecord)) return SPF_NOMEM;
/* In spite of none-existing SPF data, use local rules as substitude */
- if (r == SPF_NONE) { /* No SPF records published */
- if (!first) {
- return r;
+ if (r == SPF_NONE) { /* No SPF records published */
+ if (!first) {
+ return r;
} else {
spfdata.len = 0;
}
- if (localrules) { /* append local ruleset */
+ if (localrules) { /* append local ruleset */
local_pos = spfdata.len;
- if (!stralloc_cats(&spfdata,spflocalrules.s)) return SPF_NOMEM;
+ if (!stralloc_cats(&spfdata, spflocalrules.s)) return SPF_NOMEM;
}
if (!stralloc_0(&spfdata)) return SPF_NOMEM;
- if (!stralloc_copys(&expdomain,"")) return SPF_NOMEM;
-
- } else if (r == SPF_OK) { /* SPF records published */
+ if (!stralloc_copys(&expdomain, "")) return SPF_NOMEM;
+
+ } else if (r == SPF_OK) { /* SPF records published */
if (!stralloc_0(&spfdata)) return SPF_NOMEM;
r = SPF_NEUTRAL;
if (first && localrules) { /* try to add local rules before failure of all mechs */
pos = 0;
- p = (char *) 0;
+ p = (char *)0;
while (pos < spfdata.len) {
- NXTOK(begin,pos,&spfdata);
+ NXTOK(begin, pos, &spfdata);
if (!spfdata.s[begin]) continue;
- if (p && spfdata.s[begin] != *p) p = (char *) 0;
- if (!p && (spfdata.s[begin] == '-' ||
- spfdata.s[begin] == '~' ||
- spfdata.s[begin] == '?')) p = &spfdata.s[begin];
+ if (p && spfdata.s[begin] != *p) p = (char *)0;
+ if (!p && (spfdata.s[begin] == '-' || spfdata.s[begin] == '~' || spfdata.s[begin] == '?'))
+ p = &spfdata.s[begin];
- if (p && p > spfdata.s && case_equals(spfdata.s + begin + 1,"all")) {
+ if (p && p > spfdata.s && case_equals(spfdata.s + begin + 1, "all")) {
/* ok, we can insert the local rules at p */
local_pos = p - spfdata.s;
- if (!stralloc_readyplus(&spfdata,spflocalrules.len)) return 0;
+ if (!stralloc_readyplus(&spfdata, spflocalrules.len)) return 0;
p = spfdata.s + local_pos;
- byte_copyr(p + spflocalrules.len,spfdata.len - local_pos,p);
- byte_copy(p,spflocalrules.len,spflocalrules.s);
+ byte_copyr(p + spflocalrules.len, spfdata.len - local_pos, p);
+ byte_copy(p, spflocalrules.len, spflocalrules.s);
spfdata.len += spflocalrules.len;
pos += spflocalrules.len;
@@ -241,8 +249,8 @@ int spf_lookup(stralloc *domain)
for (i = 0; i < pos; i++)
if (!spfdata.s[i]) spfdata.s[i] = ' ';
}
-
- } else { /* Any other SPF return code */
+
+ } else { /* Any other SPF return code */
return r;
}
@@ -251,15 +259,15 @@ int spf_lookup(stralloc *domain)
pos = 0;
done = 0;
while (pos < spfdata.len) {
- NXTOK(begin,pos,&spfdata);
+ NXTOK(begin, pos, &spfdata);
if (!spfdata.s[begin]) continue;
- if (!done && localrules) { /* in local ruleset? */
+ if (!done && localrules) { /* in local ruleset? */
if (local_pos >= 0 && begin >= local_pos) {
if (begin < (local_pos + spflocalrules.len)) {
- if (!stralloc_copys(&expdomain,"")) return SPF_NOMEM;
+ if (!stralloc_copys(&expdomain, "")) return SPF_NOMEM;
} else {
- if (!stralloc_copy(&expdomain,domain)) return SPF_NOMEM;
+ if (!stralloc_copy(&expdomain, domain)) return SPF_NOMEM;
}
}
}
@@ -270,88 +278,116 @@ int spf_lookup(stralloc *domain)
if (*p == '=') {
*p++ = 0;
- if (case_equals(spfdata.s + begin,"redirect")) { /* modifiers are simply handled here */
+ if (case_equals(spfdata.s + begin, "redirect")) { /* modifiers are simply handled here */
if (done) continue;
-
-// if (!stralloc_0(domain)) return SPF_NOMEM;
- if (!spf_parse(&sa,p,domain->s)) return SPF_NOMEM;
- if (!stralloc_copy(domain,&sa)) return SPF_NOMEM;
- if (!spf_info("D=",p)) return SPF_NOMEM;
+
+ // if (!stralloc_0(domain)) return SPF_NOMEM;
+ if (!spf_parse(&sa, p, domain->s)) return SPF_NOMEM;
+ if (!stralloc_copy(domain, &sa)) return SPF_NOMEM;
+ if (!spf_info("D=", p)) return SPF_NOMEM;
r = SPF_UNKNOWN;
goto REDIRECT;
- } else if (case_equals(spfdata.s + begin,"default")) { /* we don't need those anymore */
- if (done) continue;
+ } else if (case_equals(spfdata.s + begin, "default")) { /* we don't need those anymore */
+ if (done) continue;
- for (da = spf_aliases; da->alias; ++da)
- if (case_equals(da->alias,p)) break;
+ for (da = spf_aliases; da->alias; ++da)
+ if (case_equals(da->alias, p)) break;
- r = da->defrc;
- } else if (case_equals(spfdata.s + begin,"exp")) { /* exp= only on top level */
+ r = da->defrc;
+ } else if (case_equals(spfdata.s + begin, "exp")) { /* exp= only on top level */
stralloc out = {0};
if (!first) continue;
- if (!stralloc_copys(&sa,p)) return SPF_NOMEM;
-
- switch (dns_txt(&out,&sa)) {
+ if (!stralloc_copys(&sa, p)) return SPF_NOMEM;
+
+ switch (dns_txt(&out, &sa)) {
case -1: return SPF_NOMEM;
- case 0: continue; /* nobody @home */
+ case 0: continue; /* nobody @home */
}
- if (!stralloc_copys(&spfexpmsg,out.s)) return SPF_NOMEM;
- if (!stralloc_append(&spfexpmsg,"\n")) return SPF_NOMEM;
+ if (!stralloc_copys(&spfexpmsg, out.s)) return SPF_NOMEM;
+ if (!stralloc_append(&spfexpmsg, "\n")) return SPF_NOMEM;
if (!stralloc_0(&spfexpmsg)) return SPF_NOMEM;
}
- } else if (!done) { /* and unknown modifiers are ignored */
- if (!stralloc_copys(&sa,spfdata.s + begin)) return SPF_NOMEM;
+ } else if (!done) { /* and unknown modifiers are ignored */
+ if (!stralloc_copys(&sa, spfdata.s + begin)) return SPF_NOMEM;
if (!stralloc_0(&sa)) return SPF_NOMEM;
-
+
switch (spfdata.s[begin]) {
- case '-': begin++; spfrc = SPF_FAIL; break;
- case '~': begin++; spfrc = SPF_SOFTFAIL; break;
- case '+': begin++; spfrc = SPF_OK; break;
- case '?': begin++; spfrc = SPF_NEUTRAL; break;
- default: spfrc = SPF_OK;
+ case '-':
+ begin++;
+ spfrc = SPF_FAIL;
+ break;
+ case '~':
+ begin++;
+ spfrc = SPF_SOFTFAIL;
+ break;
+ case '+':
+ begin++;
+ spfrc = SPF_OK;
+ break;
+ case '?':
+ begin++;
+ spfrc = SPF_NEUTRAL;
+ break;
+ default: spfrc = SPF_OK;
}
if (*p == '/') {
*p++ = 0;
- q = spf_mechanism(spfdata.s + begin,0,p,domain->s);
+ q = spf_mechanism(spfdata.s + begin, 0, p, domain->s);
} else {
if (*p) *p++ = 0;
- i = str_chr(p,'/');
+ i = str_chr(p, '/');
if (p[i] == '/') {
p[i++] = 0;
- q = spf_mechanism(spfdata.s + begin,p,p + i,domain->s);
+ q = spf_mechanism(spfdata.s + begin, p, p + i, domain->s);
} else if (i > 0) {
- q = spf_mechanism(spfdata.s + begin,p,0,domain->s);
+ q = spf_mechanism(spfdata.s + begin, p, 0, domain->s);
} else {
- q = spf_mechanism(spfdata.s + begin,0,0,domain->s);
+ q = spf_mechanism(spfdata.s + begin, 0, 0, domain->s);
}
}
if (q == SPF_OK) q = spfrc;
switch (q) {
- case SPF_OK: if (!spf_info("R:","+")) return SPF_NOMEM; break;
- case SPF_NEUTRAL: if (!spf_info("R:","?")) return SPF_NOMEM; break;
- case SPF_SYNTAX: if (!spf_info("P=","Unknown parse error")) return SPF_NOMEM;
- if (!spf_info("R:","e")) return SPF_NOMEM; break;
- case SPF_SOFTFAIL: if (!spf_info("R:","~")) return SPF_NOMEM; break;
- case SPF_FAIL: if (!spf_info("R:","-")) return SPF_NOMEM; break;
- case SPF_EXT: if (!spf_info("P=","Unknown SPF mechanism")) return SPF_NOMEM; break;
- case SPF_ERROR: if (localrules) if (local_pos >= 0 && begin >= local_pos) break;
- if (!spf_info("R:","o")) return SPF_NOMEM; q = SPF_NONE; break;
- case SPF_NONE: continue;
+ case SPF_OK:
+ if (!spf_info("R:", "+")) return SPF_NOMEM;
+ break;
+ case SPF_NEUTRAL:
+ if (!spf_info("R:", "?")) return SPF_NOMEM;
+ break;
+ case SPF_SYNTAX:
+ if (!spf_info("P=", "Unknown parse error")) return SPF_NOMEM;
+ if (!spf_info("R:", "e")) return SPF_NOMEM;
+ break;
+ case SPF_SOFTFAIL:
+ if (!spf_info("R:", "~")) return SPF_NOMEM;
+ break;
+ case SPF_FAIL:
+ if (!spf_info("R:", "-")) return SPF_NOMEM;
+ break;
+ case SPF_EXT:
+ if (!spf_info("P=", "Unknown SPF mechanism")) return SPF_NOMEM;
+ break;
+ case SPF_ERROR:
+ if (localrules)
+ if (local_pos >= 0 && begin >= local_pos) break;
+ if (!spf_info("R:", "o")) return SPF_NOMEM;
+ q = SPF_NONE;
+ break;
+ case SPF_NONE: continue;
}
r = q;
- done = 1; /* we're done, no more mechanisms */
+ done = 1; /* we're done, no more mechanisms */
}
}
/* we fell through, no local rule applied */
if (!done)
- if (!stralloc_copy(&expdomain,domain)) return SPF_NOMEM;
+ if (!stralloc_copy(&expdomain, domain)) return SPF_NOMEM;
return r;
}
@@ -360,23 +396,23 @@ int spf_lookup(stralloc *domain)
static struct mechanisms {
char *mechanism;
- int (*func)(char *spfspec,char *prefix);
+ int (*func)(char *spfspec, char *prefix);
unsigned int use_spfspec : 1;
- unsigned int use_prefix : 1;
- unsigned int expands : 1;
- unsigned int filldomain : 1;
- int defresult : 4;
+ unsigned int use_prefix : 1;
+ unsigned int expands : 1;
+ unsigned int filldomain : 1;
+ int defresult : 4;
} mechanisms[] = {
- { "all", 0, 0,0,0,0,SPF_OK }
-, { "include", spf_include,1,0,1,0,0 }
-, { "a", spf_a, 1,1,1,1,0 }
-, { "mx", spf_mx, 1,1,1,1,0 }
-, { "ptr", spf_ptr, 1,0,1,1,0 }
-, { "ip4", spf_ip4, 1,1,0,0,0 }
-, { "ip6", spf_ip6, 1,1,0,0,0 }
-, { "exists", spf_exists, 1,0,1,0,0 }
-, { "extension",0, 1,1,0,0,SPF_EXT }
-, { 0, 0, 1,1,0,0,SPF_EXT }
+ { "all", 0, 0, 0, 0, 0, SPF_OK},
+ { "include", spf_include, 1, 0, 1, 0, 0},
+ { "a", spf_a, 1, 1, 1, 1, 0},
+ { "mx", spf_mx, 1, 1, 1, 1, 0},
+ { "ptr", spf_ptr, 1, 0, 1, 1, 0},
+ { "ip4", spf_ip4, 1, 1, 0, 0, 0},
+ { "ip6", spf_ip6, 1, 1, 0, 0, 0},
+ { "exists", spf_exists, 1, 0, 1, 0, 0},
+ {"extension", 0, 1, 1, 0, 0, SPF_EXT},
+ { 0, 0, 1, 1, 0, 0, SPF_EXT}
};
/**
@@ -388,7 +424,7 @@ static struct mechanisms {
@return int r
*/
-int spf_mechanism(char *mechanism,char *spfspec,char *prefix,char *domain)
+int spf_mechanism(char *mechanism, char *spfspec, char *prefix, char *domain)
{
struct mechanisms *mech;
stralloc sa = {0};
@@ -396,28 +432,28 @@ int spf_mechanism(char *mechanism,char *spfspec,char *prefix,char *domain)
int pos;
for (mech = mechanisms; mech->mechanism; mech++)
- if (case_equals(mech->mechanism,mechanism)) break;
+ if (case_equals(mech->mechanism, mechanism)) break;
if (mech->use_spfspec && !spfspec && mech->filldomain) spfspec = domain;
if (!mech->use_spfspec != !spfspec) return SPF_SYNTAX;
if (mech->use_prefix && !get_prefix(prefix)) return SPF_SYNTAX;
if (!mech->func) return mech->defresult;
- if (!stralloc_readyplus(&sa,1)) return SPF_NOMEM;
+ if (!stralloc_readyplus(&sa, 1)) return SPF_NOMEM;
- if (mech->expands && case_diffs(spfspec,domain)) {
- if (!spf_parse(&sa,spfspec,domain)) return SPF_NOMEM;
+ if (mech->expands && case_diffs(spfspec, domain)) {
+ if (!spf_parse(&sa, spfspec, domain)) return SPF_NOMEM;
for (pos = 0; (sa.len - pos) > 255;) {
- pos += byte_chr(sa.s + pos,sa.len - pos,'.');
+ pos += byte_chr(sa.s + pos, sa.len - pos, '.');
if (pos < sa.len) pos++;
}
sa.len -= pos;
- if (pos > 0) byte_copy(sa.s,sa.len,sa.s + pos);
+ if (pos > 0) byte_copy(sa.s, sa.len, sa.s + pos);
if (!stralloc_0(&sa)) return SPF_NOMEM;
spfspec = sa.s;
}
- r = mech->func(spfspec,prefix);
+ r = mech->func(spfspec, prefix);
return r;
}
@@ -428,12 +464,12 @@ int spf_mechanism(char *mechanism,char *spfspec,char *prefix,char *domain)
@return int r = 1 ok; 0 failure
*/
-int spf_include(char *spfspec,char *prefix)
+int spf_include(char *spfspec, char *prefix)
{
stralloc sa = {0};
int r;
- if (!stralloc_copys(&sa,spfspec)) return SPF_NOMEM;
+ if (!stralloc_copys(&sa, spfspec)) return SPF_NOMEM;
r = spf_lookup(&sa);
switch (r) {
@@ -444,8 +480,8 @@ int spf_include(char *spfspec,char *prefix)
case SPF_FAIL: r = SPF_NONE; break;
}
if (!stralloc_0(&sa)) return SPF_NOMEM;
- if (!spf_info("I=",sa.s)) return SPF_NOMEM;
-
+ if (!spf_info("I=", sa.s)) return SPF_NOMEM;
+
return r;
}
@@ -458,34 +494,39 @@ int spf_include(char *spfspec,char *prefix)
@return int r = 1 ok; 0 failure
*/
-int spf_parse(stralloc *sa,char *spfspec,char *domain)
+int spf_parse(stralloc *sa, char *spfspec, char *domain)
{
char *p;
int pos;
char append;
- if (!stralloc_readyplus(sa,3)) return 0;
- if (!stralloc_copys(sa,"")) return 0;
+ if (!stralloc_readyplus(sa, 3)) return 0;
+ if (!stralloc_copys(sa, "")) return 0;
for (p = spfspec; *p; ++p) {
append = *p;
- if (byte_equal(p,1,"%")) {
+ if (byte_equal(p, 1, "%")) {
p++;
switch (*p) {
case '%': break;
case '_': append = ' '; break;
- case '-': if (!stralloc_cats(sa,"%20")) return 0; continue;
+ case '-':
+ if (!stralloc_cats(sa, "%20")) return 0;
+ continue;
case '{':
- pos = str_chr(p,'}');
- if (p[pos] != '}') { p--; break; }
- p[pos] = '\0';
- if (!spf_macros(sa,p + 1,domain)) return 0;
+ pos = str_chr(p, '}');
+ if (p[pos] != '}') {
+ p--;
+ break;
+ }
+ p[pos] = '\0';
+ if (!spf_macros(sa, p + 1, domain)) return 0;
p += pos;
continue;
default: p--;
}
}
- if (!stralloc_append(sa,&append)) return 0;
+ if (!stralloc_append(sa, &append)) return 0;
}
return 1;
@@ -499,7 +540,7 @@ int spf_parse(stralloc *sa,char *spfspec,char *domain)
@return int r = 1 ok; 0 failure
*/
-int spf_macros(stralloc *expand,char *macro,char *domain)
+int spf_macros(stralloc *expand, char *macro, char *domain)
{
static const char hextab[] = "0123456789abcdef";
stralloc sa = {0};
@@ -509,139 +550,167 @@ int spf_macros(stralloc *expand,char *macro,char *domain)
unsigned long u;
char ch = {0};
char ascii;
- int pos, i, n;
- int start = expand->len;
+ int pos, i, n;
+ int start = expand->len;
/* URL encoding - hidden in RFC 7208 Sec. 7.3 */
- if (*macro == 'x') { urlencode = -1; ++macro; } else urlencode = 0;
+ if (*macro == 'x') {
+ urlencode = -1;
+ ++macro;
+ } else
+ urlencode = 0;
ch = *macro;
- if (!ch) { return 1; }
- if (ch >= 'A' && ch <= 'Z') { ch += 32; urlencode = 1; }
+ if (!ch) {
+ return 1;
+ }
+ if (ch >= 'A' && ch <= 'Z') {
+ ch += 32;
+ urlencode = 1;
+ }
if (urlencode == -1) ch -= 32;
/* No. digits determine number of printed labels */
-
+
i = 0;
while (*macro) {
i++;
if (*macro == '}') break;
if (*macro >= '0' && *macro <= '9') {
- scan_ulong(macro,&u); ndigits = u;
- } else if (i > 1 && *macro == 'r') { reverse = 1; break; } /* Reverse representation */
+ scan_ulong(macro, &u);
+ ndigits = u;
+ } else if (i > 1 && *macro == 'r') {
+ reverse = 1;
+ break;
+ } /* Reverse representation */
macro++;
}
- switch (ch) { /* see RFC7208 sec. 7.2 */
- case 's': case 'S':
- if (!stralloc_readyplus(&sa,spfmf.len)) return 0;
- if (!stralloc_copys(&sa,spfmf.s)) return 0;
+ switch (ch) { /* see RFC7208 sec. 7.2 */
+ case 's':
+ case 'S':
+ if (!stralloc_readyplus(&sa, spfmf.len)) return 0;
+ if (!stralloc_copys(&sa, spfmf.s)) return 0;
break;
- case 'l': case 'L':
- i = byte_rchr(spfmf.s,spfmf.len,'@');
+ case 'l':
+ case 'L':
+ i = byte_rchr(spfmf.s, spfmf.len, '@');
if (i < spfmf.len) {
- if (!stralloc_copyb(&sa,spfmf.s,i)) return 0;
+ if (!stralloc_copyb(&sa, spfmf.s, i)) return 0;
} else {
- if (!stralloc_copys(&sa,"postmaster")) return 0;
+ if (!stralloc_copys(&sa, "postmaster")) return 0;
}
break;
- case 'o': case 'O':
- i = byte_rchr(spfmf.s,spfmf.len,'@') + 1;
+ case 'o':
+ case 'O':
+ i = byte_rchr(spfmf.s, spfmf.len, '@') + 1;
if (i > spfmf.len) break;
- if (!stralloc_copys(&sa,spfmf.s + i)) return 0;
+ if (!stralloc_copys(&sa, spfmf.s + i)) return 0;
break;
- case 'd': case 'D':
- if (!stralloc_copys(&sa,domain)) return 0; /* the hack for 'Z'; Russions everywhere ;-) */
+ case 'd':
+ case 'D':
+ if (!stralloc_copys(&sa, domain)) return 0; /* the hack for 'Z'; Russions everywhere ;-) */
break;
- case 'i': case 'c': case 'I': case 'C':
- if (!stralloc_ready(&sa,IPFMT)) return 0;
+ case 'i':
+ case 'c':
+ case 'I':
+ case 'C':
+ if (!stralloc_ready(&sa, IPFMT)) return 0;
if (flagip6) {
- sa.len = ip6_fmt(sa.s,ip6remote);
+ sa.len = ip6_fmt(sa.s, ip6remote);
} else {
- sa.len = ip4_fmt(sa.s,ip4remote);
+ sa.len = ip4_fmt(sa.s, ip4remote);
}
break;
- case 'p': case 'P':
- if (!dnsname.len) spf_ptr(domain,0);
+ case 'p':
+ case 'P':
+ if (!dnsname.len) spf_ptr(domain, 0);
if (dnsname.len) {
- if (!stralloc_copys(&sa,dnsname.s)) return 0;
+ if (!stralloc_copys(&sa, dnsname.s)) return 0;
} else {
- if (!stralloc_copys(&sa,"unknown")) return 0;
+ if (!stralloc_copys(&sa, "unknown")) return 0;
}
break;
- case 'h': case 'H':
- if (!stralloc_copys(&sa,spfhelo.s)) return 0; /* FIXME: FQDN? */
+ case 'h':
+ case 'H':
+ if (!stralloc_copys(&sa, spfhelo.s)) return 0; /* FIXME: FQDN? */
break;
- case 't': case 'T':
- if (!stralloc_ready(&sa,FMT_ULONG)) return 0;
- sa.len = fmt_ulong(sa.s,(unsigned long)now());
+ case 't':
+ case 'T':
+ if (!stralloc_ready(&sa, FMT_ULONG)) return 0;
+ sa.len = fmt_ulong(sa.s, (unsigned long)now());
break;
- case 'v': case 'V':
+ case 'v':
+ case 'V':
if (flagip6) {
- if (!stralloc_copys(&sa,"ip6")) return 0;
+ if (!stralloc_copys(&sa, "ip6")) return 0;
} else {
- if (!stralloc_copys(&sa,"in-addr")) return 0;
+ if (!stralloc_copys(&sa, "in-addr")) return 0;
}
break;
- case 'r': case 'R':
- if (!stralloc_copy(&sa,&spflocal)) return 0;
+ case 'r':
+ case 'R':
+ if (!stralloc_copy(&sa, &spflocal)) return 0;
break;
default: break;
}
- if (!stralloc_0(&sa)) return 0; // XXX
+ if (!stralloc_0(&sa)) return 0; // XXX
if (reverse) {
n = 0;
for (i = 1; i <= sa.len; i++) {
if ((ndigits == -1) || (n < ndigits)) {
- if (!byte_diff(sa.s + sa.len - i - 1,1,".") || (i == sa.len)) {
+ if (!byte_diff(sa.s + sa.len - i - 1, 1, ".") || (i == sa.len)) {
n++;
- if (!stralloc_cats(expand,sa.s + sa.len - i)) return 0;
+ if (!stralloc_cats(expand, sa.s + sa.len - i)) return 0;
if (i < sa.len) {
sa.s[sa.len - i - 1] = 0;
- if (!stralloc_cats(expand,".")) return 0;
- }
+ if (!stralloc_cats(expand, ".")) return 0;
+ }
}
- }
+ }
}
} else if (ndigits != -1) {
n = pos = 0;
for (i = 1; i <= sa.len; i++) {
if (n < ndigits) {
- if (!byte_diff(sa.s + i,1,".")) { n++; pos = i; }
+ if (!byte_diff(sa.s + i, 1, ".")) {
+ n++;
+ pos = i;
+ }
}
}
- if (!stralloc_catb(expand,sa.s,pos)) return 0;
- } else
- if (!stralloc_cats(expand,sa.s)) return 0;
+ if (!stralloc_catb(expand, sa.s, pos)) return 0;
+ } else if (!stralloc_cats(expand, sa.s))
+ return 0;
if (urlencode) {
- stralloc_copyb(&sa,expand->s + start,expand->len - start);
+ stralloc_copyb(&sa, expand->s + start, expand->len - start);
expand->len = start;
for (i = 0; i < sa.len; ++i) {
ch = sa.s[i];
if (urlchr_table[(unsigned char)ch]) {
- if (!stralloc_readyplus(expand,3)) return 0;
- if (!stralloc_append(expand,"%")) return 0;
+ if (!stralloc_readyplus(expand, 3)) return 0;
+ if (!stralloc_append(expand, "%")) return 0;
ascii = hextab[(unsigned char)ch >> 4];
- if (!stralloc_append(expand,&ascii)) return 0;
+ if (!stralloc_append(expand, &ascii)) return 0;
ascii = hextab[(unsigned char)ch & 0x0f];
- if (!stralloc_append(expand,&ascii)) return 0;
+ if (!stralloc_append(expand, &ascii)) return 0;
} else {
- if (!stralloc_append(expand,&ch)) return 0;
+ if (!stralloc_append(expand, &ch)) return 0;
}
}
- }
+ }
return 1;
}
-int spf_info(char *s,const char *t)
+int spf_info(char *s, const char *t)
{
- if (!stralloc_cats(&spfinfo,s)) return 0;
- if (!stralloc_cats(&spfinfo,t)) return 0;
- if (!stralloc_cats(&spfinfo," ")) return 0;
+ if (!stralloc_cats(&spfinfo, s)) return 0;
+ if (!stralloc_cats(&spfinfo, t)) return 0;
+ if (!stralloc_cats(&spfinfo, " ")) return 0;
return 1;
}
diff --git a/src/spfdnsip.c b/src/spfdnsip.c
index e9cf9ee..9012f69 100644
--- a/src/spfdnsip.c
+++ b/src/spfdnsip.c
@@ -1,24 +1,26 @@
#include <unistd.h>
-#include "stralloc.h"
+
#include "alloc.h"
+#include "byte.h"
+#include "case.h"
+#include "fmt.h"
#include "ip.h"
+#include "scan.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
#include "ipalloc.h"
#include "ipme.h"
-#include "str.h"
-#include "fmt.h"
-#include "scan.h"
-#include "byte.h"
#include "now.h"
-#include "dns.h"
-#include "case.h"
#include "spf.h"
// shared by spf.c + spfdnsip.c
extern stralloc dnsname;
extern char ip4remote[4];
-extern char ip6remote[16];
-extern int flagip6;
+extern char ip6remote[16];
+extern int flagip6;
/**
@brief match_ip
@@ -27,30 +29,30 @@ extern int flagip6;
@return 1 ok; 0 failure
*/
-int match_ip4(unsigned char ip1[4],int prefix,char ip2[4])
+int match_ip4(unsigned char ip1[4], int prefix, char ip2[4])
{
stralloc iptest1 = {0};
stralloc iptest2 = {0};
if (flagip6) return 0;
- if (ip4_bytestring(&iptest1,ip1,prefix) == prefix)
- if (ip4_bytestring(&iptest2,ip2,prefix) == prefix)
- if (byte_diff(iptest1.s,prefix,iptest2.s)) return 0;
+ if (ip4_bytestring(&iptest1, ip1, prefix) == prefix)
+ if (ip4_bytestring(&iptest2, ip2, prefix) == prefix)
+ if (byte_diff(iptest1.s, prefix, iptest2.s)) return 0;
return 1;
}
-int match_ip6(unsigned char ip1[16],int prefix,char ip2[16])
+int match_ip6(unsigned char ip1[16], int prefix, char ip2[16])
{
stralloc iptest1 = {0};
stralloc iptest2 = {0};
if (!flagip6) return 0;
- if (ip6_bytestring(&iptest1,ip1,prefix) == prefix)
- if (ip6_bytestring(&iptest2,ip2,prefix) == prefix)
- if (byte_diff(iptest1.s,prefix,iptest2.s)) return 0;
+ if (ip6_bytestring(&iptest1, ip1, prefix) == prefix)
+ if (ip6_bytestring(&iptest2, ip2, prefix) == prefix)
+ if (byte_diff(iptest1.s, prefix, iptest2.s)) return 0;
return 1;
}
@@ -72,7 +74,7 @@ int get_prefix(char *prefix)
if (flagip6 == 1) return 128;
}
- pos = scan_ulong(prefix,&r);
+ pos = scan_ulong(prefix, &r);
if (!pos || (prefix[pos] && !(prefix[pos] == '/'))) return SPF_SYNTAX;
if (flagip6 == 0 && r > 32) return SPF_SYNTAX;
if (flagip6 == 1 && r > 128) return SPF_SYNTAX;
@@ -90,42 +92,42 @@ int get_prefix(char *prefix)
@return SPF_OK, SPF_NONE; SPF_MULTIRR, SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_records(stralloc *spfrec,stralloc *domain)
+int spf_records(stralloc *spfrec, stralloc *domain)
{
static stralloc out = {0};
static stralloc spf = {0};
- int i, k;
- int begin;
+ int i, k;
+ int begin;
int r = 0;
begin = -1;
DNS_INIT
- r = dns_txt(&out,(const stralloc *)domain);
+ r = dns_txt(&out, (const stralloc *)domain);
switch (r) {
case DNS_MEM: return SPF_NOMEM;
case DNS_ERR: return SPF_DNSSOFT; /* return 2main */
- case DNS_NXD: return SPF_NONE;
+ case DNS_NXD: return SPF_NONE;
}
r = SPF_NONE;
for (k = 0; k < out.len; ++k) {
- if (case_starts(out.s + k,"v=spf1")) {
+ if (case_starts(out.s + k, "v=spf1")) {
begin = k;
break;
- }
+ }
}
if (begin >= 0) {
- if (case_starts(out.s + k + 6,"v=spf1")) return SPF_MULTIRR; /* return 2main */
+ if (case_starts(out.s + k + 6, "v=spf1")) return SPF_MULTIRR; /* return 2main */
- if (!stralloc_copys(&spf,"")) return SPF_NOMEM;
+ if (!stralloc_copys(&spf, "")) return SPF_NOMEM;
for (i = begin; i < out.len; ++i) {
if (out.s[i] == '\r' || out.s[i] == '\n' || out.s[i] == '\0') break;
- if (!stralloc_append(&spf,out.s + i)) return SPF_NOMEM;
- }
+ if (!stralloc_append(&spf, out.s + i)) return SPF_NOMEM;
+ }
if (!stralloc_0(&spf)) return SPF_NOMEM;
- if (!stralloc_copys(spfrec,spf.s)) return SPF_NOMEM;
+ if (!stralloc_copys(spfrec, spf.s)) return SPF_NOMEM;
r = SPF_OK;
}
@@ -142,7 +144,7 @@ int spf_records(stralloc *spfrec,stralloc *domain)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_a(char *spfspec,char *prefix)
+int spf_a(char *spfspec, char *prefix)
{
stralloc sa = {0};
stralloc ip = {0};
@@ -151,32 +153,30 @@ int spf_a(char *spfspec,char *prefix)
ipprefix = get_prefix(prefix);
if (ipprefix < 0) return SPF_SYNTAX;
- if (!stralloc_copys(&sa,spfspec)) return SPF_NOMEM;
- if (!stralloc_readyplus(&ip,0)) return SPF_NOMEM;
- if (!spf_info("MA/AAAA=",spfspec)) return SPF_NOMEM;
+ if (!stralloc_copys(&sa, spfspec)) return SPF_NOMEM;
+ if (!stralloc_readyplus(&ip, 0)) return SPF_NOMEM;
+ if (!spf_info("MA/AAAA=", spfspec)) return SPF_NOMEM;
DNS_INIT
- switch (dns_ip4(&ip,&sa)) {
+ switch (dns_ip4(&ip, &sa)) {
case DNS_MEM: return SPF_NOMEM;
case DNS_ERR: r = SPF_DNSSOFT; break;
case DNS_NXD: r = SPF_NONE; break;
- default:
+ default:
r = SPF_NONE;
- for (j = 0; j + 4 <= ip.len; j += 4)
- if (match_ip4(ip.s + j,ipprefix,ip4remote))
- return SPF_OK;
+ for (j = 0; j + 4 <= ip.len; j += 4)
+ if (match_ip4(ip.s + j, ipprefix, ip4remote)) return SPF_OK;
}
- switch (dns_ip6(&ip,&sa)) {
+ switch (dns_ip6(&ip, &sa)) {
case DNS_MEM: return SPF_NOMEM;
case DNS_ERR: r = SPF_DNSSOFT; break;
case DNS_NXD: r = SPF_NONE; break;
- default:
+ default:
r = SPF_NONE;
- for (j = 0; j + 16 <= ip.len; j += 16)
- if (match_ip6(ip.s + j,ipprefix,ip6remote))
- return SPF_OK;
+ for (j = 0; j + 16 <= ip.len; j += 16)
+ if (match_ip6(ip.s + j, ipprefix, ip6remote)) return SPF_OK;
}
return r;
@@ -189,7 +189,7 @@ int spf_a(char *spfspec,char *prefix)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_mx(char *spfspec,char *prefix)
+int spf_mx(char *spfspec, char *prefix)
{
stralloc sa = {0};
ipalloc ia = {0};
@@ -201,23 +201,21 @@ int spf_mx(char *spfspec,char *prefix)
if (ipprefix < 0) return SPF_SYNTAX;
random = now() + (getpid() << 16);
-
- if (!stralloc_copys(&sa,spfspec)) return SPF_NOMEM;
- if (!spf_info("MMX=",spfspec)) return SPF_NOMEM;
- switch (dns_mxip(&ia,&sa,random)) {
+ if (!stralloc_copys(&sa, spfspec)) return SPF_NOMEM;
+ if (!spf_info("MMX=", spfspec)) return SPF_NOMEM;
+
+ switch (dns_mxip(&ia, &sa, random)) {
case DNS_MEM: return SPF_NOMEM;
- case DNS_ERR: return SPF_DNSSOFT;
+ case DNS_ERR: return SPF_DNSSOFT;
default:
r = SPF_NONE;
for (j = 0; j < ia.len; ++j) {
- if (byte_diff(ip6remote,16,V6localnet) && !ip6_isv4mapped(ip6remote)) {
- if (match_ip6(&ia.ix[j].addr.ip6.d,ipprefix,ip6remote))
- return SPF_OK;
- }
- if (byte_diff(ip4remote,4,V4localnet)) {
- if (match_ip4(&ia.ix[j].addr.ip4.d,ipprefix,ip4remote))
- return SPF_OK;
+ if (byte_diff(ip6remote, 16, V6localnet) && !ip6_isv4mapped(ip6remote)) {
+ if (match_ip6(&ia.ix[j].addr.ip6.d, ipprefix, ip6remote)) return SPF_OK;
+ }
+ if (byte_diff(ip4remote, 4, V4localnet)) {
+ if (match_ip4(&ia.ix[j].addr.ip4.d, ipprefix, ip4remote)) return SPF_OK;
}
}
}
@@ -232,7 +230,7 @@ int spf_mx(char *spfspec,char *prefix)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_ptr(char *spfspec,char *prefix)
+int spf_ptr(char *spfspec, char *prefix)
{
stralloc fqdn = {0};
stralloc out = {0};
@@ -244,17 +242,16 @@ int spf_ptr(char *spfspec,char *prefix)
int l = 0;
/* we didn't find host with the matching IP before */
- if (dnsname.len == 7 && str_equal(dnsname.s,"unknown"))
- return SPF_NONE;
+ if (dnsname.len == 7 && str_equal(dnsname.s, "unknown")) return SPF_NONE;
- if (!spf_info("MPTR=",spfspec)) return SPF_NOMEM;
+ if (!spf_info("MPTR=", spfspec)) return SPF_NOMEM;
/* the hostname found will probably be the same as before */
while (dnsname.len) {
pos = dnsname.len - slen;
if (pos < 0) break;
if (pos > 0 && dnsname.s[pos - 1] != '.') break;
- if (case_diffb(dnsname.s + pos,slen,spfspec)) break;
+ if (case_diffb(dnsname.s + pos, slen, spfspec)) break;
return SPF_OK;
}
@@ -265,72 +262,90 @@ int spf_ptr(char *spfspec,char *prefix)
*/
- if (!stralloc_readyplus(&fqdn,255)) return SPF_NOMEM;
- if (!stralloc_readyplus(&out,255)) return SPF_NOMEM;
- if (!stralloc_readyplus(&ip,32)) return SPF_NOMEM;
+ if (!stralloc_readyplus(&fqdn, 255)) return SPF_NOMEM;
+ if (!stralloc_readyplus(&out, 255)) return SPF_NOMEM;
+ if (!stralloc_readyplus(&ip, 32)) return SPF_NOMEM;
- if (flagip6) {
- rc = dns_name6(&out,ip6remote); // usually: 2. . .ip6.addr => only one
+ if (flagip6) {
+ rc = dns_name6(&out, ip6remote); // usually: 2. . .ip6.addr => only one
switch (rc) {
case DNS_MEM: return SPF_NOMEM;
case DNS_COM: r = SPF_DNSSOFT; break;
case DNS_ERR: r = SPF_NONE; break;
case DNS_NXD: r = SPF_NONE; break;
- default: r = SPF_NONE; l++;
- if (l > LOOKUP_LIMIT) { r = SPF_ERROR; break; }
- switch (dns_ip6(&ip,&out)) { // theoretical more IPs cound be retrieved
- case DNS_MEM: return SPF_NOMEM;
- case DNS_ERR: r = SPF_DNSSOFT; break;
- case DNS_NXD: r = SPF_NONE; break;
- default: r = SPF_NONE;
- for (k = 0; k + 16 <= ip.len; k += 16) {
- if (k > 32 * LOOKUP_LIMIT) { r = SPF_ERROR; break; }
- if (match_ip6(ip.s + k,128,ip6remote)) {
- if (!dnsname.len)
- if (!stralloc_copy(&dnsname,&out)) return SPF_NOMEM;
- pos = out.len - slen;
- if (pos < 0) continue;
- if (pos > 0 && out.s[pos - 1] != '.') continue;
- if (case_diffb(out.s + pos,slen,spfspec)) continue;
-
- if (!stralloc_copy(&dnsname,&out)) return SPF_NOMEM;
- r = SPF_OK;
- }
- }
- }
- }
- } else { // IP4 branch
- rc = dns_name4(&out,ip4remote); // usual answer: d.c.b.e.in-arpa.addr for IP4 a.b.c.d => only one
+ default:
+ r = SPF_NONE;
+ l++;
+ if (l > LOOKUP_LIMIT) {
+ r = SPF_ERROR;
+ break;
+ }
+ switch (dns_ip6(&ip, &out)) { // theoretical more IPs cound be retrieved
+ case DNS_MEM: return SPF_NOMEM;
+ case DNS_ERR: r = SPF_DNSSOFT; break;
+ case DNS_NXD: r = SPF_NONE; break;
+ default:
+ r = SPF_NONE;
+ for (k = 0; k + 16 <= ip.len; k += 16) {
+ if (k > 32 * LOOKUP_LIMIT) {
+ r = SPF_ERROR;
+ break;
+ }
+ if (match_ip6(ip.s + k, 128, ip6remote)) {
+ if (!dnsname.len)
+ if (!stralloc_copy(&dnsname, &out)) return SPF_NOMEM;
+ pos = out.len - slen;
+ if (pos < 0) continue;
+ if (pos > 0 && out.s[pos - 1] != '.') continue;
+ if (case_diffb(out.s + pos, slen, spfspec)) continue;
+
+ if (!stralloc_copy(&dnsname, &out)) return SPF_NOMEM;
+ r = SPF_OK;
+ }
+ }
+ }
+ }
+ } else { // IP4 branch
+ rc = dns_name4(&out, ip4remote); // usual answer: d.c.b.e.in-arpa.addr for IP4 a.b.c.d => only one
switch (rc) {
case DNS_MEM: return SPF_NOMEM;
case DNS_ERR: r = SPF_DNSSOFT; break;
case DNS_NXD: r = SPF_NONE; break;
- default: r = SPF_NONE; l++;
- if (l > LOOKUP_LIMIT) { r = SPF_ERROR; break; }
- switch (dns_ip4(&ip,&out)) {
- case DNS_MEM: return SPF_NOMEM;
- case DNS_ERR: r = SPF_DNSSOFT; break;
- case DNS_NXD: r = SPF_NONE; break;
- default: r = SPF_NONE;
- for (k = 0; k + 4 <= ip.len; k += 4) {
- if (k > 32 * LOOKUP_LIMIT) { r = SPF_ERROR; break; }
- if (match_ip4(ip.s + k,32,ip4remote)) {
- if (!dnsname.len)
- if (!stralloc_copy(&dnsname,&out)) return SPF_NOMEM;
- pos = out.len - slen;
- if (pos < 0) continue;
- if (pos > 0 && out.s[pos - 1] != '.') continue;
- if (case_diffb(out.s + pos,slen,spfspec)) continue;
-
- if (!stralloc_copy(&dnsname,&out)) return SPF_NOMEM;
- r = SPF_OK;
- }
- }
- }
+ default:
+ r = SPF_NONE;
+ l++;
+ if (l > LOOKUP_LIMIT) {
+ r = SPF_ERROR;
+ break;
+ }
+ switch (dns_ip4(&ip, &out)) {
+ case DNS_MEM: return SPF_NOMEM;
+ case DNS_ERR: r = SPF_DNSSOFT; break;
+ case DNS_NXD: r = SPF_NONE; break;
+ default:
+ r = SPF_NONE;
+ for (k = 0; k + 4 <= ip.len; k += 4) {
+ if (k > 32 * LOOKUP_LIMIT) {
+ r = SPF_ERROR;
+ break;
+ }
+ if (match_ip4(ip.s + k, 32, ip4remote)) {
+ if (!dnsname.len)
+ if (!stralloc_copy(&dnsname, &out)) return SPF_NOMEM;
+ pos = out.len - slen;
+ if (pos < 0) continue;
+ if (pos > 0 && out.s[pos - 1] != '.') continue;
+ if (case_diffb(out.s + pos, slen, spfspec)) continue;
+
+ if (!stralloc_copy(&dnsname, &out)) return SPF_NOMEM;
+ r = SPF_OK;
+ }
+ }
+ }
}
}
if (!dnsname.len)
- if (!stralloc_copys(&dnsname,"unknown")) return SPF_NOMEM;
+ if (!stralloc_copys(&dnsname, "unknown")) return SPF_NOMEM;
return r;
}
@@ -342,7 +357,7 @@ int spf_ptr(char *spfspec,char *prefix)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_ip4(char *spfspec,char *prefix)
+int spf_ip4(char *spfspec, char *prefix)
{
char spfip[4];
@@ -350,10 +365,10 @@ int spf_ip4(char *spfspec,char *prefix)
int ipprefix = get_prefix(prefix);
if (ipprefix < 0) return SPF_SYNTAX;
- if (!ip4_scan(spfspec,spfip)) return SPF_SYNTAX;
+ if (!ip4_scan(spfspec, spfip)) return SPF_SYNTAX;
- if (!spf_info("MIPv4=",spfspec)) return SPF_NOMEM;
- if (!match_ip4(spfip,ipprefix,ip4remote)) return SPF_NONE;
+ if (!spf_info("MIPv4=", spfspec)) return SPF_NOMEM;
+ if (!match_ip4(spfip, ipprefix, ip4remote)) return SPF_NONE;
return SPF_OK;
}
@@ -365,7 +380,7 @@ int spf_ip4(char *spfspec,char *prefix)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_ip6(char *spfspec,char *prefix)
+int spf_ip6(char *spfspec, char *prefix)
{
char spfip[16];
@@ -373,10 +388,10 @@ int spf_ip6(char *spfspec,char *prefix)
int ipprefix = get_prefix(prefix);
if (ipprefix < 0) return SPF_SYNTAX;
- if (!ip6_scan(spfspec,spfip)) return SPF_SYNTAX;
+ if (!ip6_scan(spfspec, spfip)) return SPF_SYNTAX;
- if (!spf_info("MIPv6=",spfspec)) return SPF_NOMEM;
- if (!match_ip6(spfip,ipprefix,ip6remote)) return SPF_NONE;
+ if (!spf_info("MIPv6=", spfspec)) return SPF_NOMEM;
+ if (!match_ip6(spfip, ipprefix, ip6remote)) return SPF_NONE;
return SPF_OK;
}
@@ -388,19 +403,18 @@ int spf_ip6(char *spfspec,char *prefix)
@return SPF_OK, SPF_NONE; SPF_DNSSOFT, SPF_NOMEM
*/
-int spf_exists(char *spfspec,char *prefix)
+int spf_exists(char *spfspec, char *prefix)
{
stralloc sa = {0};
stralloc ip = {0};
- if (!stralloc_copys(&sa,spfspec)) return SPF_NOMEM;
- if (!spf_info("MExists=",spfspec)) return SPF_NOMEM;
+ if (!stralloc_copys(&sa, spfspec)) return SPF_NOMEM;
+ if (!spf_info("MExists=", spfspec)) return SPF_NOMEM;
- switch (dns_ip4(&ip,&sa)) {
+ switch (dns_ip4(&ip, &sa)) {
case DNS_MEM: return SPF_NOMEM;
- case DNS_ERR: return SPF_DNSSOFT;
- case DNS_NXD: return SPF_NONE;
- default: return SPF_OK;
+ case DNS_ERR: return SPF_DNSSOFT;
+ case DNS_NXD: return SPF_NONE;
+ default: return SPF_OK;
}
-
}
diff --git a/src/spfquery.c b/src/spfquery.c
index 8c642ee..68a5158 100644
--- a/src/spfquery.c
+++ b/src/spfquery.c
@@ -1,26 +1,36 @@
-#include <string.h>
#include <unistd.h>
-#include "buffer.h"
-#include "stralloc.h"
+
+#include <string.h>
+
#include "alloc.h"
-#include "spf.h"
-#include "exit.h"
-#include "dns.h"
-#include "str.h"
+#include "buffer.h"
#include "byte.h"
+#include "exit.h"
#include "logmsg.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
+#include "spf.h"
#define WHO "spfquery"
-void die(int e,char *s) { buffer_putsflush(buffer_2,s); _exit(e); }
-void die_nomem() { die(111,"fatal: out of memory\n"); }
+void die(int e, char *s)
+{
+ buffer_putsflush(buffer_2, s);
+ _exit(e);
+}
+void die_nomem()
+{
+ die(111, "fatal: out of memory\n");
+}
static stralloc heloin = {0};
static stralloc mfin = {0};
static stralloc spflocal = {0};
static stralloc spfbounce = {0};
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
stralloc spfip = {0};
int flag = 0;
@@ -28,70 +38,75 @@ int main(int argc,char **argv)
int verbose = 0;
flagip6 = 1;
- if (argc < 4)
- logmsg(WHO,100,USAGE,"spfquery <sender-ip> <sender-helo/ehlo> <envelope-from> [<local rules>] [-v(erbose) ]\n");
+ if (argc < 4)
+ logmsg(
+ WHO,
+ 100,
+ USAGE,
+ "spfquery <sender-ip> <sender-helo/ehlo> <envelope-from> [<local rules>] [-v(erbose) ]\n");
- if (!stralloc_copys(&spfip,argv[1])) die_nomem();
+ if (!stralloc_copys(&spfip, argv[1])) die_nomem();
if (!stralloc_0(&spfip)) die_nomem();
- r = byte_chr(spfip.s,spfip.len,':');
+ r = byte_chr(spfip.s, spfip.len, ':');
if (r < spfip.len) flag = 1;
- if (!stralloc_copys(&heloin,argv[2])) die_nomem();
+ if (!stralloc_copys(&heloin, argv[2])) die_nomem();
if (!stralloc_0(&heloin)) die_nomem();
- if (!stralloc_copys(&mfin,argv[3])) die_nomem();
+ if (!stralloc_copys(&mfin, argv[3])) die_nomem();
if (!stralloc_0(&mfin)) die_nomem();
if (argc > 4) {
- if (!byte_diff(argv[4],2,"-v")) verbose = 1;
+ if (!byte_diff(argv[4], 2, "-v"))
+ verbose = 1;
else {
- if (!stralloc_copys(&spflocal,argv[4])) die_nomem();
+ if (!stralloc_copys(&spflocal, argv[4])) die_nomem();
if (spflocal.len && !stralloc_0(&spflocal)) die_nomem();
}
}
if (argc > 5) {
- if (!byte_diff(argv[5],2,"-v")) verbose = 1;
+ if (!byte_diff(argv[5], 2, "-v")) verbose = 1;
}
- if (!stralloc_copys(&spfexplain,SPF_DEFEXP)) die_nomem();
+ if (!stralloc_copys(&spfexplain, SPF_DEFEXP)) die_nomem();
if (!stralloc_0(&spfexplain)) die_nomem();
DNS_INIT
- r = spf_query(spfip.s,heloin.s,mfin.s,"localhost",flag);
+ r = spf_query(spfip.s, heloin.s, mfin.s, "localhost", flag);
if (r == SPF_NOMEM) die_nomem();
- buffer_puts(buffer_1,"result=");
+ buffer_puts(buffer_1, "result=");
switch (r) {
- case SPF_ME: buffer_puts(buffer_1,"loopback"); break;
- case SPF_OK: buffer_puts(buffer_1,"pass"); break;
- case SPF_NONE: buffer_puts(buffer_1,"none"); break;
- case SPF_UNKNOWN: buffer_puts(buffer_1,"unknown"); break;
- case SPF_NEUTRAL: buffer_puts(buffer_1,"neutral"); break;
- case SPF_SOFTFAIL: buffer_puts(buffer_1,"softfail"); break;
- case SPF_FAIL: buffer_puts(buffer_1,"fail"); break;
- case SPF_ERROR: buffer_puts(buffer_1,"error"); break;
- case SPF_SYNTAX: buffer_puts(buffer_1,"IP address syntax error"); break;
- default: buffer_puts(buffer_1,"undefined"); break;
+ case SPF_ME: buffer_puts(buffer_1, "loopback"); break;
+ case SPF_OK: buffer_puts(buffer_1, "pass"); break;
+ case SPF_NONE: buffer_puts(buffer_1, "none"); break;
+ case SPF_UNKNOWN: buffer_puts(buffer_1, "unknown"); break;
+ case SPF_NEUTRAL: buffer_puts(buffer_1, "neutral"); break;
+ case SPF_SOFTFAIL: buffer_puts(buffer_1, "softfail"); break;
+ case SPF_FAIL: buffer_puts(buffer_1, "fail"); break;
+ case SPF_ERROR: buffer_puts(buffer_1, "error"); break;
+ case SPF_SYNTAX: buffer_puts(buffer_1, "IP address syntax error"); break;
+ default: buffer_puts(buffer_1, "undefined"); break;
}
- buffer_putsflush(buffer_1,"\n");
+ buffer_putsflush(buffer_1, "\n");
if (r == SPF_SYNTAX) _exit(1);
if (verbose) {
- buffer_puts(buffer_1,"SPF records read: \n");
- buffer_put(buffer_1,spfrecord.s,spfrecord.len);
+ buffer_puts(buffer_1, "SPF records read: \n");
+ buffer_put(buffer_1, spfrecord.s, spfrecord.len);
}
- buffer_puts(buffer_1,"SPF information evaluated: ");
- buffer_put(buffer_1,spfinfo.s,spfinfo.len);
- buffer_putsflush(buffer_1,"\n");
+ buffer_puts(buffer_1, "SPF information evaluated: ");
+ buffer_put(buffer_1, spfinfo.s, spfinfo.len);
+ buffer_putsflush(buffer_1, "\n");
if (r == SPF_FAIL) {
- buffer_puts(buffer_1,"SPF results returned: ");
- if (!spf_parse(&spfbounce,spfexpmsg.s,expdomain.s)) die_nomem();
- buffer_put(buffer_1,spfbounce.s,spfbounce.len);
- buffer_putsflush(buffer_1,"\n");
+ buffer_puts(buffer_1, "SPF results returned: ");
+ if (!spf_parse(&spfbounce, spfexpmsg.s, expdomain.s)) die_nomem();
+ buffer_put(buffer_1, spfbounce.s, spfbounce.len);
+ buffer_putsflush(buffer_1, "\n");
}
_exit(0);
diff --git a/src/splogger.c b/src/splogger.c
index 4e64590..2dcfe2a 100644
--- a/src/splogger.c
+++ b/src/splogger.c
@@ -1,29 +1,30 @@
-#include <sys/types.h>
#include <sys/time.h>
+#include <sys/types.h>
#include <syslog.h>
#include <unistd.h>
-#include "error.h"
+
#include "buffer.h"
+#include "error.h"
#include "exit.h"
-#include "str.h"
-#include "scan.h"
#include "fmt.h"
+#include "scan.h"
+#include "str.h"
-char buf[800]; /* syslog truncates long lines (or crashes); GPACIC */
+char buf[800]; /* syslog truncates long lines (or crashes); GPACIC */
int bufpos = 0; /* 0 <= bufpos < sizeof(buf) */
int flagcont = 0;
-int priority; /* defined if flagcont */
+int priority; /* defined if flagcont */
char stamp[FMT_ULONG + FMT_ULONG + 3]; /* defined if flagcont */
void stamp_make()
{
struct timeval tv;
char *s;
- gettimeofday(&tv,(struct timezone *) 0);
+ gettimeofday(&tv, (struct timezone *)0);
s = stamp;
- s += fmt_ulong(s,(unsigned long) tv.tv_sec);
+ s += fmt_ulong(s, (unsigned long)tv.tv_sec);
*s++ = '.';
- s += fmt_uint0(s,(unsigned int) tv.tv_usec,6);
+ s += fmt_uint0(s, (unsigned int)tv.tv_usec, 6);
*s = 0;
}
@@ -32,37 +33,40 @@ void flush()
if (bufpos) {
buf[bufpos] = 0;
if (flagcont)
- syslog(priority,"%s+%s",stamp,buf); /* logger folds invisibly; GPACIC */
+ syslog(priority, "%s+%s", stamp, buf); /* logger folds invisibly; GPACIC */
else {
stamp_make();
priority = LOG_INFO;
- if (str_start(buf,"warning:")) priority = LOG_WARNING;
- if (str_start(buf,"alert:")) priority = LOG_ALERT;
- syslog(priority,"%s %s",stamp,buf);
+ if (str_start(buf, "warning:")) priority = LOG_WARNING;
+ if (str_start(buf, "alert:")) priority = LOG_ALERT;
+ syslog(priority, "%s %s", stamp, buf);
flagcont = 1;
}
}
bufpos = 0;
}
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
char ch;
if (argv[1])
if (argv[2]) {
unsigned long facility;
- scan_ulong(argv[2],&facility);
- openlog(argv[1],0,facility << 3);
- }
- else
- openlog(argv[1],0,LOG_MAIL);
+ scan_ulong(argv[2], &facility);
+ openlog(argv[1], 0, facility << 3);
+ } else
+ openlog(argv[1], 0, LOG_MAIL);
else
- openlog("splogger",0,LOG_MAIL);
+ openlog("splogger", 0, LOG_MAIL);
for (;;) {
- if (buffer_get(buffer_0,&ch,1) < 1) _exit(0);
- if (ch == '\n') { flush(); flagcont = 0; continue; }
+ if (buffer_get(buffer_0, &ch, 1) < 1) _exit(0);
+ if (ch == '\n') {
+ flush();
+ flagcont = 0;
+ continue;
+ }
if (bufpos == sizeof(buf) - 1) flush();
if ((ch < 32) || (ch > 126)) ch = '?'; /* logger truncates at 0; GPACIC */
buf[bufpos++] = ch;
diff --git a/src/srs2.c b/src/srs2.c
index 1bb431b..4f3cd1a 100644
--- a/src/srs2.c
+++ b/src/srs2.c
@@ -21,150 +21,154 @@
e) Reduce code by 50%
*/
-#include <stdio.h>
-#include <stdlib.h>
+#include "srs2.h"
+
+#include <sys/time.h> /* timeval / timezone struct */
+#include <sys/types.h> /* tyepdefs */
+
#include <ctype.h>
#include <stdarg.h>
-#include <time.h> /* time */
-#include <sys/types.h> /* tyepdefs */
-#include <sys/time.h> /* timeval / timezone struct */
-#include <string.h> /* memcpy, strcpy, memset */
-#include "srs2.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* memcpy, strcpy, memset */
+#include <time.h> /* time */
+
#include "sha1.h"
#ifndef HAVE_STRCASECMP
-# ifdef HAVE__STRICMP
-# define strcasecmp _stricmp
-# endif
+ #ifdef HAVE__STRICMP
+ #define strcasecmp _stricmp
+ #endif
#endif
#ifndef HAVE_STRNCASECMP
-# ifdef HAVE__STRNICMP
-# define strncasecmp _strnicmp
-# endif
+ #ifdef HAVE__STRNICMP
+ #define strncasecmp _strnicmp
+ #endif
#endif
- /* Use this */
+/* Use this */
#define STRINGP(s) ((s != NULL) && (*(s) != '\0'))
static const char *srs_separators = "=-+";
-static srs_malloc_t srs_f_malloc = malloc;
-static srs_realloc_t srs_f_realloc = realloc;
-static srs_free_t srs_f_free = free;
+static srs_malloc_t srs_f_malloc = malloc;
+static srs_realloc_t srs_f_realloc = realloc;
+static srs_free_t srs_f_free = free;
-int srs_set_malloc(srs_malloc_t m, srs_realloc_t r, srs_free_t f)
+int srs_set_malloc(srs_malloc_t m, srs_realloc_t r, srs_free_t f)
{
- srs_f_malloc = m;
- srs_f_realloc = r;
- srs_f_free = f;
- return SRS_SUCCESS;
+ srs_f_malloc = m;
+ srs_f_realloc = r;
+ srs_f_free = f;
+ return SRS_SUCCESS;
}
-#define X(e,s) if (code == e) return s;
+#define X(e, s) \
+ if (code == e) return s;
const char *srs_strerror(int code)
{
- X(0,"")
+ X(0, "")
/* Simple errors */
- X(SRS_SUCCESS,"Success")
- X(SRS_ENOTSRSADDRESS,"Not an SRS address.")
+ X(SRS_SUCCESS, "Success")
+ X(SRS_ENOTSRSADDRESS, "Not an SRS address.")
/* Config errors */
- X(SRS_ENOSECRETS,"No secrets in SRS configuration.")
- X(SRS_ESEPARATORINVALID,"Invalid separator suggested.")
+ X(SRS_ENOSECRETS, "No secrets in SRS configuration.")
+ X(SRS_ESEPARATORINVALID, "Invalid separator suggested.")
/* Input errors */
- X(SRS_ENOSENDERATSIGN,"No at sign in sender address")
- X(SRS_EBUFTOOSMALL,"Buffer too small.")
+ X(SRS_ENOSENDERATSIGN, "No at sign in sender address")
+ X(SRS_EBUFTOOSMALL, "Buffer too small.")
/* Syntax errors */
- X(SRS_ENOSRS0HOST,"No host in SRS0 address.")
- X(SRS_ENOSRS0USER,"No user in SRS0 address.")
- X(SRS_ENOSRS0HASH,"No hash in SRS0 address.")
- X(SRS_ENOSRS0STAMP,"No timestamp in SRS0 address.")
- X(SRS_ENOSRS1HOST,"No host in SRS1 address.")
- X(SRS_ENOSRS1USER,"No user in SRS1 address.")
- X(SRS_ENOSRS1HASH,"No hash in SRS1 address.")
- X(SRS_EBADTIMESTAMPCHAR,"Bad base32 character in timestamp.")
- X(SRS_EHASHTOOSHORT,"Hash too short in SRS address.")
+ X(SRS_ENOSRS0HOST, "No host in SRS0 address.")
+ X(SRS_ENOSRS0USER, "No user in SRS0 address.")
+ X(SRS_ENOSRS0HASH, "No hash in SRS0 address.")
+ X(SRS_ENOSRS0STAMP, "No timestamp in SRS0 address.")
+ X(SRS_ENOSRS1HOST, "No host in SRS1 address.")
+ X(SRS_ENOSRS1USER, "No user in SRS1 address.")
+ X(SRS_ENOSRS1HASH, "No hash in SRS1 address.")
+ X(SRS_EBADTIMESTAMPCHAR, "Bad base32 character in timestamp.")
+ X(SRS_EHASHTOOSHORT, "Hash too short in SRS address.")
/* SRS errors */
- X(SRS_ETIMESTAMPOUTOFDATE,"Time stamp out of date.")
- X(SRS_EHASHINVALID,"Hash invalid in SRS address.")
+ X(SRS_ETIMESTAMPOUTOFDATE, "Time stamp out of date.")
+ X(SRS_EHASHINVALID, "Hash invalid in SRS address.")
- return "Unknown SRS error.";
+ return "Unknown SRS error.";
}
srs_t *srs_new()
{
- srs_t *srs = (srs_t *)srs_f_malloc(sizeof(srs_t));
- srs_init(srs);
- return srs;
+ srs_t *srs = (srs_t *)srs_f_malloc(sizeof(srs_t));
+ srs_init(srs);
+ return srs;
}
void srs_init(srs_t *srs)
{
- memset(srs, 0, sizeof(srs_t));
- srs->secrets = NULL;
- srs->numsecrets = 0;
- srs->separator = '=';
- srs->maxage = 21;
- srs->hashlen = 4;
- srs->hashmin = srs->hashlen;
- srs->alwaysrewrite = FALSE;
+ memset(srs, 0, sizeof(srs_t));
+ srs->secrets = NULL;
+ srs->numsecrets = 0;
+ srs->separator = '=';
+ srs->maxage = 21;
+ srs->hashlen = 4;
+ srs->hashmin = srs->hashlen;
+ srs->alwaysrewrite = FALSE;
}
void srs_free(srs_t *srs)
{
- int i;
- for (i = 0; i < srs->numsecrets; i++) {
- memset(srs->secrets[i], 0, strlen(srs->secrets[i]));
- srs_f_free(srs->secrets[i]);
- srs->secrets[i] = '\0';
- }
- srs_f_free(srs);
+ int i;
+ for (i = 0; i < srs->numsecrets; i++) {
+ memset(srs->secrets[i], 0, strlen(srs->secrets[i]));
+ srs_f_free(srs->secrets[i]);
+ srs->secrets[i] = '\0';
+ }
+ srs_f_free(srs);
}
int srs_add_secret(srs_t *srs, const char *secret)
{
- int newlen = (srs->numsecrets + 1) * sizeof(char *);
- srs->secrets = (char **)srs_f_realloc(srs->secrets, newlen);
- srs->secrets[srs->numsecrets++] = strdup(secret);
- return SRS_SUCCESS;
+ int newlen = (srs->numsecrets + 1) * sizeof(char *);
+ srs->secrets = (char **)srs_f_realloc(srs->secrets, newlen);
+ srs->secrets[srs->numsecrets++] = strdup(secret);
+ return SRS_SUCCESS;
}
const char *srs_get_secret(srs_t *srs, int idx)
{
- if (idx < srs->numsecrets)
- return srs->secrets[idx];
- return NULL;
+ if (idx < srs->numsecrets) return srs->secrets[idx];
+ return NULL;
}
-#define SRS_PARAM_DEFINE(n, t) \
- int srs_set_ ## n (srs_t *srs, t value) { \
- srs->n = value; \
- return SRS_SUCCESS; \
- } \
- t srs_get_ ## n (srs_t *srs) { \
- return srs->n; \
- }
+#define SRS_PARAM_DEFINE(n, t) \
+ int srs_set_##n(srs_t *srs, t value) \
+ { \
+ srs->n = value; \
+ return SRS_SUCCESS; \
+ } \
+ t srs_get_##n(srs_t *srs) \
+ { \
+ return srs->n; \
+ }
int srs_set_separator(srs_t *srs, char value)
{
- if (strchr(srs_separators, value) == NULL)
- return SRS_ESEPARATORINVALID;
- srs->separator = value;
- return SRS_SUCCESS;
+ if (strchr(srs_separators, value) == NULL) return SRS_ESEPARATORINVALID;
+ srs->separator = value;
+ return SRS_SUCCESS;
}
char srs_get_separator(srs_t *srs)
{
- return srs->separator;
+ return srs->separator;
}
SRS_PARAM_DEFINE(maxage, int)
- /* XXX Check hashlen >= hashmin */
+/* XXX Check hashlen >= hashmin */
SRS_PARAM_DEFINE(hashlen, int)
SRS_PARAM_DEFINE(hashmin, int)
SRS_PARAM_DEFINE(alwaysrewrite, srs_bool)
@@ -175,467 +179,421 @@ SRS_PARAM_DEFINE(noreverse, srs_bool)
* enough to rewrite the timestamp functions. These are based on
* a 2 character timestamp. Changing these in the wild is probably
* a bad idea. */
-#define SRS_TIME_PRECISION (60 * 60 * 24) /* One day */
-#define SRS_TIME_BASEBITS 5 /* 2^5 = 32 = strlen(CHARS) */
+#define SRS_TIME_PRECISION (60 * 60 * 24) /* One day */
+#define SRS_TIME_BASEBITS 5 /* 2^5 = 32 = strlen(CHARS) */
/* This had better be a real variable since we do arithmethic
* with it. */
const char *SRS_TIME_BASECHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
-#define SRS_TIME_SIZE 2
-#define SRS_TIME_SLOTS (1<<(SRS_TIME_BASEBITS<<(SRS_TIME_SIZE-1)))
+#define SRS_TIME_SIZE 2
+#define SRS_TIME_SLOTS (1 << (SRS_TIME_BASEBITS << (SRS_TIME_SIZE - 1)))
int srs_timestamp_create(srs_t *srs, char *buf, time_t now)
{
- now = now / SRS_TIME_PRECISION;
- buf[1] = SRS_TIME_BASECHARS[now & ((1 << SRS_TIME_BASEBITS) - 1)];
- now = now >> SRS_TIME_BASEBITS;
- buf[0] = SRS_TIME_BASECHARS[now & ((1 << SRS_TIME_BASEBITS) - 1)];
- buf[2] = '\0';
- return SRS_SUCCESS;
+ now = now / SRS_TIME_PRECISION;
+ buf[1] = SRS_TIME_BASECHARS[now & ((1 << SRS_TIME_BASEBITS) - 1)];
+ now = now >> SRS_TIME_BASEBITS;
+ buf[0] = SRS_TIME_BASECHARS[now & ((1 << SRS_TIME_BASEBITS) - 1)];
+ buf[2] = '\0';
+ return SRS_SUCCESS;
}
int srs_timestamp_check(srs_t *srs, const char *stamp)
{
- const char *sp;
- char *bp;
- int off;
- time_t now;
- time_t then;
-
- /* We had better go around this loop exactly twice! */
- then = 0;
- for (sp = stamp; *sp; sp++) {
- bp = strchr(SRS_TIME_BASECHARS, toupper(*sp));
- if (bp == NULL)
- return SRS_EBADTIMESTAMPCHAR;
- off = bp - SRS_TIME_BASECHARS;
- then = (then << SRS_TIME_BASEBITS) | off;
- }
-
- time(&now);
- now = (now / SRS_TIME_PRECISION) % SRS_TIME_SLOTS;
- while (now < then)
- now = now + SRS_TIME_SLOTS;
-
- if (now <= then + srs->maxage)
- return SRS_SUCCESS;
- return SRS_ETIMESTAMPOUTOFDATE;
+ const char *sp;
+ char *bp;
+ int off;
+ time_t now;
+ time_t then;
+
+ /* We had better go around this loop exactly twice! */
+ then = 0;
+ for (sp = stamp; *sp; sp++) {
+ bp = strchr(SRS_TIME_BASECHARS, toupper(*sp));
+ if (bp == NULL) return SRS_EBADTIMESTAMPCHAR;
+ off = bp - SRS_TIME_BASECHARS;
+ then = (then << SRS_TIME_BASEBITS) | off;
+ }
+
+ time(&now);
+ now = (now / SRS_TIME_PRECISION) % SRS_TIME_SLOTS;
+ while (now < then) now = now + SRS_TIME_SLOTS;
+
+ if (now <= then + srs->maxage) return SRS_SUCCESS;
+ return SRS_ETIMESTAMPOUTOFDATE;
}
-const char *SRS_HASH_BASECHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789+/";
+const char *SRS_HASH_BASECHARS =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
static void srs_hash_create_v(srs_t *srs, int idx, char *buf, int nargs, va_list ap)
{
- sha1_ctx ctx;
- char srshash[SHA1_DIGESTSIZE + 1];
- char *secret;
- char *data;
- int len;
- char *lcdata;
- unsigned char *hp;
- char *bp;
- int i;
- int j;
-
- secret = srs->secrets[idx];
- sha1_init(&ctx);
- sha1_update(&ctx, secret, strlen(secret));
-
- for (i = 0; i < nargs; i++) {
- data = va_arg(ap, char *);
- len = strlen(data);
- lcdata = alloca(len + 1);
- for (j = 0; j < len; j++) {
- if (isupper(data[j]))
- lcdata[j] = tolower(data[j]);
- else
- lcdata[j] = data[j];
- }
- sha1_update(&ctx, lcdata, len);
- }
-
- sha1_final(srshash, &ctx); /* args inverted */
- srshash[SHA1_DIGESTSIZE] = '\0';
-
- /* A little base64 encoding. Just a little. */
- hp = (unsigned char *)srshash;
- bp = buf;
- for (i = 0; i < srs->hashlen; i++) {
- switch (i & 0x03) {
- default: /* NOTREACHED */
- case 0:
- j = (*hp >> 2);
- break;
- case 1:
- j = ((*hp & 0x03) << 4) |
- ((*(hp + 1) & 0xF0) >> 4);
- hp++;
- break;
- case 2:
- j = ((*hp & 0x0F) << 2) |
- ((*(hp + 1) & 0xC0) >> 6);
- hp++;
- break;
- case 3:
- j = (*hp++ & 0x3F);
- break;
- }
- *bp++ = SRS_HASH_BASECHARS[j];
- }
-
- *bp = '\0';
- buf[srs->hashlen] = '\0';
+ sha1_ctx ctx;
+ char srshash[SHA1_DIGESTSIZE + 1];
+ char *secret;
+ char *data;
+ int len;
+ char *lcdata;
+ unsigned char *hp;
+ char *bp;
+ int i;
+ int j;
+
+ secret = srs->secrets[idx];
+ sha1_init(&ctx);
+ sha1_update(&ctx, secret, strlen(secret));
+
+ for (i = 0; i < nargs; i++) {
+ data = va_arg(ap, char *);
+ len = strlen(data);
+ lcdata = alloca(len + 1);
+ for (j = 0; j < len; j++) {
+ if (isupper(data[j]))
+ lcdata[j] = tolower(data[j]);
+ else
+ lcdata[j] = data[j];
+ }
+ sha1_update(&ctx, lcdata, len);
+ }
+
+ sha1_final(srshash, &ctx); /* args inverted */
+ srshash[SHA1_DIGESTSIZE] = '\0';
+
+ /* A little base64 encoding. Just a little. */
+ hp = (unsigned char *)srshash;
+ bp = buf;
+ for (i = 0; i < srs->hashlen; i++) {
+ switch (i & 0x03) {
+ default: /* NOTREACHED */
+ case 0: j = (*hp >> 2); break;
+ case 1:
+ j = ((*hp & 0x03) << 4) | ((*(hp + 1) & 0xF0) >> 4);
+ hp++;
+ break;
+ case 2:
+ j = ((*hp & 0x0F) << 2) | ((*(hp + 1) & 0xC0) >> 6);
+ hp++;
+ break;
+ case 3: j = (*hp++ & 0x3F); break;
+ }
+ *bp++ = SRS_HASH_BASECHARS[j];
+ }
+
+ *bp = '\0';
+ buf[srs->hashlen] = '\0';
}
int srs_hash_create(srs_t *srs, char *buf, int nargs, ...)
{
- va_list ap;
+ va_list ap;
- if (srs->numsecrets == 0)
- return SRS_ENOSECRETS;
- if (srs->secrets == NULL)
- return SRS_ENOSECRETS;
- if (srs->secrets[0] == NULL)
- return SRS_ENOSECRETS;
+ if (srs->numsecrets == 0) return SRS_ENOSECRETS;
+ if (srs->secrets == NULL) return SRS_ENOSECRETS;
+ if (srs->secrets[0] == NULL) return SRS_ENOSECRETS;
- va_start(ap, nargs);
- srs_hash_create_v(srs, 0, buf, nargs, ap);
- va_end(ap);
+ va_start(ap, nargs);
+ srs_hash_create_v(srs, 0, buf, nargs, ap);
+ va_end(ap);
- return SRS_SUCCESS;
+ return SRS_SUCCESS;
}
int srs_hash_check(srs_t *srs, char *hash, int nargs, ...)
{
- va_list ap;
- char *srshash;
- char *tmp;
- int len;
- int i;
-
- len = strlen(hash);
- if (len < srs->hashmin)
- return SRS_EHASHTOOSHORT;
- if (len < srs->hashlen) {
- tmp = alloca(srs->hashlen + 1);
- strncpy(tmp, hash, srs->hashlen);
- tmp[srs->hashlen] = '\0';
- hash = tmp;
- len = srs->hashlen;
- }
-
- for (i = 0; i < srs->numsecrets; i++) {
- va_start(ap, nargs);
- srshash = alloca(srs->hashlen + 1);
- srs_hash_create_v(srs, i, srshash, nargs, ap);
- va_end(ap);
- if (strncasecmp(hash, srshash, len) == 0)
- return SRS_SUCCESS;
- }
-
- return SRS_EHASHINVALID;
+ va_list ap;
+ char *srshash;
+ char *tmp;
+ int len;
+ int i;
+
+ len = strlen(hash);
+ if (len < srs->hashmin) return SRS_EHASHTOOSHORT;
+ if (len < srs->hashlen) {
+ tmp = alloca(srs->hashlen + 1);
+ strncpy(tmp, hash, srs->hashlen);
+ tmp[srs->hashlen] = '\0';
+ hash = tmp;
+ len = srs->hashlen;
+ }
+
+ for (i = 0; i < srs->numsecrets; i++) {
+ va_start(ap, nargs);
+ srshash = alloca(srs->hashlen + 1);
+ srs_hash_create_v(srs, i, srshash, nargs, ap);
+ va_end(ap);
+ if (strncasecmp(hash, srshash, len) == 0) return SRS_SUCCESS;
+ }
+
+ return SRS_EHASHINVALID;
}
-int srs_compile_shortcut(srs_t *srs,
- char *buf, int buflen,
- char *sendhost, char *senduser,
- const char *aliashost) {
- char *srshash;
- char srsstamp[SRS_TIME_SIZE + 1];
- int len;
- int ret;
-
- /* This never happens if we get called from guarded() */
- if ((strncasecmp(senduser, SRS0TAG, 4) == 0) &&
- (strchr(srs_separators, senduser[4]) != NULL)) {
- sendhost = senduser + 5;
- if (*sendhost == '\0')
- return SRS_ENOSRS0HOST;
- senduser = strchr(sendhost, SRSSEP);
- if ((senduser == NULL) || (*senduser == '\0'))
- return SRS_ENOSRS0USER;
- }
-
- len = strlen(SRS0TAG) + 1 +
- srs->hashlen + 1 +
- SRS_TIME_SIZE + 1 +
- strlen(sendhost) + 1 + strlen(senduser)
- + 1 + strlen(aliashost);
- if (len >= buflen)
- return SRS_EBUFTOOSMALL;
-
- ret = srs_timestamp_create(srs, srsstamp, time(NULL));
- if (ret != SRS_SUCCESS)
- return ret;
- srshash = alloca(srs->hashlen + 1);
- ret = srs_hash_create(srs, srshash,3, srsstamp, sendhost, senduser);
- if (ret != SRS_SUCCESS)
- return ret;
-
- sprintf(buf, SRS0TAG "%c%s%c%s%c%s%c%s@%s", srs->separator,
- srshash, SRSSEP, srsstamp, SRSSEP,
- sendhost, SRSSEP, senduser,
- aliashost);
-
- return SRS_SUCCESS;
+int srs_compile_shortcut(
+ srs_t *srs, char *buf, int buflen, char *sendhost, char *senduser, const char *aliashost)
+{
+ char *srshash;
+ char srsstamp[SRS_TIME_SIZE + 1];
+ int len;
+ int ret;
+
+ /* This never happens if we get called from guarded() */
+ if ((strncasecmp(senduser, SRS0TAG, 4) == 0) && (strchr(srs_separators, senduser[4]) != NULL)) {
+ sendhost = senduser + 5;
+ if (*sendhost == '\0') return SRS_ENOSRS0HOST;
+ senduser = strchr(sendhost, SRSSEP);
+ if ((senduser == NULL) || (*senduser == '\0')) return SRS_ENOSRS0USER;
+ }
+
+ len = strlen(SRS0TAG) + 1 + srs->hashlen + 1 + SRS_TIME_SIZE + 1 + strlen(sendhost) + 1
+ + strlen(senduser) + 1 + strlen(aliashost);
+ if (len >= buflen) return SRS_EBUFTOOSMALL;
+
+ ret = srs_timestamp_create(srs, srsstamp, time(NULL));
+ if (ret != SRS_SUCCESS) return ret;
+ srshash = alloca(srs->hashlen + 1);
+ ret = srs_hash_create(srs, srshash, 3, srsstamp, sendhost, senduser);
+ if (ret != SRS_SUCCESS) return ret;
+
+ sprintf(
+ buf,
+ SRS0TAG "%c%s%c%s%c%s%c%s@%s",
+ srs->separator,
+ srshash,
+ SRSSEP,
+ srsstamp,
+ SRSSEP,
+ sendhost,
+ SRSSEP,
+ senduser,
+ aliashost);
+
+ return SRS_SUCCESS;
}
-int srs_compile_guarded(srs_t *srs,
- char *buf, int buflen,
- char *sendhost, char *senduser,
- const char *aliashost) {
- char *srshost;
- char *srsuser;
- char *srshash;
- int len;
- int ret;
-
- if ((strncasecmp(senduser, SRS1TAG, 4) == 0) &&
- (strchr(srs_separators, senduser[4]) != NULL)) {
- /* Used as a temporary convenience var */
- srshash = senduser + 5;
- if (*srshash == '\0')
- return SRS_ENOSRS1HASH;
- /* Used as a temporary convenience var */
- srshost = strchr(srshash, SRSSEP);
- if (!STRINGP(srshost))
- return SRS_ENOSRS1HOST;
- *srshost++ = '\0';
- srsuser = strchr(srshost, SRSSEP);
- if (!STRINGP(srsuser))
- return SRS_ENOSRS1USER;
- *srsuser++ = '\0';
- srshash = alloca(srs->hashlen + 1);
- ret = srs_hash_create(srs, srshash, 2, srshost, srsuser);
- if (ret != SRS_SUCCESS)
- return ret;
- len = strlen(SRS1TAG) + 1 +
- srs->hashlen + 1 +
- strlen(srshost) + 1 + strlen(srsuser)
- + 1 + strlen(aliashost);
- if (len >= buflen)
- return SRS_EBUFTOOSMALL;
- sprintf(buf, SRS1TAG "%c%s%c%s%c%s@%s", srs->separator,
- srshash, SRSSEP,
- srshost, SRSSEP, srsuser,
- aliashost);
- return SRS_SUCCESS;
- }
- else if ((strncasecmp(senduser, SRS0TAG, 4) == 0) &&
- (strchr(srs_separators, senduser[4]) != NULL)) {
- srsuser = senduser + 4;
- srshost = sendhost;
- srshash = alloca(srs->hashlen + 1);
- ret = srs_hash_create(srs, srshash, 2, srshost, srsuser);
- if (ret != SRS_SUCCESS)
- return ret;
- len = strlen(SRS1TAG) + 1 +
- srs->hashlen + 1 +
- strlen(srshost) + 1 + strlen(srsuser)
- + 1 + strlen(aliashost);
- if (len >= buflen)
- return SRS_EBUFTOOSMALL;
- sprintf(buf, SRS1TAG "%c%s%c%s%c%s@%s", srs->separator,
- srshash, SRSSEP,
- srshost, SRSSEP, srsuser,
- aliashost);
- }
- else {
- return srs_compile_shortcut(srs, buf, buflen,
- sendhost, senduser, aliashost);
- }
-
- return SRS_SUCCESS;
+int srs_compile_guarded(
+ srs_t *srs, char *buf, int buflen, char *sendhost, char *senduser, const char *aliashost)
+{
+ char *srshost;
+ char *srsuser;
+ char *srshash;
+ int len;
+ int ret;
+
+ if ((strncasecmp(senduser, SRS1TAG, 4) == 0) && (strchr(srs_separators, senduser[4]) != NULL)) {
+ /* Used as a temporary convenience var */
+ srshash = senduser + 5;
+ if (*srshash == '\0') return SRS_ENOSRS1HASH;
+ /* Used as a temporary convenience var */
+ srshost = strchr(srshash, SRSSEP);
+ if (!STRINGP(srshost)) return SRS_ENOSRS1HOST;
+ *srshost++ = '\0';
+ srsuser = strchr(srshost, SRSSEP);
+ if (!STRINGP(srsuser)) return SRS_ENOSRS1USER;
+ *srsuser++ = '\0';
+ srshash = alloca(srs->hashlen + 1);
+ ret = srs_hash_create(srs, srshash, 2, srshost, srsuser);
+ if (ret != SRS_SUCCESS) return ret;
+ len = strlen(SRS1TAG) + 1 + srs->hashlen + 1 + strlen(srshost) + 1 + strlen(srsuser) + 1
+ + strlen(aliashost);
+ if (len >= buflen) return SRS_EBUFTOOSMALL;
+ sprintf(
+ buf,
+ SRS1TAG "%c%s%c%s%c%s@%s",
+ srs->separator,
+ srshash,
+ SRSSEP,
+ srshost,
+ SRSSEP,
+ srsuser,
+ aliashost);
+ return SRS_SUCCESS;
+ } else if ((strncasecmp(senduser, SRS0TAG, 4) == 0) && (strchr(srs_separators, senduser[4]) != NULL)) {
+ srsuser = senduser + 4;
+ srshost = sendhost;
+ srshash = alloca(srs->hashlen + 1);
+ ret = srs_hash_create(srs, srshash, 2, srshost, srsuser);
+ if (ret != SRS_SUCCESS) return ret;
+ len = strlen(SRS1TAG) + 1 + srs->hashlen + 1 + strlen(srshost) + 1 + strlen(srsuser) + 1
+ + strlen(aliashost);
+ if (len >= buflen) return SRS_EBUFTOOSMALL;
+ sprintf(
+ buf,
+ SRS1TAG "%c%s%c%s%c%s@%s",
+ srs->separator,
+ srshash,
+ SRSSEP,
+ srshost,
+ SRSSEP,
+ srsuser,
+ aliashost);
+ } else {
+ return srs_compile_shortcut(srs, buf, buflen, sendhost, senduser, aliashost);
+ }
+
+ return SRS_SUCCESS;
}
int srs_parse_shortcut(srs_t *srs, char *buf, int buflen, char *senduser)
{
- char *srshash;
- char *srsstamp;
- char *srshost;
- char *srsuser;
- int ret;
-
- if (strncasecmp(senduser, SRS0TAG, 4) == 0) {
- srshash = senduser + 5;
- if (!STRINGP(srshash))
- return SRS_ENOSRS0HASH;
- srsstamp = strchr(srshash, SRSSEP);
- if (!STRINGP(srsstamp))
- return SRS_ENOSRS0STAMP;
- *srsstamp++ = '\0';
- srshost = strchr(srsstamp, SRSSEP);
- if (!STRINGP(srshost))
- return SRS_ENOSRS0HOST;
- *srshost++ = '\0';
- srsuser = strchr(srshost, SRSSEP);
- if (!STRINGP(srsuser))
- return SRS_ENOSRS0USER;
- *srsuser++ = '\0';
- ret = srs_timestamp_check(srs, srsstamp);
- if (ret != SRS_SUCCESS)
- return ret;
- ret = srs_hash_check(srs, srshash, 3, srsstamp,
- srshost, srsuser);
- if (ret != SRS_SUCCESS)
- return ret;
- sprintf(buf, "%s@%s", srsuser, srshost);
- return SRS_SUCCESS;
- }
-
- return SRS_ENOTSRSADDRESS;
+ char *srshash;
+ char *srsstamp;
+ char *srshost;
+ char *srsuser;
+ int ret;
+
+ if (strncasecmp(senduser, SRS0TAG, 4) == 0) {
+ srshash = senduser + 5;
+ if (!STRINGP(srshash)) return SRS_ENOSRS0HASH;
+ srsstamp = strchr(srshash, SRSSEP);
+ if (!STRINGP(srsstamp)) return SRS_ENOSRS0STAMP;
+ *srsstamp++ = '\0';
+ srshost = strchr(srsstamp, SRSSEP);
+ if (!STRINGP(srshost)) return SRS_ENOSRS0HOST;
+ *srshost++ = '\0';
+ srsuser = strchr(srshost, SRSSEP);
+ if (!STRINGP(srsuser)) return SRS_ENOSRS0USER;
+ *srsuser++ = '\0';
+ ret = srs_timestamp_check(srs, srsstamp);
+ if (ret != SRS_SUCCESS) return ret;
+ ret = srs_hash_check(srs, srshash, 3, srsstamp, srshost, srsuser);
+ if (ret != SRS_SUCCESS) return ret;
+ sprintf(buf, "%s@%s", srsuser, srshost);
+ return SRS_SUCCESS;
+ }
+
+ return SRS_ENOTSRSADDRESS;
}
int srs_parse_guarded(srs_t *srs, char *buf, int buflen, char *senduser)
{
- char *srshash;
- char *srshost;
- char *srsuser;
- int ret;
-
- if (strncasecmp(senduser, SRS1TAG, 4) == 0) {
- srshash = senduser + 5;
- if (!STRINGP(srshash))
- return SRS_ENOSRS1HASH;
- srshost = strchr(srshash, SRSSEP);
- if (!STRINGP(srshost))
- return SRS_ENOSRS1HOST;
- *srshost++ = '\0';
- srsuser = strchr(srshost, SRSSEP);
- if (!STRINGP(srsuser))
- return SRS_ENOSRS1USER;
- *srsuser++ = '\0';
- ret = srs_hash_check(srs, srshash, 2, srshost, srsuser);
- if (ret != SRS_SUCCESS)
- return ret;
- sprintf(buf, SRS0TAG "%s@%s", srsuser, srshost);
- return SRS_SUCCESS;
- }
- else {
- return srs_parse_shortcut(srs, buf, buflen, senduser);
- }
+ char *srshash;
+ char *srshost;
+ char *srsuser;
+ int ret;
+
+ if (strncasecmp(senduser, SRS1TAG, 4) == 0) {
+ srshash = senduser + 5;
+ if (!STRINGP(srshash)) return SRS_ENOSRS1HASH;
+ srshost = strchr(srshash, SRSSEP);
+ if (!STRINGP(srshost)) return SRS_ENOSRS1HOST;
+ *srshost++ = '\0';
+ srsuser = strchr(srshost, SRSSEP);
+ if (!STRINGP(srsuser)) return SRS_ENOSRS1USER;
+ *srsuser++ = '\0';
+ ret = srs_hash_check(srs, srshash, 2, srshost, srsuser);
+ if (ret != SRS_SUCCESS) return ret;
+ sprintf(buf, SRS0TAG "%s@%s", srsuser, srshost);
+ return SRS_SUCCESS;
+ } else {
+ return srs_parse_shortcut(srs, buf, buflen, senduser);
+ }
}
-int srs_forward(srs_t *srs, char *buf, int buflen,
- const char *sender, const char *alias)
+int srs_forward(srs_t *srs, char *buf, int buflen, const char *sender, const char *alias)
{
- char *senduser;
- char *sendhost;
- char *tmp;
- int len;
-
- if (srs->noforward)
- return SRS_ENOTREWRITTEN;
-
- /* This is allowed to be a plain domain */
- while ((tmp = strchr(alias, '@')) != NULL)
- alias = tmp + 1;
-
- tmp = strchr(sender, '@');
- if (tmp == NULL)
- return SRS_ENOSENDERATSIGN;
- sendhost = tmp + 1;
-
- len = strlen(sender);
-
- if (! srs->alwaysrewrite) {
- if (strcasecmp(sendhost, alias) == 0) {
- if (strlen(sender) >= buflen)
- return SRS_EBUFTOOSMALL;
- strcpy(buf, sender);
- return SRS_SUCCESS;
- }
- }
-
- /* Reconstruct the whole show into our alloca() buffer. */
- senduser = alloca(len + 1);
- strcpy(senduser, sender);
- tmp = (senduser + (tmp - sender));
- sendhost = tmp + 1;
- *tmp = '\0';
-
- return srs_compile_guarded(srs, buf, buflen,
- sendhost, senduser, alias);
+ char *senduser;
+ char *sendhost;
+ char *tmp;
+ int len;
+
+ if (srs->noforward) return SRS_ENOTREWRITTEN;
+
+ /* This is allowed to be a plain domain */
+ while ((tmp = strchr(alias, '@')) != NULL) alias = tmp + 1;
+
+ tmp = strchr(sender, '@');
+ if (tmp == NULL) return SRS_ENOSENDERATSIGN;
+ sendhost = tmp + 1;
+
+ len = strlen(sender);
+
+ if (!srs->alwaysrewrite) {
+ if (strcasecmp(sendhost, alias) == 0) {
+ if (strlen(sender) >= buflen) return SRS_EBUFTOOSMALL;
+ strcpy(buf, sender);
+ return SRS_SUCCESS;
+ }
+ }
+
+ /* Reconstruct the whole show into our alloca() buffer. */
+ senduser = alloca(len + 1);
+ strcpy(senduser, sender);
+ tmp = (senduser + (tmp - sender));
+ sendhost = tmp + 1;
+ *tmp = '\0';
+
+ return srs_compile_guarded(srs, buf, buflen, sendhost, senduser, alias);
}
-int srs_forward_alloc(srs_t *srs, char **sptr,
- const char *sender, const char *alias)
+int srs_forward_alloc(srs_t *srs, char **sptr, const char *sender, const char *alias)
{
- char *buf;
- int slen;
- int alen;
- int len;
- int ret;
+ char *buf;
+ int slen;
+ int alen;
+ int len;
+ int ret;
- if (srs->noforward)
- return SRS_ENOTREWRITTEN;
+ if (srs->noforward) return SRS_ENOTREWRITTEN;
- slen = strlen(sender);
- alen = strlen(alias);
+ slen = strlen(sender);
+ alen = strlen(alias);
- /* strlen(SRSxTAG) + strlen("====+@") < 64 */
- len = slen + alen + srs->hashlen + SRS_TIME_SIZE + 64;
- buf = (char *)srs_f_malloc(len);
+ /* strlen(SRSxTAG) + strlen("====+@") < 64 */
+ len = slen + alen + srs->hashlen + SRS_TIME_SIZE + 64;
+ buf = (char *)srs_f_malloc(len);
- ret = srs_forward(srs, buf, len, sender, alias);
+ ret = srs_forward(srs, buf, len, sender, alias);
- if (ret == SRS_SUCCESS)
- *sptr = buf;
- else
- srs_f_free(buf);
+ if (ret == SRS_SUCCESS)
+ *sptr = buf;
+ else
+ srs_f_free(buf);
- return ret;
+ return ret;
}
int srs_reverse(srs_t *srs, char *buf, int buflen, const char *sender)
{
- char *senduser;
- char *tmp;
- int len;
-
- if (!SRS_IS_SRS_ADDRESS(sender))
- return SRS_ENOTSRSADDRESS;
-
- if (srs->noreverse)
- return SRS_ENOTREWRITTEN;
-
- len = strlen(sender);
- if (len >= buflen)
- return SRS_EBUFTOOSMALL;
- senduser = alloca(len + 1);
- strcpy(senduser, sender);
-
- /* We don't really care about the host for reversal. */
- tmp = strchr(senduser, '@');
- if (tmp != NULL)
- *tmp = '\0';
- return srs_parse_guarded(srs, buf, buflen, senduser);
+ char *senduser;
+ char *tmp;
+ int len;
+
+ if (!SRS_IS_SRS_ADDRESS(sender)) return SRS_ENOTSRSADDRESS;
+
+ if (srs->noreverse) return SRS_ENOTREWRITTEN;
+
+ len = strlen(sender);
+ if (len >= buflen) return SRS_EBUFTOOSMALL;
+ senduser = alloca(len + 1);
+ strcpy(senduser, sender);
+
+ /* We don't really care about the host for reversal. */
+ tmp = strchr(senduser, '@');
+ if (tmp != NULL) *tmp = '\0';
+ return srs_parse_guarded(srs, buf, buflen, senduser);
}
int srs_reverse_alloc(srs_t *srs, char **sptr, const char *sender)
{
- char *buf;
- int len;
- int ret;
+ char *buf;
+ int len;
+ int ret;
- *sptr = NULL;
+ *sptr = NULL;
- if (!SRS_IS_SRS_ADDRESS(sender))
- return SRS_ENOTSRSADDRESS;
+ if (!SRS_IS_SRS_ADDRESS(sender)) return SRS_ENOTSRSADDRESS;
- if (srs->noreverse)
- return SRS_ENOTREWRITTEN;
+ if (srs->noreverse) return SRS_ENOTREWRITTEN;
- len = strlen(sender) + 1;
- buf = (char *)srs_f_malloc(len);
+ len = strlen(sender) + 1;
+ buf = (char *)srs_f_malloc(len);
- ret = srs_reverse(srs, buf, len, sender);
+ ret = srs_reverse(srs, buf, len, sender);
- if (ret == SRS_SUCCESS)
- *sptr = buf;
- else
- srs_f_free(buf);
+ if (ret == SRS_SUCCESS)
+ *sptr = buf;
+ else
+ srs_f_free(buf);
- return ret;
+ return ret;
}
diff --git a/src/srsforward.c b/src/srsforward.c
index c8aefc9..c855d36 100644
--- a/src/srsforward.c
+++ b/src/srsforward.c
@@ -1,24 +1,32 @@
-#include <unistd.h>
#include <sys/types.h>
-#include "control.h"
-#include "sig.h"
+#include <unistd.h>
+
+#include "buffer.h"
#include "constmap.h"
-#include "readwrite.h"
-#include "exit.h"
#include "env.h"
-#include "qmail.h"
-#include "auto_qmail.h"
-#include "buffer.h"
-#include "str.h"
+#include "exit.h"
#include "fmt.h"
-#include "stralloc.h"
#include "logmsg.h"
+#include "readwrite.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "auto_qmail.h"
+#include "control.h"
+#include "qmail.h"
#include "srs2.h"
#define WHO "srsforward"
-void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
-void die_control() { logmsg(WHO,110,FATAL,"Unable to read control files"); }
+void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
+void die_control()
+{
+ logmsg(WHO, 110, FATAL, "Unable to read control files");
+}
struct qmail qqt;
char *srsdomaininfo = 0;
@@ -35,27 +43,28 @@ stralloc srserror = {0};
110 control file not readable
*/
-static int srserror_str(int code) {
- if (!stralloc_copys(&srserror,"SRS: ")) die_nomem();
- if (!stralloc_cats(&srserror,srs_strerror(code))) die_nomem();
+static int srserror_str(int code)
+{
+ if (!stralloc_copys(&srserror, "SRS: ")) die_nomem();
+ if (!stralloc_cats(&srserror, srs_strerror(code))) die_nomem();
if (!stralloc_0(&srserror)) die_nomem();
return -3;
}
-ssize_t mywrite(int fd,char *buf,int len)
+ssize_t mywrite(int fd, char *buf, int len)
{
- qmail_put(&qqt,buf,len);
+ qmail_put(&qqt, buf, len);
return len;
}
char inbuf[BUFFER_INSIZE];
char outbuf[1];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
-buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
+buffer bo = BUFFER_INIT(mywrite, -1, outbuf, sizeof(outbuf));
char num[FMT_ULONG];
-int main(int argc,char **argv)
+int main(int argc, char **argv)
{
int i, j, r;
char *qqx;
@@ -70,57 +79,59 @@ int main(int argc,char **argv)
int alwaysrewrite = 0;
sig_pipeignore();
-
+
sender = env_get("NEWSENDER");
- if (!sender)
- logmsg(WHO,100,FATAL,"NEWSENDER not set");
+ if (!sender) logmsg(WHO, 100, FATAL, "NEWSENDER not set");
host = env_get("HOST");
- if (!host)
- logmsg(WHO,100,FATAL,"HOST not set");
+ if (!host) logmsg(WHO, 100, FATAL, "HOST not set");
dtline = env_get("DTLINE");
- if (!dtline)
- logmsg(WHO,100,FATAL,"DTLINE not set");
+ if (!dtline) logmsg(WHO, 100, FATAL, "DTLINE not set");
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
- if (!stralloc_cats(&srshost,"!")) die_nomem();
- if (!stralloc_cats(&srshost,host)) die_nomem();
+ if (!stralloc_cats(&srshost, "!")) die_nomem();
+ if (!stralloc_cats(&srshost, host)) die_nomem();
- switch (control_readfile(&srsdomains,"control/srsdomains",0)) {
+ switch (control_readfile(&srsdomains, "control/srsdomains", 0)) {
case -1: die_control();
- case 0: if (!constmap_init(&mapsrsdomains,"",0,1)) die_nomem(); break;
- case 1: if (!constmap_init(&mapsrsdomains,srsdomains.s,srsdomains.len,1)) die_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapsrsdomains, "", 0, 1)) die_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapsrsdomains, srsdomains.s, srsdomains.len, 1)) die_nomem();
+ break;
}
- if (constmap(&mapsrsdomains,srshost.s,srshost.len)) return 0; // domain blacklisted
- if ((srsdomaininfo = constmap(&mapsrsdomains,host,str_len(host))) == 0) {
- if ((srsdomaininfo = constmap(&mapsrsdomains,"*",1)) == 0) return 0; // '*' means always SRS
- else alwaysrewrite = 1;
+ if (constmap(&mapsrsdomains, srshost.s, srshost.len)) return 0; // domain blacklisted
+ if ((srsdomaininfo = constmap(&mapsrsdomains, host, str_len(host))) == 0) {
+ if ((srsdomaininfo = constmap(&mapsrsdomains, "*", 1)) == 0)
+ return 0; // '*' means always SRS
+ else
+ alwaysrewrite = 1;
}
if (*srsdomaininfo) {
- i = str_chr(srsdomaininfo,'|'); // multiple cookies; separated by ' '
+ i = str_chr(srsdomaininfo, '|'); // multiple cookies; separated by ' '
if (srsdomaininfo[i] == '|') {
srsdomaininfo[i] = 0;
- j = str_chr(srsdomaininfo + i + 1,'|');
+ j = str_chr(srsdomaininfo + i + 1, '|');
if (srsdomaininfo[i + j + 1] == '|') {
srsdomaininfo[i + j + 1] = 0;
- sendhost = srsdomaininfo + i + j + 2; // separator: - + =
+ sendhost = srsdomaininfo + i + j + 2; // separator: - + =
}
separator = srsdomaininfo[i + 1];
}
- if (!stralloc_copys(&cookie,srsdomaininfo)) die_nomem();
+ if (!stralloc_copys(&cookie, srsdomaininfo)) die_nomem();
if (!stralloc_0(&cookie)) die_nomem();
- if (!stralloc_copys(&srshost,"")) die_nomem();
+ if (!stralloc_copys(&srshost, "")) die_nomem();
if (*sendhost) {
j = str_len(sendhost);
if (sendhost[j - 1] == '.') {
- if (!stralloc_copys(&srshost,sendhost)) die_nomem();
- if (!stralloc_cats(&srshost,host)) die_nomem();
- } else
- if (!stralloc_copys(&srshost,sendhost)) die_nomem();
- } else
- if (!stralloc_copys(&srshost,host)) die_nomem();
+ if (!stralloc_copys(&srshost, sendhost)) die_nomem();
+ if (!stralloc_cats(&srshost, host)) die_nomem();
+ } else if (!stralloc_copys(&srshost, sendhost))
+ die_nomem();
+ } else if (!stralloc_copys(&srshost, host))
+ die_nomem();
if (!stralloc_0(&srshost)) die_nomem();
} else
die_control();
@@ -129,41 +140,41 @@ int main(int argc,char **argv)
srs = srs_new();
- if (separator == '-' || separator == '+' || separator == '=') { // '=' is default
- r = srs_set_separator(srs,separator);
+ if (separator == '-' || separator == '+' || separator == '=') { // '=' is default
+ r = srs_set_separator(srs, separator);
if (r != SRS_SUCCESS) return srserror_str(r);
}
if (alwaysrewrite) {
- r = srs_set_alwaysrewrite(srs,alwaysrewrite);
+ r = srs_set_alwaysrewrite(srs, alwaysrewrite);
if (r != SRS_SUCCESS) return srserror_str(r);
}
for (j = 0, i = 0; j < cookie.len; j++) {
- if (cookie.s[j] == ' ' || cookie.s[j] == '\0' ) {
- cookie.s[j] = '\0';
- r = srs_add_secret(srs,cookie.s + i);
+ if (cookie.s[j] == ' ' || cookie.s[j] == '\0') {
+ cookie.s[j] = '\0';
+ r = srs_add_secret(srs, cookie.s + i);
if (r != SRS_SUCCESS) return srserror_str(r);
- i = j + 1;
- if (cookie.s[i] == ' ') { j++; continue; }
+ i = j + 1;
+ if (cookie.s[i] == ' ') {
+ j++;
+ continue;
+ }
}
}
- if ((r = srs_forward(srs,srssender,sizeof(srssender),sender,srshost.s)) != SRS_SUCCESS)
- logmsg(WHO,100,FATAL,B("Unable to forward: ",sender," ",srs_strerror(r)));
+ if ((r = srs_forward(srs, srssender, sizeof(srssender), sender, srshost.s)) != SRS_SUCCESS)
+ logmsg(WHO, 100, FATAL, B("Unable to forward: ", sender, " ", srs_strerror(r)));
- if (qmail_open(&qqt) == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
- qmail_puts(&qqt,dtline);
- if (buffer_copy(&bo,&bi) != 0)
- logmsg(WHO,111,FATAL,"unable to read message: ");
+ if (qmail_open(&qqt) == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
+ qmail_puts(&qqt, dtline);
+ if (buffer_copy(&bo, &bi) != 0) logmsg(WHO, 111, FATAL, "unable to read message: ");
buffer_flush(&bo);
- num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
-
- qmail_from(&qqt,srssender);
- while (*++argv) qmail_to(&qqt,*argv);
- qqx = qmail_close(&qqt);
- if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
- logmsg(WHO,0,LOG,B(srssender,": qp ",num));
+ num[fmt_ulong(num, qmail_qp(&qqt))] = 0;
+ qmail_from(&qqt, srssender);
+ while (*++argv) qmail_to(&qqt, *argv);
+ qqx = qmail_close(&qqt);
+ if (*qqx) logmsg(WHO, *qqx == 'D' ? 100 : 111, FATAL, qqx + 1);
+ logmsg(WHO, 0, LOG, B(srssender, ": qp ", num));
}
diff --git a/src/srsreverse.c b/src/srsreverse.c
index dc2171d..33d0e5a 100644
--- a/src/srsreverse.c
+++ b/src/srsreverse.c
@@ -1,26 +1,34 @@
-#include <unistd.h>
#include <sys/types.h>
-#include "control.h"
-#include "sig.h"
-#include "constmap.h"
-#include "readwrite.h"
-#include "exit.h"
-#include "env.h"
-#include "qmail.h"
-#include "auto_qmail.h"
-#include "auto_break.h"
+#include <unistd.h>
+
#include "buffer.h"
#include "case.h"
-#include "str.h"
+#include "constmap.h"
+#include "env.h"
+#include "exit.h"
#include "fmt.h"
-#include "stralloc.h"
#include "logmsg.h"
+#include "readwrite.h"
+#include "sig.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "auto_break.h"
+#include "auto_qmail.h"
+#include "control.h"
+#include "qmail.h"
#include "srs2.h"
#define WHO "srsreverse"
-void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
-void die_control() { logmsg(WHO,110,FATAL,"Unable to read control files"); }
+void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
+void die_control()
+{
+ logmsg(WHO, 110, FATAL, "Unable to read control files");
+}
struct qmail qqt;
char *vdomainuser = 0;
@@ -40,23 +48,24 @@ stralloc srshost = {0};
110 control file not readable
*/
-static int srserror_str(int code) {
- if (!stralloc_copys(&srserror,"SRS: ")) die_nomem();
- if (!stralloc_cats(&srserror,srs_strerror(code))) die_nomem();
+static int srserror_str(int code)
+{
+ if (!stralloc_copys(&srserror, "SRS: ")) die_nomem();
+ if (!stralloc_cats(&srserror, srs_strerror(code))) die_nomem();
if (!stralloc_0(&srserror)) die_nomem();
return -3;
}
-ssize_t mywrite(int fd,char *buf,int len)
+ssize_t mywrite(int fd, char *buf, int len)
{
- qmail_put(&qqt,buf,len);
+ qmail_put(&qqt, buf, len);
return len;
}
char inbuf[BUFFER_INSIZE];
char outbuf[1];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
-buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
+buffer bo = BUFFER_INIT(mywrite, -1, outbuf, sizeof(outbuf));
char num[FMT_ULONG];
@@ -73,100 +82,104 @@ int main()
char *host = 0;
sig_pipeignore();
-
+
recipient = env_get("RECIPIENT");
- if (!recipient)
- logmsg(WHO,100,FATAL,"RECIPIENT not set");
+ if (!recipient) logmsg(WHO, 100, FATAL, "RECIPIENT not set");
dtline = env_get("DTLINE");
- if (!dtline)
- logmsg(WHO,100,FATAL,"DTLINE not set");
+ if (!dtline) logmsg(WHO, 100, FATAL, "DTLINE not set");
host = env_get("HOST");
- if (!host)
- logmsg(WHO,100,FATAL,"HOST not set");
-
- if (chdir(auto_qmail) == -1)
- logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
+ if (!host) logmsg(WHO, 100, FATAL, "HOST not set");
+
+ if (chdir(auto_qmail) == -1) logmsg(WHO, 111, FATAL, B("unable to chdir to: ", auto_qmail));
/* Check for particular virtual SRS domain user */
- switch (control_readfile(&vdomains,"control/virtualdomains",0)) {
+ switch (control_readfile(&vdomains, "control/virtualdomains", 0)) {
case -1: die_control();
- case 0: if (!constmap_init(&mapvdomains,"",0,1)) die_nomem(); break;
- case 1: if (!constmap_init(&mapvdomains,vdomains.s,vdomains.len,1)) die_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapvdomains, "", 0, 1)) die_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapvdomains, vdomains.s, vdomains.len, 1)) die_nomem();
+ break;
}
j = str_len(host);
- for (i = 0; i <= j; ++i)
+ for (i = 0; i <= j; ++i)
if ((i == 0) || (host[i] == '.')) {
- if (!stralloc_copys(&srshost,"")) die_nomem();
- if (!stralloc_catb(&srshost,host + i,j - i)) die_nomem();
- if ((srsdomaininfo = constmap(&mapvdomains,srshost.s,srshost.len)) != 0) goto SRSDOMAINS;
+ if (!stralloc_copys(&srshost, "")) die_nomem();
+ if (!stralloc_catb(&srshost, host + i, j - i)) die_nomem();
+ if ((srsdomaininfo = constmap(&mapvdomains, srshost.s, srshost.len)) != 0) goto SRSDOMAINS;
}
- if (!stralloc_copys(&srshost,host)) die_nomem();
+ if (!stralloc_copys(&srshost, host)) die_nomem();
- SRSDOMAINS:
+SRSDOMAINS:
- switch (control_readfile(&srsdomains,"control/srsdomains",0)) {
+ switch (control_readfile(&srsdomains, "control/srsdomains", 0)) {
case -1: die_control();
- case 0: if (!constmap_init(&mapsrsdomains,"",0,1)) die_nomem(); break;
- case 1: if (!constmap_init(&mapsrsdomains,srsdomains.s,srsdomains.len,1)) die_nomem(); break;
+ case 0:
+ if (!constmap_init(&mapsrsdomains, "", 0, 1)) die_nomem();
+ break;
+ case 1:
+ if (!constmap_init(&mapsrsdomains, srsdomains.s, srsdomains.len, 1)) die_nomem();
+ break;
}
- if ((srsdomaininfo = constmap(&mapsrsdomains,srshost.s,srshost.len)) == 0)
- if ((srsdomaininfo = constmap(&mapsrsdomains,"*",1)) == 0) return 0;
+ if ((srsdomaininfo = constmap(&mapsrsdomains, srshost.s, srshost.len)) == 0)
+ if ((srsdomaininfo = constmap(&mapsrsdomains, "*", 1)) == 0) return 0;
if (*srsdomaininfo) {
- i = str_chr(srsdomaininfo,'|'); // multiple cookies; separated by ' '
+ i = str_chr(srsdomaininfo, '|'); // multiple cookies; separated by ' '
if (srsdomaininfo[i] == '|') {
- srsdomaininfo[i] = 0;
- separator = srsdomaininfo[i+1];
+ srsdomaininfo[i] = 0;
+ separator = srsdomaininfo[i + 1];
}
- if (!stralloc_copys(&cookie,srsdomaininfo)) die_nomem();
+ if (!stralloc_copys(&cookie, srsdomaininfo)) die_nomem();
if (!stralloc_0(&cookie)) die_nomem();
}
/* strip virtual user from recipient */
- if ((vdomainuser = constmap(&mapvdomains,host,j))) {
- i = str_chr(recipient,*auto_break);
- if (!case_diffb(recipient,i - 1,vdomainuser)) recipient += i + 1;
+ if ((vdomainuser = constmap(&mapvdomains, host, j))) {
+ i = str_chr(recipient, *auto_break);
+ if (!case_diffb(recipient, i - 1, vdomainuser)) recipient += i + 1;
}
-
+
/* Let's go SRS reverse */
srs = srs_new();
- if (separator == '-' || separator == '+' || separator == '=') { // '=' is default
- r = srs_set_separator(srs,separator);
+ if (separator == '-' || separator == '+' || separator == '=') { // '=' is default
+ r = srs_set_separator(srs, separator);
if (r != SRS_SUCCESS) return srserror_str(r);
}
for (j = 0, i = 0; j < cookie.len; j++) {
- if (cookie.s[j] == ' ' || cookie.s[j] == '\0' ) {
- cookie.s[j] = '\0';
- r = srs_add_secret(srs,cookie.s + i);
+ if (cookie.s[j] == ' ' || cookie.s[j] == '\0') {
+ cookie.s[j] = '\0';
+ r = srs_add_secret(srs, cookie.s + i);
if (r != SRS_SUCCESS) return srserror_str(r);
- i = j + 1;
- if (cookie.s[i] == ' ') { j++; continue; }
+ i = j + 1;
+ if (cookie.s[i] == ' ') {
+ j++;
+ continue;
+ }
}
}
- if ((r = srs_reverse(srs,srsrecipient,sizeof(srsrecipient),recipient)) != SRS_SUCCESS) {
- logmsg(WHO,100,FATAL,B("unable to reverse: ",recipient," ",srs_strerror(r)));
+ if ((r = srs_reverse(srs, srsrecipient, sizeof(srsrecipient), recipient)) != SRS_SUCCESS) {
+ logmsg(WHO, 100, FATAL, B("unable to reverse: ", recipient, " ", srs_strerror(r)));
}
- if (qmail_open(&qqt) == -1)
- logmsg(WHO,111,FATAL,"unable to fork: ");
- qmail_puts(&qqt,dtline);
- if (buffer_copy(&bo,&bi) != 0)
- logmsg(WHO,111,FATAL,"unable to read message: ");
+ if (qmail_open(&qqt) == -1) logmsg(WHO, 111, FATAL, "unable to fork: ");
+ qmail_puts(&qqt, dtline);
+ if (buffer_copy(&bo, &bi) != 0) logmsg(WHO, 111, FATAL, "unable to read message: ");
buffer_flush(&bo);
- num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
-
- qmail_from(&qqt,"");
- qmail_to(&qqt,srsrecipient);
- qqx = qmail_close(&qqt);
- if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
- logmsg(WHO,0,LOG,B(srsrecipient,": qp ",num));
+ num[fmt_ulong(num, qmail_qp(&qqt))] = 0;
+ qmail_from(&qqt, "");
+ qmail_to(&qqt, srsrecipient);
+ qqx = qmail_close(&qqt);
+ if (*qqx) logmsg(WHO, *qqx == 'D' ? 100 : 111, FATAL, qqx + 1);
+ logmsg(WHO, 0, LOG, B(srsrecipient, ": qp ", num));
}
diff --git a/src/strset.c b/src/strset.c
index 8f3ffe8..3f3a855 100644
--- a/src/strset.c
+++ b/src/strset.c
@@ -1,7 +1,8 @@
#include "strset.h"
-#include "str.h"
-#include "byte.h"
+
#include "alloc.h"
+#include "byte.h"
+#include "str.h"
uint32 strset_hash(char *s)
{
@@ -24,20 +25,26 @@ int strset_init(strset *set)
set->n = 0;
set->a = 10;
- set->first = (int *) alloc(sizeof(int) * (set->mask + 1));
+ set->first = (int *)alloc(sizeof(int) * (set->mask + 1));
if (!set->first) return 0;
- set->p = (strset_list *) alloc(sizeof(strset_list) * set->a);
- if (!set->p) { alloc_free(set->first); return 0; }
- set->x = (char **) alloc(sizeof(char *) * set->a);
- if (!set->x) { alloc_free(set->p); alloc_free(set->first); return 0; }
+ set->p = (strset_list *)alloc(sizeof(strset_list) * set->a);
+ if (!set->p) {
+ alloc_free(set->first);
+ return 0;
+ }
+ set->x = (char **)alloc(sizeof(char *) * set->a);
+ if (!set->x) {
+ alloc_free(set->p);
+ alloc_free(set->first);
+ return 0;
+ }
- for (h = 0; h <= set->mask; ++h)
- set->first[h] = -1;
+ for (h = 0; h <= set->mask; ++h) set->first[h] = -1;
return 1;
}
-char *strset_in(strset *set,char *s)
+char *strset_in(strset *set, char *s)
{
uint32 h;
strset_list *sl;
@@ -51,14 +58,14 @@ char *strset_in(strset *set,char *s)
sl = set->p + i;
if (sl->h == h) {
xi = set->x[i];
- if (!str_diff(xi,s)) return xi;
+ if (!str_diff(xi, s)) return xi;
}
i = sl->next;
}
return 0;
}
-int strset_add(strset *set,char *s)
+int strset_add(strset *set, char *s)
{
uint32 h;
int n;
@@ -72,13 +79,16 @@ int strset_add(strset *set,char *s)
char **newx;
newa = n + 10 + (n >> 3);
- newp = (strset_list *) alloc(sizeof(strset_list) * newa);
+ newp = (strset_list *)alloc(sizeof(strset_list) * newa);
if (!newp) return 0;
- newx = (char **) alloc(sizeof(char *) * newa);
- if (!newx) { alloc_free(newp); return 0; }
+ newx = (char **)alloc(sizeof(char *) * newa);
+ if (!newx) {
+ alloc_free(newp);
+ return 0;
+ }
- byte_copy(newp,sizeof(strset_list) * n,set->p);
- byte_copy(newx,sizeof(char *) * n,set->x);
+ byte_copy(newp, sizeof(strset_list) * n, set->p);
+ byte_copy(newx, sizeof(char *) * n, set->x);
alloc_free(set->p);
alloc_free(set->x);
set->p = newp;
@@ -90,13 +100,12 @@ int strset_add(strset *set,char *s)
int *newfirst;
int i;
uint32 h;
-
+
newmask = set->mask + set->mask + 1;
- newfirst = (int *) alloc(sizeof(int) * (newmask + 1));
+ newfirst = (int *)alloc(sizeof(int) * (newmask + 1));
if (!newfirst) return 0;
- for (h = 0; h <= newmask; ++h)
- newfirst[h] = -1;
+ for (h = 0; h <= newmask; ++h) newfirst[h] = -1;
for (i = 0; i < n; ++i) {
sl = set->p + i;
diff --git a/src/tai64nfrac.c b/src/tai64nfrac.c
index f3db977..bb29b44 100644
--- a/src/tai64nfrac.c
+++ b/src/tai64nfrac.c
@@ -1,11 +1,11 @@
#include "buffer.h"
-#include "stralloc.h"
#include "exit.h"
-#include "readwrite.h"
-#include "open.h"
-#include "scan.h"
#include "fmt.h"
#include "getln.h"
+#include "open.h"
+#include "readwrite.h"
+#include "scan.h"
+#include "stralloc.h"
#define TAI64NLEN 24
@@ -16,11 +16,11 @@
*/
char outbuf[64];
-buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
+buffer bo = BUFFER_INIT(write, 1, outbuf, sizeof(outbuf));
static void outs(char *s)
{
- if (buffer_puts(&bo,s) == -1) _exit(1);
+ if (buffer_puts(&bo, s) == -1) _exit(1);
if (buffer_flush(&bo) == -1) _exit(1);
}
@@ -28,12 +28,12 @@ static void outi(int i)
{
char num[FMT_ULONG];
- if (buffer_put(&bo,num,fmt_ulong(num,(unsigned long) i)) == -1) _exit(1);
+ if (buffer_put(&bo, num, fmt_ulong(num, (unsigned long)i)) == -1) _exit(1);
if (buffer_flush(&bo) == -1) _exit(1);
}
char inbuf[1024];
-buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
+buffer bi = BUFFER_INIT(read, 0, inbuf, sizeof(inbuf));
int main(void)
{
@@ -41,23 +41,23 @@ int main(void)
int i;
int match;
unsigned long u;
- unsigned long seconds;
+ unsigned long seconds;
unsigned long nanoseconds;
stralloc line = {0};
-/* Read from stdin */
+ /* Read from stdin */
- buffer_init(&bi,read,0,inbuf,sizeof(inbuf));
+ buffer_init(&bi, read, 0, inbuf, sizeof(inbuf));
for (;;) {
- if (getln(&bi,&line,&match,'\n') != 0) _exit(1);
+ if (getln(&bi, &line, &match, '\n') != 0) _exit(1);
if (!match) break;
if (!stralloc_0(&line)) _exit(1);
seconds = 0;
nanoseconds = 0;
-
- if (line.s[0] == '@') { /* tai64 timestamp */
+
+ if (line.s[0] == '@') { /* tai64 timestamp */
for (i = 1; i <= TAI64NLEN; i++) {
c = (int)line.s[i];
u = c - '0';
@@ -74,9 +74,14 @@ int main(void)
}
seconds -= 4611686018427387914ULL;
seconds = seconds > 0 ? seconds : 0;
- outi(seconds); outs("."); outi(nanoseconds); outs(line.s + i); outs("\n");
+ outi(seconds);
+ outs(".");
+ outi(nanoseconds);
+ outs(line.s + i);
+ outs("\n");
} else {
- outs("tai64nfrac: fatal: Wrong TAI64N input format."); outs("\n");
+ outs("tai64nfrac: fatal: Wrong TAI64N input format.");
+ outs("\n");
_exit(1);
}
}
diff --git a/src/tcpto.c b/src/tcpto.c
index 92c33ea..77e565c 100644
--- a/src/tcpto.c
+++ b/src/tcpto.c
@@ -1,21 +1,24 @@
+#include "tcpto.h"
+
#include <sys/socket.h>
#include <unistd.h>
-#include "tcpto.h"
-#include "open.h"
+
+#include "byte.h"
+#include "ip.h"
#include "lock.h"
+#include "open.h"
#include "seek.h"
-#include "now.h"
-#include "ip.h"
-#include "ipalloc.h"
-#include "byte.h"
+
#include "datetime.h"
+#include "ipalloc.h"
+#include "now.h"
char tcpto_buf[1024];
static int flagwasthere;
static int fdlock;
-static int getbuf()
+static int getbuf()
{
int r;
int fd;
@@ -23,17 +26,27 @@ static int getbuf()
fdlock = open_write("queue/lock/tcpto");
if (fdlock == -1) return 0;
fd = open_read("queue/lock/tcpto");
- if (fd == -1) { close(fdlock); return 0; }
- if (lock_ex(fdlock) == -1) { close(fdlock); close(fd); return 0; }
- r = read(fd,tcpto_buf,sizeof(tcpto_buf));
+ if (fd == -1) {
+ close(fdlock);
+ return 0;
+ }
+ if (lock_ex(fdlock) == -1) {
+ close(fdlock);
+ close(fd);
+ return 0;
+ }
+ r = read(fd, tcpto_buf, sizeof(tcpto_buf));
close(fd);
- if (r < 0) { close(fdlock); return 0; }
+ if (r < 0) {
+ close(fdlock);
+ return 0;
+ }
r >>= 5;
if (!r) close(fdlock);
return r;
}
-int tcpto(struct ip_mx *ix)
+int tcpto(struct ip_mx *ix)
{
int af = ix->af;
struct ip_address *ip = &ix->addr;
@@ -51,13 +64,13 @@ int tcpto(struct ip_mx *ix)
record = tcpto_buf;
for (i = 0; i < n; ++i) {
- if (af == record[0] && byte_equal(ip->d,af == AF_INET ? 4 : 16,record + 16)) {
+ if (af == record[0] && byte_equal(ip->d, af == AF_INET ? 4 : 16, record + 16)) {
flagwasthere = 1;
if (record[4] >= 2) {
- when = (unsigned long) (unsigned char) record[11];
- when = (when << 8) + (unsigned long) (unsigned char) record[10];
- when = (when << 8) + (unsigned long) (unsigned char) record[9];
- when = (when << 8) + (unsigned long) (unsigned char) record[8];
+ when = (unsigned long)(unsigned char)record[11];
+ when = (when << 8) + (unsigned long)(unsigned char)record[10];
+ when = (when << 8) + (unsigned long)(unsigned char)record[9];
+ when = (when << 8) + (unsigned long)(unsigned char)record[8];
if (now() - when < ((60 + (getpid() & 31)) << 6)) return 1;
}
@@ -68,7 +81,7 @@ int tcpto(struct ip_mx *ix)
return 0;
}
-void tcpto_err(struct ip_mx *ix,int flagerr)
+void tcpto_err(struct ip_mx *ix, int flagerr)
{
int af = ix->af;
struct ip_address *ip = &ix->addr;
@@ -81,8 +94,7 @@ void tcpto_err(struct ip_mx *ix,int flagerr)
datetime_sec lastwhen;
if (!flagerr)
- if (!flagwasthere)
- return; /* could have been added, but not worth the effort to check */
+ if (!flagwasthere) return; /* could have been added, but not worth the effort to check */
n = getbuf();
if (!n) return;
@@ -90,26 +102,32 @@ void tcpto_err(struct ip_mx *ix,int flagerr)
record = tcpto_buf;
for (i = 0; i < n; ++i) {
- if (af == record[0] && byte_equal(ip->d,af == AF_INET ? 4 : 16,record + 16)) {
+ if (af == record[0] && byte_equal(ip->d, af == AF_INET ? 4 : 16, record + 16)) {
if (!flagerr)
- record[4] = 0;
+ record[4] = 0;
else {
- lastwhen = (unsigned long) (unsigned char) record[11];
- lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[10];
- lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[9];
- lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[8];
+ lastwhen = (unsigned long)(unsigned char)record[11];
+ lastwhen = (lastwhen << 8) + (unsigned long)(unsigned char)record[10];
+ lastwhen = (lastwhen << 8) + (unsigned long)(unsigned char)record[9];
+ lastwhen = (lastwhen << 8) + (unsigned long)(unsigned char)record[8];
when = now();
- if (record[4] && (when < 120 + lastwhen)) { close(fdlock); return; }
+ if (record[4] && (when < 120 + lastwhen)) {
+ close(fdlock);
+ return;
+ }
if (++record[4] > 10) record[4] = 10;
- record[8] = when; when >>= 8;
- record[9] = when; when >>= 8;
- record[10] = when; when >>= 8;
+ record[8] = when;
+ when >>= 8;
+ record[9] = when;
+ when >>= 8;
+ record[10] = when;
+ when >>= 8;
record[11] = when;
}
- if (seek_set(fdlock,i << 5) == 0)
- if (write(fdlock,record,32) < 32)
+ if (seek_set(fdlock, i << 5) == 0)
+ if (write(fdlock, record, 32) < 32)
; /*XXX*/
close(fdlock);
return;
@@ -117,7 +135,10 @@ void tcpto_err(struct ip_mx *ix,int flagerr)
record += 32;
}
- if (!flagerr) { close(fdlock); return; }
+ if (!flagerr) {
+ close(fdlock);
+ return;
+ }
record = tcpto_buf;
@@ -131,10 +152,10 @@ void tcpto_err(struct ip_mx *ix,int flagerr)
record = tcpto_buf;
for (i = 0; i < n; ++i) {
- when = (unsigned long) (unsigned char) record[11];
- when = (when << 8) + (unsigned long) (unsigned char) record[10];
- when = (when << 8) + (unsigned long) (unsigned char) record[9];
- when = (when << 8) + (unsigned long) (unsigned char) record[8];
+ when = (unsigned long)(unsigned char)record[11];
+ when = (when << 8) + (unsigned long)(unsigned char)record[10];
+ when = (when << 8) + (unsigned long)(unsigned char)record[9];
+ when = (when << 8) + (unsigned long)(unsigned char)record[8];
when += (record[4] << 10);
if ((firstpos < 0) || (when < firstwhen)) {
firstpos = i;
@@ -148,20 +169,23 @@ void tcpto_err(struct ip_mx *ix,int flagerr)
if (i >= 0) {
record = tcpto_buf + (i << 5);
record[0] = af;
- if (af == AF_INET6)
- byte_copy(record + 16,16,ip->d);
+ if (af == AF_INET6)
+ byte_copy(record + 16, 16, ip->d);
else {
- byte_copy(record + 16,4,ip->d);
- byte_copy(record + 20,12,"............");
+ byte_copy(record + 16, 4, ip->d);
+ byte_copy(record + 20, 12, "............");
}
when = now();
- record[8] = when; when >>= 8;
- record[9] = when; when >>= 8;
- record[10] = when; when >>= 8;
+ record[8] = when;
+ when >>= 8;
+ record[9] = when;
+ when >>= 8;
+ record[10] = when;
+ when >>= 8;
record[11] = when;
record[4] = 1;
- if (seek_set(fdlock,i << 5) == 0)
- if (write(fdlock,record,32) < 32)
+ if (seek_set(fdlock, i << 5) == 0)
+ if (write(fdlock, record, 32) < 32)
; /*XXX*/
}
diff --git a/src/tcpto_clean.c b/src/tcpto_clean.c
index e0b6969..92df9bd 100644
--- a/src/tcpto_clean.c
+++ b/src/tcpto_clean.c
@@ -1,7 +1,9 @@
#include <unistd.h>
-#include "tcpto.h"
-#include "open.h"
+
#include "buffer.h"
+#include "open.h"
+
+#include "tcpto.h"
char tcpto_cleanbuf[1024];
@@ -13,9 +15,8 @@ void tcpto_clean() /* running from queue/mess */
fd = open_write("../lock/tcpto");
if (fd == -1) return;
- buffer_init(&bo,write,fd,tcpto_cleanbuf,sizeof(tcpto_cleanbuf));
- for (i = 0; i < sizeof(tcpto_cleanbuf); ++i)
- buffer_put(&bo,"",1);
+ buffer_init(&bo, write, fd, tcpto_cleanbuf, sizeof(tcpto_cleanbuf));
+ for (i = 0; i < sizeof(tcpto_cleanbuf); ++i) buffer_put(&bo, "", 1);
buffer_flush(&bo); /* if it fails, bummer */
close(fd);
}
diff --git a/src/tls_errors.c b/src/tls_errors.c
index 5c30236..3d24784 100644
--- a/src/tls_errors.c
+++ b/src/tls_errors.c
@@ -1,7 +1,9 @@
-#include <unistd.h>
-#include "stralloc.h"
#include "tls_errors.h"
+
+#include <unistd.h>
+
#include "error.h"
+#include "stralloc.h"
/** @file tls_errors.c
@brief temp_tls* routines are used for error messges
@@ -9,41 +11,41 @@
/* TLS error messages: A) Setup */
-void temp_tlscert()
-{
- out("ZCan't load X.509 certificate: ");
- outsafe(&certfile);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlscert()
+{
+ out("ZCan't load X.509 certificate: ");
+ outsafe(&certfile);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlskey()
-{
- out("ZCan't load X.509 private key: ");
- outsafe(&keyfile);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlskey()
+{
+ out("ZCan't load X.509 private key: ");
+ outsafe(&keyfile);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlschk()
-{
- out("ZKeyfile does not match X.509 certificate: ");
- outsafe(&keypwd);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlschk()
+{
+ out("ZKeyfile does not match X.509 certificate: ");
+ outsafe(&keypwd);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlsca()
-{
- out("ZI wasn't able to set up CAFILE: ");
- outsafe(&cafile);
+void temp_tlsca()
+{
+ out("ZI wasn't able to set up CAFILE: ");
+ outsafe(&cafile);
out(" or CADIR: ");
- outsafe(&cadir);
- out(" for TLS. (#4.4.1)\n");
- zerodie();
+ outsafe(&cadir);
+ out(" for TLS. (#4.4.1)\n");
+ zerodie();
}
-void temp_tlscipher()
+void temp_tlscipher()
{
out("ZI wasn't able to process the TLS ciphers: ");
outsafe(&ciphers);
@@ -53,106 +55,128 @@ void temp_tlscipher()
/* TLS error messages: B) Connection related */
-void temp_tlsctx()
-{
+void temp_tlsctx()
+{
out("ZI wasn't able to create TLS context for: ");
- outsafe(&host); out(" at "); out(remotehost.s);
- out(". (#4.4.1)\n");
+ outsafe(&host);
+ out(" at ");
+ out(remotehost.s);
+ out(". (#4.4.1)\n");
zerodie();
}
-void temp_tlscon()
-{
+void temp_tlscon()
+{
errno = EPROTO;
- out("ZI wasn't able to establish a TLS connection with: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+ out("ZI wasn't able to establish a TLS connection with: ");
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlserr()
+void temp_tlserr()
{
errno = EPROTO;
out("ZTLS connection/protocol error with: ");
- out(remotehost.s); out(" for "); outsafe(&host);
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
out(". (#4.4.1)\n");
zerodie();
}
-void temp_tlshost()
-{
- out("ZI wasn't able to negotiate a StartTLS connection with: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlshost()
+{
+ out("ZI wasn't able to negotiate a StartTLS connection with: ");
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
/* TLS error messages: C) Verification related */
-void temp_tlspeercert()
-{
- out("ZUnable to obtain X.509 certificate from: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlspeercert()
+{
+ out("ZUnable to obtain X.509 certificate from: ");
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlspeerverify()
-{
- out("ZUnable to verify X.509 certificate from: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlspeerverify()
+{
+ out("ZUnable to verify X.509 certificate from: ");
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlspeervalid()
-{
- out("ZUnable to validate X.509 certificate Subject for: ");
- outsafe(&host); out(" at "); out(remotehost.s);
- out(". (#4.4.1)\n");
- zerodie();
+void temp_tlspeervalid()
+{
+ out("ZUnable to validate X.509 certificate Subject for: ");
+ outsafe(&host);
+ out(" at ");
+ out(remotehost.s);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlscertfp()
-{
+void temp_tlscertfp()
+{
out("ZReceived X.509 certificate from: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(" does not match fingerprint: ");
- outsafe(&cafile);
- out(". (#4.4.1)\n");
- zerodie();
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(" does not match fingerprint: ");
+ outsafe(&cafile);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_invaliddigest()
-{
+void temp_invaliddigest()
+{
out("ZInvalid digest length provided given for: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlsamissing()
-{
+void temp_tlsamissing()
+{
out("ZTLSA X.509 cert required but missing from: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(". (#4.4.1)\n");
- zerodie();
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlsainvalid()
-{
+void temp_tlsainvalid()
+{
out("ZTLSA fingerprint matching error for: ");
- out(remotehost.s);
- out(". (#4.4.1)\n");
- zerodie();
+ out(remotehost.s);
+ out(". (#4.4.1)\n");
+ zerodie();
}
-void temp_tlsdigest()
-{
+void temp_tlsdigest()
+{
out("ZReceived X.509 certificate from: ");
- out(remotehost.s); out(" for "); outsafe(&host);
- out(" posses an unknown digest method");
- out(". (#4.4.1)\n");
- zerodie();
+ out(remotehost.s);
+ out(" for ");
+ outsafe(&host);
+ out(" posses an unknown digest method");
+ out(". (#4.4.1)\n");
+ zerodie();
}
diff --git a/src/tls_remote.c b/src/tls_remote.c
index 1318b4e..7986077 100644
--- a/src/tls_remote.c
+++ b/src/tls_remote.c
@@ -1,14 +1,17 @@
+#include "tls_remote.h"
+
#include <unistd.h>
-#include "ucspissl.h"
-#include "fmt.h"
-#include "stralloc.h"
-#include "str.h"
+
#include "byte.h"
#include "case.h"
-#include "dns.h"
#include "constmap.h"
-#include "tls_remote.h"
+#include "fmt.h"
+#include "str.h"
+#include "stralloc.h"
+
+#include "dns.h"
#include "tls_errors.h"
+#include "ucspissl.h"
/** @file tls_remote.c -- TLS client functions
@brief connection functions: tls_conn, tls_exit;
@@ -26,43 +29,40 @@
#define X509_cert_digest X509_digest
-int tls_certkey(SSL_CTX *ctx,const char *cert,const char *key,char *ppwd)
+int tls_certkey(SSL_CTX *ctx, const char *cert, const char *key, char *ppwd)
{
if (!cert) return 0;
- if (SSL_CTX_use_certificate_chain_file(ctx,cert) != 1)
- return -1;
+ if (SSL_CTX_use_certificate_chain_file(ctx, cert) != 1) return -1;
if (!key) key = cert;
- if (ppwd) SSL_CTX_set_default_passwd_cb_userdata(ctx,ppwd);
+ if (ppwd) SSL_CTX_set_default_passwd_cb_userdata(ctx, ppwd);
- if (SSL_CTX_use_PrivateKey_file(ctx,key,SSL_FILETYPE_PEM) != 1)
- return -2;
+ if (SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM) != 1) return -2;
- if (SSL_CTX_check_private_key(ctx) != 1)
- return -3;
+ if (SSL_CTX_check_private_key(ctx) != 1) return -3;
return 0;
}
-int tls_conn(SSL *ssl,int smtpfd)
+int tls_conn(SSL *ssl, int smtpfd)
{
- SSL_set_options(ssl,SSL_OP_NO_SSLv2);
- SSL_set_options(ssl,SSL_OP_NO_SSLv3);
- return SSL_set_fd(ssl,smtpfd);
+ SSL_set_options(ssl, SSL_OP_NO_SSLv2);
+ SSL_set_options(ssl, SSL_OP_NO_SSLv3);
+ return SSL_set_fd(ssl, smtpfd);
}
-int tls_checkpeer(SSL *ssl,X509 *cert,const stralloc host,const int flag,const int verify)
+int tls_checkpeer(SSL *ssl, X509 *cert, const stralloc host, const int flag, const int verify)
{
- STACK_OF(GENERAL_NAME) *extensions;
+ STACK_OF(GENERAL_NAME) * extensions;
const GENERAL_NAME *ext;
char buf[SSL_NAME_LEN];
char *dnsname = 0;
int dname = 0;
int num;
int len;
- int fflag;
+ int fflag;
int i;
int rc = 0;
@@ -73,58 +73,64 @@ int tls_checkpeer(SSL *ssl,X509 *cert,const stralloc host,const int flag,const i
/* X.509 CA DN/SAN name validation against DNS */
if (host.len && fflag > 4) {
- extensions = (GENERAL_NAME *)X509_get_ext_d2i(cert,NID_subject_alt_name,0,0);
- num = sk_GENERAL_NAME_num(extensions); /* num = 0, if no SAN extensions */
+ extensions = (GENERAL_NAME *)X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0);
+ num = sk_GENERAL_NAME_num(extensions); /* num = 0, if no SAN extensions */
for (i = 0; i < num; ++i) {
- ext = sk_GENERAL_NAME_value(extensions,i);
+ ext = sk_GENERAL_NAME_value(extensions, i);
if (ext->type == GEN_DNS) {
- #if (OPENSSL_VERSION_NUMBER < 0x10100000L) // 0xmnnffppsL
+#if (OPENSSL_VERSION_NUMBER < 0x10100000L) // 0xmnnffppsL
if (ASN1_STRING_type(ext->d.ia5) != V_ASN1_IA5STRING) continue;
dnsname = (char *)ASN1_STRING_data(ext->d.ia5);
- #else
- if (OBJ_sn2nid((const char*)ext->d.ia5) != V_ASN1_IA5STRING) continue;
+#else
+ if (OBJ_sn2nid((const char *)ext->d.ia5) != V_ASN1_IA5STRING) continue;
dnsname = (char *)ASN1_STRING_get0_data(ext->d.ia5);
- #endif
+#endif
len = ASN1_STRING_length(ext->d.ia5);
dname = 1;
}
}
if (!dname) {
- X509_NAME_get_text_by_NID(X509_get_subject_name(cert),NID_commonName,buf,sizeof(buf));
+ X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_commonName, buf, sizeof(buf));
buf[SSL_NAME_LEN - 1] = 0;
dnsname = buf;
len = SSL_NAME_LEN - 1;
}
switch (fflag) {
- case 5: if (dnsname[0] == '*' && dnsname[1] == '.')
- if (case_diffrs(dnsname + 1,host.s)) return -3;
- if (case_diffrs(dnsname,host.s)) return -3;
- rc = 3; break;
- case 6: if (case_diffs(dnsname,host.s)) return -3;
- rc = 2; break;
+ case 5:
+ if (dnsname[0] == '*' && dnsname[1] == '.')
+ if (case_diffrs(dnsname + 1, host.s)) return -3;
+ if (case_diffrs(dnsname, host.s)) return -3;
+ rc = 3;
+ break;
+ case 6:
+ if (case_diffs(dnsname, host.s)) return -3;
+ rc = 2;
+ break;
}
}
/* X.509 CA Verification: root CA must be available */
- if (fflag > 3 && verify > -2) {
- if (SSL_get_verify_result(ssl) != X509_V_OK) return -2;
- else rc = 1;
+ if (fflag > 3 && verify > -2) {
+ if (SSL_get_verify_result(ssl) != X509_V_OK)
+ return -2;
+ else
+ rc = 1;
}
return rc;
}
-int tls_checkcrl(SSL *ssl) // not implemented yet
+int tls_checkcrl(SSL *ssl) // not implemented yet
{
return 0;
}
-int dig_ascii(char *digascii,const char *digest,const int len)
+int dig_ascii(char *digascii, const char *digest, const int len)
{
static const char hextab[] = "0123456789abcdef";
int j;
@@ -143,25 +149,25 @@ int dig_ascii(char *digascii,const char *digest,const int len)
Subjects keys are restricted to 2048 byte in size.
Return codes: 1: sucess, 0: failed. */
-int X509_pkey_digest(const X509 *cert,const EVP_MD *type,unsigned char *md,unsigned int *dlen)
+int X509_pkey_digest(const X509 *cert, const EVP_MD *type, unsigned char *md, unsigned int *dlen)
{
unsigned int len = 0;
unsigned int size = 2048;
unsigned char *buf;
unsigned char *buf2;
- unsigned char buffer[size]; // avoid malloc
+ unsigned char buffer[size]; // avoid malloc
-/* Following Viktor's suggestion */
+ /* Following Viktor's suggestion */
if (!X509_get0_pubkey_bitstr(cert)) return 0; // no Subject public key
- len = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert),0);
+ len = i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), 0);
if (len > size) return 0;
buf2 = buf = buffer;
- i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert),(unsigned char **)&buf2);
+ i2d_X509_PUBKEY(X509_get_X509_PUBKEY(cert), (unsigned char **)&buf2);
if (buf2 - buf != len) return 0;
- if (!EVP_Digest(buf,len,md,dlen,type,0)) return 0; // OpenSSL voodoo
+ if (!EVP_Digest(buf, len, md, dlen, type, 0)) return 0; // OpenSSL voodoo
return 1;
}
@@ -169,7 +175,7 @@ int X509_pkey_digest(const X509 *cert,const EVP_MD *type,unsigned char *md,unsig
-2: unsupported type, -1: weird TLSA record
0: No X.509 cert; seen: usage++; */
-int tlsa_check(const STACK_OF(X509) *certs,const stralloc host,const unsigned long p)
+int tlsa_check(const STACK_OF(X509) * certs, const stralloc host, const unsigned long p)
{
const EVP_MD *methodsha256 = EVP_sha256();
const EVP_MD *methodsha512 = EVP_sha512();
@@ -180,25 +186,27 @@ int tlsa_check(const STACK_OF(X509) *certs,const stralloc host,const unsigned lo
unsigned int dlen = 0;
unsigned int n = 0;
int i = 0;
- int r;
+ int r;
char port[FMT_ULONG];
uint16 type;
uint16 selector;
uint16 usage;
-// construct TLSA FQDN -- simple procedure; returning Usage
+ // construct TLSA FQDN -- simple procedure; returning Usage
if (host.len < 2) return 0;
- if (!stralloc_copyb(&sa,"_",1)) temp_nomem();
- port[fmt_ulong(port,p)] = 0;
- if (!stralloc_cats(&sa,port)) temp_nomem();
- if (!stralloc_cats(&sa,"._tcp.")) temp_nomem();
- if (!stralloc_cats(&sa,host.s)) temp_nomem();
-
- if (dns_cname(&cn,&sa) > 0) // query name could be a cname
- { if (dns_tlsa(&out,&cn) <= 0) return 0; }
- else
- { if (dns_tlsa(&out,&sa) <= 0) return 0; }
+ if (!stralloc_copyb(&sa, "_", 1)) temp_nomem();
+ port[fmt_ulong(port, p)] = 0;
+ if (!stralloc_cats(&sa, port)) temp_nomem();
+ if (!stralloc_cats(&sa, "._tcp.")) temp_nomem();
+ if (!stralloc_cats(&sa, host.s)) temp_nomem();
+
+ if (dns_cname(&cn, &sa) > 0) // query name could be a cname
+ {
+ if (dns_tlsa(&out, &cn) <= 0) return 0;
+ } else {
+ if (dns_tlsa(&out, &sa) <= 0) return 0;
+ }
if (out.len < 5) return -1;
/* https://www.openssl.org/docs/man3.0/man3/X509_digest.html (1.1.1):
@@ -207,23 +215,23 @@ int tlsa_check(const STACK_OF(X509) *certs,const stralloc host,const unsigned lo
*/
do {
- usage = (unsigned char) out.s[i]; // Usage: PKIX-TA [0], PKIX-EE [1], DANE-TA [2], DANE-EE [3]
- selector = (unsigned char) out.s[i + 1]; // Selector: 0 = Cert, 1 = SPKI
- type = (unsigned char) out.s[i + 2]; // Type: 0/1/2 = [Cert|SPKI]/SHA256/SHA512
+ usage = (unsigned char)out.s[i]; // Usage: PKIX-TA [0], PKIX-EE [1], DANE-TA [2], DANE-EE [3]
+ selector = (unsigned char)out.s[i + 1]; // Selector: 0 = Cert, 1 = SPKI
+ type = (unsigned char)out.s[i + 2]; // Type: 0/1/2 = [Cert|SPKI]/SHA256/SHA512
unsigned len = sk_X509_num(certs);
- for (n = 0; n < len; n++) {
- X509 *cert = sk_X509_value(certs,n);
+ for (n = 0; n < len; n++) {
+ X509 *cert = sk_X509_value(certs, n);
if (type == 1) {
- if (selector == 0) r = X509_cert_digest(cert,methodsha256,digest,&dlen);
- if (selector == 1) r = X509_pkey_digest(cert,methodsha256,digest,&dlen);
+ if (selector == 0) r = X509_cert_digest(cert, methodsha256, digest, &dlen);
+ if (selector == 1) r = X509_pkey_digest(cert, methodsha256, digest, &dlen);
} else if (type == 2) {
- if (selector == 0) r = X509_cert_digest(cert,methodsha512,digest,&dlen);
- if (selector == 1) r = X509_pkey_digest(cert,methodsha512,digest,&dlen);
- } else
+ if (selector == 0) r = X509_cert_digest(cert, methodsha512, digest, &dlen);
+ if (selector == 1) r = X509_pkey_digest(cert, methodsha512, digest, &dlen);
+ } else
return -2;
- if (!byte_diff(digest,dlen,out.s + i + 3)) return ++usage;
+ if (!byte_diff(digest, dlen, out.s + i + 3)) return ++usage;
}
i += (dlen + 3);
@@ -232,7 +240,7 @@ int tlsa_check(const STACK_OF(X509) *certs,const stralloc host,const unsigned lo
return -3;
}
-int tls_fingerprint(X509 *cert,const char *fingerprint,int dlen)
+int tls_fingerprint(X509 *cert, const char *fingerprint, int dlen)
{
const EVP_MD *methodsha1 = EVP_sha1();
const EVP_MD *methodsha224 = EVP_sha224();
@@ -242,24 +250,27 @@ int tls_fingerprint(X509 *cert,const char *fingerprint,int dlen)
unsigned char digascii[257];
unsigned int len;
- switch (dlen) { /* fetch digest from cert; len = bitlength/8 */
- case 40: if (!X509_digest(cert,methodsha1,digest,&len)) return -2;
- case 56: if (!X509_digest(cert,methodsha224,digest,&len)) return -2;
- case 64: if (!X509_digest(cert,methodsha256,digest,&len)) return -2;
- case 128: if (!X509_digest(cert,methodsha512,digest,&len)) return -2;
- default: return -3;
+ switch (dlen) { /* fetch digest from cert; len = bitlength/8 */
+ case 40:
+ if (!X509_digest(cert, methodsha1, digest, &len)) return -2;
+ case 56:
+ if (!X509_digest(cert, methodsha224, digest, &len)) return -2;
+ case 64:
+ if (!X509_digest(cert, methodsha256, digest, &len)) return -2;
+ case 128:
+ if (!X509_digest(cert, methodsha512, digest, &len)) return -2;
+ default: return -3;
}
- len = dig_ascii(digascii,digest,len);
- if (!str_diffn(digascii,fingerprint,len)) return 1;
+ len = dig_ascii(digascii, digest, len);
+ if (!str_diffn(digascii, fingerprint, len)) return 1;
return 0;
}
int tls_exit(SSL *ssl)
{
- if (SSL_shutdown(ssl) == 0)
- SSL_shutdown(ssl);
+ if (SSL_shutdown(ssl) == 0) SSL_shutdown(ssl);
return 0;
}
@@ -283,86 +294,86 @@ int tls_destination(const stralloc hostname)
stralloc tlshost = {0};
stralloc tlsdest = {0};
- if (!stralloc_copy(&tlshost,&hostname)) temp_nomem();
+ if (!stralloc_copy(&tlshost, &hostname)) temp_nomem();
if (!stralloc_0(&tlshost)) temp_nomem();
-// Host rules
+ // Host rules
+
+ if (!stralloc_copys(&tlsdest, "!")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return -1;
- if (!stralloc_copys(&tlsdest,"!")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return -1;
+ if (!stralloc_copys(&tlsdest, "?")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 9;
- if (!stralloc_copys(&tlsdest,"?")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 9;
+ if (!stralloc_copys(&tlsdest, "/")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 8;
- if (!stralloc_copys(&tlsdest,"/")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 8;
+ if (!stralloc_copys(&tlsdest, "%")) temp_nomem(); // CERT + hash
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 7;
- if (!stralloc_copys(&tlsdest,"%")) temp_nomem(); // CERT + hash
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 7;
+ if (!stralloc_copys(&tlsdest, "=")) temp_nomem(); // CERT + FQDN
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 6;
- if (!stralloc_copys(&tlsdest,"=")) temp_nomem(); // CERT + FQDN
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 6;
-
- if (!stralloc_copys(&tlsdest,"~")) temp_nomem(); // CERT + Wild
- if (!stralloc_cats(&tlsdest,tlshost.s)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 5;
-
-// Domain rules
+ if (!stralloc_copys(&tlsdest, "~")) temp_nomem(); // CERT + Wild
+ if (!stralloc_cats(&tlsdest, tlshost.s)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 5;
+
+ // Domain rules
for (i = 0; i < tlshost.len; ++i) // TLS fallthru
if ((i == 0) || (tlshost.s[i] == '.')) {
- if (!stralloc_copys(&tlsdest,"?")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s + i)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 9;
+ if (!stralloc_copys(&tlsdest, "?")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s + i)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 9;
}
for (i = 0; i < tlshost.len; ++i) // no TLSA
if ((i == 0) || (tlshost.s[i] == '.')) {
- if (!stralloc_copys(&tlsdest,"/")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s + i)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 8;
+ if (!stralloc_copys(&tlsdest, "/")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s + i)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 8;
}
for (i = 0; i < tlshost.len; ++i) // CERT + Wild
if ((i == 0) || (tlshost.s[i] == '.')) {
- if (!stralloc_copys(&tlsdest,"~")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s + i)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 5;
+ if (!stralloc_copys(&tlsdest, "~")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s + i)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 5;
}
- for (i = 0; i < tlshost.len; ++i) // CERT - generic
+ for (i = 0; i < tlshost.len; ++i) // CERT - generic
if ((i == 0) || (tlshost.s[i] == '.')) {
- if (!stralloc_copys(&tlsdest,"")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s + i)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 4;
+ if (!stralloc_copys(&tlsdest, "")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s + i)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 4;
}
for (i = 0; i < tlshost.len; ++i) // ADH per host/domain
if ((i == 0) || (tlshost.s[i] == '.')) {
- if (!stralloc_copys(&tlsdest,"-")) temp_nomem();
- if (!stralloc_cats(&tlsdest,tlshost.s + i)) temp_nomem();
- if ((tlsdestinfo = constmap(&maptlsdestinations,tlsdest.s,tlsdest.len))) return 2;
+ if (!stralloc_copys(&tlsdest, "-")) temp_nomem();
+ if (!stralloc_cats(&tlsdest, tlshost.s + i)) temp_nomem();
+ if ((tlsdestinfo = constmap(&maptlsdestinations, tlsdest.s, tlsdest.len))) return 2;
}
-// General rules (mandatory TLS)
+ // General rules (mandatory TLS)
tlsdestinfo = 0;
- if (constmap(&maptlsdestinations,"/*",2)) return 8; // no TLSA
- if (constmap(&maptlsdestinations,"=*",2)) return 6; // CERT + FQDN
- if (constmap(&maptlsdestinations,"~*",2)) return 5; // CERT + Wild
- if (constmap(&maptlsdestinations,"+*",2)) return 4; // CERT
- if (constmap(&maptlsdestinations,"-*",2)) return 2; // ADH
+ if (constmap(&maptlsdestinations, "/*", 2)) return 8; // no TLSA
+ if (constmap(&maptlsdestinations, "=*", 2)) return 6; // CERT + FQDN
+ if (constmap(&maptlsdestinations, "~*", 2)) return 5; // CERT + Wild
+ if (constmap(&maptlsdestinations, "+*", 2)) return 4; // CERT
+ if (constmap(&maptlsdestinations, "-*", 2)) return 2; // ADH
-// Fall thru rules (optional TLS)
+ // Fall thru rules (optional TLS)
- if (constmap(&maptlsdestinations,"?",1)) return 9; // fallback to no TLS
- if (constmap(&maptlsdestinations,"*",1)) return 3; // CERT
- if (constmap(&maptlsdestinations,"-",1)) return 1; // ADH
+ if (constmap(&maptlsdestinations, "?", 1)) return 9; // fallback to no TLS
+ if (constmap(&maptlsdestinations, "*", 1)) return 3; // CERT
+ if (constmap(&maptlsdestinations, "-", 1)) return 1; // ADH
return 0;
}
@@ -370,18 +381,18 @@ int tls_destination(const stralloc hostname)
int tls_domaincerts(const stralloc domainname)
{
int i;
- tlsdomaininfo = 0; // extern
+ tlsdomaininfo = 0; // extern
-/* Our Certs - per domain */
+ /* Our Certs - per domain */
if (domainname.len)
for (i = 0; i < domainname.len; ++i)
if ((i == 0) || (domainname.s[i] == '.'))
- if ((tlsdomaininfo = constmap(&mapdomaincerts,domainname.s + i,domainname.len - i))) return 2;
+ if ((tlsdomaininfo = constmap(&mapdomaincerts, domainname.s + i, domainname.len - i))) return 2;
+
+ /* Standard Cert (if any) */
-/* Standard Cert (if any) */
-
- if ((tlsdomaininfo = constmap(&mapdomaincerts,"*",1))) return 1;
+ if ((tlsdomaininfo = constmap(&mapdomaincerts, "*", 1))) return 1;
return 0;
}
diff --git a/src/tls_start.c b/src/tls_start.c
index 77c5155..12c8e75 100644
--- a/src/tls_start.c
+++ b/src/tls_start.c
@@ -1,35 +1,42 @@
#include <unistd.h>
-#include "scan.h"
+
#include "env.h"
-#include "open.h"
-#include "stralloc.h"
#include "fd.h"
#include "logmsg.h"
+#include "open.h"
+#include "scan.h"
+#include "stralloc.h"
#define WHO "tls_start"
#define BUFSIZE 8192
-static void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
-static void die_tlsenv() { logmsg(WHO,111,FATAL,"no UCSPITLS environment to read"); }
+static void die_nomem()
+{
+ logmsg(WHO, 111, FATAL, "out of memory");
+}
+static void die_tlsenv()
+{
+ logmsg(WHO, 111, FATAL, "no UCSPITLS environment to read");
+}
int starttls_init(void)
{
unsigned long fd;
char *fdstr;
-
+
if (!(fdstr = env_get("SSLCTLFD"))) return 0;
- if (!scan_ulong(fdstr,&fd)) return 0;
- if (write((int)fd,"Y",1) < 1) return 0;
-
+ if (!scan_ulong(fdstr, &fd)) return 0;
+ if (write((int)fd, "Y", 1) < 1) return 0;
+
if (!(fdstr = env_get("SSLREADFD"))) return 0;
- if (!scan_ulong(fdstr,&fd)) return 0;
- if (fd_move(0,(int)fd) == -1) return 0;
-
- if (!(fdstr = env_get("SSLWRITEFD"))) return 0;
- if (!scan_ulong(fdstr,&fd)) return 0;
- if (fd_move(1,(int)fd) == -1) return 0;
-
+ if (!scan_ulong(fdstr, &fd)) return 0;
+ if (fd_move(0, (int)fd) == -1) return 0;
+
+ if (!(fdstr = env_get("SSLWRITEFD"))) return 0;
+ if (!scan_ulong(fdstr, &fd)) return 0;
+ if (fd_move(1, (int)fd) == -1) return 0;
+
return 1;
}
@@ -41,41 +48,43 @@ int starttls_info(void)
char *x;
int j;
- stralloc ssl_env = {0};
- stralloc ssl_parm = {0};
+ stralloc ssl_env = {0};
+ stralloc ssl_parm = {0};
stralloc ssl_value = {0};
if (!(fdstr = env_get("SSLCTLFD"))) return 0;
- if (!scan_ulong(fdstr,&fd)) return 0;
+ if (!scan_ulong(fdstr, &fd)) return 0;
- while ((j = read(fd,envbuf,BUFSIZE)) > 0 ) {
- if (!stralloc_catb(&ssl_env,envbuf,j)) die_nomem();
- if (ssl_env.len >= 2 && ssl_env.s[ssl_env.len - 2] == 0 && ssl_env.s[ssl_env.len - 1] == 0)
- break;
+ while ((j = read(fd, envbuf, BUFSIZE)) > 0) {
+ if (!stralloc_catb(&ssl_env, envbuf, j)) die_nomem();
+ if (ssl_env.len >= 2 && ssl_env.s[ssl_env.len - 2] == 0 && ssl_env.s[ssl_env.len - 1] == 0) break;
}
- if (j <= 0) { die_tlsenv(); return 0; } // nothing to read
+ if (j <= 0) {
+ die_tlsenv();
+ return 0;
+ } // nothing to read
- x = ssl_env.s;
+ x = ssl_env.s;
for (j = 0; j < ssl_env.len - 1; ++j) {
- if ( *x != '=' ) {
- if (!stralloc_catb(&ssl_parm,x,1)) die_nomem();
- x++;
+ if (*x != '=') {
+ if (!stralloc_catb(&ssl_parm, x, 1)) die_nomem();
+ x++;
} else {
if (!stralloc_0(&ssl_parm)) die_nomem();
x++;
for (; j < ssl_env.len - j - 1; ++j) {
- if ( *x != '\0' ) {
- if (!stralloc_catb(&ssl_value,x,1)) die_nomem();
- x++;
+ if (*x != '\0') {
+ if (!stralloc_catb(&ssl_value, x, 1)) die_nomem();
+ x++;
} else {
if (!stralloc_0(&ssl_value)) die_nomem();
x++;
- if (!env_put(ssl_parm.s,ssl_value.s)) die_nomem();
- ssl_parm.len = 0;
+ if (!env_put(ssl_parm.s, ssl_value.s)) die_nomem();
+ ssl_parm.len = 0;
ssl_value.len = 0;
- break;
+ break;
}
}
}
diff --git a/src/tls_timeoutio.c b/src/tls_timeoutio.c
index c5f40a2..3a2936b 100644
--- a/src/tls_timeoutio.c
+++ b/src/tls_timeoutio.c
@@ -1,14 +1,15 @@
/* This is essentially taken from Eric Vermeulen's TLS patch */
-#include "select.h"
+#include "tls_timeoutio.h"
+
#include "error.h"
+#include "logmsg.h"
#include "ndelay.h"
+#include "select.h"
+
#include "now.h"
-#include "logmsg.h"
#include "ucspissl.h"
-#include "tls_timeoutio.h"
-int tls_timeoutio(int (*fun)(),
- int t, int rfd, int wfd, SSL *ssl, char *buf, int len)
+int tls_timeoutio(int (*fun)(), int t, int rfd, int wfd, SSL *ssl, char *buf, int len)
{
int n;
const datetime_sec end = (datetime_sec)t + now();
@@ -17,22 +18,25 @@ int tls_timeoutio(int (*fun)(),
fd_set fds;
struct timeval tv;
- const int r = buf ? fun(ssl,buf,len) : fun(ssl);
+ const int r = buf ? fun(ssl, buf, len) : fun(ssl);
if (r > 0) return r;
t = end - now();
if (t < 0) break;
- tv.tv_sec = (time_t)t; tv.tv_usec = 0;
+ tv.tv_sec = (time_t)t;
+ tv.tv_usec = 0;
FD_ZERO(&fds);
- switch (SSL_get_error(ssl,r)) {
+ switch (SSL_get_error(ssl, r)) {
default: return r; /* some other error */
- case SSL_ERROR_WANT_READ:
- FD_SET(rfd,&fds); n = select(rfd + 1,&fds,NULL,NULL,&tv);
- break;
- case SSL_ERROR_WANT_WRITE:
- FD_SET(wfd,&fds); n = select(wfd + 1,NULL,&fds,NULL,&tv);
- break;
+ case SSL_ERROR_WANT_READ:
+ FD_SET(rfd, &fds);
+ n = select(rfd + 1, &fds, NULL, NULL, &tv);
+ break;
+ case SSL_ERROR_WANT_WRITE:
+ FD_SET(wfd, &fds);
+ n = select(wfd + 1, NULL, &fds, NULL, &tv);
+ break;
}
/* n is the number of descriptors that changed status */
@@ -42,58 +46,64 @@ int tls_timeoutio(int (*fun)(),
return -1;
}
-int tls_timeoutaccept(int t,int rfd,int wfd,SSL *ssl)
+int tls_timeoutaccept(int t, int rfd, int wfd, SSL *ssl)
{
int r;
/* if connection is established, keep NDELAY */
if (ndelay_on(rfd) == -1 || ndelay_on(wfd) == -1) return -1;
- r = tls_timeoutio(SSL_accept,t,rfd,wfd,ssl,NULL,0);
+ r = tls_timeoutio(SSL_accept, t, rfd, wfd, ssl, NULL, 0);
- if (r <= 0) { ndelay_off(rfd); ndelay_off(wfd); }
- else SSL_set_mode(ssl,SSL_MODE_ENABLE_PARTIAL_WRITE);
+ if (r <= 0) {
+ ndelay_off(rfd);
+ ndelay_off(wfd);
+ } else
+ SSL_set_mode(ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
return r;
}
-int tls_timeoutconn(int t,int rfd,int wfd,SSL *ssl)
+int tls_timeoutconn(int t, int rfd, int wfd, SSL *ssl)
{
int r;
/* if connection is established, keep NDELAY */
if (ndelay_on(rfd) == -1 || ndelay_on(wfd) == -1) return -1;
- r = tls_timeoutio(SSL_connect,t,rfd,wfd,ssl,NULL,0);
+ r = tls_timeoutio(SSL_connect, t, rfd, wfd, ssl, NULL, 0);
- if (r <= 0) { ndelay_off(rfd); ndelay_off(wfd); }
- else SSL_set_mode(ssl,SSL_MODE_ENABLE_PARTIAL_WRITE);
+ if (r <= 0) {
+ ndelay_off(rfd);
+ ndelay_off(wfd);
+ } else
+ SSL_set_mode(ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
return r;
}
-int tls_timeoutrehandshake(int t,int rfd,int wfd,SSL *ssl)
+int tls_timeoutrehandshake(int t, int rfd, int wfd, SSL *ssl)
{
int r;
SSL_renegotiate(ssl);
- r = tls_timeoutio(SSL_do_handshake,t,rfd,wfd,ssl,NULL,0);
+ r = tls_timeoutio(SSL_do_handshake, t, rfd, wfd, ssl, NULL, 0);
if (r <= 0) return r;
if (SSL_get_state(ssl) & SSL_ST_CONNECT) return -2; /* now a macro in ssl.h */
/* this is for the client only */
SSL_set_connect_state(ssl);
- return tls_timeoutio(SSL_do_handshake,t,rfd,wfd,ssl,NULL,0);
+ return tls_timeoutio(SSL_do_handshake, t, rfd, wfd, ssl, NULL, 0);
}
-int tls_timeoutread(int t,int rfd,int wfd,SSL *ssl,char *buf,int len)
+int tls_timeoutread(int t, int rfd, int wfd, SSL *ssl, char *buf, int len)
{
if (!buf) return 0;
- if (SSL_pending(ssl)) return SSL_read(ssl,buf,len);
- return tls_timeoutio(SSL_read,t,rfd,wfd,ssl,buf,len);
+ if (SSL_pending(ssl)) return SSL_read(ssl, buf, len);
+ return tls_timeoutio(SSL_read, t, rfd, wfd, ssl, buf, len);
}
-int tls_timeoutwrite(int t,int rfd,int wfd,SSL *ssl,char *buf,int len)
+int tls_timeoutwrite(int t, int rfd, int wfd, SSL *ssl, char *buf, int len)
{
if (!buf) return 0;
- return tls_timeoutio(SSL_write,t,rfd,wfd,ssl,buf,len);
+ return tls_timeoutio(SSL_write, t, rfd, wfd, ssl, buf, len);
}
diff --git a/src/token822.c b/src/token822.c
index 239887c..e1048c6 100644
--- a/src/token822.c
+++ b/src/token822.c
@@ -1,10 +1,11 @@
-#include "stralloc.h"
+#include "token822.h"
+
#include "alloc.h"
#include "genalloc.h"
#include "str.h"
-#include "token822.h"
+#include "stralloc.h"
-static struct token822 comma = { TOKEN822_COMMA };
+static struct token822 comma = {TOKEN822_COMMA};
void token822_reverse(token822_alloc *ta)
{
@@ -17,14 +18,15 @@ void token822_reverse(token822_alloc *ta)
temp = ta->t[i];
ta->t[i] = ta->t[n - i];
ta->t[n - i] = temp;
- }
+ }
}
-GEN_ALLOC_ready(token822_alloc,struct token822,t,len,a,i,n,x,30,token822_ready)
-GEN_ALLOC_readyplus(token822_alloc,struct token822,t,len,a,i,n,x,30,token822_readyplus)
-GEN_ALLOC_append(token822_alloc,struct token822,t,len,a,i,n,x,30,token822_readyplus,token822_append)
+GEN_ALLOC_ready(token822_alloc, struct token822, t, len, a, i, n, x, 30, token822_ready)
+ GEN_ALLOC_readyplus(token822_alloc, struct token822, t, len, a, i, n, x, 30, token822_readyplus)
+ GEN_ALLOC_append(
+ token822_alloc, struct token822, t, len, a, i, n, x, 30, token822_readyplus, token822_append)
-static int needspace(int t1,int t2)
+ static int needspace(int t1, int t2)
{
if (!t1) return 0;
if (t1 == TOKEN822_COLON) return 1;
@@ -32,12 +34,15 @@ static int needspace(int t1,int t2)
if (t2 == TOKEN822_LEFT) return 1;
switch (t1) {
- case TOKEN822_ATOM: case TOKEN822_LITERAL:
- case TOKEN822_QUOTE: case TOKEN822_COMMENT:
+ case TOKEN822_ATOM:
+ case TOKEN822_LITERAL:
+ case TOKEN822_QUOTE:
+ case TOKEN822_COMMENT:
switch (t2) {
- case TOKEN822_ATOM: case TOKEN822_LITERAL:
- case TOKEN822_QUOTE: case TOKEN822_COMMENT:
- return 1;
+ case TOKEN822_ATOM:
+ case TOKEN822_LITERAL:
+ case TOKEN822_QUOTE:
+ case TOKEN822_COMMENT: return 1;
}
}
return 0;
@@ -46,11 +51,20 @@ static int needspace(int t1,int t2)
static int atomok(char ch)
{
switch (ch) {
- case ' ': case '\t': case '\r': case '\n':
- case '(': case '[': case '"':
- case '<': case '>': case ';': case ':':
- case '@': case ',': case '.':
- return 0;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ case '(':
+ case '[':
+ case '"':
+ case '<':
+ case '>':
+ case ';':
+ case ':':
+ case '@':
+ case ',':
+ case '.': return 0;
}
return 1;
}
@@ -59,7 +73,7 @@ static void atomcheck(struct token822 *t)
{
int i;
char ch;
-
+
for (i = 0; i < t->slen; ++i) {
ch = t->s[i];
if ((ch < 32) || (ch > 126) || (ch == ')') || (ch == ']') || (ch == '\\')) {
@@ -69,7 +83,7 @@ static void atomcheck(struct token822 *t)
}
}
-int token822_unparse(stralloc *sa,token822_alloc *ta,unsigned int linelen)
+int token822_unparse(stralloc *sa, token822_alloc *ta, unsigned int linelen)
{
struct token822 *t;
int len;
@@ -88,29 +102,40 @@ int token822_unparse(stralloc *sa,token822_alloc *ta,unsigned int linelen)
for (i = 0; i < ta->len; ++i) {
t = ta->t + i;
newtype = t->type;
- if (needspace(lasttype,newtype)) ++len;
+ if (needspace(lasttype, newtype)) ++len;
lasttype = newtype;
switch (newtype) {
- case TOKEN822_COMMA:
- len += 3; break;
- case TOKEN822_AT: case TOKEN822_DOT: case TOKEN822_LEFT: case TOKEN822_RIGHT:
- case TOKEN822_SEMI: case TOKEN822_COLON:
- ++len; break;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL: case TOKEN822_COMMENT:
+ case TOKEN822_COMMA: len += 3; break;
+ case TOKEN822_AT:
+ case TOKEN822_DOT:
+ case TOKEN822_LEFT:
+ case TOKEN822_RIGHT:
+ case TOKEN822_SEMI:
+ case TOKEN822_COLON: ++len; break;
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
+ case TOKEN822_COMMENT:
if (t->type != TOKEN822_ATOM) len += 2;
- for (j = 0; j < t->slen; ++j)
- switch (ch = t->s[j]) {
- case '"': case '[': case ']': case '(': case ')':
- case '\\': case '\r': case '\n': ++len;
- default: ++len;
+ for (j = 0; j < t->slen; ++j) switch (ch = t->s[j])
+ {
+ case '"':
+ case '[':
+ case ']':
+ case '(':
+ case ')':
+ case '\\':
+ case '\r':
+ case '\n': ++len;
+ default: ++len;
}
- break;
+ break;
}
}
len += 2;
- if (!stralloc_ready(sa,len)) return -1;
+ if (!stralloc_ready(sa, len)) return -1;
s = sa->s;
lineb = s;
@@ -121,49 +146,64 @@ int token822_unparse(stralloc *sa,token822_alloc *ta,unsigned int linelen)
for (i = 0; i < ta->len; ++i) {
t = ta->t + i;
newtype = t->type;
- if (needspace(lasttype,newtype)) *s++ = ' ';
+ if (needspace(lasttype, newtype)) *s++ = ' ';
lasttype = newtype;
switch (newtype) {
- case TOKEN822_COMMA:
- *s++ = ',';
-#define NSUW \
- s[0] = '\n'; s[1] = ' '; \
- if (linee && (!linelen || (s - lineb <= linelen))) \
- { while (linee < s) { linee[0] = linee[2]; ++linee; } linee -= 2; } \
- else { if (linee) lineb = linee + 1; linee = s; s += 2; }
- NSUW
- break;
- case TOKEN822_AT: *s++ = '@'; break;
- case TOKEN822_DOT: *s++ = '.'; break;
- case TOKEN822_LEFT: *s++ = '<'; break;
- case TOKEN822_RIGHT: *s++ = '>'; break;
- case TOKEN822_SEMI: *s++ = ';'; break;
- case TOKEN822_COLON: *s++ = ':'; break;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL: case TOKEN822_COMMENT:
- if (t->type == TOKEN822_QUOTE) *s++ = '"';
- if (t->type == TOKEN822_LITERAL) *s++ = '[';
- if (t->type == TOKEN822_COMMENT) *s++ = '(';
-
- for (j = 0; j < t->slen; ++j)
- switch (ch = t->s[j]) {
- case '"': case '[': case ']': case '(': case ')':
- case '\\': case '\r': case '\n': *s++ = '\\';
- default: *s++ = ch;
- }
- if (t->type == TOKEN822_QUOTE) *s++ = '"';
- if (t->type == TOKEN822_LITERAL) *s++ = ']';
- if (t->type == TOKEN822_COMMENT) *s++ = ')';
- break;
+ case TOKEN822_COMMA: *s++ = ',';
+#define NSUW \
+ s[0] = '\n'; \
+ s[1] = ' '; \
+ if (linee && (!linelen || (s - lineb <= linelen))) { \
+ while (linee < s) { \
+ linee[0] = linee[2]; \
+ ++linee; \
+ } \
+ linee -= 2; \
+ } else { \
+ if (linee) lineb = linee + 1; \
+ linee = s; \
+ s += 2; \
+ }
+ NSUW break;
+ case TOKEN822_AT: *s++ = '@'; break;
+ case TOKEN822_DOT: *s++ = '.'; break;
+ case TOKEN822_LEFT: *s++ = '<'; break;
+ case TOKEN822_RIGHT: *s++ = '>'; break;
+ case TOKEN822_SEMI: *s++ = ';'; break;
+ case TOKEN822_COLON: *s++ = ':'; break;
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
+ case TOKEN822_COMMENT:
+ if (t->type == TOKEN822_QUOTE) *s++ = '"';
+ if (t->type == TOKEN822_LITERAL) *s++ = '[';
+ if (t->type == TOKEN822_COMMENT) *s++ = '(';
+
+ for (j = 0; j < t->slen; ++j) switch (ch = t->s[j])
+ {
+ case '"':
+ case '[':
+ case ']':
+ case '(':
+ case ')':
+ case '\\':
+ case '\r':
+ case '\n': *s++ = '\\';
+ default: *s++ = ch;
+ }
+ if (t->type == TOKEN822_QUOTE) *s++ = '"';
+ if (t->type == TOKEN822_LITERAL) *s++ = ']';
+ if (t->type == TOKEN822_COMMENT) *s++ = ')';
+ break;
}
}
- NSUW
- --s;
- sa->len = s - sa->s;
- return 1;
+ NSUW-- s;
+ sa->len = s - sa->s;
+ return 1;
}
-int token822_unquote(stralloc *sa,token822_alloc *ta)
+int token822_unquote(stralloc *sa, token822_alloc *ta)
{
struct token822 *t;
int len;
@@ -176,17 +216,20 @@ int token822_unquote(stralloc *sa,token822_alloc *ta)
for (i = 0; i < ta->len; ++i) {
t = ta->t + i;
switch (t->type) {
- case TOKEN822_COMMA: case TOKEN822_AT: case TOKEN822_DOT: case TOKEN822_LEFT:
- case TOKEN822_RIGHT: case TOKEN822_SEMI: case TOKEN822_COLON:
- ++len; break;
- case TOKEN822_LITERAL:
- len += 2;
- case TOKEN822_ATOM: case TOKEN822_QUOTE:
- len += t->slen;
+ case TOKEN822_COMMA:
+ case TOKEN822_AT:
+ case TOKEN822_DOT:
+ case TOKEN822_LEFT:
+ case TOKEN822_RIGHT:
+ case TOKEN822_SEMI:
+ case TOKEN822_COLON: ++len; break;
+ case TOKEN822_LITERAL: len += 2;
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE: len += t->slen;
}
}
- if (!stralloc_ready(sa,len)) return -1;
+ if (!stralloc_ready(sa, len)) return -1;
s = sa->s;
@@ -194,16 +237,17 @@ int token822_unquote(stralloc *sa,token822_alloc *ta)
t = ta->t + i;
switch (t->type) {
case TOKEN822_COMMA: *s++ = ','; break;
- case TOKEN822_AT: *s++ = '@'; break;
- case TOKEN822_DOT: *s++ = '.'; break;
- case TOKEN822_LEFT: *s++ = '<'; break;
+ case TOKEN822_AT: *s++ = '@'; break;
+ case TOKEN822_DOT: *s++ = '.'; break;
+ case TOKEN822_LEFT: *s++ = '<'; break;
case TOKEN822_RIGHT: *s++ = '>'; break;
- case TOKEN822_SEMI: *s++ = ';'; break;
+ case TOKEN822_SEMI: *s++ = ';'; break;
case TOKEN822_COLON: *s++ = ':'; break;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL:
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
if (t->type == TOKEN822_LITERAL) *s++ = '[';
- for (j = 0; j < t->slen; ++j)
- *s++ = t->s[j];
+ for (j = 0; j < t->slen; ++j) *s++ = t->s[j];
if (t->type == TOKEN822_LITERAL) *s++ = ']';
break;
case TOKEN822_COMMENT: break;
@@ -213,7 +257,7 @@ int token822_unquote(stralloc *sa,token822_alloc *ta)
return 1;
}
-int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
+int token822_parse(token822_alloc *ta, stralloc *sa, stralloc *buf)
{
int i;
int salen;
@@ -228,13 +272,23 @@ int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
numchars = 0;
numtoks = 0;
- for (i = 0; i < salen; ++i)
- switch (sa->s[i]) {
- case '.': case ',': case '@': case '<': case '>': case ':': case ';':
- ++numtoks; break;
- case ' ': case '\t': case '\r': case '\n': break;
- case ')': case ']': return 0;
- /* other control chars and non-ASCII chars are also bad, in theory */
+ for (i = 0; i < salen; ++i) switch (sa->s[i])
+ {
+ case '.':
+ case ',':
+ case '@':
+ case '<':
+ case '>':
+ case ':':
+ case ';': ++numtoks; break;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n': break;
+ case ')':
+ case ']':
+ return 0;
+ /* other control chars and non-ASCII chars are also bad, in theory */
case '(':
level = 1;
while (level) {
@@ -242,8 +296,9 @@ int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
switch (sa->s[i]) {
case '(': ++level; break;
case ')': --level; break;
- case '\\': if (++i >= salen) return 0;
- default: ++numchars;
+ case '\\':
+ if (++i >= salen) return 0;
+ default: ++numchars;
}
}
++numtoks;
@@ -254,7 +309,8 @@ int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
if (++i >= salen) return 0;
switch (sa->s[i]) {
case '"': --level; break;
- case '\\': if (++i >= salen) return 0;
+ case '\\':
+ if (++i >= salen) return 0;
default: ++numchars;
}
}
@@ -266,84 +322,120 @@ int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
if (++i >= salen) return 0;
switch (sa->s[i]) {
case ']': --level; break;
- case '\\': if (++i >= salen) return 0;
- default: ++numchars;
+ case '\\':
+ if (++i >= salen) return 0;
+ default: ++numchars;
}
}
++numtoks;
break;
default:
do {
- if (sa->s[i] == '\\') if (++i >= salen) break;
+ if (sa->s[i] == '\\')
+ if (++i >= salen) break;
++numchars;
- if (++i >= salen) break;
+ if (++i >= salen) break;
} while (atomok(sa->s[i]));
--i;
++numtoks;
}
- if (!token822_ready(ta,numtoks)) return -1;
- if (!stralloc_ready(buf,numchars)) return -1;
+ if (!token822_ready(ta, numtoks)) return -1;
+ if (!stralloc_ready(buf, numchars)) return -1;
cbuf = buf->s;
ta->len = numtoks;
t = ta->t;
- for (i = 0; i < salen; ++i)
- switch (sa->s[i]) {
- case '.': t->type = TOKEN822_DOT; ++t; break;
- case ',': t->type = TOKEN822_COMMA; ++t; break;
- case '@': t->type = TOKEN822_AT; ++t; break;
- case '<': t->type = TOKEN822_LEFT; ++t; break;
- case '>': t->type = TOKEN822_RIGHT; ++t; break;
- case ':': t->type = TOKEN822_COLON; ++t; break;
- case ';': t->type = TOKEN822_SEMI; ++t; break;
- case ' ': case '\t': case '\r': case '\n': break;
+ for (i = 0; i < salen; ++i) switch (sa->s[i])
+ {
+ case '.':
+ t->type = TOKEN822_DOT;
+ ++t;
+ break;
+ case ',':
+ t->type = TOKEN822_COMMA;
+ ++t;
+ break;
+ case '@':
+ t->type = TOKEN822_AT;
+ ++t;
+ break;
+ case '<':
+ t->type = TOKEN822_LEFT;
+ ++t;
+ break;
+ case '>':
+ t->type = TOKEN822_RIGHT;
+ ++t;
+ break;
+ case ':':
+ t->type = TOKEN822_COLON;
+ ++t;
+ break;
+ case ';':
+ t->type = TOKEN822_SEMI;
+ ++t;
+ break;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n': break;
case '(':
- t->type = TOKEN822_COMMENT; t->s = cbuf; t->slen = 0;
+ t->type = TOKEN822_COMMENT;
+ t->s = cbuf;
+ t->slen = 0;
level = 1;
while (level) {
++i; /* assert: < salen */
switch (sa->s[i]) {
- case '(': ++level; break;
- case ')': --level; break;
+ case '(': ++level; break;
+ case ')': --level; break;
case '\\': ++i; /* assert: < salen */
- default: *cbuf++ = sa->s[i]; ++t->slen;
+ default: *cbuf++ = sa->s[i]; ++t->slen;
}
}
++t;
break;
case '"':
- t->type = TOKEN822_QUOTE; t->s = cbuf; t->slen = 0;
+ t->type = TOKEN822_QUOTE;
+ t->s = cbuf;
+ t->slen = 0;
level = 1;
while (level) {
++i; /* assert: < salen */
switch (sa->s[i]) {
- case '"': --level; break;
+ case '"': --level; break;
case '\\': ++i; /* assert: < salen */
- default: *cbuf++ = sa->s[i]; ++t->slen;
+ default: *cbuf++ = sa->s[i]; ++t->slen;
}
}
++t;
break;
case '[':
- t->type = TOKEN822_LITERAL; t->s = cbuf; t->slen = 0;
+ t->type = TOKEN822_LITERAL;
+ t->s = cbuf;
+ t->slen = 0;
level = 1;
while (level) {
++i; /* assert: < salen */
switch (sa->s[i]) {
- case ']': --level; break;
+ case ']': --level; break;
case '\\': ++i; /* assert: < salen */
- default: *cbuf++ = sa->s[i]; ++t->slen;
+ default: *cbuf++ = sa->s[i]; ++t->slen;
}
}
++t;
break;
default:
- t->type = TOKEN822_ATOM; t->s = cbuf; t->slen = 0;
+ t->type = TOKEN822_ATOM;
+ t->s = cbuf;
+ t->slen = 0;
do {
- if (sa->s[i] == '\\') if (++i >= salen) break;
- *cbuf++ = sa->s[i]; ++t->slen;
+ if (sa->s[i] == '\\')
+ if (++i >= salen) break;
+ *cbuf++ = sa->s[i];
+ ++t->slen;
if (++i >= salen) break;
} while (atomok(sa->s[i]));
atomcheck(t);
@@ -353,24 +445,22 @@ int token822_parse(token822_alloc *ta,stralloc *sa,stralloc *buf)
return 1;
}
-static int gotaddr(token822_alloc *taout,token822_alloc *taaddr,int (*callback)())
+static int gotaddr(token822_alloc *taout, token822_alloc *taaddr, int (*callback)())
{
int i;
- if (callback(taaddr) != 1)
- return 0;
+ if (callback(taaddr) != 1) return 0;
+
+ if (!token822_readyplus(taout, taaddr->len)) return 0;
- if (!token822_readyplus(taout,taaddr->len))
- return 0;
-
- for (i = 0; i < taaddr->len; ++i)
- taout->t[taout->len++] = taaddr->t[i];
+ for (i = 0; i < taaddr->len; ++i) taout->t[taout->len++] = taaddr->t[i];
taaddr->len = 0;
return 1;
}
-int token822_addrlist(token822_alloc *taout,token822_alloc *taaddr,token822_alloc *ta,int (*callback)())
+int token822_addrlist(
+ token822_alloc *taout, token822_alloc *taaddr, token822_alloc *ta, int (*callback)())
{
struct token822 *t;
struct token822 *beginning;
@@ -380,23 +470,29 @@ int token822_addrlist(token822_alloc *taout,token822_alloc *taaddr,token822_allo
taout->len = 0;
taaddr->len = 0;
- if (!token822_readyplus(taout,1)) return -1;
- if (!token822_readyplus(taaddr,1)) return -1;
-
+ if (!token822_readyplus(taout, 1)) return -1;
+ if (!token822_readyplus(taaddr, 1)) return -1;
+
ingroup = 0;
wordok = 1;
beginning = ta->t + 2;
t = ta->t + ta->len - 1;
- /* rfc 822 address lists are easy to parse from right to left */
+ /* rfc 822 address lists are easy to parse from right to left */
-#define FLUSH if (taaddr->len) if (!gotaddr(taout,taaddr,callback)) return -1;
-#define FLUSHCOMMA if (taaddr->len) { \
-if (!gotaddr(taout,taaddr,callback)) return -1; \
-if (!token822_append(taout,&comma)) return -1; }
-#define ADDRLEFT if (!token822_append(taaddr,t--)) return -1;
-#define OUTLEFT if (!token822_append(taout,t--)) return -1;
+#define FLUSH \
+ if (taaddr->len) \
+ if (!gotaddr(taout, taaddr, callback)) return -1;
+#define FLUSHCOMMA \
+ if (taaddr->len) { \
+ if (!gotaddr(taout, taaddr, callback)) return -1; \
+ if (!token822_append(taout, &comma)) return -1; \
+ }
+#define ADDRLEFT \
+ if (!token822_append(taaddr, t--)) return -1;
+#define OUTLEFT \
+ if (!token822_append(taout, t--)) return -1;
while (t >= beginning) {
switch (t->type) {
@@ -410,35 +506,34 @@ if (!token822_append(taout,&comma)) return -1; }
FLUSH
if (!ingroup) return 0;
ingroup = 0;
- while ((t >= beginning) && (t->type != TOKEN822_COMMA))
- OUTLEFT
- if (t >= beginning)
- OUTLEFT
+ while ((t >= beginning) && (t->type != TOKEN822_COMMA)) OUTLEFT
+ if (t >= beginning) OUTLEFT
wordok = 1;
continue;
case TOKEN822_RIGHT:
FLUSHCOMMA
OUTLEFT
- while ((t >= beginning) && (t->type != TOKEN822_LEFT))
- ADDRLEFT
- /* important to use address here even if it's empty: <> */
- if (!gotaddr(taout,taaddr,callback)) return -1;
+ while ((t >= beginning) && (t->type != TOKEN822_LEFT)) ADDRLEFT
+ /* important to use address here even if it's empty: <> */
+ if (!gotaddr(taout, taaddr, callback)) return -1;
if (t < beginning) return 0;
OUTLEFT
- while ((t >= beginning) && ((t->type == TOKEN822_COMMENT) ||
- (t->type == TOKEN822_ATOM) || (t->type == TOKEN822_QUOTE) ||
- (t->type == TOKEN822_AT) || (t->type == TOKEN822_DOT)))
- OUTLEFT
+ while (
+ (t >= beginning)
+ && ((t->type == TOKEN822_COMMENT) || (t->type == TOKEN822_ATOM)
+ || (t->type == TOKEN822_QUOTE) || (t->type == TOKEN822_AT) || (t->type == TOKEN822_DOT)))
+ OUTLEFT
wordok = 0;
continue;
- case TOKEN822_ATOM: case TOKEN822_QUOTE: case TOKEN822_LITERAL:
- if (!wordok)
- FLUSHCOMMA
+ case TOKEN822_ATOM:
+ case TOKEN822_QUOTE:
+ case TOKEN822_LITERAL:
+ if (!wordok) FLUSHCOMMA
wordok = 0;
ADDRLEFT
continue;
case TOKEN822_COMMENT:
- /* comment is lexically a space; shouldn't affect wordok */
+ /* comment is lexically a space; shouldn't affect wordok */
break;
case TOKEN822_COMMA:
FLUSH
@@ -448,13 +543,13 @@ if (!token822_append(taout,&comma)) return -1; }
wordok = 1;
ADDRLEFT
continue;
- }
- OUTLEFT
- }
+ }
+ OUTLEFT
+ }
FLUSH
++t;
while (t > ta->t)
- if (!token822_append(taout,--t)) return -1;
+ if (!token822_append(taout, --t)) return -1;
token822_reverse(taout);
return 1;
diff --git a/src/trigger.c b/src/trigger.c
index ec22e11..4b7cc49 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -1,41 +1,43 @@
-#include "select.h"
-#include "ndelay.h"
-#include "open.h"
#include "trigger.h"
+
#include "close.h"
+#include "ndelay.h"
+#include "open.h"
+#include "select.h"
static int fd = -1;
-void trigger_set()
+void trigger_set()
{
if (fd != -1) close(fd);
fd = open_read("lock/trigger");
}
-void trigger_selprep(int *nfds,fd_set *rfds)
+void trigger_selprep(int *nfds, fd_set *rfds)
{
if (fd != -1) {
- FD_SET(fd,rfds);
+ FD_SET(fd, rfds);
if (*nfds < fd + 1) *nfds = fd + 1;
}
}
-int trigger_pulled(fd_set *rfds)
+int trigger_pulled(fd_set *rfds)
{
- if (fd != -1) if (FD_ISSET(fd,rfds)) return 1;
+ if (fd != -1)
+ if (FD_ISSET(fd, rfds)) return 1;
return 0;
}
-void write(); /* compiler warning (temp) */
+void write(); /* compiler warning (temp) */
-void triggerpull()
+void triggerpull()
{
int fd;
fd = open_write("lock/trigger");
if (fd >= 0) {
ndelay_on(fd);
- write(fd,"",1); /* if it fails, bummer */
+ write(fd, "", 1); /* if it fails, bummer */
close(fd);
}
}
diff --git a/src/triggerpull.c b/src/triggerpull.c
index 3691c5a..a55797f 100644
--- a/src/triggerpull.c
+++ b/src/triggerpull.c
@@ -1,7 +1,9 @@
+#include "triggerpull.h"
+
#include <unistd.h>
+
#include "ndelay.h"
#include "open.h"
-#include "triggerpull.h"
void triggerpull(void)
{
@@ -10,7 +12,7 @@ void triggerpull(void)
fd = open_write("lock/trigger");
if (fd >= 0) {
ndelay_on(fd);
- write(fd,"",1); /* if it fails, bummer */
+ write(fd, "", 1); /* if it fails, bummer */
close(fd);
}
}
diff --git a/src/trycpp.c b/src/trycpp.c
index 690f2f3..5fdf435 100644
--- a/src/trycpp.c
+++ b/src/trycpp.c
@@ -1,7 +1,9 @@
int main()
{
#ifdef NeXT
- printf("nextstep\n"); exit(0);
+ printf("nextstep\n");
+ exit(0);
#endif
- printf("unknown\n"); exit(0);
+ printf("unknown\n");
+ exit(0);
}
diff --git a/src/trydrent.c b/src/trydrent.c
index c778176..c1967e6 100644
--- a/src/trydrent.c
+++ b/src/trydrent.c
@@ -1,5 +1,5 @@
-#include <sys/types.h>
#include <dirent.h>
+#include <sys/types.h>
void foo()
{
diff --git a/src/tryflock.c b/src/tryflock.c
index b18743a..e15acca 100644
--- a/src/tryflock.c
+++ b/src/tryflock.c
@@ -1,8 +1,8 @@
-#include <sys/types.h>
-#include <sys/file.h>
#include <fcntl.h>
+#include <sys/file.h>
+#include <sys/types.h>
int main()
{
- flock(0,LOCK_EX | LOCK_UN | LOCK_NB);
+ flock(0, LOCK_EX | LOCK_UN | LOCK_NB);
}
diff --git a/src/trymkffo.c b/src/trymkffo.c
index e832a31..573c891 100644
--- a/src/trymkffo.c
+++ b/src/trymkffo.c
@@ -1,7 +1,7 @@
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
int main()
{
- mkfifo("temp-trymkffo",0);
+ mkfifo("temp-trymkffo", 0);
}
diff --git a/src/trynpbg1.c b/src/trynpbg1.c
index 01a152e..da3e47e 100644
--- a/src/trynpbg1.c
+++ b/src/trynpbg1.c
@@ -1,6 +1,6 @@
-#include "select.h"
-#include "open.h"
#include "fifo.h"
+#include "open.h"
+#include "select.h"
#define FN "temp-trynpbg1.fifo"
@@ -9,16 +9,15 @@ int main()
int flagbug;
struct timeval instant;
fd_set rfds;
-
+
flagbug = 0;
- if (fifo_make(FN,0600) != -1) {
+ if (fifo_make(FN, 0600) != -1) {
close(0);
if (open_read(FN) == 0) {
FD_ZERO(&rfds);
- FD_SET(0,&rfds);
+ FD_SET(0, &rfds);
instant.tv_sec = instant.tv_usec = 0;
- if (select(1,&rfds,(fd_set *) 0,(fd_set *) 0,&instant) > 0)
- flagbug = 1;
+ if (select(1, &rfds, (fd_set *)0, (fd_set *)0, &instant) > 0) flagbug = 1;
}
unlink(FN);
}
diff --git a/src/trysalen.c b/src/trysalen.c
index 731a109..05a0b13 100644
--- a/src/trysalen.c
+++ b/src/trysalen.c
@@ -1,8 +1,8 @@
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/time.h>
#include <sys/ioctl.h>
+#include <sys/param.h>
#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
void foo()
{
diff --git a/src/trysgact.c b/src/trysgact.c
index 1471ecc..c9714ff 100644
--- a/src/trysgact.c
+++ b/src/trysgact.c
@@ -6,5 +6,5 @@ int main()
sa.sa_handler = 0;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
- sigaction(0,&sa,(struct sigaction *) 0);
+ sigaction(0, &sa, (struct sigaction *)0);
}
diff --git a/src/trysgprm.c b/src/trysgprm.c
index 3d73f86..7a2c6b6 100644
--- a/src/trysgprm.c
+++ b/src/trysgprm.c
@@ -3,8 +3,8 @@
int main()
{
sigset_t ss;
-
+
sigemptyset(&ss);
- sigaddset(&ss,SIGCHLD);
- sigprocmask(SIG_SETMASK,&ss,(sigset_t *) 0);
+ sigaddset(&ss, SIGCHLD);
+ sigprocmask(SIG_SETMASK, &ss, (sigset_t *)0);
}
diff --git a/src/tryshsgr.c b/src/tryshsgr.c
index 81b395c..ea1bf66 100644
--- a/src/tryshsgr.c
+++ b/src/tryshsgr.c
@@ -1,14 +1,15 @@
int main()
{
short x[4];
-
+
x[0] = x[1] = 1;
- if (getgroups(1,x) == 0) if (setgroups(1,x) == -1) _exit(1);
-
- if (getgroups(1,x) == -1) _exit(1);
+ if (getgroups(1, x) == 0)
+ if (setgroups(1, x) == -1) _exit(1);
+
+ if (getgroups(1, x) == -1) _exit(1);
if (x[1] != 1) _exit(1);
x[1] = 2;
- if (getgroups(1,x) == -1) _exit(1);
+ if (getgroups(1, x) == -1) _exit(1);
if (x[1] != 2) _exit(1);
_exit(0);
}
diff --git a/src/trysysel.c b/src/trysysel.c
index abebad5..e974364 100644
--- a/src/trysysel.c
+++ b/src/trysysel.c
@@ -1,11 +1,13 @@
-#include <sys/types.h>
-#include <sys/time.h>
#include <sys/select.h> /* SVR4 silliness */
+#include <sys/time.h>
+#include <sys/types.h>
+
#include <stdio.h>
+
#include "select.h"
int main()
{
- printf("FD_SETSIZE:%d\n",FD_SETSIZE);
- return 0;
+ printf("FD_SETSIZE:%d\n", FD_SETSIZE);
+ return 0;
}
diff --git a/src/trysyslog.c b/src/trysyslog.c
index 4b99afc..5408436 100644
--- a/src/trysyslog.c
+++ b/src/trysyslog.c
@@ -1,9 +1,9 @@
-#include <sys/types.h>
#include <sys/time.h>
+#include <sys/types.h>
#include <syslog.h>
main()
{
- openlog("foo",0,LOG_MAIL);
- syslog(0,"foo");
+ openlog("foo", 0, LOG_MAIL);
+ syslog(0, "foo");
}
diff --git a/src/tryulong32.c b/src/tryulong32.c
index 20683d6..43951e9 100644
--- a/src/tryulong32.c
+++ b/src/tryulong32.c
@@ -2,10 +2,38 @@ int main()
{
unsigned long u;
u = 1;
- u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u;
- u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u;
- u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u;
- u += u; u += u; u += u; u += u; u += u; u += u; u += u; u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
+ u += u;
if (!u) _exit(0);
_exit(1);
}
diff --git a/src/tryutmp.c b/src/tryutmp.c
index 2a25e5d..7c8deb3 100644
--- a/src/tryutmp.c
+++ b/src/tryutmp.c
@@ -1,5 +1,6 @@
+#include <utmp.h>
+
#include <sys/types.h>
-#include <utmp.h>
int main()
{
diff --git a/src/trywaitp.c b/src/trywaitp.c
index 0380358..c6d50e8 100644
--- a/src/trywaitp.c
+++ b/src/trywaitp.c
@@ -3,5 +3,5 @@
int main()
{
- waitpid(0,0,0);
+ waitpid(0, 0, 0);
}
diff --git a/src/wildmat.c b/src/wildmat.c
index 739f943..363c118 100644
--- a/src/wildmat.c
+++ b/src/wildmat.c
@@ -37,8 +37,8 @@
** on.
*/
-#define TRUE 1
-#define FALSE 0
+#define TRUE 1
+#define FALSE 0
#define ABORT -1
/* What character marks an inverted character class? */
@@ -53,57 +53,50 @@
*/
static int DoMatch(register char *text, register char *p)
{
- register int last;
- register int matched;
- register int reverse;
+ register int last;
+ register int matched;
+ register int reverse;
for (; *p; text++, p++) {
- if (*text == '\0' && *p != '*')
- return ABORT;
+ if (*text == '\0' && *p != '*') return ABORT;
switch (*p) {
- case '\\': /* Literal match with following character. */
- p++;
- case '?': /* Match anything. */
- continue;
- case '*': /* Consecutive stars act just like one. */
- while (*++p == '*')
- continue;
- if (*p == '\0') return TRUE; /* Trailing star matches everything. */
- while (*text)
- if ((matched = DoMatch(text++, p)) != FALSE) return matched;
- return ABORT;
- case '[':
- reverse = p[1] == NEGATE_CLASS ? TRUE : FALSE;
- if (reverse) p++; /* Inverted character class. */
- matched = FALSE;
- if (p[1] == ']' || p[1] == '-')
- if (*++p == *text) matched = TRUE;
- for (last = *p; *++p && *p != ']'; last = *p) /* This next line requires a good C compiler. */
- if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p)
- matched = TRUE;
- if (matched == reverse) return FALSE;
- continue;
- default: /* FALLTHROUGH */
- if (*text != *p) return FALSE;
- continue;
+ case '\\': /* Literal match with following character. */ p++;
+ case '?': /* Match anything. */ continue;
+ case '*': /* Consecutive stars act just like one. */
+ while (*++p == '*') continue;
+ if (*p == '\0') return TRUE; /* Trailing star matches everything. */
+ while (*text)
+ if ((matched = DoMatch(text++, p)) != FALSE) return matched;
+ return ABORT;
+ case '[':
+ reverse = p[1] == NEGATE_CLASS ? TRUE : FALSE;
+ if (reverse) p++; /* Inverted character class. */
+ matched = FALSE;
+ if (p[1] == ']' || p[1] == '-')
+ if (*++p == *text) matched = TRUE;
+ for (last = *p; *++p && *p != ']'; last = *p) /* This next line requires a good C compiler. */
+ if (*p == '-' && p[1] != ']' ? *text <= *++p && *text >= last : *text == *p) matched = TRUE;
+ if (matched == reverse) return FALSE;
+ continue;
+ default: /* FALLTHROUGH */
+ if (*text != *p) return FALSE;
+ continue;
}
}
-#ifdef MATCH_TAR_PATTERN
- if (*text == '/')
- return TRUE;
-#endif /* MATCH_TAR_ATTERN */
+#ifdef MATCH_TAR_PATTERN
+ if (*text == '/') return TRUE;
+#endif /* MATCH_TAR_ATTERN */
return *text == '\0';
}
/*
** User-level routine. Returns TRUE or FALSE.
*/
-int wildmat(char *text,char *p)
+int wildmat(char *text, char *p)
{
-#ifdef OPTIMIZE_JUST_STAR
- if (p[0] == '*' && p[1] == '\0')
- return TRUE;
-#endif /* OPTIMIZE_JUST_STAR */
+#ifdef OPTIMIZE_JUST_STAR
+ if (p[0] == '*' && p[1] == '\0') return TRUE;
+#endif /* OPTIMIZE_JUST_STAR */
return DoMatch(text, p) == TRUE;
}