aboutsummaryrefslogtreecommitdiffstats
path: root/servport.c
diff options
context:
space:
mode:
Diffstat (limited to 'servport.c')
-rw-r--r--servport.c62
1 files changed, 62 insertions, 0 deletions
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 <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#elif defined(HAVE_NETINET_IN_H)
+#include <netinet/in.h>
+#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 */