commit - 500ea6d4e3c9b60a442cf1bdd4f493026dcf3a5e
commit + 5fdffb49b9198907d9f91b76cf7128286e175a0a
blob - 5474b82b07a262e571a2f8e296770e58c895c214
blob + 024829c9ff003efd27ebd99bc42ae8588f09ddc9
--- filter-dkimsign.8
+++ filter-dkimsign.8
.Op Fl h Ar headers
.Op Fl x Ar seconds
.Fl d Ar domain
+.Fl D Ar file
.Fl k Ar file
.Fl s Ar selector
.Sh DESCRIPTION
The canonicalization algorithm used to sign the message.
Defaults to
.Em simple/simple .
+.It Fl D Ar file
+.Ar file
+should point to a file containing a list of domains.
+Only one domain per line should be specified.
+See
+.Fl d
+for more information.
.It Fl d Ar domain
The
.Ar domain
blob - 6e3bee7c5f62afa22685453206abc72833040b0a
blob + 2961793635330ed82f566e8870166a7f012e7e7a
--- main.c
+++ main.c
#define DKIM_SIGNATURE_LINELEN 78
void usage(void);
+void dkim_adddomain(char *);
void dkim_err(struct dkim_message *, char *);
void dkim_errx(struct dkim_message *, char *);
void dkim_headers_set(char *);
main(int argc, char *argv[])
{
int ch;
- FILE *keyfile;
+ FILE *file;
+ char *line;
+ size_t linesz;
+ ssize_t linelen;
const char *errstr;
- while ((ch = getopt(argc, argv, "a:c:d:h:k:s:tx:z")) != -1) {
+ while ((ch = getopt(argc, argv, "a:c:D:d:h:k:s:tx:z")) != -1) {
switch (ch) {
case 'a':
if (strncmp(optarg, "rsa-", 4) == 0) {
canonbody = CANON_SIMPLE;
else
osmtpd_err(1, "Invalid canonicalization");
+ break;
+ case 'D':
+ if ((file = fopen(optarg, "r")) == NULL)
+ osmtpd_err(1, "Can't open domain file (%s)",
+ optarg);
+ do {
+ line = NULL;
+ linesz = 0;
+ linelen = getline(&line, &linesz, file);
+ if (linelen > 0) {
+ if (line[linelen - 1] == '\n')
+ line[linelen - 1] = '\0';
+ dkim_adddomain(line);
+ }
+ } while (linelen != -1);
+ if (ferror(file))
+ osmtpd_err(1, "Error reading domain file (%s)",
+ optarg);
+ fclose(file);
break;
case 'd':
- if ((domain = reallocarray(domain, ndomains + 1,
- sizeof(*domain))) == NULL)
- osmtpd_err(1, "malloc");
- domain[ndomains++] = optarg;
+ dkim_adddomain(optarg);
break;
case 'h':
dkim_headers_set(optarg);
break;
case 'k':
- if ((keyfile = fopen(optarg, "r")) == NULL)
+ if ((file = fopen(optarg, "r")) == NULL)
osmtpd_err(1, "Can't open key file (%s)",
optarg);
- pkey = PEM_read_PrivateKey(keyfile, NULL, NULL, NULL);
+ pkey = PEM_read_PrivateKey(file, NULL, NULL, NULL);
if (pkey == NULL)
osmtpd_errx(1, "Can't read key file");
- fclose(keyfile);
+ fclose(file);
break;
case 's':
selector = optarg;
osmtpd_run();
return 0;
+}
+
+void
+dkim_adddomain(char *d)
+{
+ domain = reallocarray(domain, ndomains + 1, sizeof(*domain));
+ if (domain == NULL)
+ osmtpd_err(1, "malloc");
+ domain[ndomains++] = d;
+
}
void
{
fprintf(stderr, "usage: filter-dkimsign [-tz] [-a signalg] "
"[-c canonicalization] \n [-h headerfields]"
- "[-x seconds] -d domain -k keyfile -s selector\n");
+ "[-x seconds] -D file -d domain -k keyfile -s selector\n");
exit(1);
}