diff options
author | Matthias Andree <matthias.andree@gmx.de> | 2005-08-02 00:31:27 +0000 |
---|---|---|
committer | Matthias Andree <matthias.andree@gmx.de> | 2005-08-02 00:31:27 +0000 |
commit | 9042eba522e8c99da720ad31c0aafc7c03374e26 (patch) | |
tree | 009bbf525765c578c585ac4ca53e52f883968ef4 | |
parent | 7fb4f88045498caa235354b1c585bb5f7dda6ce9 (diff) | |
download | fetchmail-9042eba522e8c99da720ad31c0aafc7c03374e26.tar.gz fetchmail-9042eba522e8c99da720ad31c0aafc7c03374e26.tar.bz2 fetchmail-9042eba522e8c99da720ad31c0aafc7c03374e26.zip |
Add new servport.c file to resolve service -> port for non-IPv6 builds.
svn path=/trunk/; revision=4216
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | servport.c | 62 |
2 files changed, 63 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am index 64587c70..39c8064b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,7 +41,7 @@ endif fetchmail_SOURCES= fetchmail.h getopt.h \ i18n.h kerberos.h md5.h mx.h netrc.h ntlm.h \ smbbyteorder.h smbdes.h smbmd4.h smbencrypt.h smtp.h \ - socket.h tunable.h \ + socket.h tunable.h servport.c \ socket.c getpass.c pop2.c pop3.c imap.c etrn.c \ odmr.c fetchmail.c env.c idle.c options.c daemon.c \ driver.c transact.c sink.c smtp.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 <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 */ |