diff --git a/examples/Makefile.am b/examples/Makefile.am index a0f95e3..4db9df3 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,4 +1,4 @@ -noinst_PROGRAMS = nfsclient-async nfsclient-raw nfsclient-sync nfsclient-bcast nfsclient-listservers nfs-io nfs-ln nfs4-cat portmap-client portmap-server +noinst_PROGRAMS = nfsclient-async nfsclient-raw nfsclient-sync nfsclient-bcast nfsclient-listservers nfs-fh nfs-io nfs-ln nfs4-cat portmap-client portmap-server if HAVE_TALLOC_TEVENT noinst_PROGRAMS += nfs4-cat-talloc @@ -21,6 +21,7 @@ nfsclient_raw_LDADD = $(COMMON_LIBS) nfsclient_sync_LDADD = $(COMMON_LIBS) nfsclient_bcast_LDADD = $(COMMON_LIBS) nfsclient_listservers_LDADD = $(COMMON_LIBS) +nfs_fh_LDADD = $(COMMON_LIBS) nfs_io_LDADD = $(COMMON_LIBS) nfs_ln_LDADD = $(COMMON_LIBS) nfs4_cat_LDADD = $(COMMON_LIBS) -levent diff --git a/examples/nfs-fh.c b/examples/nfs-fh.c new file mode 100644 index 0000000..b07513b --- /dev/null +++ b/examples/nfs-fh.c @@ -0,0 +1,133 @@ +/* -*- mode:c; tab-width:8; c-basic-offset:8; indent-tabs-mode:nil; -*- */ +/* + Copyright (C) by Ronnie Sahlberg 2018 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#define _FILE_OFFSET_BITS 64 +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef AROS +#include "aros_compat.h" +#endif + + +#ifdef WIN32 +#include "win32_compat.h" +#pragma comment(lib, "ws2_32.lib") +WSADATA wsaData; +#else +#include +#include +#endif + +#ifdef HAVE_POLL_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include +#include +#include "libnfs.h" +#include "libnfs-raw.h" +#include "libnfs-raw-nfs.h" + +void usage(void) +{ + fprintf(stderr, "Usage: nfs-fh \n"); + fprintf(stderr, "\tPrints the NFS filehandle for a URL.\n"); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int i; + int ret = 0; + struct nfs_context *nfs = NULL; + struct nfsfh *nfsfh = NULL; + struct nfs_fh3 *fh3; + struct nfs_url *url = NULL; + +#ifdef WIN32 + if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { + printf("Failed to start Winsock2\n"); + return 1; + } +#endif + +#ifdef AROS + aros_init_socket(); +#endif + + if (argc < 2) { + usage(); + } + + nfs = nfs_init_context(); + if (nfs == NULL) { + fprintf(stderr, "failed to init context\n"); + goto finished; + } + + url = nfs_parse_url_full(nfs, argv[1]); + if (url == NULL) { + fprintf(stderr, "%s\n", nfs_get_error(nfs)); + ret = 1; + goto finished; + } + + if (nfs_mount(nfs, url->server, url->path) != 0) { + fprintf(stderr, "Failed to mount nfs share : %s\n", + nfs_get_error(nfs)); + ret = 1; + goto finished; + } + + if (nfs_open(nfs, url->file, O_RDONLY, &nfsfh) != 0) { + fprintf(stderr, "Failed to open file %s: %s\n", + url->file, nfs_get_error(nfs)); + ret = 1; + goto finished; + } + + fh3 = (struct nfs_fh3 *)nfs_get_fh(nfsfh); + for (i = 0; i < fh3->data.data_len; i++) { + printf("%02x", (unsigned char)(fh3->data.data_val[i])); + } + printf("\n"); + + finished: + if (nfsfh) { + nfs_close(nfs, nfsfh); + } + if (url) { + nfs_destroy_url(url); + } + if (nfs) { + nfs_destroy_context(nfs); + } + + return ret; +}