@@ -21,6 +21,7 @@ libparser.a
libpath.a
libsi.a
libxlog.a
+display-junction
fedfs-create-junction
fedfs-create-replication
fedfs-delete-junction
@@ -26,8 +26,12 @@
noinst_HEADERS = junction-internal.h
noinst_LTLIBRARIES = libjunction.la
+noinst_PROGRAMS = display-junction
libjunction_la_SOURCES = export-cache.c fedfs.c junction.c \
locations.c nfs.c xml.c
+LDADD = $(top_builddir)/src/libxlog/libxlog.la \
+ $(top_builddir)/src/libjunction/libjunction.la \
+ $(top_builddir)/src/libnsdb/libnsdb.la
CLEANFILES = cscope.in.out cscope.out cscope.po.out *~
DISTCLEANFILES = Makefile.in
new file mode 100644
@@ -0,0 +1,111 @@
+/**
+ * @file src/libjunction/display-junction.c
+ * @brief Tool to retrieve and display junction XML document
+ */
+
+/*
+ * Copyright 2012 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <langinfo.h>
+
+#include <attr/xattr.h>
+
+#include "junction.h"
+#include "junction-internal.h"
+#include "xlog.h"
+
+/**
+ * Restore an object's mode bits
+ *
+ * @param pathname NUL-terminated C string containing pathname of a directory
+ * @return a FedFsStatus code
+ */
+int
+main(int argc, char **argv)
+{
+ char *progname, *pathname, *buf = NULL;
+ FedFsStatus retval;
+ int fd;
+
+ /* Ensure UTF-8 strings can be handled transparently */
+ if (setlocale(LC_CTYPE, "") == NULL ||
+ strcmp(nl_langinfo(CODESET), "UTF-8") != 0) {
+ fprintf(stderr, "Failed to set locale and langinfo\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* For the libraries */
+ if ((progname = strrchr(argv[0], '/')) != NULL)
+ progname++;
+ else
+ progname = argv[0];
+ xlog_stderr(1);
+ xlog_syslog(0);
+ xlog_open(progname);
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <pathname>\n", progname);
+ return EXIT_FAILURE;
+ }
+ pathname = argv[1];
+
+ retval = junction_open_path(pathname, &fd);
+ switch (retval) {
+ case FEDFS_OK:
+ break;
+ case FEDFS_ERR_PERM:
+ fprintf(stderr, "Failed to open junction %s: not running as root\n",
+ pathname);
+ return EXIT_FAILURE;
+ default:
+ fprintf(stderr, "Failed to open junction %s: %s\n",
+ pathname, nsdb_display_fedfsstatus(retval));
+ return EXIT_FAILURE;
+ }
+
+ retval = junction_read_xattr(fd, pathname, JUNCTION_XATTR_NAME_NFS, &buf);
+ switch (retval) {
+ case FEDFS_OK:
+ break;
+ case FEDFS_ERR_ACCESS:
+ fprintf(stderr, "Object %s is not a junction\n", pathname);
+ return EXIT_FAILURE;
+ default:
+ fprintf(stderr, "Failed to read junction %s: %s\n",
+ pathname, nsdb_display_fedfsstatus(retval));
+ return EXIT_FAILURE;
+ }
+
+ printf("%s\n", buf);
+
+ free(buf);
+ (void)close(fd);
+ return retval;
+}
Introduce the "display-junction" command, which takes a pathname and displays the contents of the junction XML. This is a debugging tool, not an installed program, so no man page is provided. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- .gitignore | 1 src/libjunction/Makefile.am | 4 + src/libjunction/display-junction.c | 111 ++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 0 deletions(-) create mode 100644 src/libjunction/display-junction.c