X-Original-To: alpine-aports@mail.alpinelinux.org Delivered-To: alpine-aports@mail.alpinelinux.org Received: from mail.alpinelinux.org (dallas-a1.alpinelinux.org [127.0.0.1]) by mail.alpinelinux.org (Postfix) with ESMTP id 5DF37DC1449 for ; Tue, 15 Sep 2015 12:31:05 +0000 (UTC) Received: from smtp142.ord.emailsrvr.com (smtp142.ord.emailsrvr.com [173.203.6.142]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.alpinelinux.org (Postfix) with ESMTPS id 19DF6DC0114 for ; Tue, 15 Sep 2015 12:31:04 +0000 (UTC) Received: from smtp26.relay.ord1a.emailsrvr.com (localhost.localdomain [127.0.0.1]) by smtp26.relay.ord1a.emailsrvr.com (SMTP Server) with ESMTP id 783F618013F; Tue, 15 Sep 2015 08:31:04 -0400 (EDT) Received: by smtp26.relay.ord1a.emailsrvr.com (Authenticated sender: jonathan-AT-curran.in) with ESMTPSA id 29D481800A2; Tue, 15 Sep 2015 08:31:04 -0400 (EDT) X-Sender-Id: jonathan@curran.in Received: from alpine.my.domain (cpe-97-99-28-109.tx.res.rr.com [97.99.28.109]) (using TLSv1.2 with cipher AES128-SHA256) by 0.0.0.0:25 (trex/5.4.2); Tue, 15 Sep 2015 12:31:04 GMT From: Jonathan Curran To: alpine-aports@lists.alpinelinux.org Cc: Jonathan Curran Subject: [alpine-aports] [PATCH v2] testing/opensmtpd: new aport Date: Thu, 10 Sep 2015 21:01:14 +0000 Message-Id: <1441918874-31745-1-git-send-email-jonathan@curran.in> X-Mailer: git-send-email 2.4.1 In-Reply-To: <1441830663-23827-1-git-send-email-jonathan@curran.in> References: <1441830663-23827-1-git-send-email-jonathan@curran.in> X-Virus-Scanned: ClamAV using ClamSMTP X-Mailinglist: alpine-aports Precedence: list List-Id: Alpine Development List-Unsubscribe: List-Post: List-Help: List-Subscribe: This aport provides the portable version of OpenSMTPD patched to work with musl. Parts of the patch will be submitted upstream soon. https://opensmtpd.org --- Changes v1 -> v2: - updated smtpd.initd testing/opensmtpd/00-opensmtpd.patch | 498 +++++++++++++++++++++++++++++++ testing/opensmtpd/APKBUILD | 73 +++++ testing/opensmtpd/aliases | 63 ++++ testing/opensmtpd/opensmtpd.post-install | 5 + testing/opensmtpd/opensmtpd.pre-install | 11 + testing/opensmtpd/smtpd.initd | 24 ++ 6 files changed, 674 insertions(+) create mode 100644 testing/opensmtpd/00-opensmtpd.patch create mode 100644 testing/opensmtpd/APKBUILD create mode 100644 testing/opensmtpd/aliases create mode 100644 testing/opensmtpd/opensmtpd.post-install create mode 100644 testing/opensmtpd/opensmtpd.pre-install create mode 100644 testing/opensmtpd/smtpd.initd diff --git a/testing/opensmtpd/00-opensmtpd.patch b/testing/opensmtpd/00-opensmtpd.patch new file mode 100644 index 0000000..243b0a4 --- /dev/null +++ b/testing/opensmtpd/00-opensmtpd.patch @@ -0,0 +1,498 @@ +diff --git a/configure.ac b/configure.ac +index a93a08f..55f41c1 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -685,6 +685,7 @@ AC_CHECK_FUNCS([ \ + getpeereid \ + getspnam \ + inet_aton \ ++ inet_net_pton \ + inet_ntoa \ + inet_ntop \ + isblank \ +@@ -693,6 +694,7 @@ AC_CHECK_FUNCS([ \ + pidfile \ + pw_dup \ + reallocarray \ ++ res_hnok \ + setenv \ + setlinebuf \ + setproctitle \ +diff --git a/openbsd-compat/Makefile.am b/openbsd-compat/Makefile.am +index 5c55faa..fdee88e 100644 +--- a/openbsd-compat/Makefile.am ++++ b/openbsd-compat/Makefile.am +@@ -5,9 +5,9 @@ libopenbsd_compat_a_SOURCES = \ + bsd-getpeereid.c bsd-misc.c bsd-waitpid.c clock_gettime.c \ + daemon.c dirname.c entropy.c errc.c event_asr_run.c explicit_bzero.c \ + fgetln.c fmt_scaled.c fparseln.c getopt.c imsg.c imsg-buffer.c \ +- libressl.c mktemp.c pidfile.c pw_dup.c reallocarray.c setresguid.c \ +- setproctitle.c strlcat.c strlcpy.c strmode.c strtonum.c \ +- strsep.c vis.c xmalloc.c ++ inet_net_pton.c libressl.c mktemp.c pidfile.c pw_dup.c reallocarray.c \ ++ res_hnok.c setresguid.c setproctitle.c strlcat.c strlcpy.c strmode.c \ ++ strtonum.c strsep.c vis.c xmalloc.c + + EXTRA_DIST = base64.h bsd-misc.h bsd-waitpid.h chacha_private.h defines.h \ + entropy.h imsg.h includes.h log.h openbsd-compat.h sys/queue.h \ +diff --git a/openbsd-compat/defines.h b/openbsd-compat/defines.h +index e1abee6..f0f5f59 100644 +--- a/openbsd-compat/defines.h ++++ b/openbsd-compat/defines.h +@@ -857,4 +857,12 @@ struct winsize { + #define FPARSELN_UNESCALL 0x0f + #endif + ++#ifndef SCOPE_DELIMITER ++#define SCOPE_DELIMITER '%' ++#endif ++ ++#ifndef WAIT_MYPGRP ++#define WAIT_MYPGRP 0 ++#endif ++ + #endif /* _DEFINES_H */ +diff --git a/openbsd-compat/inet_net_pton.c b/openbsd-compat/inet_net_pton.c +new file mode 100644 +index 0000000..0831e25 +--- /dev/null ++++ b/openbsd-compat/inet_net_pton.c +@@ -0,0 +1,214 @@ ++/* ++ * Copyright (c) 1996 by Internet Software Consortium. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS ++ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES ++ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE ++ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL ++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR ++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++ * SOFTWARE. ++ */ ++ ++#if defined(LIBC_SCCS) && !defined(lint) ++static const char orig_rcsid[] = "From Id: inet_net_pton.c,v 1.8 1996/11/21 10:28:12 vixie Exp $"; ++#endif ++//#include ++//__FBSDID("$FreeBSD: src/lib/libc/net/inet_net_pton.c,v 1.9 2003/09/15 23:38:06 fenner Exp $"); ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef SPRINTF_CHAR ++# define SPRINTF(x) strlen(sprintf/**/x) ++#else ++# define SPRINTF(x) ((size_t)sprintf x) ++#endif ++ ++static int inet_net_pton_ipv4(const char *src, u_char *dst, size_t size); ++ ++/* ++ * static int ++ * inet_net_pton(af, src, dst, size) ++ * convert network number from presentation to network format. ++ * accepts hex octets, hex strings, decimal octets, and /CIDR. ++ * "size" is in bytes and describes "dst". ++ * return: ++ * number of bits, either imputed classfully or specified with /CIDR, ++ * or -1 if some failure occurred (check errno). ENOENT means it was ++ * not a valid network specification. ++ * author: ++ * Paul Vixie (ISC), June 1996 ++ */ ++int ++inet_net_pton(af, src, dst, size) ++ int af; ++ const char *src; ++ void *dst; ++ size_t size; ++{ ++ switch (af) { ++ case AF_INET: ++ return (inet_net_pton_ipv4(src, dst, size)); ++ default: ++ errno = EAFNOSUPPORT; ++ return (-1); ++ } ++} ++ ++/* ++ * static int ++ * inet_net_pton_ipv4(src, dst, size) ++ * convert IPv4 network number from presentation to network format. ++ * accepts hex octets, hex strings, decimal octets, and /CIDR. ++ * "size" is in bytes and describes "dst". ++ * return: ++ * number of bits, either imputed classfully or specified with /CIDR, ++ * or -1 if some failure occurred (check errno). ENOENT means it was ++ * not an IPv4 network specification. ++ * note: ++ * network byte order assumed. this means 192.5.5.240/28 has ++ * 0x11110000 in its fourth octet. ++ * author: ++ * Paul Vixie (ISC), June 1996 ++ */ ++static int ++inet_net_pton_ipv4(src, dst, size) ++ const char *src; ++ u_char *dst; ++ size_t size; ++{ ++ static const char ++ xdigits[] = "0123456789abcdef", ++ digits[] = "0123456789"; ++ int n, ch, tmp, dirty, bits; ++ const u_char *odst = dst; ++ ++ ch = *src++; ++ if (ch == '0' && (src[0] == 'x' || src[0] == 'X') ++ && isascii(src[1]) && isxdigit(src[1])) { ++ /* Hexadecimal: Eat nybble string. */ ++ if (size <= 0) ++ goto emsgsize; ++ *dst = 0, dirty = 0; ++ src++; /* skip x or X. */ ++ while ((ch = *src++) != '\0' && ++ isascii(ch) && isxdigit(ch)) { ++ if (isupper(ch)) ++ ch = tolower(ch); ++ n = strchr(xdigits, ch) - xdigits; ++ assert(n >= 0 && n <= 15); ++ *dst |= n; ++ if (!dirty++) ++ *dst <<= 4; ++ else if (size-- > 0) ++ *++dst = 0, dirty = 0; ++ else ++ goto emsgsize; ++ } ++ if (dirty) ++ size--; ++ } else if (isascii(ch) && isdigit(ch)) { ++ /* Decimal: eat dotted digit string. */ ++ for (;;) { ++ tmp = 0; ++ do { ++ n = strchr(digits, ch) - digits; ++ assert(n >= 0 && n <= 9); ++ tmp *= 10; ++ tmp += n; ++ if (tmp > 255) ++ goto enoent; ++ } while ((ch = *src++) != '\0' && ++ isascii(ch) && isdigit(ch)); ++ if (size-- <= 0) ++ goto emsgsize; ++ *dst++ = (u_char) tmp; ++ if (ch == '\0' || ch == '/') ++ break; ++ if (ch != '.') ++ goto enoent; ++ ch = *src++; ++ if (!isascii(ch) || !isdigit(ch)) ++ goto enoent; ++ } ++ } else ++ goto enoent; ++ ++ bits = -1; ++ if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) { ++ /* CIDR width specifier. Nothing can follow it. */ ++ ch = *src++; /* Skip over the /. */ ++ bits = 0; ++ do { ++ n = strchr(digits, ch) - digits; ++ assert(n >= 0 && n <= 9); ++ bits *= 10; ++ bits += n; ++ } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); ++ if (ch != '\0') ++ goto enoent; ++ if (bits > 32) ++ goto emsgsize; ++ } ++ ++ /* Firey death and destruction unless we prefetched EOS. */ ++ if (ch != '\0') ++ goto enoent; ++ ++ /* If nothing was written to the destination, we found no address. */ ++ if (dst == odst) ++ goto enoent; ++ /* If no CIDR spec was given, infer width from net class. */ ++ if (bits == -1) { ++ if (*odst >= 240) /* Class E */ ++ bits = 32; ++ else if (*odst >= 224) /* Class D */ ++ bits = 4; ++ else if (*odst >= 192) /* Class C */ ++ bits = 24; ++ else if (*odst >= 128) /* Class B */ ++ bits = 16; ++ else /* Class A */ ++ bits = 8; ++ /* If imputed mask is narrower than specified octets, widen. */ ++ if (bits < ((dst - odst) * 8)) ++ bits = (dst - odst) * 8; ++ } ++ /* Extend network to cover the actual mask. */ ++ while (bits > ((dst - odst) * 8)) { ++ if (size-- <= 0) ++ goto emsgsize; ++ *dst++ = '\0'; ++ } ++ return (bits); ++ ++ enoent: ++ errno = ENOENT; ++ return (-1); ++ ++ emsgsize: ++ errno = EMSGSIZE; ++ return (-1); ++} ++ ++/* ++ * Weak aliases for applications that use certain private entry points, ++ * and fail to include . ++ */ ++#undef inet_net_pton ++/* __weak_reference(__inet_net_pton, inet_net_pton); */ +diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h +index e345a9d..a3fa80c 100644 +--- a/openbsd-compat/openbsd-compat.h ++++ b/openbsd-compat/openbsd-compat.h +@@ -184,8 +184,20 @@ int vsnprintf(char *, size_t, const char *, va_list); + void explicit_bzero(void *p, size_t n); + #endif + ++#ifndef HAVE_INET_NET_PTON ++int inet_net_pton(int, const char *, void *, size_t); ++#endif ++ ++#ifndef HAVE_RES_HNOK ++int res_hnok(const char *); ++#endif ++ + /* OpenSMTPD-portable specific entries */ + ++#ifndef FILE ++#include ++#endif ++ + #ifndef HAVE_FGETLN + #include + #include +diff --git a/openbsd-compat/res_hnok.c b/openbsd-compat/res_hnok.c +new file mode 100644 +index 0000000..06a3e8a +--- /dev/null ++++ b/openbsd-compat/res_hnok.c +@@ -0,0 +1,168 @@ ++/* $OpenBSD: res_comp.c,v 1.14 2008/04/16 22:35:23 deraadt Exp $ */ ++ ++/* ++ * ++Copyright++ 1985, 1993 ++ * - ++ * Copyright (c) 1985, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * - ++ * Portions Copyright (c) 1993 by Digital Equipment Corporation. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies, and that ++ * the name of Digital Equipment Corporation not be used in advertising or ++ * publicity pertaining to distribution of the document or software without ++ * specific, written prior permission. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL ++ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES ++ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT ++ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL ++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR ++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++ * SOFTWARE. ++ * - ++ * --Copyright-- ++ */ ++ ++/* OPENBSD ORIGINAL: lib/libc/net/res_comp.c */ ++ ++#include "includes.h" ++#ifndef HAVE_RES_HNOK ++ ++/* ++ * Verify that a domain name uses an acceptable character set. ++ */ ++ ++/* ++ * Note the conspicuous absence of ctype macros in these definitions. On ++ * non-ASCII hosts, we can't depend on string literals or ctype macros to ++ * tell us anything about network-format data. The rest of the BIND system ++ * is not careful about this, but for some reason, we're doing it right here. ++ */ ++#define PERIOD 0x2e ++#define hyphenchar(c) ((c) == 0x2d) ++#define bslashchar(c) ((c) == 0x5c) ++#define underscorechar(c) ((c) == 0x5f) ++#define periodchar(c) ((c) == PERIOD) ++#define asterchar(c) ((c) == 0x2a) ++#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ ++ || ((c) >= 0x61 && (c) <= 0x7a)) ++#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39) ++ ++#define borderchar(c) (alphachar(c) || digitchar(c)) ++#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(c)) ++#define domainchar(c) ((c) > 0x20 && (c) < 0x7f) ++ ++int ++res_hnok(const char *dn) ++{ ++ int pch = PERIOD, ch = *dn++; ++ ++ while (ch != '\0') { ++ int nch = *dn++; ++ ++ if (periodchar(ch)) { ++ ; ++ } else if (periodchar(pch)) { ++ if (!borderchar(ch)) ++ return (0); ++ } else if (periodchar(nch) || nch == '\0') { ++ if (!borderchar(ch)) ++ return (0); ++ } else { ++ if (!middlechar(ch)) ++ return (0); ++ } ++ pch = ch, ch = nch; ++ } ++ return (1); ++} ++ ++/* ++ * hostname-like (A, MX, WKS) owners can have "*" as their first label ++ * but must otherwise be as a host name. ++ */ ++int ++res_ownok(const char *dn) ++{ ++ if (asterchar(dn[0])) { ++ if (periodchar(dn[1])) ++ return (res_hnok(dn+2)); ++ if (dn[1] == '\0') ++ return (1); ++ } ++ return (res_hnok(dn)); ++} ++ ++/* ++ * SOA RNAMEs and RP RNAMEs can have any printable character in their first ++ * label, but the rest of the name has to look like a host name. ++ */ ++int ++res_mailok(const char *dn) ++{ ++ int ch, escaped = 0; ++ ++ /* "." is a valid missing representation */ ++ if (*dn == '\0') ++ return(1); ++ ++ /* otherwise