From 9042eba522e8c99da720ad31c0aafc7c03374e26 Mon Sep 17 00:00:00 2001 From: Matthias Andree Date: Tue, 2 Aug 2005 00:31:27 +0000 Subject: Add new servport.c file to resolve service -> port for non-IPv6 builds. svn path=/trunk/; revision=4216 --- servport.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 servport.c (limited to 'servport.c') diff --git a/servport.c b/servport.c new file mode 100644 index 00000000..2f69faba --- /dev/null +++ b/servport.c @@ -0,0 +1,62 @@ +/** \file servport.c Resolve service name to port number. + * \author Matthias Andree + * \date 2005 + * + * Copyright (C) 2005 by Matthias Andree + * For license terms, see the file COPYING in this directory. + */ +#include "fetchmail.h" +#include "i18n.h" + +#include +#include +#include +#include +#ifdef HAVE_ARPA_INET_H +#include +#elif defined(HAVE_NETINET_IN_H) +#include +#endif + +int servport(const char *service) { + int port; + unsigned long u; + char *end; + + if (service == 0) + return -1; + + /* + * Check if the service is a number. If so, convert it. + * If it isn't a number, call getservbyname to resolve it. + */ + errno = 0; + u = strtoul(service, &end, 10); + if (errno || end[strspn(end, POSIX_space)] != '\0') { + struct servent *se; + + /* hardcode kpop to port 1109 as per fetchmail(1) + * manual page, it's not a IANA registered service */ + if (strcmp(service, "kpop") == 0) + return 1109; + + se = getservbyname(service, "tcp"); + if (se == NULL) { + endservent(); + goto err; + } else { + port = ntohs(se->s_port); + endservent(); + } + } else { + if (u == 0 || u > 65535) + goto err; + port = u; + } + + return port; +err: + report(stderr, GT_("Cannot resolve service %s to port. Please specify the service as decimal port number.\n"), service); + return -1; +} +/* end of servport.c */ -- cgit v1.2.3