-SUBDIRS = mount nfs portmap rquota lib include . $(MAYBE_EXAMPLES)
+SUBDIRS = mount nfs nlm portmap rquota lib include . $(MAYBE_EXAMPLES)
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libnfs.pc
[lib/Makefile]
[mount/Makefile]
[nfs/Makefile]
+ [nlm/Makefile]
[portmap/Makefile]
[rquota/Makefile]
[examples/Makefile]
+
+
+
+/*
+ * NFSACL functions
+ */
+
/*
* Call NFSACL/NULL
* Call the NULL procedure for the NFSACL
*/
struct SETACL3args;
int rpc_nfsacl_setacl_async(struct rpc_context *rpc, rpc_cb cb, struct SETACL3args *args, void *private_data);
+
+
+
+
+/*
+ * NLM functions
+ */
+char *nlmstat4_to_str(int stat);
+
+/*
+ * Call NLM/NULL
+ * Call the NULL procedure for the NLM protocol
+ *
+ * Function returns
+ * 0 : The call was initiated. The callback will be invoked when the call completes.
+ * <0 : An error occured when trying to set up the call. The callback will not be invoked.
+ *
+ * When the callback is invoked, status indicates the result:
+ * RPC_STATUS_SUCCESS : We got a successful response from the nlm daemon.
+ * data is NULL
+ * RPC_STATUS_ERROR : An error occured when trying to contact the nlm daemon.
+ * data is the error string.
+ * RPC_STATUS_CANCEL : The connection attempt was aborted before it could complete.
+ * data is NULL.
+ */
+int rpc_nlm_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data);
libnfs_la_CPPFLAGS = -I$(abs_top_srcdir)/include \
-I../mount \
-I../nfs \
+ -I../nlm \
-I../portmap \
-I../rquota \
"-D_U_=__attribute__((unused))"
libnfs_la_LIBADD = \
../mount/libmount.la \
../nfs/libnfs.la \
+ ../nlm/libnlm.la \
../portmap/libportmap.la \
../rquota/librquota.la
--- /dev/null
+noinst_LTLIBRARIES = libnlm.la
+
+nlm_SOURCES_GENERATED = libnfs-raw-nlm.c
+nlm_HEADERS_GENERATED = libnfs-raw-nlm.h
+nlm_GENERATED = $(nlm_SOURCES_GENERATED) $(nlm_HEADERS_GENERATED)
+
+CLEANFILES = $(nlm_GENERATED) nlm-stamp
+
+libnlm_la_CPPFLAGS = -I$(abs_top_srcdir)/include
+libnlm_la_SOURCES = \
+ $(nlm_SOURCES_GENERATED) \
+ nlm.c
+
+$(nlm_GENERATED) : nlm-stamp
+nlm-stamp : nlm.x
+ rm -f $(nlm_GENERATED)
+ rpcgen -h @RPCGENFLAGS@ $< > libnfs-raw-nlm.h
+ rpcgen -c @RPCGENFLAGS@ $< | sed -e "s/#include \".*nlm.h\"/#include \"libnfs-raw-nlm.h\"/" > libnfs-raw-nlm.c
+ touch nlm-stamp
+
--- /dev/null
+/*
+ Copyright (C) 2012 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef WIN32
+#include "win32_compat.h"
+#endif/*WIN32*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <rpc/rpc.h>
+#include <rpc/xdr.h>
+#include "libnfs.h"
+#include "libnfs-raw.h"
+#include "libnfs-private.h"
+#include "libnfs-raw-nlm.h"
+
+int rpc_nlm_null_async(struct rpc_context *rpc, rpc_cb cb, void *private_data)
+{
+ struct rpc_pdu *pdu;
+
+ pdu = rpc_allocate_pdu(rpc, NLM_PROGRAM, NLM_V4, NLM4_NULL, cb, private_data, (xdrproc_t)xdr_void, 0);
+ if (pdu == NULL) {
+ rpc_set_error(rpc, "Out of memory. Failed to allocate pdu for nlm/null call");
+ return -1;
+ }
+
+ if (rpc_queue_pdu(rpc, pdu) != 0) {
+ rpc_set_error(rpc, "Out of memory. Failed to queue pdu for nlm/null call");
+ rpc_free_pdu(rpc, pdu);
+ return -1;
+ }
+
+ return 0;
+}
+
+char *nlmstat4_to_str(int st)
+{
+ enum nlmstat4 stat = st;
+
+ char *str = "unknown nlm stat";
+ switch (stat) {
+ case NLM4_GRANTED: str="NLM4_GRANTED";break;
+ case NLM4_DENIED: str="NLM4_DENIED";break;
+ case NLM4_DENIED_NOLOCKS: str="NLM4_DENIED_NOLOCKS";break;
+ case NLM4_BLOCKED: str="NLM4_BLOCKED";break;
+ case NLM4_DENIED_GRACE_PERIOD: str="NLM4_DENIED_GRACE_PERIOD";break;
+ case NLM4_DEADLCK: str="NLM4_DEADLCK";break;
+ case NLM4_ROFS: str="NLM4_ROFS";break;
+ case NLM4_STALE_FH: str="NLM4_STALE_FH";break;
+ case NLM4_FBIG: str="NLM4_FBIG";break;
+ case NLM4_FAILED: str="NLM4_FAILED";break;
+ }
+ return str;
+}
+
+
+
+
--- /dev/null
+/* based on rfc1813 and wireshark */
+
+const COOKIESIZE = 4;
+typedef opaque nlm_cookie[COOKIESIZE];
+
+enum nlmstat4 {
+ NLM4_GRANTED = 0,
+ NLM4_DENIED = 1,
+ NLM4_DENIED_NOLOCKS = 2,
+ NLM4_BLOCKED = 3,
+ NLM4_DENIED_GRACE_PERIOD = 4,
+ NLM4_DEADLCK = 5,
+ NLM4_ROFS = 6,
+ NLM4_STALE_FH = 7,
+ NLM4_FBIG = 8,
+ NLM4_FAILED = 9
+};
+
+struct nlm4_holder {
+ bool exclusive;
+ unsigned int svid;
+ netobj oh;
+ unsigned hyper l_offset;
+ unsigned hyper l_len;
+};
+
+const NLM_MAXNAME = 256;
+struct nlm4_lock {
+ string caller_name<NLM_MAXNAME>;
+ netobj fh;
+ netobj oh;
+ unsigned int svid;
+ unsigned hyper l_offset;
+ unsigned hyper l_len;
+};
+
+struct nlm4_share {
+ string caller_name<NLM_MAXNAME>;
+ netobj fh;
+ netobj oh;
+ unsigned int mode;
+ unsigned int access;
+};
+
+
+struct nlm4_testres_ok {
+ nlm_cookie cookie;
+ nlm4_holder holder;
+};
+
+union nlm4_testres switch (nlmstat4 nlm_status) {
+ case NLM4_GRANTED:
+ nlm4_testres_ok lock;
+ default:
+ void;
+};
+
+struct nlm4_testargs {
+ nlm_cookie cookie;
+ bool exclusive;
+ nlm4_lock lock;
+};
+
+program NLM_PROGRAM {
+ version NLM_V4 {
+ void
+ NLM4_NULL(void) = 0;
+
+ nlm4_testres
+ NLM4_TEST(nlm4_testargs) = 1;
+
+/* nlm4_res */
+/* NLM4_LOCK(nlm4_lockargs) = 2; */
+
+/* nlm4_res */
+/* NLM4_CANCEL(nlm4_cancargs) = 3; */
+
+/* nlm4_res */
+/* NLM4_UNLOCK(nlm4_unlockargs) = 4; */
+
+/* nlm4_res */
+/* NLM4_GRANTED(nlm4_testargs) = 5; */
+
+/* void */
+/* NLM4_TEST_MSG(nlm4_testargs) = 6; */
+
+/* void */
+/* NLM4_LOCK_MSG(nlm4_lockargs) = 7; */
+
+/* void */
+/* NLM4_CANCEL_MSG(nlm4_cancargs) = 8; */
+
+/* void */
+/* NLM4_UNLOCK_MSG(nlm4_unlockargs) = 9; */
+
+/* void */
+/* NLM4_GRANTED_MSG(nlm4_testargs) = 10; */
+
+/* void */
+/* NLM4_TEST_RES(nlm4_testres) = 11; */
+
+/* void */
+/* NLM4_LOCK_RES(nlm4_res) = 12; */
+
+/* void */
+/* NLM4_CANCEL_RES(nlm4_res) = 13; */
+
+/* void */
+/* NLM4_UNLOCK_RES(nlm4_res) = 14; */
+
+/* void */
+/* NLM4_GRANTED_RES(nlm4_res) = 15; */
+
+/* nlm4_shareres */
+/* NLM4_SHARE(nlm4_shareargs) = 20; */
+
+/* nlm4_shareres */
+/* NLM4_UNSHARE(nlm4_shareargs) = 21; */
+
+/* nlm4_res */
+/* NLM4_NM_LOCK(nlm4_lockargs) = 22; */
+
+/* void */
+/* NLM4_FREE_ALL(nlm4_notify) = 23; */
+ } = 4;
+} = 100021;