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 <[email protected]> --- .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 diff --git a/.gitignore b/.gitignore index 10c43a2..57e67c0 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ libparser.a libpath.a libsi.a libxlog.a +display-junction fedfs-create-junction fedfs-create-replication fedfs-delete-junction diff --git a/src/libjunction/Makefile.am b/src/libjunction/Makefile.am index 4898d01..fd35365 100644 --- a/src/libjunction/Makefile.am +++ b/src/libjunction/Makefile.am @@ -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 diff --git a/src/libjunction/display-junction.c b/src/libjunction/display-junction.c new file mode 100644 index 0000000..8635bfc --- /dev/null +++ b/src/libjunction/display-junction.c @@ -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; +} _______________________________________________ fedfs-utils-devel mailing list [email protected] https://oss.oracle.com/mailman/listinfo/fedfs-utils-devel
