Added test/getfqnd.c, a replacement for "hostname" that always
authorDavid Levine <levinedl@acm.org>
Wed, 14 Mar 2012 02:20:47 +0000 (21:20 -0500)
committerDavid Levine <levinedl@acm.org>
Wed, 14 Mar 2012 02:26:28 +0000 (21:26 -0500)
tries to provide the fully qualified domainname of the host, even
on Cygwin.  It uses the code that LocalName in sbr/mts.c uses.

.gitignore
Makefile.am
test/format/test-myhost
test/format/test-mymbox
test/getfqdn.c [new file with mode: 0644]

index 87e31cb..d1dd750 100644 (file)
@@ -45,7 +45,7 @@ a.out.DSYM/
 /mts/libmts.a
 /sbr/*.a
 /sbr/sigmsg.h
-/test/testdir
+/test/testdir/
 /uip/ali
 /uip/anno
 /uip/ap
@@ -97,6 +97,7 @@ a.out.DSYM/
 /uip/whom
 /uip/*.exe
 /test/getfullname
+/test/getfqdn
 
 # Removed by mostlyclean:
 *.o
index c87160c..9ca7740 100644 (file)
@@ -65,7 +65,7 @@ TESTS = test/bad-input/test-header \
        test/cleanup ## The "cleanup" test should always be last.
 
 check_SCRIPTS = test/common.sh
-check_PROGRAMS = test/getfullname
+check_PROGRAMS = test/getfullname test/getfqdn
 
 ##
 ## Stuff that should be cleaned via "make clean"
@@ -363,6 +363,9 @@ uip_viamail_SOURCES = uip/viamail.c uip/mhmisc.c uip/mhoutsbr.c uip/sendsbr.c \
 test_getfullname_SOURCES = test/getfullname.c
 test_getfullname_LDADD =
 
+test_getfqdn_SOURCES = test/getfqdn.c
+test_getfqdn_LDADD =
+
 ##
 ## Our rebuild rules for files that aren't built via the normal mechanisms
 ##
index 27069af..635f35f 100755 (executable)
@@ -13,7 +13,8 @@ fi
 
 setup_test
 
-run_test "${MH_LIB_DIR}/ap -format %(myhost) ignore" "`hostname`" \
+host=`${MH_OBJ_DIR}/test/getfqdn`
+run_test "${MH_LIB_DIR}/ap -format %(myhost) ignore" "$host" \
          "local hostname test"
 
 cp ${MHMTSCONF} ${MH_TEST_DIR}/Mail/mts.conf || exit 1
index e3decd9..c154a8b 100755 (executable)
@@ -14,7 +14,7 @@ fi
 setup_test
 
 user="`id -un`"
-host="`hostname`"
+host=`${MH_OBJ_DIR}/test/getfqdn`
 
 run_test "${MH_LIB_DIR}/ap -format %(mymbox{text}) ${user}" \
          1 "Basic user test"
diff --git a/test/getfqdn.c b/test/getfqdn.c
new file mode 100644 (file)
index 0000000..23685da
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * getfqdn.c - Print the FQDN of a host, default to localhost.
+ *
+ * This code is Copyright (c) 2012, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
+ */
+
+#include <netdb.h>   /* for getaddrinfo */
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>  /* for gethostname */
+#include <limits.h>  /* for _POSIX_HOST_NAME_MAX */
+#include <string.h>  /* for memset */
+#include <stdio.h>
+
+
+int
+main(int argc, char *argv[])
+{
+  char buf[_POSIX_HOST_NAME_MAX + 1];
+  const char *hostname = buf;
+  struct addrinfo hints, *res;
+  int status = 0;
+
+  /* Borrowed the important code below from LocalName() in sbr/mts.c. */
+
+  if (argc < 2) {
+    /* First get our local name. */
+    status = gethostname(buf, sizeof buf);
+  } else if (argc == 2) {
+    hostname = argv[1];
+  } else if (argc > 2) {
+    fprintf (stderr, "usage: %s [hostname]\n", argv[0]);
+    return 1;
+  }
+
+  if (status == 0) {
+    /* Now fully qualify the hostname. */
+    memset(&hints, 0, sizeof hints);
+    hints.ai_flags = AI_CANONNAME;
+    hints.ai_family = AF_UNSPEC;
+
+    if ((status = getaddrinfo(hostname, NULL, &hints, &res)) == 0) {
+      printf ("%s\n", res->ai_canonname);
+      freeaddrinfo(res);
+    }
+  }
+
+  return status;
+}