On 8/24/19 10:06 PM, Gilles Chehade wrote:
> On Sat, Aug 24, 2019 at 12:32:05PM -0700, Darren S. wrote:
>> OpenBSD 6.5 amd64
>> OpenSMTPD 6.5.0
>>
>> port [port]
>> Listen on the given port instead of the default port 25.
>>
>> I wanted to confirm if service names are intended to be supported for
>> `listen on` option in smtpd.conf.
>>
>> These result in syntax failure:
>>
>> listen on lo port smtp
>> listen on lo port smtps
>>
>> These do not:
>>
>> listen on lo port 25
>> listen on lo port 465
>>
>> This also does not:
>>
>> listen on lo port submission
>>
>> Found it curious that `submission` may be used in place of a port
>> number but not the other service names.
>>
>
> this is because `smtp' and `smtps` are keywords, so they must be quoted:
>
> listen on lo port "smtp"
>
>
Don't know if there's interest, but considering the port argument is
non-optional and smtp and smtps are valid (and imho not unreasonable)
port names I reckon we could add them explicitly so they can be used
without quotes.
martijn@
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/parse.y,v
retrieving revision 1.258
diff -u -p -r1.258 parse.y
--- parse.y 23 Aug 2019 19:05:01 -0000 1.258
+++ parse.y 24 Aug 2019 20:14:40 -0000
@@ -1863,6 +1863,38 @@ opt_if_listen : INET4 {
free($2);
listen_opts.port = ntohs(servent->s_port);
}
+ | PORT SMTP {
+ struct servent *servent;
+
+ if (listen_opts.options & LO_PORT) {
+ yyerror("port already specified");
+ YYERROR;
+ }
+ listen_opts.options |= LO_PORT;
+
+ servent = getservbyname("smtp", "tcp");
+ if (servent == NULL) {
+ yyerror("invalid port: smtp");
+ YYERROR;
+ }
+ listen_opts.port = ntohs(servent->s_port);
+ }
+ | PORT SMTPS {
+ struct servent *servent;
+
+ if (listen_opts.options & LO_PORT) {
+ yyerror("port already specified");
+ YYERROR;
+ }
+ listen_opts.options |= LO_PORT;
+
+ servent = getservbyname("smtps", "tcp");
+ if (servent == NULL) {
+ yyerror("invalid port: smtps");
+ YYERROR;
+ }
+ listen_opts.port = ntohs(servent->s_port);
+ }
| PORT NUMBER {
if (listen_opts.options & LO_PORT) {
yyerror("port already specified");