NLM: initial support for NLM

libnfs-4.0.0-vitalif
Ronnie Sahlberg 2012-03-10 20:46:03 +11:00
parent f314b3df7d
commit 6916a66546
7 changed files with 255 additions and 1 deletions

View File

@ -1,4 +1,4 @@
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

View File

@ -93,6 +93,7 @@ AC_CONFIG_FILES([Makefile]
[lib/Makefile]
[mount/Makefile]
[nfs/Makefile]
[nlm/Makefile]
[portmap/Makefile]
[rquota/Makefile]
[examples/Makefile]

View File

@ -752,6 +752,13 @@ int rpc_rquota2_getactivequota_async(struct rpc_context *rpc, rpc_cb cb, char *e
/*
* NFSACL functions
*/
/*
* Call NFSACL/NULL
* Call the NULL procedure for the NFSACL
@ -807,3 +814,29 @@ int rpc_nfsacl_getacl_async(struct rpc_context *rpc, rpc_cb cb, struct GETACL3ar
*/
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);

View File

@ -3,6 +3,7 @@ lib_LTLIBRARIES = libnfs.la
libnfs_la_CPPFLAGS = -I$(abs_top_srcdir)/include \
-I../mount \
-I../nfs \
-I../nlm \
-I../portmap \
-I../rquota \
"-D_U_=__attribute__((unused))"
@ -18,6 +19,7 @@ libnfs_la_LDFLAGS = -version-info 1:3:0
libnfs_la_LIBADD = \
../mount/libmount.la \
../nfs/libnfs.la \
../nlm/libnlm.la \
../portmap/libportmap.la \
../rquota/librquota.la

20
nlm/Makefile.am Normal file
View File

@ -0,0 +1,20 @@
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

72
nlm/nlm.c Normal file
View File

@ -0,0 +1,72 @@
/*
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;
}

126
nlm/nlm.x Normal file
View File

@ -0,0 +1,126 @@
/* 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;