<pre style='margin:0'>
Chris Jones (cjones051073) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/934463b56639f7f0a5c6c5a3ce2198c57e6dda6d">https://github.com/macports/macports-legacy-support/commit/934463b56639f7f0a5c6c5a3ce2198c57e6dda6d</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 934463b56639f7f0a5c6c5a3ce2198c57e6dda6d
</span>Author: Mihai Moldovan <ionic@ionic.de>
AuthorDate: Wed Mar 20 13:07:23 2019 +0100

<span style='display:block; white-space:pre;color:#404040;'>    test/: add test_fstatat64.c - testing fstatat64's behavior if needed.
</span>---
 test/test_fstatat64.c | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 258 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_fstatat64.c b/test/test_fstatat64.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..b185017
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_fstatat64.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,258 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2019 Mihai Moldovan <ionic@ionic.de>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <libgen.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/syslimits.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int main (int argc, char **argv) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__DARWIN_ONLY_64_BIT_INO_T
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Caveat: dirname() and basename() my modify their arguments, so create copies. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *prog = strdup (argv[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!prog) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to copy program name: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *prog_dirname = strdup (dirname (prog));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free (prog);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!prog_dirname) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to copy program's dirname: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog = strdup (argv[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!prog) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to copy program name: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *prog_basename = strdup (basename (prog));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free (prog);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!prog_basename) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to copy program's basename: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Fetch raw stat64 data. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct stat64 orig_stat64 = { 0 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (0 != stat64 (argv[0], &orig_stat64)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to get test file's stat64 information: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Test stat64-compatibility with AT_FDCWD, which should behave exactly the same. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct stat64 atfdcwd_stat64 = { 0 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (0 != fstatat64 (AT_FDCWD, argv[0], &atfdcwd_stat64, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to get test file's stat64 information via fstatat64() in AT_FDCWD mode: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (0 != memcmp (&orig_stat64, &atfdcwd_stat64, sizeof (struct stat64))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Results obtained by stat64() and fstatat64() in AT_FDCWD mode deviate.\nBailing out.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   * Now we actually want to use a directory that is different from our CWD.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   * If the dirname is not ".", we're pretty much done.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   * Otherwise, more work is required.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct stat64 othercwd_stat64 = { 0 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int prog_dir_fd = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if ((1 == strlen (prog_dirname)) && ('.' == prog_dirname[0])) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     * The binary sits in our CWD (or has been called differently).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     * We'll fetch the CWD, extract the last component, switch to the upper
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     * directory and use the extracted component in our fstatat64 call.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    const size_t max_size = 1024000;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    size_t cur_size = PATH_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char *cwd = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char *ret = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while (NULL == ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      char *realloc_ret = realloc (cwd, cur_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (NULL == realloc_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fprintf (stderr, "Unable to request more memory to store the CWD in.\nBailing out.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (cwd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      cwd = realloc_ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ret = getcwd (cwd, cur_size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if ((NULL == ret) && (ERANGE != saved_errno)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fprintf (stderr, "Unable to fetch CWD: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* Do not free cwd here, it's state is explicitly undefined. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      cur_size *= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (cur_size > max_size) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fprintf (stderr, "CWD length would exceed maximum safe guard value of 1 MiB.\nBailing out.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (cwd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char *cwd_copy = strdup (cwd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!cwd_copy) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      fprintf (stderr, "Unable to copy CWD: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (cwd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char *last_component = strdup (basename (cwd_copy));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (cwd_copy);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    cwd_copy = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    free (cwd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    cwd = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!last_component) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      fprintf (stderr, "Unable to copy CWD's basename: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (0 != chdir ("..")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      fprintf (stderr, "Unable to change to upper directory: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (last_component);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Now get a reference to the previous directory. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    prog_dir_fd = open (last_component, O_RDONLY | O_DIRECTORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (-1 == prog_dir_fd) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      fprintf (stderr, "Unable to open directory '%s' from upper dir: %s\nBailing out.\n", last_component, strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (last_component);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Our CWD differs, so we can just open a reference to dirname. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    prog_dir_fd = open (prog_dirname, O_RDONLY | O_DIRECTORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (-1 == prog_dir_fd) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      fprintf (stderr, "Unable to open directory '%s': %s\nBailing out.\n", prog_dirname, strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int fstatat64_ret = fstatat64 (prog_dir_fd, prog_basename, &othercwd_stat64, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  saved_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  close (prog_dir_fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog_dir_fd = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free (prog_dirname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog_dirname = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free (prog_basename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  prog_basename = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Done, populate struct (and check for errors, naturally). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (0 != fstatat64_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Unable to get test file's stat64 information via fstatat64() with a different CWD supplied: %s\nBailing out.\n", strerror (saved_errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (0 != memcmp (&orig_stat64, &othercwd_stat64, sizeof (struct stat64))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf (stderr, "Results obtained by stat64() and fstatat64() with a different CWD supplied deviate.\nBailing out.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return (EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf ("fstatat64() is not supported on your platform, this test will do nothing.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return (EXIT_SUCCESS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>

</pre>