diff options
Diffstat (limited to 'xlators/nfs/lib/src')
| -rw-r--r-- | xlators/nfs/lib/src/auth-null.c | 72 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/auth-unix.c | 97 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/msg-nfs3.c | 554 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/msg-nfs3.h | 186 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpc-socket.c | 365 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpc-socket.h | 65 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpcsvc-auth.c | 400 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpcsvc.c | 2923 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpcsvc.h | 728 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/xdr-common.h | 48 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/xdr-nfs3.c | 1897 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/xdr-nfs3.h | 1206 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/xdr-rpc.c | 229 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/xdr-rpc.h | 82 | 
14 files changed, 0 insertions, 8852 deletions
diff --git a/xlators/nfs/lib/src/auth-null.c b/xlators/nfs/lib/src/auth-null.c deleted file mode 100644 index 0c8e335dba9..00000000000 --- a/xlators/nfs/lib/src/auth-null.c +++ /dev/null @@ -1,72 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "rpcsvc.h" -#include "list.h" -#include "dict.h" - - -int -nfs_auth_null_request_init (rpcsvc_request_t *req, void *priv) -{ -        if (!req) -                return -1; - -        memset (req->cred.authdata, 0, RPCSVC_MAX_AUTH_BYTES); -        req->cred.datalen = 0; - -        memset (req->verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES); -        req->verf.datalen = 0; - -        return 0; -} - -int -nfs_auth_null_authenticate (rpcsvc_request_t *req, void *priv) -{ -        /* Always succeed. */ -        return RPCSVC_AUTH_ACCEPT; -} - -rpcsvc_auth_ops_t nfs_auth_null_ops = { -        .conn_init              = NULL, -        .request_init           = nfs_auth_null_request_init, -        .authenticate           = nfs_auth_null_authenticate -}; - -rpcsvc_auth_t nfs_rpcsvc_auth_null = { -        .authname       = "AUTH_NULL", -        .authnum        = AUTH_NULL, -        .authops        = &nfs_auth_null_ops, -        .authprivate    = NULL -}; - - -rpcsvc_auth_t * -nfs_rpcsvc_auth_null_init (rpcsvc_t *svc, dict_t *options) -{ -        return &nfs_rpcsvc_auth_null; -} - diff --git a/xlators/nfs/lib/src/auth-unix.c b/xlators/nfs/lib/src/auth-unix.c deleted file mode 100644 index 50ca381ec85..00000000000 --- a/xlators/nfs/lib/src/auth-unix.c +++ /dev/null @@ -1,97 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - - - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "rpcsvc.h" -#include "list.h" -#include "dict.h" -#include "xdr-rpc.h" - - -int -nfs_auth_unix_request_init (rpcsvc_request_t *req, void *priv) -{ -        if (!req) -                return -1; -        memset (req->verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES); -        req->verf.datalen = 0; -        req->verf.flavour = AUTH_NULL; - -        return 0; -} - -int -nfs_auth_unix_authenticate (rpcsvc_request_t *req, void *priv) -{ -        int                     ret = RPCSVC_AUTH_REJECT; -        struct authunix_parms   aup; -        char                    machname[MAX_MACHINE_NAME]; - -        if (!req) -                return ret; - -        ret = nfs_xdr_to_auth_unix_cred (req->cred.authdata, req->cred.datalen, -                                         &aup, machname, req->auxgids); -        if (ret == -1) { -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        if (aup.aup_len > 16) { -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        req->uid = aup.aup_uid; -        req->gid = aup.aup_gid; -        req->auxgidcount = aup.aup_len; - -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth Info: machine name: %s, uid: %d" -                ", gid: %d", machname, req->uid, req->gid); -        ret = RPCSVC_AUTH_ACCEPT; -err: -        return ret; -} - -rpcsvc_auth_ops_t nfs_auth_unix_ops = { -        .conn_init              = NULL, -        .request_init           = nfs_auth_unix_request_init, -        .authenticate           = nfs_auth_unix_authenticate -}; - -rpcsvc_auth_t nfs_rpcsvc_auth_unix = { -        .authname       = "AUTH_UNIX", -        .authnum        = AUTH_UNIX, -        .authops        = &nfs_auth_unix_ops, -        .authprivate    = NULL -}; - - -rpcsvc_auth_t * -nfs_rpcsvc_auth_unix_init (rpcsvc_t *svc, dict_t *options) -{ -        return &nfs_rpcsvc_auth_unix; -} - diff --git a/xlators/nfs/lib/src/msg-nfs3.c b/xlators/nfs/lib/src/msg-nfs3.c deleted file mode 100644 index e6e722051ee..00000000000 --- a/xlators/nfs/lib/src/msg-nfs3.c +++ /dev/null @@ -1,554 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include <sys/uio.h> -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <sys/types.h> - -#include "xdr-nfs3.h" -#include "msg-nfs3.h" -#include "xdr-common.h" - - -/* Decode the mount path from the network message in inmsg - * into the memory referenced by outpath.iov_base. - * The size allocated for outpath.iov_base is outpath.iov_len. - * The size of the path extracted from the message is returned. - */ -ssize_t -xdr_to_mountpath (struct iovec outpath, struct iovec inmsg) -{ -        XDR     xdr; -        ssize_t ret = -1; -        char    *mntpath = NULL; - -        if ((!outpath.iov_base) || (!inmsg.iov_base)) -                return -1; - -        xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, -                       XDR_DECODE); - -        mntpath = outpath.iov_base; -        if (!xdr_dirpath (&xdr, (dirpath *)&mntpath)) { -                ret = -1; -                goto ret; -        } - -        ret = nfs_xdr_decoded_length (xdr); - -ret: -        return ret; -} - - -ssize_t -nfs_xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc) -{ -        ssize_t ret = -1; -        XDR     xdr; - -        if ((!outmsg.iov_base) || (!res) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len, -                       XDR_ENCODE); - -        if (!proc (&xdr, res)) { -                ret = -1; -                goto ret; -        } - -        ret = nfs_xdr_encoded_length (xdr); - -ret: -        return ret; -} - - -ssize_t -nfs_xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc) -{ -        XDR     xdr; -        ssize_t ret = -1; - -        if ((!inmsg.iov_base) || (!args) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, -                       XDR_DECODE); - -        if (!proc (&xdr, args)) { -                ret  = -1; -                goto ret; -        } - -        ret = nfs_xdr_decoded_length (xdr); -ret: -        return ret; -} - - -ssize_t -nfs_xdr_to_generic_payload (struct iovec inmsg, void *args, xdrproc_t proc, -                            struct iovec *pendingpayload) -{ -        XDR     xdr; -        ssize_t ret = -1; - -        if ((!inmsg.iov_base) || (!args) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, -                       XDR_DECODE); - -        if (!proc (&xdr, args)) { -                ret  = -1; -                goto ret; -        } - -        ret = nfs_xdr_decoded_length (xdr); - -        if (pendingpayload) { -                pendingpayload->iov_base = nfs_xdr_decoded_remaining_addr (xdr); -                pendingpayload->iov_len = nfs_xdr_decoded_remaining_len (xdr); -        } - -ret: -        return ret; -} - - -/* Translate the mountres3 structure in res into XDR format into memory - * referenced by outmsg.iov_base. - * Returns the number of bytes used in encoding into XDR format. - */ -ssize_t -xdr_serialize_mountres3 (struct iovec outmsg, mountres3 *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_mountres3); -} - - -ssize_t -xdr_serialize_mountbody (struct iovec outmsg, mountbody *mb) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)mb, -                                          (xdrproc_t)xdr_mountbody); -} - -ssize_t -xdr_serialize_mountlist (struct iovec outmsg, mountlist *ml) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)ml, -                                          (xdrproc_t)xdr_mountlist); -} - - -ssize_t -xdr_serialize_mountstat3 (struct iovec outmsg, mountstat3 *m) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)m, -                                          (xdrproc_t)xdr_mountstat3); -} - - -ssize_t -xdr_to_getattr3args (struct iovec inmsg, getattr3args *ga) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ga, -                                   (xdrproc_t)xdr_getattr3args); -} - - -ssize_t -xdr_serialize_getattr3res (struct iovec outmsg, getattr3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_getattr3res); -} - - -ssize_t -xdr_serialize_setattr3res (struct iovec outmsg, setattr3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_setattr3res); -} - - -ssize_t -xdr_to_setattr3args (struct iovec inmsg, setattr3args *sa) -{ -        return nfs_xdr_to_generic (inmsg, (void *)sa, -                                   (xdrproc_t)xdr_setattr3args); -} - - -ssize_t -xdr_serialize_lookup3res (struct iovec outmsg, lookup3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_lookup3res); -} - - -ssize_t -xdr_to_lookup3args (struct iovec inmsg, lookup3args *la) -{ -        return nfs_xdr_to_generic (inmsg, (void *)la, -                                   (xdrproc_t)xdr_lookup3args); -} - - -ssize_t -xdr_to_access3args (struct iovec inmsg, access3args *ac) -{ -        return nfs_xdr_to_generic (inmsg,(void *)ac, -                                   (xdrproc_t)xdr_access3args); -} - - -ssize_t -xdr_serialize_access3res (struct iovec outmsg, access3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_access3res); -} - - -ssize_t -xdr_to_readlink3args (struct iovec inmsg, readlink3args *ra) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ra, -                                   (xdrproc_t)xdr_readlink3args); -} - - -ssize_t -xdr_serialize_readlink3res (struct iovec outmsg, readlink3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_readlink3res); -} - - -ssize_t -xdr_to_read3args (struct iovec inmsg, read3args *ra) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ra, (xdrproc_t)xdr_read3args); -} - - -ssize_t -xdr_serialize_read3res (struct iovec outmsg, read3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_read3res); -} - -ssize_t -xdr_serialize_read3res_nocopy (struct iovec outmsg, read3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_read3res_nocopy); -} - - -ssize_t -xdr_to_write3args (struct iovec inmsg, write3args *wa) -{ -        return nfs_xdr_to_generic (inmsg, (void *)wa,(xdrproc_t)xdr_write3args); -} - - -ssize_t -xdr_to_write3args_nocopy (struct iovec inmsg, write3args *wa, -                          struct iovec *payload) -{ -        return nfs_xdr_to_generic_payload (inmsg, (void *)wa, -                                           (xdrproc_t)xdr_write3args, payload); -} - - -ssize_t -xdr_serialize_write3res (struct iovec outmsg, write3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_write3res); -} - - -ssize_t -xdr_to_create3args (struct iovec inmsg, create3args *ca) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ca, -                                   (xdrproc_t)xdr_create3args); -} - - -ssize_t -xdr_serialize_create3res (struct iovec outmsg, create3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_create3res); -} - - -ssize_t -xdr_serialize_mkdir3res (struct iovec outmsg, mkdir3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_mkdir3res); -} - - -ssize_t -xdr_to_mkdir3args (struct iovec inmsg, mkdir3args *ma) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ma, -                                   (xdrproc_t)xdr_mkdir3args); -} - - -ssize_t -xdr_to_symlink3args (struct iovec inmsg, symlink3args *sa) -{ -        return nfs_xdr_to_generic (inmsg, (void *)sa, -                                   (xdrproc_t)xdr_symlink3args); -} - - -ssize_t -xdr_serialize_symlink3res (struct iovec outmsg, symlink3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_symlink3res); -} - - -ssize_t -xdr_to_mknod3args (struct iovec inmsg, mknod3args *ma) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ma, -                                   (xdrproc_t)xdr_mknod3args); -} - - -ssize_t -xdr_serialize_mknod3res (struct iovec outmsg, mknod3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_mknod3res); -} - - -ssize_t -xdr_to_remove3args (struct iovec inmsg, remove3args *ra) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ra, -                                   (xdrproc_t)xdr_remove3args); -} - - -ssize_t -xdr_serialize_remove3res (struct iovec outmsg, remove3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_remove3res); -} - - -ssize_t -xdr_to_rmdir3args (struct iovec inmsg, rmdir3args *ra) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ra, -                                   (xdrproc_t)xdr_rmdir3args); -} - - -ssize_t -xdr_serialize_rmdir3res (struct iovec outmsg, rmdir3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_rmdir3res); -} - - -ssize_t -xdr_serialize_rename3res (struct iovec outmsg, rename3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_rename3res); -} - - -ssize_t -xdr_to_rename3args (struct iovec inmsg, rename3args *ra) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ra, -                                   (xdrproc_t)xdr_rename3args); -} - - -ssize_t -xdr_serialize_link3res (struct iovec outmsg, link3res *li) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)li, -                                          (xdrproc_t)xdr_link3res); -} - - -ssize_t -xdr_to_link3args (struct iovec inmsg, link3args *la) -{ -        return nfs_xdr_to_generic (inmsg, (void *)la, (xdrproc_t)xdr_link3args); -} - - -ssize_t -xdr_to_readdir3args (struct iovec inmsg, readdir3args *rd) -{ -        return nfs_xdr_to_generic (inmsg, (void *)rd, -                                   (xdrproc_t)xdr_readdir3args); -} - - -ssize_t -xdr_serialize_readdir3res (struct iovec outmsg, readdir3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_readdir3res); -} - - -ssize_t -xdr_to_readdirp3args (struct iovec inmsg, readdirp3args *rp) -{ -        return nfs_xdr_to_generic (inmsg, (void *)rp, -                                   (xdrproc_t)xdr_readdirp3args); -} - - -ssize_t -xdr_serialize_readdirp3res (struct iovec outmsg, readdirp3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_readdirp3res); -} - - -ssize_t -xdr_to_fsstat3args (struct iovec inmsg, fsstat3args *fa) -{ -        return nfs_xdr_to_generic (inmsg, (void *)fa, -                                   (xdrproc_t)xdr_fsstat3args); -} - - -ssize_t -xdr_serialize_fsstat3res (struct iovec outmsg, fsstat3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_fsstat3res); -} - -ssize_t -xdr_to_fsinfo3args (struct iovec inmsg, fsinfo3args *fi) -{ -        return nfs_xdr_to_generic (inmsg, (void *)fi, -                                   (xdrproc_t)xdr_fsinfo3args); -} - - -ssize_t -xdr_serialize_fsinfo3res (struct iovec outmsg, fsinfo3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_fsinfo3res); -} - - -ssize_t -xdr_to_pathconf3args (struct iovec inmsg, pathconf3args *pc) -{ -        return nfs_xdr_to_generic (inmsg, (void *)pc, -                                   (xdrproc_t)xdr_pathconf3args);} - - -ssize_t -xdr_serialize_pathconf3res (struct iovec outmsg, pathconf3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_pathconf3res); -} - - -ssize_t -xdr_to_commit3args (struct iovec inmsg, commit3args *ca) -{ -        return nfs_xdr_to_generic (inmsg, (void *)ca, -                                   (xdrproc_t)xdr_commit3args); -} - - -ssize_t -xdr_serialize_commit3res (struct iovec outmsg, commit3res *res) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)res, -                                          (xdrproc_t)xdr_commit3res); -} - - -ssize_t -xdr_serialize_exports (struct iovec outmsg, exports *elist) -{ -        XDR     xdr; -        ssize_t  ret = -1; - -        if ((!outmsg.iov_base) || (!elist)) -                return -1; - -        xdrmem_create (&xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len, -                       XDR_ENCODE); - -        if (!xdr_exports (&xdr, elist)) -                goto ret; - -        ret = nfs_xdr_decoded_length (xdr); - -ret: -        return ret; -} - - -ssize_t -xdr_serialize_nfsstat3 (struct iovec outmsg, nfsstat3 *s) -{ -        return nfs_xdr_serialize_generic (outmsg, (void *)s, -                                          (xdrproc_t)xdr_nfsstat3); -} - - diff --git a/xlators/nfs/lib/src/msg-nfs3.h b/xlators/nfs/lib/src/msg-nfs3.h deleted file mode 100644 index f0d57c64632..00000000000 --- a/xlators/nfs/lib/src/msg-nfs3.h +++ /dev/null @@ -1,186 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _MSG_NFS3_H_ -#define _MSG_NFS3_H_ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "xdr-nfs3.h" - -#include <sys/types.h> -#include <sys/uio.h> - -extern ssize_t -xdr_to_mountpath (struct iovec outpath, struct iovec inmsg); - -extern ssize_t -xdr_serialize_mountres3 (struct iovec outmsg, mountres3 *res); - -extern ssize_t -xdr_serialize_mountbody (struct iovec outmsg, mountbody *mb); - -extern ssize_t -xdr_to_getattr3args (struct iovec inmsg, getattr3args *ga); - -extern ssize_t -xdr_serialize_getattr3res (struct iovec outmsg, getattr3res *res); - -extern ssize_t -xdr_serialize_setattr3res (struct iovec outmsg, setattr3res *res); - -extern ssize_t -xdr_to_setattr3args (struct iovec inmsg, setattr3args *sa); - -extern ssize_t -xdr_serialize_lookup3res (struct iovec outmsg, lookup3res *res); - -extern ssize_t -xdr_to_lookup3args (struct iovec inmsg, lookup3args *la); - -extern ssize_t -xdr_to_access3args (struct iovec inmsg, access3args *ac); - -extern ssize_t -xdr_serialize_access3res (struct iovec outmsg, access3res *res); - -extern ssize_t -xdr_to_readlink3args (struct iovec inmsg, readlink3args *ra); - -extern ssize_t -xdr_serialize_readlink3res (struct iovec outmsg, readlink3res *res); - -extern ssize_t -xdr_to_read3args (struct iovec inmsg, read3args *ra); - -extern ssize_t -xdr_serialize_read3res (struct iovec outmsg, read3res *res); - -extern ssize_t -xdr_serialize_read3res_nocopy (struct iovec outmsg, read3res *res); - -extern ssize_t -xdr_to_write3args (struct iovec inmsg, write3args *wa); - -extern ssize_t -xdr_to_write3args_nocopy (struct iovec inmsg, write3args *wa, -                          struct iovec *payload); - -extern ssize_t -xdr_serialize_write3res (struct iovec outmsg, write3res *res); - -extern ssize_t -xdr_to_create3args (struct iovec inmsg, create3args *ca); - -extern ssize_t -xdr_serialize_create3res (struct iovec outmsg, create3res *res); - -extern ssize_t -xdr_serialize_mkdir3res (struct iovec outmsg, mkdir3res *res); - -extern ssize_t -xdr_to_mkdir3args (struct iovec inmsg, mkdir3args *ma); - -extern ssize_t -xdr_to_symlink3args (struct iovec inmsg, symlink3args *sa); - -extern ssize_t -xdr_serialize_symlink3res (struct iovec outmsg, symlink3res *res); - -extern ssize_t -xdr_to_mknod3args (struct iovec inmsg, mknod3args *ma); - -extern ssize_t -xdr_serialize_mknod3res (struct iovec outmsg, mknod3res *res); - -extern ssize_t -xdr_to_remove3args (struct iovec inmsg, remove3args *ra); - -extern ssize_t -xdr_serialize_remove3res (struct iovec outmsg, remove3res *res); - -extern ssize_t -xdr_to_rmdir3args (struct iovec inmsg, rmdir3args *ra); - -extern ssize_t -xdr_serialize_rmdir3res (struct iovec outmsg, rmdir3res *res); - -extern ssize_t -xdr_serialize_rename3res (struct iovec outmsg, rename3res *res); - -extern ssize_t -xdr_to_rename3args (struct iovec inmsg, rename3args *ra); - -extern ssize_t -xdr_serialize_link3res (struct iovec outmsg, link3res *li); - -extern ssize_t -xdr_to_link3args (struct iovec inmsg, link3args *la); - -extern ssize_t -xdr_to_readdir3args (struct iovec inmsg, readdir3args *rd); - -extern ssize_t -xdr_serialize_readdir3res (struct iovec outmsg, readdir3res *res); - -extern ssize_t -xdr_to_readdirp3args (struct iovec inmsg, readdirp3args *rp); - -extern ssize_t -xdr_serialize_readdirp3res (struct iovec outmsg, readdirp3res *res); - -extern ssize_t -xdr_to_fsstat3args (struct iovec inmsg, fsstat3args *fa); - -extern ssize_t -xdr_serialize_fsstat3res (struct iovec outmsg, fsstat3res *res); - -extern ssize_t -xdr_to_fsinfo3args (struct iovec inmsg, fsinfo3args *fi); - -extern ssize_t -xdr_serialize_fsinfo3res (struct iovec outmsg, fsinfo3res *res); - -extern ssize_t -xdr_to_pathconf3args (struct iovec inmsg, pathconf3args *pc); - -extern ssize_t -xdr_serialize_pathconf3res (struct iovec outmsg, pathconf3res *res); - -extern ssize_t -xdr_to_commit3args (struct iovec inmsg, commit3args *ca); - -extern ssize_t -xdr_serialize_commit3res (struct iovec outmsg, commit3res *res); - -extern ssize_t -xdr_serialize_exports (struct iovec outmsg, exports *elist); - -extern ssize_t -xdr_serialize_mountlist (struct iovec outmsg, mountlist *ml); - -extern ssize_t -xdr_serialize_mountstat3 (struct iovec outmsg, mountstat3 *m); - -extern ssize_t -xdr_serialize_nfsstat3 (struct iovec outmsg, nfsstat3 *s); -#endif diff --git a/xlators/nfs/lib/src/rpc-socket.c b/xlators/nfs/lib/src/rpc-socket.c deleted file mode 100644 index d2b4bfeb2f0..00000000000 --- a/xlators/nfs/lib/src/rpc-socket.c +++ /dev/null @@ -1,365 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "rpc-socket.h" -#include "rpcsvc.h" -#include "dict.h" -#include "logging.h" -#include "byte-order.h" -#include "common-utils.h" -#include "compat-errno.h" - -#include <fcntl.h> -#include <errno.h> -#include <sys/socket.h> -#include <netdb.h> -#include <netinet/in.h> -#include <netinet/tcp.h> - -#ifndef AI_ADDRCONFIG -#define AI_ADDRCONFIG 0 -#endif /* AI_ADDRCONFIG */ - -static int -nfs_rpcsvc_socket_server_get_local_socket (int addrfam, char *listenhost, -                                           uint16_t listenport, -                                           struct sockaddr *addr, -                                           socklen_t *addr_len) -{ -        struct addrinfo         hints, *res = 0; -        char                    service[NI_MAXSERV]; -        int                     ret = -1; - -        memset (service, 0, sizeof (service)); -        sprintf (service, "%d", listenport); - -        memset (&hints, 0, sizeof (hints)); -        addr->sa_family = hints.ai_family = addrfam; -        hints.ai_socktype = SOCK_STREAM; -        hints.ai_flags    = AI_ADDRCONFIG | AI_PASSIVE; - -        ret = getaddrinfo(listenhost, service, &hints, &res); -        if (ret != 0) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, -                        "getaddrinfo failed for host %s, service %s (%s)", -                        listenhost, service, gai_strerror (ret)); -                ret = -1; -                goto err; -        } - -        memcpy (addr, res->ai_addr, res->ai_addrlen); -        *addr_len = res->ai_addrlen; - -        freeaddrinfo (res); -        ret = 0; - -err: -        return ret; -} - - -int -nfs_rpcsvc_socket_listen (int addrfam, char *listenhost, uint16_t listenport) -{ -        int                     sock = -1; -        socklen_t               sockaddr_len; -        int                     flags = 0; -        int                     ret = -1; -        int                     opt = 1; -        union gf_sock_union     sock_union; - -        ret = nfs_rpcsvc_socket_server_get_local_socket (addrfam, listenhost, -                                                         listenport, -                                                         &sock_union.sa, -                                                         &sockaddr_len); - -        if (ret == -1) -                return ret; - -        sock = socket (sock_union.sa.sa_family, SOCK_STREAM, 0); -        if (sock == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "socket creation failed" -                        " (%s)", strerror (errno)); -                goto err; -        } - -        flags = fcntl (sock, F_GETFL); -        if (flags == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "cannot get socket flags" -                        " (%s)", strerror(errno)); -                goto close_err; -        } - -        ret = fcntl (sock, F_SETFL, flags | O_NONBLOCK); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "cannot set socket " -                        "non-blocking (%s)", strerror (errno)); -                goto close_err; -        } - -        ret = setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "setsockopt() for " -                        "SO_REUSEADDR failed (%s)", strerror (errno)); -                goto close_err; -        } - -        ret = bind (sock, &sock_union.sa, sockaddr_len); -        if (ret == -1) { -                if (errno != EADDRINUSE) { -                        gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "binding socket " -                                "failed: %s", strerror (errno)); -                        goto close_err; -                } -        } - -        ret = listen (sock, 10); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "could not listen on" -                        " socket (%s)", strerror (errno)); -                goto close_err; -        } - -        return sock; - -close_err: -        close (sock); -        sock = -1; - -err: -        return sock; -} - - -int -nfs_rpcsvc_socket_accept (int listenfd) -{ -        int                     new_sock = -1; -        struct sockaddr_storage new_sockaddr = {0, }; -        socklen_t               addrlen = sizeof (new_sockaddr); -        int                     flags = 0; -        int                     ret = -1; -        int                     on = 1; - -        new_sock = accept (listenfd, SA (&new_sockaddr), &addrlen); -        if (new_sock == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR,"accept on socket failed"); -                goto err; -        } - -        flags = fcntl (new_sock, F_GETFL); -        if (flags == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "cannot get socket flags" -                        " (%s)", strerror(errno)); -                goto close_err; -        } - -        ret = fcntl (new_sock, F_SETFL, flags | O_NONBLOCK); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "cannot set socket " -                        "non-blocking (%s)", strerror (errno)); -                goto close_err; -        } - -#ifdef TCP_NODELAY -        ret = setsockopt(new_sock, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "cannot set no-delay " -                        " socket option"); -        } -#endif - -        return new_sock; - -close_err: -        close (new_sock); -        new_sock = -1; - -err: -        return new_sock; -} - -ssize_t -nfs_rpcsvc_socket_read (int sockfd, char *readaddr, size_t readsize) -{ -        ssize_t         dataread = 0; -        ssize_t         readlen = -1; - -        if (!readaddr) -                return -1; - -        while (readsize > 0) { -                readlen = read (sockfd, readaddr, readsize); -                if (readlen == -1) { -                        if (errno != EAGAIN) { -                                dataread = -1; -                                break; -                        } else -                                break; -                } else if (readlen == 0) -                        break; - -                dataread += readlen; -                readaddr += readlen; -                readsize -= readlen; -        } - -        return dataread; -} - - -ssize_t -nfs_rpcsvc_socket_write (int sockfd, char *buffer, size_t size, int *eagain) -{ -        size_t          writelen = -1; -        ssize_t         written = 0; - -        if (!buffer) -                return -1; - -        while (size > 0) { -                writelen = write (sockfd, buffer, size); -                if (writelen == -1) { -                        if (errno != EAGAIN) { -                                written = -1; -                                break; -                        } else { -                                *eagain = 1; -                                break; -                        } -                } else if (writelen == 0) -                        break; - -                written += writelen; -                size -= writelen; -                buffer += writelen; -        } - -        return written; -} - - -int -nfs_rpcsvc_socket_peername (int sockfd, char *hostname, int hostlen) -{ -        struct sockaddr         sa; -        socklen_t               sl = sizeof (sa); -        int                     ret = EAI_FAIL; - -        if (!hostname) -                return ret; - -        ret = getpeername (sockfd, &sa, &sl); -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "Failed to get peer name:" -                        " %s", strerror (errno)); -                ret = EAI_FAIL; -                goto err; -        } - -        ret = getnameinfo (&sa, sl, hostname, hostlen, NULL, 0, 0); -        if (ret != 0) -                goto err; - -err: -        return ret; -} - - -int -nfs_rpcsvc_socket_peeraddr (int sockfd, char *addrstr, int addrlen, -                            struct sockaddr *returnsa, socklen_t sasize) -{ -        struct sockaddr         sa; -        int                     ret = EAI_FAIL; - -        if (returnsa) -                ret = getpeername (sockfd, returnsa, &sasize); -        else { -                sasize = sizeof (sa); -                ret = getpeername (sockfd, &sa, &sasize); -        } - -        if (ret == -1) { -                gf_log (GF_RPCSVC_SOCK, GF_LOG_ERROR, "Failed to get peer addr:" -                        " %s", strerror (errno)); -                ret = EAI_FAIL; -                goto err; -        } - -        /* If caller did not specify a string into which the address can be -         * stored, dont bother getting it. -         */ -        if (!addrstr) { -                ret = 0; -                goto err; -        } - -        if (returnsa) -                ret = getnameinfo (returnsa, sasize, addrstr, addrlen, NULL, 0, -                                   NI_NUMERICHOST); -        else -                ret = getnameinfo (&sa, sasize, addrstr, addrlen, NULL, 0, -                                   NI_NUMERICHOST); - -err: -        return ret; -} - - -int -nfs_rpcsvc_socket_block_tx (int sockfd) -{ - -        int     ret = -1; -        int     on = 1; - -#ifdef TCP_CORK -        ret = setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, &on, sizeof(on)); -#endif - -#ifdef TCP_NOPUSH -        ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, &on, sizeof(on)); -#endif - -        return ret; -} - - -int -nfs_rpcsvc_socket_unblock_tx (int sockfd) -{ -        int     ret = -1; -        int     off = 0; - -#ifdef TCP_CORK -        ret = setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, &off, sizeof(off)); -#endif - -#ifdef TCP_NOPUSH -        ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, &off, sizeof(off)); -#endif -        return ret; -} - diff --git a/xlators/nfs/lib/src/rpc-socket.h b/xlators/nfs/lib/src/rpc-socket.h deleted file mode 100644 index 8662df0a741..00000000000 --- a/xlators/nfs/lib/src/rpc-socket.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _NFS_RPCSVC_SOCKET_H_ -#define _NFS_RPCSVC_SOCKET_H_ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "rpcsvc.h" -#include "dict.h" -#include "logging.h" -#include "byte-order.h" -#include "common-utils.h" -#include "compat-errno.h" - -#include <fcntl.h> -#include <errno.h> -#include <sys/socket.h> -#include <netdb.h> - -#define SA(ptr)                 ((struct sockaddr *)ptr) -#define GF_RPCSVC_SOCK          "rpc-socket" -extern int -nfs_rpcsvc_socket_listen (int addrfam, char *listenhost, uint16_t listenport); - -extern int -nfs_rpcsvc_socket_accept (int listenfd); - -extern ssize_t -nfs_rpcsvc_socket_read (int sockfd, char *readaddr, size_t readsize); - -extern ssize_t -nfs_rpcsvc_socket_write (int sockfd, char *buffer, size_t size, int *eagain); - -extern int -nfs_rpcsvc_socket_peername (int sockfd, char *hostname, int hostlen); - -extern int -nfs_rpcsvc_socket_peeraddr (int sockfd, char *addrstr, int addrlen, -                            struct sockaddr *returnsa, socklen_t sasize); -extern int -nfs_rpcsvc_socket_block_tx (int sockfd); - -extern int -nfs_rpcsvc_socket_unblock_tx (int sockfd); -#endif diff --git a/xlators/nfs/lib/src/rpcsvc-auth.c b/xlators/nfs/lib/src/rpcsvc-auth.c deleted file mode 100644 index 6c8d30ec009..00000000000 --- a/xlators/nfs/lib/src/rpcsvc-auth.c +++ /dev/null @@ -1,400 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#include "rpcsvc.h" -#include "logging.h" -#include "dict.h" - -extern rpcsvc_auth_t * -nfs_rpcsvc_auth_null_init (rpcsvc_t *svc, dict_t *options); - -extern rpcsvc_auth_t * -nfs_rpcsvc_auth_unix_init (rpcsvc_t *svc, dict_t *options); - -int -nfs_rpcsvc_auth_add_initer (struct list_head *list, char *idfier, -                            rpcsvc_auth_initer_t init) -{ -        struct rpcsvc_auth_list         *new = NULL; - -        if ((!list) || (!init) || (!idfier)) -                return -1; - -        new = GF_CALLOC (1, sizeof (*new), gf_common_mt_rpcsvc_auth_list); -        if (!new) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Memory allocation failed"); -                return -1; -        } - -        new->init = init; -        strcpy (new->name, idfier); -        INIT_LIST_HEAD (&new->authlist); -        list_add_tail (&new->authlist, list); -        return 0; -} - - - -int -nfs_rpcsvc_auth_add_initers (rpcsvc_t *svc) -{ -        int     ret = -1; - -        ret = nfs_rpcsvc_auth_add_initer (&svc->authschemes, "auth-null", -                                          (rpcsvc_auth_initer_t) -                                          nfs_rpcsvc_auth_null_init); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_NULL"); -                goto err; -        } - -        ret = nfs_rpcsvc_auth_add_initer (&svc->authschemes, "auth-unix", -                                          (rpcsvc_auth_initer_t) -                                          nfs_rpcsvc_auth_unix_init); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_UNIX"); -                goto err; -        } - -err: -        return ret; -} - - -int -nfs_rpcsvc_auth_init_auth (rpcsvc_t *svc, dict_t *options, -                           struct rpcsvc_auth_list *authitem) -{ -        int             ret = -1; - -        if ((!svc) || (!options) || (!authitem)) -                return -1; - -        if (!authitem->init) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "No init function defined"); -                ret = -1; -                goto err; -        } - -        authitem->auth = authitem->init (svc, options); -        if (!authitem->auth) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Registration of auth failed:" -                        " %s", authitem->name); -                ret = -1; -                goto err; -        } - -        authitem->enable = 1; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Authentication enabled: %s", -                authitem->auth->authname); - -        ret = 0; -err: -        return ret; -} - - -int -nfs_rpcsvc_auth_init_auths (rpcsvc_t *svc, dict_t *options) -{ -        int                     ret = -1; -        struct rpcsvc_auth_list *auth = NULL; -        struct rpcsvc_auth_list *tmp = NULL; - -        if (!svc) -                return -1; - -        if (list_empty (&svc->authschemes)) { -                gf_log (GF_RPCSVC, GF_LOG_WARNING, "No authentication!"); -                ret = 0; -                goto err; -        } - -        /* If auth null and sys are not disabled by the user, we must enable -         * it by default. This is a globally default rule, the user is still -         * allowed to disable the two for particular subvolumes. -         */ -        if (!dict_get (options, "rpc-auth.auth-null")) { -                ret = dict_set_dynstr (options, "rpc-auth.auth-null", "on"); -                if (ret < 0) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, -                                "Failed to set dict value."); -                        goto err; -                } -        } - -        if (!dict_get (options, "rpc-auth.auth-unix")) { -                ret = dict_set_dynstr (options, "rpc-auth.auth-unix", "on"); -                if (ret < 0) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, -                                "Failed to set dict value."); -                        goto err; -                } -        } - -        list_for_each_entry_safe (auth, tmp, &svc->authschemes, authlist) { -                ret = nfs_rpcsvc_auth_init_auth (svc, options, auth); -                if (ret == -1) -                        goto err; -        } - -        ret = 0; -err: -        return ret; - -} - -int -nfs_rpcsvc_auth_init (rpcsvc_t *svc, dict_t *options) -{ -        int             ret = -1; - -        if ((!svc) || (!options)) -                return -1; - -        ret = nfs_rpcsvc_auth_add_initers (svc); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add initers"); -                goto out; -        } - -        ret = nfs_rpcsvc_auth_init_auths (svc, options); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init auth schemes"); -                goto out; -        } - -out: -        return ret; -} - - -rpcsvc_auth_t * -__nfs_rpcsvc_auth_get_handler (rpcsvc_request_t *req) -{ -        struct rpcsvc_auth_list *auth = NULL; -        struct rpcsvc_auth_list *tmp = NULL; -        rpcsvc_t                *svc = NULL; - -        if (!req) -                return NULL; - -        svc = nfs_rpcsvc_request_service (req); -        if (list_empty (&svc->authschemes)) { -                gf_log (GF_RPCSVC, GF_LOG_WARNING, "No authentication!"); -                goto err; -        } - -        list_for_each_entry_safe (auth, tmp, &svc->authschemes, authlist) { -                if (!auth->enable) -                        continue; -                if (auth->auth->authnum == req->cred.flavour) -                        goto err; - -        } - -        auth = NULL; -err: -        if (auth) -                return auth->auth; -        else -                return NULL; -} - -rpcsvc_auth_t * -nfs_rpcsvc_auth_get_handler (rpcsvc_request_t *req) -{ -        rpcsvc_auth_t           *auth = NULL; - -        auth = __nfs_rpcsvc_auth_get_handler (req); -        if (auth) -                goto ret; - -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "No auth handler: %d", -                req->cred.flavour); - -        /* The requested scheme was not available so fall back the to one -         * scheme that will always be present. -         */ -        req->cred.flavour = AUTH_NULL; -        req->verf.flavour = AUTH_NULL; -        auth = __nfs_rpcsvc_auth_get_handler (req); -ret: -        return auth; -} - - -int -nfs_rpcsvc_auth_request_init (rpcsvc_request_t *req) -{ -        int                     ret = -1; -        rpcsvc_auth_t           *auth = NULL; - -        if (!req) -                return -1; - -        auth = nfs_rpcsvc_auth_get_handler (req); -        if (!auth) -                goto err; -        ret = 0; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth handler: %s", auth->authname); -        if (!auth->authops->request_init) -                ret = auth->authops->request_init (req, auth->authprivate); - -err: -        return ret; -} - - -int -nfs_rpcsvc_authenticate (rpcsvc_request_t *req) -{ -        int                     ret = RPCSVC_AUTH_REJECT; -        rpcsvc_auth_t           *auth = NULL; -        int                     minauth = 0; - -        if (!req) -                return ret; - -        minauth = nfs_rpcsvc_request_prog_minauth (req); -        if (minauth > nfs_rpcsvc_request_cred_flavour (req)) { -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Auth too weak"); -                nfs_rpcsvc_request_set_autherr (req, AUTH_TOOWEAK); -                goto err; -        } - -        auth = nfs_rpcsvc_auth_get_handler (req); -        if (!auth) { -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "No auth handler found"); -                goto err; -        } - -        if (auth->authops->authenticate) -                ret = auth->authops->authenticate (req, auth->authprivate); - -err: -        return ret; -} - - -int -nfs_rpcsvc_auth_array (rpcsvc_t *svc, char *volname, int *autharr, int arrlen) -{ -        int             count = 0; -        int             gen = RPCSVC_AUTH_REJECT; -        int             spec = RPCSVC_AUTH_REJECT; -        int             final = RPCSVC_AUTH_REJECT; -        char            *srchstr = NULL; -        char            *valstr = NULL; -        gf_boolean_t    boolval = _gf_false; -        int             ret = 0; - -        struct rpcsvc_auth_list *auth = NULL; -        struct rpcsvc_auth_list *tmp = NULL; - -        if ((!svc) || (!autharr) || (!volname)) -                return -1; - -        memset (autharr, 0, arrlen * sizeof(int)); -        if (list_empty (&svc->authschemes)) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "No authentication!"); -                goto err; -        } - -        list_for_each_entry_safe (auth, tmp, &svc->authschemes, authlist) { -                if (count >= arrlen) -                        break; - -                gen = gf_asprintf (&srchstr, "rpc-auth.%s", auth->name); -                if (gen == -1) { -                        count = -1; -                        goto err; -                } - -                gen = RPCSVC_AUTH_REJECT; -                if (dict_get (svc->options, srchstr)) { -                        ret = dict_get_str (svc->options, srchstr, &valstr); -                        if (ret == 0) { -                                ret = gf_string2boolean (valstr, &boolval); -                                if (ret == 0) { -                                        if (boolval == _gf_true) -                                                gen = RPCSVC_AUTH_ACCEPT; -                                } else -                                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile" -                                                "d to read auth val"); -                        } else -                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile" -                                        "d to read auth val"); -                } - -                GF_FREE (srchstr); -                spec = gf_asprintf (&srchstr, "rpc-auth.%s.%s", auth->name, -                                    volname); -                if (spec == -1) { -                        count = -1; -                        goto err; -                } - -                spec = RPCSVC_AUTH_DONTCARE; -                if (dict_get (svc->options, srchstr)) { -                        ret = dict_get_str (svc->options, srchstr, &valstr); -                        if (ret == 0) { -                                ret = gf_string2boolean (valstr, &boolval); -                                if (ret == 0) { -                                        if (boolval == _gf_true) -                                                spec = RPCSVC_AUTH_ACCEPT; -                                        else -                                                spec = RPCSVC_AUTH_REJECT; -                                } else -                                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile" -                                                "d to read auth val"); -                        } else -                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile" -                                        "d to read auth val"); -                } - -                GF_FREE (srchstr); -                final = nfs_rpcsvc_combine_gen_spec_volume_checks (gen, spec); -                if (final == RPCSVC_AUTH_ACCEPT) { -                        autharr[count] = auth->auth->authnum; -                        ++count; -                } -        } - -err: -        return count; -} - - -gid_t * -nfs_rpcsvc_auth_unix_auxgids (rpcsvc_request_t *req, int *arrlen) -{ -        if ((!req) || (!arrlen)) -                return NULL; - -        if (req->cred.flavour != AUTH_UNIX) -                return NULL; - -        *arrlen = req->auxgidcount; -        if (*arrlen == 0) -                return NULL; - -        return &req->auxgids[0]; -} - diff --git a/xlators/nfs/lib/src/rpcsvc.c b/xlators/nfs/lib/src/rpcsvc.c deleted file mode 100644 index 0831cf49ab6..00000000000 --- a/xlators/nfs/lib/src/rpcsvc.c +++ /dev/null @@ -1,2923 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "rpcsvc.h" -#include "rpc-socket.h" -#include "dict.h" -#include "logging.h" -#include "byte-order.h" -#include "common-utils.h" -#include "compat-errno.h" -#include "list.h" -#include "xdr-rpc.h" -#include "iobuf.h" -#include "globals.h" - -#include <errno.h> -#include <pthread.h> -#include <stdlib.h> -#include <rpc/rpc.h> -#include <rpc/pmap_clnt.h> -#include <arpa/inet.h> -#include <rpc/xdr.h> -#include <fnmatch.h> -#include <stdarg.h> -#include <stdio.h> - - -#define nfs_rpcsvc_alloc_request(con, request)                          \ -        do {                                                            \ -                request = (rpcsvc_request_t *) mem_get ((con)->rxpool); \ -                memset (request, 0, sizeof (rpcsvc_request_t));         \ -        } while (0)                                                     \ - -/* The generic event handler for every stage */ -void * -nfs_rpcsvc_stage_proc (void *arg) -{ -        rpcsvc_stage_t          *stg = (rpcsvc_stage_t *)arg; - -        if (!stg) -                return NULL; - -        event_dispatch (stg->eventpool); -        return NULL; -} - - -rpcsvc_stage_t * -nfs_rpcsvc_stage_init (rpcsvc_t *svc) -{ -        rpcsvc_stage_t          *stg = NULL; -        int                     ret = -1; -        size_t                  stacksize = RPCSVC_THREAD_STACK_SIZE; -        pthread_attr_t          stgattr; -        unsigned int            eventpoolsize = 0; - -        if (!svc) -                return NULL; - -        stg = GF_CALLOC (1, sizeof(*stg), gf_common_mt_rpcsvc_stage_t); -        if (!stg) -                return NULL; - -        eventpoolsize = svc->memfactor * RPCSVC_EVENTPOOL_SIZE_MULT; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "event pool size: %d", eventpoolsize); -        stg->eventpool = event_pool_new (eventpoolsize); -        if (!stg->eventpool) -                goto free_stg; - -        pthread_attr_init (&stgattr); -        ret = pthread_attr_setstacksize (&stgattr, stacksize); -        if (ret == EINVAL) -                gf_log (GF_RPCSVC, GF_LOG_WARNING, -                                "Using default thread stack size"); - -        ret = pthread_create (&stg->tid, &stgattr, nfs_rpcsvc_stage_proc, -                              (void *)stg); -        if (ret != 0) { -                ret = -1; -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Stage creation failed"); -                goto free_stg; -        } - -        stg->svc = svc; -        ret = 0; -free_stg: -        if (ret == -1) { -                GF_FREE (stg); -                stg = NULL; -        } - -        return stg; -} - - -int -nfs_rpcsvc_init_options (rpcsvc_t *svc, dict_t *options) -{ -        char            *optstr = NULL; -        int             ret = -1; - -        if ((!svc) || (!options)) -                return -1; - -        svc->memfactor = RPCSVC_DEFAULT_MEMFACTOR; - -        svc->register_portmap = _gf_true; -        if (dict_get (options, "rpc.register-with-portmap")) { -                ret = dict_get_str (options, "rpc.register-with-portmap", -                                    &optstr); -                if (ret < 0) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to parse " -                                "dict"); -                        goto out; -                } - -                ret = gf_string2boolean (optstr, &svc->register_portmap); -                if (ret < 0) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to parse bool " -                                "string"); -                        goto out; -                } -        } - -        if (!svc->register_portmap) -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Portmap registration " -                        "disabled"); - -        ret = 0; -out: -        return ret; -} - - -/* The global RPC service initializer. - * Starts up the stages and then waits for RPC program registrations - * to come in. - */ -rpcsvc_t * -nfs_rpcsvc_init (glusterfs_ctx_t *ctx, dict_t *options) -{ -        rpcsvc_t        *svc = NULL; -        int             ret = -1; - -        if ((!ctx) || (!options)) -                return NULL; - -        svc = GF_CALLOC (1, sizeof (*svc), gf_common_mt_rpcsvc_t); -        if (!svc) -                return NULL; - -        pthread_mutex_init (&svc->rpclock, NULL); -        INIT_LIST_HEAD (&svc->stages); -        INIT_LIST_HEAD (&svc->authschemes); -        INIT_LIST_HEAD (&svc->allprograms); - -        ret = nfs_rpcsvc_init_options (svc, options); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init options"); -                goto free_svc; -        } - -        ret = nfs_rpcsvc_auth_init (svc, options); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init " -                        "authentication"); -                goto free_svc; -        } - -        ret = -1; -        svc->defaultstage = nfs_rpcsvc_stage_init (svc); -        if (!svc->defaultstage) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR,"RPC service init failed."); -                goto free_svc; -        } -        svc->options = options; -        svc->ctx = ctx; -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC service inited."); - -        ret = 0; -free_svc: -        if (ret == -1) { -                GF_FREE (svc); -                svc = NULL; -        } - -        return svc; -} - - -/* Once multi-threaded support is complete, we'll be able to round-robin - * the various incoming connections over the many available stages. This - * function selects one from among all the stages. - */ -rpcsvc_stage_t * -nfs_rpcsvc_select_stage (rpcsvc_t *rpcservice) -{ -        if (!rpcservice) -                return NULL; - -        return rpcservice->defaultstage; -} - - -int -nfs_rpcsvc_conn_peer_check_search (dict_t *options, char *pattern, char *clstr) -{ -        int                     ret = -1; -        char                    *addrtok = NULL; -        char                    *addrstr = NULL; -        char                    *svptr = NULL; - -        if ((!options) || (!clstr)) -                return -1; - -        if (!dict_get (options, pattern)) -                return -1; - -        ret = dict_get_str (options, pattern, &addrstr); -        if (ret < 0) { -                ret = -1; -                goto err; -        } - -        if (!addrstr) { -                ret = -1; -                goto err; -        } - -        addrtok = strtok_r (addrstr, ",", &svptr); -        while (addrtok) { - -                /* CASEFOLD not present on Solaris */ -#ifdef FNM_CASEFOLD -                ret = fnmatch (addrtok, clstr, FNM_CASEFOLD); -#else -                ret = fnmatch (addrtok, clstr, 0); -#endif -                if (ret == 0) -                        goto err; - -                addrtok = strtok_r (NULL, ",", &svptr); -        } - -        ret = -1; -err: - -        return ret; -} - - -int -nfs_rpcsvc_conn_peer_check_allow (dict_t *options, char *volname, char *clstr) -{ -        int     ret = RPCSVC_AUTH_DONTCARE; -        char    *srchstr = NULL; -        char    globalrule[] = "rpc-auth.addr.allow"; - -        if ((!options) || (!clstr)) -                return ret; - -        /* If volname is NULL, then we're searching for the general rule to -         * determine the current address in clstr is allowed or not for all -         * subvolumes. -         */ -        if (volname) { -                ret = gf_asprintf (&srchstr, "rpc-auth.addr.%s.allow", volname); -                if (ret == -1) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed"); -                        ret = RPCSVC_AUTH_DONTCARE; -                        goto out; -                } -        } else -                srchstr = globalrule; - -        ret = nfs_rpcsvc_conn_peer_check_search (options, srchstr, clstr); -        if (volname) -                GF_FREE (srchstr); - -        if (ret == 0) -                ret = RPCSVC_AUTH_ACCEPT; -        else -                ret = RPCSVC_AUTH_DONTCARE; -out: -        return ret; -} - -int -nfs_rpcsvc_conn_peer_check_reject (dict_t *options, char *volname, char *clstr) -{ -        int     ret = RPCSVC_AUTH_DONTCARE; -        char    *srchstr = NULL; -        char    generalrule[] = "rpc-auth.addr.reject"; - -        if ((!options) || (!clstr)) -                return ret; - -        if (volname) { -                ret = gf_asprintf (&srchstr, "rpc-auth.addr.%s.reject", -                                   volname); -                if (ret == -1) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed"); -                        ret = RPCSVC_AUTH_REJECT; -                        goto out; -                } -        } else -                srchstr = generalrule; - -        ret = nfs_rpcsvc_conn_peer_check_search (options, srchstr, clstr); -        if (volname) -                GF_FREE (srchstr); - -        if (ret == 0) -                ret = RPCSVC_AUTH_REJECT; -        else -                ret = RPCSVC_AUTH_DONTCARE; -out: -        return ret; -} - - -/* This function tests the results of the allow rule and the reject rule to - * combine them into a single result that can be used to determine if the - * connection should be allowed to proceed. - * Heres the test matrix we need to follow in this function. - * - * A -  Allow, the result of the allow test. Never returns R. - * R - Reject, result of the reject test. Never returns A. - * Both can return D or dont care if no rule was given. - * - * | @allow | @reject | Result | - * |    A   |   R     | R      | - * |    D   |   D     | D      | - * |    A   |   D     | A      | - * |    D   |   R     | R      | - */ -int -nfs_rpcsvc_combine_allow_reject_volume_check (int allow, int reject) -{ -        int     final = RPCSVC_AUTH_REJECT; - -        /* If allowed rule allows but reject rule rejects, we stay cautious -         * and reject. */ -        if ((allow == RPCSVC_AUTH_ACCEPT) && (reject == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; -        /* if both are dont care, that is user did not specify for either allow -         * or reject, we leave it up to the general rule to apply, in the hope -         * that there is one. -         */ -        else if ((allow == RPCSVC_AUTH_DONTCARE) && -                 (reject == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_DONTCARE; -        /* If one is dont care, the other one applies. */ -        else if ((allow == RPCSVC_AUTH_ACCEPT) && -                 (reject == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((allow == RPCSVC_AUTH_DONTCARE) && -                 (reject == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; - -        return final; -} - - -/* Combines the result of the general rule test against, the specific rule - * to determine final permission for the client's address. - * - * | @gen   | @spec   | Result | - * |    A   |   A     | A      | - * |    A   |   R     | R      | - * |    A   |   D     | A      | - * |    D   |   A     | A      | - * |    D   |   R     | R      | - * |    D   |   D     | D      | - * |    R   |   A     | A      | - * |    R   |   D     | R      | - * |    R   |   R     | R      | - */ -int -nfs_rpcsvc_combine_gen_spec_addr_checks (int gen, int spec) -{ -        int     final = RPCSVC_AUTH_REJECT; - -        if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec== RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_DONTCARE; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; - -        return final; -} - - - -/* Combines the result of the general rule test against, the specific rule - * to determine final test for the connection coming in for a given volume. - * - * | @gen   | @spec   | Result | - * |    A   |   A     | A      | - * |    A   |   R     | R      | - * |    A   |   D     | A      | - * |    D   |   A     | A      | - * |    D   |   R     | R      | - * |    D   |   D     | R      |, special case, we intentionally disallow this. - * |    R   |   A     | A      | - * |    R   |   D     | R      | - * |    R   |   R     | R      | - */ -int -nfs_rpcsvc_combine_gen_spec_volume_checks (int gen, int spec) -{ -        int     final = RPCSVC_AUTH_REJECT; - -        if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_ACCEPT) && (spec == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; -        /* On no rule, we reject. */ -        else if ((gen == RPCSVC_AUTH_DONTCARE) && (spec== RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_ACCEPT)) -                final = RPCSVC_AUTH_ACCEPT; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_DONTCARE)) -                final = RPCSVC_AUTH_REJECT; -        else if ((gen == RPCSVC_AUTH_REJECT) && (spec == RPCSVC_AUTH_REJECT)) -                final = RPCSVC_AUTH_REJECT; - -        return final; -} - - -int -nfs_rpcsvc_conn_peer_check_name (dict_t *options, char *volname, -                                 rpcsvc_conn_t *conn) -{ -        int     ret = RPCSVC_AUTH_REJECT; -        int     aret = RPCSVC_AUTH_REJECT; -        int     rjret = RPCSVC_AUTH_REJECT; -        char    clstr[RPCSVC_PEER_STRLEN]; - -        if (!conn) -                return ret; - -        ret = nfs_rpcsvc_conn_peername (conn, clstr, RPCSVC_PEER_STRLEN); -        if (ret != 0) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get remote addr: " -                        "%s", gai_strerror (ret)); -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        aret = nfs_rpcsvc_conn_peer_check_allow (options, volname, clstr); -        rjret = nfs_rpcsvc_conn_peer_check_reject (options, volname, clstr); - -        ret = nfs_rpcsvc_combine_allow_reject_volume_check (aret, rjret); - -err: -        return ret; -} - - -int -nfs_rpcsvc_conn_peer_check_addr (dict_t *options, char *volname, -                                 rpcsvc_conn_t *conn) -{ -        int     ret = RPCSVC_AUTH_REJECT; -        int     aret = RPCSVC_AUTH_DONTCARE; -        int     rjret = RPCSVC_AUTH_REJECT; -        char    clstr[RPCSVC_PEER_STRLEN]; - -        if (!conn) -                return ret; - -        ret = nfs_rpcsvc_conn_peeraddr (conn, clstr, RPCSVC_PEER_STRLEN, NULL, -                                        0); -        if (ret != 0) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get remote addr: " -                        "%s", gai_strerror (ret)); -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        aret = nfs_rpcsvc_conn_peer_check_allow (options, volname, clstr); -        rjret = nfs_rpcsvc_conn_peer_check_reject (options, volname, clstr); - -        ret = nfs_rpcsvc_combine_allow_reject_volume_check (aret, rjret); -err: -        return ret; -} - - -int -nfs_rpcsvc_conn_check_volume_specific (dict_t *options, char *volname, -                                       rpcsvc_conn_t *conn) -{ -        int             namechk = RPCSVC_AUTH_REJECT; -        int             addrchk = RPCSVC_AUTH_REJECT; -        gf_boolean_t    namelookup = _gf_true; -        char            *namestr = NULL; -        int             ret = 0; - -        if ((!options) || (!volname) || (!conn)) -                return RPCSVC_AUTH_REJECT; - -        /* Enabled by default */ -        if ((dict_get (options, "rpc-auth.addr.namelookup"))) { -                ret = dict_get_str (options, "rpc-auth.addr.namelookup" -                                    , &namestr); -                if (ret == 0) -                        ret = gf_string2boolean (namestr, &namelookup); -        } - -        /* We need two separate checks because the rules with addresses in them -         * can be network addresses which can be general and names can be -         * specific which will over-ride the network address rules. -         */ -        if (namelookup) -                namechk = nfs_rpcsvc_conn_peer_check_name (options, volname, -                                                           conn); -        addrchk = nfs_rpcsvc_conn_peer_check_addr (options, volname, conn); - -        if (namelookup) -                ret = nfs_rpcsvc_combine_gen_spec_addr_checks (addrchk, -                                                               namechk); -        else -                ret = addrchk; - -        return ret; -} - - -int -nfs_rpcsvc_conn_check_volume_general (dict_t *options, rpcsvc_conn_t *conn) -{ -        int             addrchk = RPCSVC_AUTH_REJECT; -        int             namechk = RPCSVC_AUTH_REJECT; -        gf_boolean_t    namelookup = _gf_true; -        char            *namestr = NULL; -        int             ret = 0; - -        if ((!options) || (!conn)) -                return RPCSVC_AUTH_REJECT; - -        /* Enabled by default */ -        if ((dict_get (options, "rpc-auth.addr.namelookup"))) { -                ret = dict_get_str (options, "rpc-auth.addr.namelookup" -                                    , &namestr); -                if (ret == 0) -                        ret = gf_string2boolean (namestr, &namelookup); -        } - -        /* We need two separate checks because the rules with addresses in them -         * can be network addresses which can be general and names can be -         * specific which will over-ride the network address rules. -         */ -        if (namelookup) -                namechk = nfs_rpcsvc_conn_peer_check_name (options, NULL, conn); -        addrchk = nfs_rpcsvc_conn_peer_check_addr (options, NULL, conn); - -        if (namelookup) -                ret = nfs_rpcsvc_combine_gen_spec_addr_checks (addrchk, -                                                               namechk); -        else -                ret = addrchk; - -        return ret; -} - -int -nfs_rpcsvc_conn_peer_check (dict_t *options, char *volname, rpcsvc_conn_t *conn) -{ -        int     general_chk = RPCSVC_AUTH_REJECT; -        int     specific_chk = RPCSVC_AUTH_REJECT; - -        if ((!options) || (!volname) || (!conn)) -                return RPCSVC_AUTH_REJECT; - -        general_chk = nfs_rpcsvc_conn_check_volume_general (options, conn); -        specific_chk = nfs_rpcsvc_conn_check_volume_specific (options, volname, -                                                              conn); - -        return nfs_rpcsvc_combine_gen_spec_volume_checks (general_chk, -                                                          specific_chk); -} - - -char * -nfs_rpcsvc_volume_allowed (dict_t *options, char *volname) -{ -        char    globalrule[] = "rpc-auth.addr.allow"; -        char    *srchstr = NULL; -        char    *addrstr = NULL; -        int     ret = -1; - -        if ((!options) || (!volname)) -                return NULL; - -        ret = gf_asprintf (&srchstr, "rpc-auth.addr.%s.allow", volname); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed"); -                goto out; -        } - -        if (!dict_get (options, srchstr)) { -                GF_FREE (srchstr); -                srchstr = globalrule; -                ret = dict_get_str (options, srchstr, &addrstr); -        } else -                ret = dict_get_str (options, srchstr, &addrstr); - -out: -        return addrstr; -} - - -/* Initialize the core of a connection */ -rpcsvc_conn_t * -nfs_rpcsvc_conn_init (rpcsvc_t *svc, int sockfd) -{ -        rpcsvc_conn_t  *conn = NULL; -        int             ret = -1; -        unsigned int    poolcount = 0; - -        conn = GF_CALLOC (1, sizeof(*conn), gf_common_mt_rpcsvc_conn_t); -        if (!conn) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "memory allocation failed"); -                return NULL; -        } - -        conn->sockfd = sockfd; -        INIT_LIST_HEAD (&conn->txbufs); -        poolcount = RPCSVC_POOLCOUNT_MULT * svc->memfactor; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "tx pool: %d", poolcount); -        conn->txpool = mem_pool_new (rpcsvc_txbuf_t, poolcount); -        if (!conn->txpool) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "mem pool allocation failed"); -                goto free_conn; -        } - -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "rx pool: %d", poolcount); -        conn->rxpool = mem_pool_new (rpcsvc_request_t, poolcount); -        if (!conn->rxpool) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "mem pool allocation failed"); -                goto free_txp; -        } - -        /* Cannot consider a connection connected unless the user of this -         * connection decides it is ready to use. It is possible that we have -         * to free this connection soon after. That free will not happpen -         * unless the state is disconnected. -         */ -        conn->connstate = RPCSVC_CONNSTATE_DISCONNECTED; -        pthread_mutex_init (&conn->connlock, NULL); -        conn->connref = 0; -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New connection inited: sockfd: %d", -                sockfd); - -        ret = 0; -free_txp: -        if (ret == -1) -                mem_pool_destroy (conn->txpool); - -free_conn: -        if (ret == -1) { -                GF_FREE (conn); -                conn = NULL; -        } - -        return conn; -} - - -void -nfs_rpcsvc_conn_destroy (rpcsvc_conn_t *conn) -{ -        mem_pool_destroy (conn->txpool); -        mem_pool_destroy (conn->rxpool); - -        /* Need to destory record state, txlists etc. */ -        GF_FREE (conn); -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Connection destroyed"); -} - - -int -__nfs_rpcsvc_conn_unref (rpcsvc_conn_t *conn) -{ -        --conn->connref; -        return conn->connref; -} - - -void -__nfs_rpcsvc_conn_deinit (rpcsvc_conn_t *conn) -{ -        if (!conn) -                return; - -        if ((conn->stage) && (conn->stage->eventpool)) { -                event_unregister (conn->stage->eventpool, conn->sockfd, -                                  conn->eventidx); -        } - -        if (nfs_rpcsvc_conn_check_active (conn)) { -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Connection de-activated:" -                        " sockfd: %d", conn->sockfd); -                conn->connstate = RPCSVC_CONNSTATE_DISCONNECTED; -        } - -        if (conn->sockfd != -1) { -                close (conn->sockfd); -                conn->sockfd = -1; -        } -} - - -void -nfs_rpcsvc_conn_deinit (rpcsvc_conn_t *conn) -{ -        int ref = 0; - -        if (!conn) -                return; - -        pthread_mutex_lock (&conn->connlock); -        { -                __nfs_rpcsvc_conn_deinit (conn); -                ref = __nfs_rpcsvc_conn_unref (conn); -        } -        pthread_mutex_unlock (&conn->connlock); - -        if (ref == 0) -                nfs_rpcsvc_conn_destroy (conn); - -        return; -} - - -void -nfs_rpcsvc_conn_unref (rpcsvc_conn_t *conn) -{ -        int ref = 0; -        if (!conn) -                return; - -        pthread_mutex_lock (&conn->connlock); -        { -                ref = __nfs_rpcsvc_conn_unref (conn); -        } -        pthread_mutex_unlock (&conn->connlock); - -        if (ref == 0) -                nfs_rpcsvc_conn_destroy (conn); -} - - -int -nfs_rpcsvc_conn_active (rpcsvc_conn_t *conn) -{ -        int     status = 0; - -        if (!conn) -                return 0; - -        pthread_mutex_lock (&conn->connlock); -        { -                status = nfs_rpcsvc_conn_check_active (conn); -        } -        pthread_mutex_unlock (&conn->connlock); - -        return status; -} - - - -void -nfs_rpcsvc_conn_ref (rpcsvc_conn_t *conn) -{ -        if (!conn) -                return; - -        pthread_mutex_lock (&conn->connlock); -        { -                ++conn->connref; -        } -        pthread_mutex_unlock (&conn->connlock); - -        return; -} - - -void -nfs_rpcsvc_conn_state_init (rpcsvc_conn_t *conn) -{ -        if (!conn) -                return; - -        ++conn->connref; -        conn->connstate = RPCSVC_CONNSTATE_CONNECTED; -} - -/* Builds a rpcsvc_conn_t with the aim of listening on it. - */ -rpcsvc_conn_t * -nfs_rpcsvc_conn_listen_init (rpcsvc_t *svc, rpcsvc_program_t *newprog) -{ -        rpcsvc_conn_t  *conn = NULL; -        int             sock = -1; - -        if (!newprog) -                return NULL; - -        sock = nfs_rpcsvc_socket_listen (newprog->progaddrfamily, -                                         newprog->proghost, newprog->progport); -        if (sock == -1) -                goto err; - -        conn = nfs_rpcsvc_conn_init (svc, sock); -        if (!conn) -                goto sock_close_err; - -        nfs_rpcsvc_conn_state_init (conn); -sock_close_err: -        if (!conn) -                close (sock); - -err: -        return conn; -} - -void -nfs_rpcsvc_record_init (rpcsvc_record_state_t *rs, struct iobuf_pool *pool) -{ -        if (!rs) -                return; - -        rs->state = RPCSVC_READ_FRAGHDR; -        rs->vecstate = 0; -        rs->remainingfraghdr = RPCSVC_FRAGHDR_SIZE; -        rs->remainingfrag = 0; -        rs->fragsize = 0; -        rs->recordsize = 0; -        rs->islastfrag = 0; - -        /* If the rs preserves a ref to the iob used by the previous request, -         * we must unref it here to prevent memory leak. -         * If program actor wanted to keep that memory around, it should've -         * refd it on entry into the actor. -         */ -        if (rs->activeiob) -                iobuf_unref (rs->activeiob); - -        if (rs->vectoriob) { -                iobuf_unref (rs->vectoriob); -                rs->vectoriob = NULL; -        } - -        rs->activeiob = iobuf_get (pool); -        rs->fragcurrent = iobuf_ptr (rs->activeiob); - -        memset (rs->fragheader, 0, RPCSVC_FRAGHDR_SIZE); -        rs->hdrcurrent = &rs->fragheader[0]; - -} - - -int -nfs_rpcsvc_conn_privport_check (rpcsvc_t *svc, char *volname, -                                rpcsvc_conn_t *conn) -{ -        struct sockaddr_in      sa; -        int                     ret = RPCSVC_AUTH_REJECT; -        socklen_t               sasize = sizeof (sa); -        char                    *srchstr = NULL; -        char                    *valstr = NULL; -        int                     globalinsecure = RPCSVC_AUTH_REJECT; -        int                     exportinsecure = RPCSVC_AUTH_DONTCARE; -        uint16_t                port = 0; -        gf_boolean_t            insecure = _gf_false; - -        if ((!svc) || (!volname) || (!conn)) -                return ret; - -        ret = nfs_rpcsvc_conn_peeraddr (conn, NULL, 0, (struct sockaddr *)&sa, -                                        sasize); -        if (ret != 0) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get peer addr: %s", -                        gai_strerror (ret)); -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        port = ntohs (sa.sin_port); -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Client port: %d", (int)port); -        /* If the port is already a privileged one, dont bother with checking -         * options. -         */ -        if (port <= 1024) { -                ret = RPCSVC_AUTH_ACCEPT; -                goto err; -        } - -        /* Disabled by default */ -        if ((dict_get (svc->options, "rpc-auth.ports.insecure"))) { -                ret = dict_get_str (svc->options, "rpc-auth.ports.insecure" -                                    , &srchstr); -                if (ret == 0) { -                        ret = gf_string2boolean (srchstr, &insecure); -                        if (ret == 0) { -                                if (insecure == _gf_true) -                                        globalinsecure = RPCSVC_AUTH_ACCEPT; -                        } else -                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to" -                                        " read rpc-auth.ports.insecure value"); -                } else -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to" -                                " read rpc-auth.ports.insecure value"); -        } - -        /* Disabled by default */ -        ret = gf_asprintf (&srchstr, "rpc-auth.ports.%s.insecure", volname); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed"); -                ret = RPCSVC_AUTH_REJECT; -                goto err; -        } - -        if (dict_get (svc->options, srchstr)) { -                ret = dict_get_str (svc->options, srchstr, &valstr); -                if (ret == 0) { -                        ret = gf_string2boolean (srchstr, &insecure); -                        if (ret == 0) { -                                if (insecure == _gf_true) -                                       exportinsecure = RPCSVC_AUTH_ACCEPT; -                                else -                                        exportinsecure = RPCSVC_AUTH_REJECT; -                        } else -                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to" -                                        " read rpc-auth.ports.insecure value"); -                } else -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to" -                                " read rpc-auth.ports.insecure value"); -        } - -        ret = nfs_rpcsvc_combine_gen_spec_volume_checks (globalinsecure, -                                                         exportinsecure); -        if (ret == RPCSVC_AUTH_ACCEPT) -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Unprivileged port allowed"); -        else -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Unprivileged port not" -                        " allowed"); - -err: -        return ret; -} - -/* Inits a rpcsvc_conn_t after accepting the connection. - */ -rpcsvc_conn_t * -nfs_rpcsvc_conn_accept_init (rpcsvc_t *svc, int listenfd) -{ -        rpcsvc_conn_t   *newconn = NULL; -        int             sock = -1; -        int             ret = -1; - -        sock = nfs_rpcsvc_socket_accept (listenfd); -        if (sock == -1) -                goto err; - -        newconn = nfs_rpcsvc_conn_init (svc, sock); -        if (!newconn) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init conn object"); -                ret = -1; -                goto err; -        } - -        nfs_rpcsvc_record_init (&newconn->rstate, svc->ctx->iobuf_pool); -        nfs_rpcsvc_conn_state_init (newconn); -        ret = 0; - -err: -        if (ret == -1) -                close (sock); - -        return newconn; -} - - -/* Once the connection has been created, we need to associate it with - * a stage so that the selected stage will handle the event on this connection. - * This function also allows the caller to decide which handler should - * be executed in the context of the stage, and also which specific events - * should be handed to the handler when running in this particular stage. - */ -int -nfs_rpcsvc_stage_conn_associate (rpcsvc_stage_t *stg, rpcsvc_conn_t *conn, -                                 event_handler_t handler, void *data) -{ -        int     ret = -1; - -        if ((!stg) || (!conn)) -                return -1; - -        conn->stage = stg; -        conn->eventidx = event_register (stg->eventpool, conn->sockfd, handler, -                                         data, 1, 0); -        if (conn->eventidx == -1) -                goto err; - -        ret = 0; -err: -        return ret; -} - - -/* Depending on the state we're in, return the size of the next read request. */ -size_t -nfs_rpcsvc_record_read_size (rpcsvc_record_state_t *rs) -{ -        size_t  toread = -1; - -        if (!rs) -                return -1; - -        if (nfs_rpcsvc_record_readfraghdr (rs)) -                toread = rs->remainingfraghdr; -        else if (nfs_rpcsvc_record_readfrag (rs)) -                toread = rs->remainingfrag; -        else -                toread = RPCSVC_CONN_READ; - -        return toread; -} - - -uint32_t -nfs_rpcsvc_record_extract_fraghdr (char *fraghdr) -{ -        uint32_t        hdr = 0; -        if (!fraghdr) -                return 0; - -        memcpy ((void *)&hdr, fraghdr, sizeof (hdr)); - -        hdr = ntohl (hdr); -        return hdr; -} - - -ssize_t -nfs_rpcsvc_record_read_complete_fraghdr (rpcsvc_record_state_t *rs, -                                         ssize_t dataread) -{ -        uint32_t        remhdr = 0; -        char            *fraghdrstart = NULL; -        uint32_t        fraghdr = 0; - -        fraghdrstart = &rs->fragheader[0]; -        remhdr = rs->remainingfraghdr; -        fraghdr = nfs_rpcsvc_record_extract_fraghdr (fraghdrstart); -        rs->fragsize = RPCSVC_FRAGSIZE (fraghdr); -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Received fragment size: %d", -                rs->fragsize); -        if (nfs_rpcsvc_record_vectored (rs)) { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC header," -                        " remaining: %d", RPCSVC_BARERPC_MSGSZ); -                rs->remainingfrag = RPCSVC_BARERPC_MSGSZ; -        } else { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Regular RPC header," -                        " remaining: %d", rs->fragsize); -                rs->remainingfrag = rs->fragsize; -        } - -        rs->state = RPCSVC_READ_FRAG; -        dataread -= remhdr; -        rs->remainingfraghdr -= remhdr; -        rs->islastfrag = RPCSVC_LASTFRAG (fraghdr); - -        return dataread; -} - - -ssize_t -nfs_rpcsvc_record_read_partial_fraghdr (rpcsvc_record_state_t *rs, -                                        ssize_t dataread) -{ - -        /* In case we got less than even the remaining header size, -         * we need to consume it all and wait for remaining frag hdr -         * bytes to come in. -         */ -         rs->remainingfraghdr -= dataread; -         nfs_rpcsvc_record_update_currenthdr (rs, dataread); -         dataread = 0; -         gf_log (GF_RPCSVC, GF_LOG_TRACE, "Fragment header remaining: %d", -                 rs->remainingfraghdr); - -         return dataread; -} - - -ssize_t -nfs_rpcsvc_record_update_fraghdr (rpcsvc_record_state_t *rs, ssize_t dataread) -{ -        if ((!rs) || (dataread <= 0)) -                return -1; - -        /* Why are we even here, we're not supposed to be in the fragment -         * header processing state. -         */ -        if (!nfs_rpcsvc_record_readfraghdr(rs)) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "record state inconsistent" -                        ": request to update frag header when state is not" -                        "RPCSVC_READ_FRAGHDR"); -                return -1; -        } - -        /* Again, if header has been read then the state member above should've -         * been different, this is crazy. We should not be here. -         */ -        if (rs->remainingfraghdr == 0) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "record state inconsistent" -                        ": request to update frag header when frag header" -                        "remaining is 0."); -                return -1; -        } - -        /* We've definitely got the full header now and may be even more. */ -        if (dataread >= rs->remainingfraghdr) -                dataread = nfs_rpcsvc_record_read_complete_fraghdr (rs, -                                                                    dataread); -        else -                dataread = nfs_rpcsvc_record_read_partial_fraghdr (rs, -                                                                   dataread); - -        return dataread; -} - -ssize_t -nfs_rpcsvc_record_read_complete_frag (rpcsvc_record_state_t *rs, -                                      ssize_t dataread) -{ -        uint32_t        remfrag; - -        /* Since the frag is now complete, change the state to the next -         * one, i.e. to read the header of the next fragment. -         */ -        remfrag = rs->remainingfrag; -        rs->state = RPCSVC_READ_FRAGHDR; -        dataread -= remfrag; - -        /* This will be 0 now. */ -        rs->remainingfrag -= remfrag; - -        /* Now that the fragment is complete, we must update the -         * record size. Recall that fragsize was got from the frag -         * header. -         */ -        rs->recordsize += rs->fragsize; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Fragment remaining: %d", -                rs->remainingfrag); - -        return dataread; -} - - -ssize_t -nfs_rpcsvc_record_read_partial_frag (rpcsvc_record_state_t *rs, -                                     ssize_t dataread) -{ -        /* Just take whatever has come through the current network buffer. */ -        rs->remainingfrag -= dataread; - -        nfs_rpcsvc_record_update_currentfrag (rs, dataread); -        /* Since we know we're consuming the whole buffer from dataread -         * simply setting to 0 zero is fine. -         */ -        dataread = 0; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Fragment remaining: %d", -                rs->remainingfrag); -        return dataread; -} - - -ssize_t -nfs_rpcsvc_record_update_frag (rpcsvc_record_state_t *rs, ssize_t dataread) -{ -        if ((!rs) || (dataread <= 0)) -                return -1; - -        if (!nfs_rpcsvc_record_readfrag (rs)) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "record state inconsistent" -                        ": request to update fragment when record state is not" -                        "RPCSVC_READ_FRAG."); -                return -1; -        } - -        if (rs->remainingfrag == 0) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "record state inconsistent" -                        ": request to update fragment when there is no fragment" -                        " data remaining to be read."); -                return -1; -        } - -        /* We've read in more data than the current fragment requires. */ -        if (dataread >= rs->remainingfrag) -                dataread = nfs_rpcsvc_record_read_complete_frag (rs, dataread); -        else -                dataread = nfs_rpcsvc_record_read_partial_frag (rs, dataread); - -        return dataread; -} - - - -/* This needs to change to returning errors, since - * we need to return RPC specific error messages when some - * of the pointers below are NULL. - */ -int -__nfs_rpcsvc_program_actor (rpcsvc_request_t *req, rpcsvc_program_t **prg) -{ -        rpcsvc_program_t        *program = NULL; -        int                     ret = PROG_UNAVAIL; -        rpcsvc_actor_t          *actor = NULL; -        struct list_head        *prglist = NULL; - -        if (!req) -                return ret; - -        prglist = &((nfs_rpcsvc_request_service (req))->allprograms); -        if (list_empty (prglist)) -                goto err; - -        list_for_each_entry (program, prglist, proglist) { -                ret = PROG_UNAVAIL; -                if (req->prognum != program->prognum) -                        continue; - -                if (!program->actors) { -                        ret = SYSTEM_ERR; -                        goto err; -                } - -                ret = PROG_MISMATCH; -                if (req->progver != program->progver) -                        continue; - -                ret = PROC_UNAVAIL; -                if ((req->procnum < 0) || (req->procnum >= program->numactors)) -                        goto err; - -                actor = &program->actors[req->procnum]; -                if (!actor->actor) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC Program procedure" -                                " not defined"); -                        actor = NULL; -                        goto err; -                } else { -                        ret = SUCCESS; -                        break; -                } -        } - -        *prg = program; -err: -        switch (ret) { - -        case PROG_UNAVAIL: -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC program not available"); -                break; - -        case PROG_MISMATCH: -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC program version " -                        "not available"); -                break; - -        case PROC_UNAVAIL: -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC Program procedure" -                        " not available"); -                break; - -        case SUCCESS: -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "RPC Program found"); -                break; - -        default: -                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "System error"); -                break; -        } - -        /* If the error is not RPC_MISMATCH, we consider the call as accepted -         * since we are not handling authentication failures for now. -         */ -        req->rpc_stat = MSG_ACCEPTED; -        req->rpc_err = ret; - -        return ret; -} - -/* This needs to change to returning errors, since - * we need to return RPC specific error messages when some - * of the pointers below are NULL. - */ -rpcsvc_actor_t * -nfs_rpcsvc_program_actor (rpcsvc_request_t *req) -{ -        int                     err = SYSTEM_ERR; -        rpcsvc_actor_t          *actor = NULL; - -        if (!req) -                goto err; - -        actor = &req->program->actors[req->procnum]; -        err = SUCCESS; -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Actor found: %s - %s", -                req->program->progname, actor->procname); -err: -        if (req) -                req->rpc_err = err; - -        return actor; -} - - -rpcsvc_txbuf_t * -nfs_rpcsvc_init_txbuf (rpcsvc_conn_t *conn, struct iovec msg, struct iobuf *iob, -                       struct iobref *iobref, int txflags) -{ -        rpcsvc_txbuf_t  *txbuf = NULL; - -        txbuf = (rpcsvc_txbuf_t *) mem_get(conn->txpool); -        if (!txbuf) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get txbuf"); -                return NULL; -        } - -        memset (txbuf, 0, sizeof (*txbuf)); -        INIT_LIST_HEAD (&txbuf->txlist); -        txbuf->buf = msg; - -        /* If it was required, this iob must've been ref'd already -         *  so I dont have to bother here. -         */ -        txbuf->iob = iob; -        txbuf->iobref = iobref; -        txbuf->offset = 0; -        txbuf->txbehave = txflags; - -        return txbuf; -} - - -int -nfs_rpcsvc_conn_append_txlist (rpcsvc_conn_t *conn, struct iovec msg, -                               struct iobuf *iob, int txflags) -{ -        rpcsvc_txbuf_t          *txbuf = NULL; - -        if ((!conn) || (!msg.iov_base) || (!iob)) -                return -1; - -        txbuf = nfs_rpcsvc_init_txbuf (conn, msg, iob, NULL, txflags); -        if (!txbuf) -                return -1; - -        list_add_tail (&txbuf->txlist, &conn->txbufs); -        return 0; -} - - -void -nfs_rpcsvc_set_lastfrag (uint32_t *fragsize) { -        (*fragsize) |= 0x80000000U; -} - -void -nfs_rpcsvc_set_frag_header_size (uint32_t size, char *haddr) -{ -        size = htonl (size); -        memcpy (haddr, &size, sizeof (size)); -} - -void -nfs_rpcsvc_set_last_frag_header_size (uint32_t size, char *haddr) -{ -        nfs_rpcsvc_set_lastfrag (&size); -        nfs_rpcsvc_set_frag_header_size (size, haddr); -} - - -/* Given the RPC reply structure and the payload handed by the RPC program, - * encode the RPC record header into the buffer pointed by recordstart. - */ -struct iovec -nfs_rpcsvc_record_build_header (char *recordstart, size_t rlen, -                                struct rpc_msg reply, size_t payload) -{ -        struct iovec    replyhdr; -        struct iovec    txrecord = {0, 0}; -        size_t          fraglen = 0; -        int             ret = -1; - -        /* After leaving aside the 4 bytes for the fragment header, lets -         * encode the RPC reply structure into the buffer given to us. -         */ -        ret = nfs_rpc_reply_to_xdr (&reply,(recordstart + RPCSVC_FRAGHDR_SIZE), -                                    rlen, &replyhdr); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to create RPC reply"); -                goto err; -        } - -        fraglen = payload + replyhdr.iov_len; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Reply fraglen %zu, payload: %zu, " -                "rpc hdr: %zu", fraglen, payload, replyhdr.iov_len); - -        /* Since we're not spreading RPC records over mutiple fragments -         * we just set this fragment as the first and last fragment for this -         * record. -         */ -        nfs_rpcsvc_set_last_frag_header_size (fraglen, recordstart); - -        /* Even though the RPC record starts at recordstart+RPCSVC_FRAGHDR_SIZE -         * we need to transmit the record with the fragment header, which starts -         * at recordstart. -         */ -        txrecord.iov_base = recordstart; - -        /* Remember, this is only the vec for the RPC header and does not -         * include the payload above. We needed the payload only to calculate -         * the size of the full fragment. This size is sent in the fragment -         * header. -         */ -        txrecord.iov_len = RPCSVC_FRAGHDR_SIZE + replyhdr.iov_len; - -err: -        return txrecord; -} - - -int -nfs_rpcsvc_conn_submit (rpcsvc_conn_t *conn, struct iovec hdr, -                        struct iobuf *hdriob, struct iovec msgvec, -                        struct iobuf *msgiob) -{ -        int     ret = -1; - -        if ((!conn) || (!hdr.iov_base) || (!hdriob)) -                return -1; - -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Tx Header: %zu, payload: %zu", -                hdr.iov_len, msgvec.iov_len); -        /* Now that we have both the RPC and Program buffers in xdr format -         * lets hand it to the transmission layer. -         */ -        pthread_mutex_lock (&conn->connlock); -        { -                if (!nfs_rpcsvc_conn_check_active (conn)) { -                        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Connection inactive"); -                        goto unlock_err; -                } - -                ret = nfs_rpcsvc_conn_append_txlist (conn, hdr, hdriob, -                                                     RPCSVC_TXB_FIRST); -                if (ret == -1) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to append " -                                "header to transmission list"); -                        goto unlock_err; -                } - -                /* It is possible that this RPC reply is an error reply. In that -                 * case we might not have been handed a payload. -                 */ -                ret = 0; -                if (msgiob) -                        ret = nfs_rpcsvc_conn_append_txlist (conn, msgvec, -                                                             msgiob, -                                                             RPCSVC_TXB_LAST); -                if (ret == -1) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to append" -                                " payload to transmission list"); -                        goto unlock_err; -                } -        } -unlock_err: -        pthread_mutex_unlock (&conn->connlock); - -        if (ret == -1) -                goto err; - -        /* Tell event pool, we're interested in poll_out to trigger flush -         * of our tx buffers. -         */ -        conn->eventidx = event_select_on (conn->stage->eventpool, conn->sockfd, -                                          conn->eventidx, -1, 1); -        ret = 0; -err: - -        return ret; -} - - -int -nfs_rpcsvc_fill_reply (rpcsvc_request_t *req, struct rpc_msg *reply) -{ -        rpcsvc_program_t        *prog = NULL; -        if ((!req) || (!reply)) -                return -1; - -        prog = nfs_rpcsvc_request_program (req); -        nfs_rpc_fill_empty_reply (reply, req->xid); - -        if (req->rpc_stat == MSG_DENIED) -                nfs_rpc_fill_denied_reply (reply, req->rpc_err, req->auth_err); -        else if (req->rpc_stat == MSG_ACCEPTED) { -                if (!prog) -                        nfs_rpc_fill_accepted_reply (reply, req->rpc_err, 0, 0, -                                                     req->verf.flavour, -                                                     req->verf.datalen, -                                                     req->verf.authdata); -                else -                        nfs_rpc_fill_accepted_reply (reply, req->rpc_err, -                                                     prog->proglowvers, -                                                     prog->proghighvers, -                                                     req->verf.flavour, -                                                     req->verf.datalen, -                                                     req->verf.authdata); - -        } else -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Invalid rpc_stat value"); - -        return 0; -} - - -/* Given a request and the reply payload, build a reply and encodes the reply - * into a record header. This record header is encoded into the vector pointed - * to be recbuf. - * msgvec is the buffer that points to the payload of the RPC program. - * This buffer can be NULL, if an RPC error reply is being constructed. - * The only reason it is needed here is that in case the buffer is provided, - * we should account for the length of that buffer in the RPC fragment header. - */ -struct iobuf * -nfs_rpcsvc_record_build_record (rpcsvc_request_t *req, size_t payload, -                                struct iovec *recbuf) -{ -        struct rpc_msg          reply; -        struct iobuf            *replyiob = NULL; -        char                    *record = NULL; -        struct iovec            recordhdr = {0, }; -        size_t                  pagesize = 0; -        rpcsvc_conn_t           *conn = NULL; -        rpcsvc_t                *svc = NULL; - -        if ((!req) || (!req->conn) || (!recbuf)) -                return NULL; - -        /* First, try to get a pointer into the buffer which the RPC -         * layer can use. -         */ -        conn = req->conn; -        svc = nfs_rpcsvc_conn_rpcsvc (conn); -        replyiob = iobuf_get (svc->ctx->iobuf_pool); -        pagesize = iobpool_pagesize ((struct iobuf_pool *)svc->ctx->iobuf_pool); -        if (!replyiob) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get iobuf"); -                goto err_exit; -        } - -        record = iobuf_ptr (replyiob);  /* Now we have it. */ - -        /* Fill the rpc structure and XDR it into the buffer got above. */ -        nfs_rpcsvc_fill_reply (req, &reply); -        recordhdr = nfs_rpcsvc_record_build_header (record, pagesize, reply, -                                                    payload); -        if (!recordhdr.iov_base) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to build record " -                        " header"); -                iobuf_unref (replyiob); -                replyiob = NULL; -                recbuf->iov_base = NULL; -                goto err_exit; -        } - -        recbuf->iov_base = recordhdr.iov_base; -        recbuf->iov_len = recordhdr.iov_len; -err_exit: -        return replyiob; -} - - -/* - * The function to submit a program message to the RPC service. - * This message is added to the transmission queue of the - * conn. - * - * Program callers are not expected to use the msgvec->iov_base - * address for anything else. - * Nor are they expected to free it once this function returns. - * Once the transmission of the buffer is completed by the RPC service, - * the memory area as referenced through @msg will be unrefed. - * If a higher layer does not want anything to do with this iobuf - * after this function returns, it should call unref on it. For keeping - * it around till the transmission is actually complete, rpcsvc also refs it. - *  * - * If this function returns an error by returning -1, the - * higher layer programs should assume that a disconnection happened - * and should know that the conn memory area as well as the req structure - * has been freed internally. - * - * For now, this function assumes that a submit is always called - * to send a new record. Later, if there is a situation where different - * buffers for the same record come from different sources, then we'll - * need to change this code to account for multiple submit calls adding - * the buffers into a single record. - */ - -int -nfs_rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec msgvec, -                           struct iobuf *msg) -{ -        int                     ret = -1; -        struct iobuf            *replyiob = NULL; -        struct iovec            recordhdr = {0, }; -        rpcsvc_conn_t           *conn = NULL; -        int                     rpc_status = 0; -        int                     rpc_error = 0; - -        if ((!req) || (!req->conn)) -                return -1; - -        conn = req->conn; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Tx message: %zu", msgvec.iov_len); -        /* Build the buffer containing the encoded RPC reply. */ -        replyiob = nfs_rpcsvc_record_build_record (req, msgvec.iov_len, -                                                   &recordhdr); -        if (!replyiob) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR,"Reply record creation failed"); -                goto disconnect_exit; -        } - -        /* Must ref the iobuf got from higher layer so that the higher layer -         * can rest assured that it can unref it and leave the final freeing -         * of the buffer to us. Note msg can be NULL if an RPC-only message -         * was being sent. Happens when an RPC error reply is being sent. -         */ -        if (msg) -                iobuf_ref (msg); -        ret = nfs_rpcsvc_conn_submit (conn, recordhdr, replyiob, msgvec, msg); - -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to submit message"); -                iobuf_unref (replyiob); -        } - -disconnect_exit: -        /* Note that a unref is called everytime a reply is sent. This is in -         * response to the ref that is performed on the conn when a request is -         * handed to the RPC program. -         * -         * The catch, however, is that if the reply is an rpc error, we must -         * not unref. This is because the ref only contains -         * references for the actors to which the request was handed plus one -         * reference maintained by the RPC layer. By unrefing for a case where -         * no actor was called, we will be losing the ref held for the RPC -         * layer. -         */ - -        /* If the request succeeded and was handed to the actor, then unref the -         * conn. -         */ - -        rpc_status = req->rpc_stat; -        rpc_error = req->rpc_err; -        /* Must mem_put req back to rxpool before the possibility of destroying -         * conn in conn_unref, where the rxpool itself is destroyed. -         */ -        mem_put (conn->rxpool, req); -        if ((rpc_status == MSG_ACCEPTED) && (rpc_error == SUCCESS)) -                nfs_rpcsvc_conn_unref (conn); - -        return ret; -} - - -int -nfs_rpcsvc_request_attach_vector (rpcsvc_request_t *req, struct iovec msgvec, -                                  struct iobuf *iob, struct iobref *iobref, -                                  int finalvector) -{ -        rpcsvc_txbuf_t          *txb = NULL; -        int                     txflags = 0; - -        if ((!req) || (!msgvec.iov_base)) -                return -1; - -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Tx Vector: %zu", msgvec.iov_len); -        if (finalvector) -                txflags |= RPCSVC_TXB_LAST; -        /* We only let the user decide whether this is the last vector for the -         * record, since the first vector is always the RPC header. -         */ -        txb = nfs_rpcsvc_init_txbuf (req->conn, msgvec, iob, iobref, txflags); -        if (!txb) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not init tx buf"); -                return -1; -        } - -        req->payloadsize += msgvec.iov_len; -        if (iob) -                iobuf_ref (iob); -        if (iobref) -                iobref_ref (iobref); -        list_add_tail (&txb->txlist, &req->txlist); - -        return 0; -} - - -int -nfs_rpcsvc_request_attach_vectors (rpcsvc_request_t *req, struct iovec *payload, -                                   int vcount, struct iobref *piobref) -{ -        int     c = 0; -        int     ret = -1; - -        for (;c < (vcount-1); c++) { -                ret = nfs_rpcsvc_request_attach_vector (req, payload[c], NULL, -                                                        piobref, 0); -                if (ret < 0) { -                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to attach " -                                "vector"); -                        goto out; -                } -        } - -        ret = nfs_rpcsvc_request_attach_vector (req, payload[vcount-1], NULL, -                                                piobref, 1); -        if (ret < 0) -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to attach final vec"); - -out: -	return ret; -} - - -int -nfs_rpcsvc_submit_vectors (rpcsvc_request_t *req) -{ -        int                     ret = -1; -        struct iobuf            *replyiob = NULL; -        struct iovec            recordhdr = {0, }; -        rpcsvc_txbuf_t          *rpctxb = NULL; -        rpcsvc_conn_t           *conn = NULL; - -        if ((!req) || (!req->conn)) -                return -1; - -        /* Build the buffer containing the encoded RPC reply. */ -        replyiob = nfs_rpcsvc_record_build_record (req, req->payloadsize, -                                                   &recordhdr); -        if (!replyiob) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR,"Reply record creation failed"); -                goto disconnect_exit; -        } - -        rpctxb = nfs_rpcsvc_init_txbuf (req->conn, recordhdr, replyiob, NULL, -                                        RPCSVC_TXB_FIRST); -        if (!rpctxb) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to create tx buf"); -                goto disconnect_exit; -        } - -        pthread_mutex_lock (&req->conn->connlock); -        { -                list_add_tail (&rpctxb->txlist, &req->conn->txbufs); -                list_append_init (&req->txlist, &req->conn->txbufs); -        } -        pthread_mutex_unlock (&req->conn->connlock); - -        ret = 0; -        req->conn->eventidx = event_select_on (req->conn->stage->eventpool, -                                               req->conn->sockfd, -                                               req->conn->eventidx, -1, 1); -disconnect_exit: -        /* Note that a unref is called everytime a reply is sent. This is in -         * response to the ref that is performed on the conn when a request is -         * handed to the RPC program. -         */ -        conn = req->conn; -        /* Must mem_put req back to rxpool before the possibility of destroying -         * conn in conn_unref, where the rxpool itself is destroyed. -         */ -        mem_put (conn->rxpool, req); - -        nfs_rpcsvc_conn_unref (conn); -        if (ret == -1) -                iobuf_unref (replyiob); - -        return ret; -} - - -int -nfs_rpcsvc_error_reply (rpcsvc_request_t *req) -{ -        struct iovec    dummyvec = {0, }; - -        if (!req) -                return -1; - -        /* At this point the req should already have been filled with the -         * appropriate RPC error numbers. -         */ -        return nfs_rpcsvc_submit_generic (req, dummyvec, NULL); -} - - -rpcsvc_request_t * -nfs_rpcsvc_request_init (rpcsvc_conn_t *conn, struct rpc_msg *callmsg, -                         struct iovec progmsg, rpcsvc_request_t *req) -{ -        if ((!conn) || (!callmsg)|| (!req)) -                return NULL; - - -        /* We start a RPC request as always denied. */ -        req->rpc_stat = MSG_DENIED; -        req->xid = nfs_rpc_call_xid (callmsg); -        req->prognum = nfs_rpc_call_program (callmsg); -        req->progver = nfs_rpc_call_progver (callmsg); -        req->procnum = nfs_rpc_call_progproc (callmsg); -        req->conn = conn; -        req->msg = progmsg; -        req->recordiob = conn->rstate.activeiob; -        INIT_LIST_HEAD (&req->txlist); -        req->payloadsize = 0; - -        /* By this time, the data bytes for the auth scheme would have already -         * been copied into the required sections of the req structure, -         * we just need to fill in the meta-data about it now. -         */ -        req->cred.flavour = nfs_rpc_call_cred_flavour (callmsg); -        req->cred.datalen = nfs_rpc_call_cred_len (callmsg); -        req->verf.flavour = nfs_rpc_call_verf_flavour (callmsg); -        req->verf.datalen = nfs_rpc_call_verf_len (callmsg); - -        /* AUTH */ -        nfs_rpcsvc_auth_request_init (req); -        return req; -} - - -rpcsvc_request_t * -nfs_rpcsvc_request_create (rpcsvc_conn_t *conn) -{ -        char                    *msgbuf = NULL; -        struct rpc_msg          rpcmsg; -        struct iovec            progmsg;        /* RPC Program payload */ -        rpcsvc_request_t        *req = NULL; -        int                     ret = -1; -        rpcsvc_program_t        *program = NULL; - -        if (!conn) -                return NULL; - -        /* We need to allocate the request before actually calling -         * rpcsvc_request_init on the request so that we, can fill the auth -         * data directly into the request structure from the message iobuf. -         * This avoids a need to keep a temp buffer into which the auth data -         * would've been copied otherwise. -         */ -        nfs_rpcsvc_alloc_request (conn, req); -        if (!req) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to alloc request"); -                goto err; -        } - -        msgbuf = iobuf_ptr (conn->rstate.activeiob); -        ret = nfs_xdr_to_rpc_call (msgbuf, conn->rstate.recordsize, &rpcmsg, -                                   &progmsg, req->cred.authdata, -                                   req->verf.authdata); - -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC call decoding failed"); -                nfs_rpcsvc_request_seterr (req, GARBAGE_ARGS); -                req->conn = conn; -                goto err; -        } - -        ret = -1; -        nfs_rpcsvc_request_init (conn, &rpcmsg, progmsg, req); - -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC XID: %lx, Ver: %ld, Program: %ld," -                " ProgVers: %ld, Proc: %ld", nfs_rpc_call_xid (&rpcmsg), -                nfs_rpc_call_rpcvers (&rpcmsg), nfs_rpc_call_program (&rpcmsg), -                nfs_rpc_call_progver (&rpcmsg), -                nfs_rpc_call_progproc (&rpcmsg)); - -        if (nfs_rpc_call_rpcvers (&rpcmsg) != 2) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC version not supported"); -                nfs_rpcsvc_request_seterr (req, RPC_MISMATCH); -                goto err; -        } - -        ret = __nfs_rpcsvc_program_actor (req, &program); -        if (ret != SUCCESS) { -                ret = -1; -                goto err; -        } - -        req->program = program; -        ret = nfs_rpcsvc_authenticate (req); -        if (ret == RPCSVC_AUTH_REJECT) { -                /* No need to set auth_err, that is the responsibility of -                 * the authentication handler since only that know what exact -                 * error happened. -                 */ -                nfs_rpcsvc_request_seterr (req, AUTH_ERROR); -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed authentication"); -                ret = -1; -                goto err; -        } - -        ret = 0; -err: -        if (ret == -1) { -                ret = nfs_rpcsvc_error_reply (req); -                req = NULL; -        } - -        return req; -} - - -int -nfs_rpcsvc_handle_rpc_call (rpcsvc_conn_t *conn) -{ -        rpcsvc_actor_t          *actor = NULL; -        rpcsvc_request_t        *req = NULL; -        int                     ret = -1; - -        if (!conn) -                return -1; - -        req = nfs_rpcsvc_request_create (conn); -        if (!req) -                goto err; - -        if (!nfs_rpcsvc_request_accepted (req)) -                goto err_reply; - -        actor = nfs_rpcsvc_program_actor (req); -        if (!actor) -                goto err_reply; - -        if ((actor) && (actor->actor)) { -                THIS = nfs_rpcsvc_request_actorxl (req); -                nfs_rpcsvc_conn_ref (conn); -                ret = actor->actor (req); -        } - -err_reply: -        if (ret == RPCSVC_ACTOR_ERROR) -                ret = nfs_rpcsvc_error_reply (req); -        else if (ret == RPCSVC_ACTOR_IGNORE) -                mem_put (conn->rxpool, req); - -        /* No need to propagate error beyond this function since the reply -         * has now been queued. */ -        ret = 0; -err: -        return ret; -} - -#define nfs_rpc_call_cred_addr(rs) (iobuf_ptr ((rs)->activeiob) + RPCSVC_BARERPC_MSGSZ - 4) - -uint32_t -nfs_rpcsvc_call_credlen (rpcsvc_record_state_t *rs) -{ -        char                    *credaddr = NULL; -        uint32_t                credlen_nw = 0; -        uint32_t                credlen_host = 0; - -        /* Position to the start of the credential length field. */ -        credaddr = nfs_rpc_call_cred_addr (rs); -        credlen_nw = *(uint32_t *)credaddr; -        credlen_host = ntohl (credlen_nw); - -        return credlen_host; -} - -uint32_t -nfs_rpcsvc_call_verflen (rpcsvc_record_state_t *rs) -{ -        char            *verfaddr = NULL; -        uint32_t        verflen_nw = 0; -        uint32_t        verflen_host = 0; -        uint32_t        credlen = 0; - -        /* Position to the start of the verifier length field. */ -        credlen = nfs_rpcsvc_call_credlen (rs); -        verfaddr = (nfs_rpc_call_cred_addr (rs) + 4 + credlen); -        verflen_nw = *(uint32_t *)verfaddr; -        verflen_host = ntohl (verflen_nw); - -        return verflen_host; -} - - -void -nfs_rpcsvc_update_vectored_verf (rpcsvc_record_state_t *rs) -{ -        if (!rs) -                return; - -        rs->recordsize += nfs_rpcsvc_call_verflen (rs); -        return; -} - - -void -nfs_rpcsvc_handle_vectored_prep_rpc_call (rpcsvc_conn_t *conn) -{ -        rpcsvc_actor_t          *actor = NULL; -        rpcsvc_request_t        *req = NULL; -        rpcsvc_record_state_t   *rs = NULL; -        rpcsvc_t                *svc = NULL; -        int                     ret = -1; -        ssize_t                 remfrag = RPCSVC_ACTOR_ERROR; -        int                     newbuf = 0; - -        if (!conn) -                return; - -        rs = &conn->rstate; - -        /* In case one of the steps below fails, we need to make sure that the -         * remaining frag in the kernel's buffers are read-out so that the -         * requests that follow can be served. -         */ -        rs->remainingfrag = rs->fragsize - rs->recordsize; -        rs->vecstate = RPCSVC_VECTOR_IGNORE; -        req = nfs_rpcsvc_request_create (conn); -        svc = nfs_rpcsvc_conn_rpcsvc (conn); -        if (!req) -                goto err; - -        if (!nfs_rpcsvc_request_accepted (req)) -                goto err_reply; - -        actor = nfs_rpcsvc_program_actor (req); -        if (!actor) -                goto err_reply; - -        if (!actor->vector_sizer) { -                ret = -1; -                nfs_rpcsvc_request_seterr (req, PROC_UNAVAIL); -                goto err_reply; -        } - -        nfs_rpcsvc_conn_ref (conn); -        THIS = nfs_rpcsvc_request_actorxl (req); -        ret = actor->vector_sizer (req, &remfrag, &newbuf); -        nfs_rpcsvc_conn_unref (conn); - -        if (ret == RPCSVC_ACTOR_ERROR) { -                ret = -1; -                nfs_rpcsvc_request_seterr (req, SYSTEM_ERR); -                goto err_reply; -        } - -        rs->remainingfrag = remfrag; -        rs->vecstate = RPCSVC_VECTOR_READPROCHDR; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC proc header remaining:" -                " %d", rs->remainingfrag); -        conn->vectoredreq = req; - -        /* Store the reference to the current frag pointer. This is where the -         * proc header will be read into. -         */ -        req->msg.iov_base = rs->fragcurrent; -        req->msg.iov_len = rs->remainingfrag; -        ret = 0; - -err_reply: -        if (ret == -1) -                ret = nfs_rpcsvc_error_reply (req); - -        /* No need to propagate error beyond this function since the reply -         * has now been queued. */ -        ret = 0; -err: -        return; -} - - -void -nfs_rpcsvc_update_vectored_verfsz (rpcsvc_conn_t *conn) -{ -        rpcsvc_record_state_t   *rs = NULL; -        uint32_t                verflen = 0; - -        if (!conn) -                return; - -        rs = &conn->rstate; - -        verflen = nfs_rpcsvc_call_verflen (rs); -        rs->recordsize += 8; -        if (verflen > 0) { -                rs->remainingfrag = verflen; -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC verf remaining: " -                        " %d", rs->remainingfrag); -                rs->vecstate = RPCSVC_VECTOR_READVERF; -        } else { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC preparing call"); -                nfs_rpcsvc_handle_vectored_prep_rpc_call (conn); -        } - -        return; -} - - -void -nfs_rpcsvc_update_vectored_cred (rpcsvc_record_state_t *rs) -{ -        uint32_t                credlen = 0; - -        if (!rs) -                return; - -        credlen = nfs_rpcsvc_call_credlen (rs); -        /* Update remainingfrag to read the 8 bytes needed for -         * reading verf flavour and verf len. -         */ -        rs->remainingfrag = (2 * sizeof (uint32_t)); -        rs->vecstate = RPCSVC_VECTOR_READVERFSZ; -        rs->recordsize += credlen; -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC verfsz remaining: %d", -                rs->remainingfrag); - -        return; -} - -void -nfs_rpcsvc_update_vectored_barerpc (rpcsvc_record_state_t *rs) -{ -        uint32_t                credlen = 0; - -        if (!rs) -                return; - -        credlen = nfs_rpcsvc_call_credlen (rs); -        rs->recordsize = RPCSVC_BARERPC_MSGSZ; -        if (credlen == 0) { -                rs->remainingfrag = 8; -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC verfsz remaining" -                        ": %d", rs->remainingfrag); -                rs->vecstate = RPCSVC_VECTOR_READVERFSZ; -        } else { -                rs->remainingfrag = credlen; -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC cred remaining: " -                        "%d", rs->remainingfrag); -                rs->vecstate = RPCSVC_VECTOR_READCRED; -        } - -        return; -} - - -void -nfs_rpcsvc_handle_vectored_rpc_call (rpcsvc_conn_t *conn) -{ -        rpcsvc_actor_t          *actor = NULL; -        rpcsvc_request_t        *req = NULL; -        rpcsvc_record_state_t   *rs = NULL; -        rpcsvc_t                *svc = NULL; -        int                     ret = -1; -        ssize_t                 remfrag = -1; -        int                     newbuf = 0; - -        if (!conn) -                return; - -        rs = &conn->rstate; - -        req = conn->vectoredreq; -        svc = nfs_rpcsvc_conn_rpcsvc (conn); - -        if (!req) -                goto err; - -        actor = nfs_rpcsvc_program_actor (req); -        if (!actor) -                goto err_reply; - -        if (!actor->vector_sizer) { -                ret = -1; -                nfs_rpcsvc_request_seterr (req, PROC_UNAVAIL); -                goto err_reply; -        } - -        req->msg.iov_len = (unsigned long)((long)rs->fragcurrent - (long)req->msg.iov_base); -        nfs_rpcsvc_conn_ref (conn); -        THIS = nfs_rpcsvc_request_actorxl (req); -        ret = actor->vector_sizer (req, &remfrag, &newbuf); -        nfs_rpcsvc_conn_unref (conn); -        if (ret == RPCSVC_ACTOR_ERROR) { -                ret = -1; -                nfs_rpcsvc_request_seterr (req, SYSTEM_ERR); -                goto err_reply; -        } - -        if (newbuf) { -                rs->vectoriob = iobuf_get (svc->ctx->iobuf_pool); -                rs->fragcurrent = iobuf_ptr (rs->vectoriob); -                rs->vecstate = RPCSVC_VECTOR_READVEC; -                rs->remainingfrag = remfrag; -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC buf remaining:" -                        " %d", rs->remainingfrag); -        } else { -                rs->remainingfrag = remfrag; -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC proc remaining:" -                        " %d", rs->remainingfrag); -        } - -        ret = 0; -err_reply: -        if (ret == -1) -                ret = nfs_rpcsvc_error_reply (req); - -        /* No need to propagate error beyond this function since the reply -         * has now been queued. */ -        ret = 0; -err: -        return; -} - - - -void -nfs_rpcsvc_record_vectored_call_actor (rpcsvc_conn_t *conn) -{ -        rpcsvc_actor_t          *actor = NULL; -        rpcsvc_request_t        *req = NULL; -        rpcsvc_record_state_t   *rs = NULL; -        rpcsvc_t                *svc = NULL; -        int                     ret = -1; - -        if (!conn) -                return; - -        rs = &conn->rstate; -        req = conn->vectoredreq; -        svc = nfs_rpcsvc_conn_rpcsvc (conn); - -        if (!req) -                goto err; - -        actor = nfs_rpcsvc_program_actor (req); -        if (!actor) -                goto err_reply; - -        if (actor->vector_actor) { -                nfs_rpcsvc_conn_ref (conn); -                THIS = nfs_rpcsvc_request_actorxl (req); -                ret = actor->vector_actor (req, rs->vectoriob); -        } else { -                nfs_rpcsvc_request_seterr (req, PROC_UNAVAIL); -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "No vectored handler present"); -                ret = RPCSVC_ACTOR_ERROR; -        } - -err_reply: -        if (ret == RPCSVC_ACTOR_ERROR) -                ret = nfs_rpcsvc_error_reply (req); -        else if (ret == RPCSVC_ACTOR_IGNORE) -                mem_put (conn->rxpool, req); - -        /* No need to propagate error beyond this function since the reply -         * has now been queued. */ -        ret = 0; -err: -        return; -} - - - -ssize_t -nfs_rpcsvc_update_vectored_state (rpcsvc_conn_t *conn) -{ -        rpcsvc_record_state_t   *rs = NULL; -        rpcsvc_t                *svc = NULL; - -        if (!conn) -                return 0; - -        /* At this point, we can be confident that the activeiob contains -         * exactly the first RPCSVC_BARERPC_MSGSZ bytes needed in order to -         * determine the program and actor. So the next state will be -         * to read the credentials. -         * -         * But first, try to determine how many more bytes do we need from the -         * network to complete the RPC message including the credentials. -         */ - -        rs = &conn->rstate; -        if (nfs_rpcsvc_record_vectored_baremsg (rs)) -                nfs_rpcsvc_update_vectored_barerpc (rs); -        else if (nfs_rpcsvc_record_vectored_cred (rs)) -                nfs_rpcsvc_update_vectored_cred (rs); -        else if (nfs_rpcsvc_record_vectored_verfsz (rs)) -                nfs_rpcsvc_update_vectored_verfsz (conn); -        else if (nfs_rpcsvc_record_vectored_verfread (rs)) { -                nfs_rpcsvc_update_vectored_verf (rs); -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC preparing call"); -                nfs_rpcsvc_handle_vectored_prep_rpc_call (conn); -        } else if (nfs_rpcsvc_record_vectored_readprochdr (rs)) -                nfs_rpcsvc_handle_vectored_rpc_call (conn); -        else if (nfs_rpcsvc_record_vectored_ignore (rs)) { -                svc = nfs_rpcsvc_conn_rpcsvc (conn); -                nfs_rpcsvc_record_init (rs, svc->ctx->iobuf_pool); -        } else if (nfs_rpcsvc_record_vectored_readvec (rs)) { -                svc = nfs_rpcsvc_conn_rpcsvc (conn); -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored RPC vector read"); -                nfs_rpcsvc_record_vectored_call_actor (conn); -                nfs_rpcsvc_record_init (rs, svc->ctx->iobuf_pool); -        } - -        return 0; -} - - -ssize_t -nfs_rpcsvc_record_read_partial_frag (rpcsvc_record_state_t *rs, -                                     ssize_t dataread); - -ssize_t -nfs_rpcsvc_update_vectored_msg (rpcsvc_conn_t *conn, ssize_t dataread) -{ - -        if (!conn) -                return dataread; - -        /* find out how much of the bare msg is pending and set that up to be -         * read into the updated fragcurrent along with the updated size into -         * remainingfrag. -         */ - - -        /* Incidently, the logic needed here is similar to a regular partial -         * fragment read since we've already set the remainingfrag member in -         * rstate to be RPCSVC_BARERPC_MSGSZ for the purpose of a vectored -         * fragment. -         */ -        return nfs_rpcsvc_record_read_partial_frag (&conn->rstate, dataread); -} - -/* FIX: As a first version of vectored reading, I am assuming dataread will - * always be equal to RPCSVC_BARERPC_MSGSZ for the sake of simplicity on the - * belief that we're never actually reading more bytes than needed in each - * poll_in. - */ -ssize_t -nfs_rpcsvc_handle_vectored_frag (rpcsvc_conn_t *conn, ssize_t dataread) -{ -        if (!conn) -                return dataread; - -        /* At this point we can be confident that only the frag size has been -         * read from the network. Now it is up to us to have the remaining RPC -         * fields given to us here. -         */ - -        /* Since the poll_in handler uses the remainingfrag field to determine -         * how much to read from the network, we'll hack this scheme to tell -         * the poll_in to read at most RPCSVC_BARERPC_MSGSZ bytes. This is done -         * to, as a first step, identify which (program, actor) we need to call. -         */ - -        dataread = nfs_rpcsvc_update_vectored_msg (conn, dataread); - -        if (conn->rstate.remainingfrag == 0) { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored frag complete"); -                dataread = nfs_rpcsvc_update_vectored_state (conn); -        } - -        return dataread; -} - - -int -nfs_rpcsvc_record_update_state (rpcsvc_conn_t *conn, ssize_t dataread) -{ -        rpcsvc_record_state_t   *rs = NULL; -        rpcsvc_t                *svc = NULL; - -        if (!conn) -                return -1; - -        rs = &conn->rstate; -        /* At entry into this function, fragcurrent will be pointing to the\ -         * start of the area into which dataread number of bytes were read. -         */ - -        if (nfs_rpcsvc_record_readfraghdr(rs)) -                dataread = nfs_rpcsvc_record_update_fraghdr (rs, dataread); - -        if (nfs_rpcsvc_record_readfrag(rs)) { -                /* The minimum needed for triggering the vectored handler is -                 * the frag size field. The fragsize member remains set to this -                 * size till this request is completely extracted from the -                 * network. Once all the data has been read from the network, -                 * the request structure would've been created. The point being -                 * that even if it takes multiple calls to network IO for -                 * getting the vectored fragment, we can continue to use this -                 * condition as the flag to tell us that this is a vectored -                 * fragment. -                 */ -                if ((dataread > 0) && (nfs_rpcsvc_record_vectored (rs))) { -                        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Vectored frag"); -                        dataread = nfs_rpcsvc_handle_vectored_frag (conn, -                                                                    dataread); -                } else if (dataread > 0) { -                        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Regular frag"); -                        dataread = nfs_rpcsvc_record_update_frag (rs, dataread); -                } -        } - -        /* This should not happen. We are never reading more than the current -         * fragment needs. Something is seriously wrong. -         */ -        if (dataread > 0) { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Data Left: %zd", dataread); -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Unwanted data read from " -                        " connection."); -        } - -        /* If we're now supposed to wait for a new fragment header and if the -         * fragment that we just completed in the previous call to -         * rpcsvc_record_update_frag was the last fragment for the current -         * RPC record, then, it is time to perform the translation from -         * XDR formatted buffer in activeiob followed by the upcall to the -         * protocol actor. -         */ -        if ((nfs_rpcsvc_record_readfraghdr(rs)) && (rs->islastfrag)) { -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "Full Record Received."); -                nfs_rpcsvc_handle_rpc_call (conn); -                svc = nfs_rpcsvc_conn_rpcsvc (conn); -                nfs_rpcsvc_record_init (rs, svc->ctx->iobuf_pool); -        } - -        return 0; -} - - -char * -nfs_rpcsvc_record_read_addr (rpcsvc_record_state_t *rs) -{ - -        if (nfs_rpcsvc_record_readfraghdr (rs)) -                return nfs_rpcsvc_record_currenthdr_addr (rs); -        else if (nfs_rpcsvc_record_readfrag (rs)) -                return nfs_rpcsvc_record_currentfrag_addr (rs); - -        return NULL; -} - - -int -nfs_rpcsvc_conn_data_poll_in (rpcsvc_conn_t *conn) -{ -        ssize_t         dataread = -1; -        size_t          readsize = 0; -        char            *readaddr = NULL; -        int             ret = -1; - -        readaddr = nfs_rpcsvc_record_read_addr (&conn->rstate); -        if (!readaddr) -                goto err; - -        readsize = nfs_rpcsvc_record_read_size (&conn->rstate); -        if (readsize == -1) -                goto err; - -        dataread = nfs_rpcsvc_socket_read (conn->sockfd, readaddr, readsize); -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "conn: 0x%lx, readsize: %zu, dataread:" -                "%zd", (long)conn, readsize, dataread); - -        if (dataread > 0) -                ret = nfs_rpcsvc_record_update_state (conn, dataread); - -err: -        return ret; -} - - -int -nfs_rpcsvc_conn_data_poll_err (rpcsvc_conn_t *conn) -{ -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Received error event"); -        nfs_rpcsvc_conn_deinit (conn); -        return 0; -} - - -int -__nfs_rpcsvc_conn_data_poll_out (rpcsvc_conn_t *conn) -{ -        rpcsvc_txbuf_t          *txbuf = NULL; -        rpcsvc_txbuf_t          *tmp = NULL; -        ssize_t                 written = -1; -        char                    *writeaddr = NULL; -        size_t                  writesize = -1; -        int                     eagain = 0; - -        if (!conn) -                return -1; - -        /* Attempt transmission of each of the pending buffers */ -        list_for_each_entry_safe (txbuf, tmp, &conn->txbufs, txlist) { -tx_remaining: -                eagain = 0; -                writeaddr = (char *)(txbuf->buf.iov_base + txbuf->offset); -                writesize = (txbuf->buf.iov_len - txbuf->offset); - -                if (txbuf->txbehave & RPCSVC_TXB_FIRST) { -                        gf_log (GF_RPCSVC, GF_LOG_TRACE, "First Tx Buf"); -                        nfs_rpcsvc_socket_block_tx (conn->sockfd); -                } - -                written = nfs_rpcsvc_socket_write (conn->sockfd, writeaddr, -                                                   writesize, &eagain); -                if (txbuf->txbehave & RPCSVC_TXB_LAST) { -                        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Last Tx Buf"); -                        nfs_rpcsvc_socket_unblock_tx (conn->sockfd); -                } -                gf_log (GF_RPCSVC, GF_LOG_TRACE, "conn: 0x%lx, Tx request: %zu," -                        " Tx sent: %zd", (long)conn, writesize, written); - -                /* There was an error transmitting this buffer */ -                if (written == -1) -                        break; - -                if (written >= 0) -                        txbuf->offset += written; - -                /* If the current buffer has been completely transmitted, -                 * delete it from the list and move on to the next buffer. -                 */ -                if (txbuf->offset == txbuf->buf.iov_len) { -                        /* It doesnt matter who ref'ed this iobuf, rpcsvc for -                         * its own header or a RPC program. -                         */ -                        if (txbuf->iob) -                                iobuf_unref (txbuf->iob); -                        if (txbuf->iobref) -                                iobref_unref (txbuf->iobref); - -                        list_del (&txbuf->txlist); -                        mem_put (conn->txpool, txbuf); -                } else { -                        /* If the current buffer is incompletely tx'd, do not -                         * go to the head of the loop, since that moves us to -                         * the next buffer. -                         * -                         * BUT, if the current transmission exited due to EAGAIN -                         * we need to leave the buffers where they are and come -                         * back later for retransmission. -                         */ -                        if (!eagain) -                                goto tx_remaining; -                        else -                                break; -                } - -        } - -        /* If we've broken out of the loop above then we must unblock -         * the transmission now. -         */ -        nfs_rpcsvc_socket_unblock_tx (conn->sockfd); -        if (list_empty (&conn->txbufs)) -                conn->eventidx = event_select_on (conn->stage->eventpool, -                                                  conn->sockfd, conn->eventidx, -                                                  -1, 0); - -        return 0; -} - - -int -nfs_rpcsvc_conn_data_poll_out (rpcsvc_conn_t *conn) -{ -        if (!conn) -                return -1; - - -        pthread_mutex_lock (&conn->connlock); -        { -                __nfs_rpcsvc_conn_data_poll_out (conn); -        } -        pthread_mutex_unlock (&conn->connlock); - -        return 0; -} - - -int -nfs_rpcsvc_conn_data_handler (int fd, int idx, void *data, int poll_in, -                              int poll_out, int poll_err) -{ -        rpcsvc_conn_t   *conn = NULL; -        int             ret = 0; - -        if (!data) -                return 0; - -        conn = (rpcsvc_conn_t *)data; - -        if (poll_out) -                ret = nfs_rpcsvc_conn_data_poll_out (conn); - -        if (poll_err) { -                ret = nfs_rpcsvc_conn_data_poll_err (conn); -                return 0; -        } - -        if (poll_in) { -                ret = 0; -                ret = nfs_rpcsvc_conn_data_poll_in (conn); -        } - -        if (ret == -1) -                nfs_rpcsvc_conn_data_poll_err (conn); - -        return 0; -} - - -int -nfs_rpcsvc_conn_listening_handler (int fd, int idx, void *data, int poll_in, -                                   int poll_out, int poll_err) -{ -        rpcsvc_conn_t           *newconn = NULL; -        rpcsvc_stage_t          *selectedstage = NULL; -        int                     ret = -1; -        rpcsvc_conn_t           *conn = NULL; -        rpcsvc_t                *svc = NULL; - -        if (!poll_in) -                return 0; - -        conn = (rpcsvc_conn_t *)data; -        svc = nfs_rpcsvc_conn_rpcsvc (conn); -        newconn = nfs_rpcsvc_conn_accept_init (svc, fd); -        if (!newconn) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "failed to accept connection"); -                goto err; -        } - -        selectedstage = nfs_rpcsvc_select_stage (svc); -        if (!selectedstage) -                goto close_err; - -        /* Now that we've accepted the connection, we need to associate -         * its events to a stage. -         */ -        ret = nfs_rpcsvc_stage_conn_associate (selectedstage, newconn, -                                               nfs_rpcsvc_conn_data_handler, -                                               newconn); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "could not associated stage " -                        " with new connection"); -                goto close_err; -        } -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New Connection"); -        ret = 0; -close_err: -        if (ret == -1) -                nfs_rpcsvc_conn_unref (newconn); - -err: -        return ret; -} - - -/* Register the program with the local portmapper service. */ -int -nfs_rpcsvc_program_register_portmap (rpcsvc_t *svc, rpcsvc_program_t *newprog) -{ -        if (!newprog) -                return -1; - -        if (!svc->register_portmap) -                return 0; - -        if (!(pmap_set(newprog->prognum, newprog->progver, IPPROTO_TCP, -                       newprog->progport))) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not register with" -                        " portmap"); -                return -1; -        } - -        return 0; -} - - -int -nfs_rpcsvc_program_unregister_portmap (rpcsvc_t *svc, rpcsvc_program_t *prog) -{ -        if (!prog) -                return -1; - -        if (!svc->register_portmap) -                return 0; - -        if (!(pmap_unset(prog->prognum, prog->progver))) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not unregister with" -                        " portmap"); -                return -1; -        } - -        return 0; -} - - -int -nfs_rpcsvc_stage_program_register (rpcsvc_stage_t *stg, -                                   rpcsvc_program_t *newprog) -{ -        rpcsvc_conn_t           *newconn = NULL; -        rpcsvc_t                *svc = NULL; - -        if ((!stg) || (!newprog)) -                return -1; - -        svc = nfs_rpcsvc_stage_service (stg); -        /* Create a listening socket */ -        newconn = nfs_rpcsvc_conn_listen_init (svc, newprog); -        if (!newconn) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "could not create listening" -                        " connection"); -                return -1; -        } - -        if ((nfs_rpcsvc_stage_conn_associate (stg, newconn, -                                              nfs_rpcsvc_conn_listening_handler, -                                              newconn)) == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR,"could not associate stage with" -                        " listening connection"); -                return -1; -        } - -        return 0; -} - - -int -nfs_rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t program) -{ -        rpcsvc_program_t        *newprog = NULL; -        rpcsvc_stage_t          *selectedstage = NULL; -        int                     ret = -1; - -        if (!svc) -                return -1; - -        newprog = GF_CALLOC (1, sizeof(*newprog),gf_common_mt_rpcsvc_program_t); -        if (!newprog) -                return -1; - -        if (!program.actors) -                goto free_prog; - -        memcpy (newprog, &program, sizeof (program)); -        INIT_LIST_HEAD (&newprog->proglist); -        list_add_tail (&newprog->proglist, &svc->allprograms); -        selectedstage = nfs_rpcsvc_select_stage (svc); - -        ret = nfs_rpcsvc_stage_program_register (selectedstage, newprog); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "stage registration of program" -                        " failed"); -                goto free_prog; -        } - -        ret = nfs_rpcsvc_program_register_portmap (svc, newprog); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "portmap registration of" -                        " program failed"); -                goto free_prog; -        } - -        ret = 0; -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New program registered: %s, Num: %d," -                " Ver: %d, Port: %d", newprog->progname, newprog->prognum, -                newprog->progver, newprog->progport); - -free_prog: -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Program registration failed:" -                        " %s, Num: %d, Ver: %d, Port: %d", newprog->progname, -                        newprog->prognum, newprog->progver, newprog->progport); -                list_del (&newprog->proglist); -                GF_FREE (newprog); -        } - -        return ret; -} - -/* The only difference between the generic submit and this one is that the - * generic submit is also used for submitting RPC error replies in where there - * are no payloads so the msgvec and msgbuf can be NULL. - * Since RPC programs should be using this function along with their payloads - * we must perform NULL checks before calling the generic submit. - */ -int -nfs_rpcsvc_submit_message (rpcsvc_request_t *req, struct iovec msgvec, -                           struct iobuf *msg) -{ -        if ((!req) || (!req->conn) || (!msg) || (!msgvec.iov_base)) -                return -1; - -        return nfs_rpcsvc_submit_generic (req, msgvec, msg); -} - - -int -nfs_rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t prog) -{ -        int                     ret = -1; - -        if (!svc) -                return -1; - -        /* TODO: De-init the listening connection for this program. */ -        ret = nfs_rpcsvc_program_unregister_portmap (svc, &prog); -        if (ret == -1) { -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "portmap unregistration of" -                        " program failed"); -                goto err; -        } - -        ret = 0; -        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Program unregistered: %s, Num: %d," -                " Ver: %d, Port: %d", prog.progname, prog.prognum, -                prog.progver, prog.progport); - -err: -        if (ret == -1) -                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Program unregistration failed" -                        ": %s, Num: %d, Ver: %d, Port: %d", prog.progname, -                        prog.prognum, prog.progver, prog.progport); - -        return ret; -} - - -int -nfs_rpcsvc_conn_peername (rpcsvc_conn_t *conn, char *hostname, int hostlen) -{ -        if (!conn) -                return -1; - -        return nfs_rpcsvc_socket_peername (conn->sockfd, hostname, hostlen); -} - - -int -nfs_rpcsvc_conn_peeraddr (rpcsvc_conn_t *conn, char *addrstr, int addrlen, -                          struct sockaddr *sa, socklen_t sasize) -{ -        if (!conn) -                return -1; - -        return nfs_rpcsvc_socket_peeraddr (conn->sockfd, addrstr, addrlen, sa, -                                           sasize); -} - diff --git a/xlators/nfs/lib/src/rpcsvc.h b/xlators/nfs/lib/src/rpcsvc.h deleted file mode 100644 index 4e7c8184547..00000000000 --- a/xlators/nfs/lib/src/rpcsvc.h +++ /dev/null @@ -1,728 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _NFS_RPCSVC_H -#define _NFS_RPCSVC_H - - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "event.h" -#include "logging.h" -#include "dict.h" -#include "mem-pool.h" -#include "list.h" -#include "iobuf.h" -#include "xdr-rpc.h" -#include "glusterfs.h" -#include "xlator.h" - -#include <pthread.h> -#include <sys/uio.h> - -#ifdef GF_DARWIN_HOST_OS -#include <nfs/rpcv2.h> -#define NGRPS RPCAUTH_UNIXGIDS -#endif - -#define GF_RPCSVC       "nfsrpc" -#define RPCSVC_THREAD_STACK_SIZE ((size_t)(1024 * GF_UNIT_KB)) - -#define RPCSVC_DEFAULT_MEMFACTOR        15 -#define RPCSVC_EVENTPOOL_SIZE_MULT      1024 -#define RPCSVC_POOLCOUNT_MULT           35 -#define RPCSVC_CONN_READ        (128 * GF_UNIT_KB) -#define RPCSVC_PAGE_SIZE        (128 * GF_UNIT_KB) - -/* Defines for RPC record and fragment assembly */ - -#define RPCSVC_FRAGHDR_SIZE  4       /* 4-byte RPC fragment header size */ - -/* Given the 4-byte fragment header, returns non-zero if this fragment - * is the last fragment for the RPC record being assemebled. - * RPC Record marking standard defines a 32 bit value as the fragment - * header with the MSB signifying whether the fragment is the last - * fragment for the record being asembled. - */ -#define RPCSVC_LASTFRAG(fraghdr) ((uint32_t)(fraghdr & 0x80000000U)) - -/* Given the 4-byte fragment header, extracts the bits that contain - * the fragment size. - */ -#define RPCSVC_FRAGSIZE(fraghdr) ((uint32_t)(fraghdr & 0x7fffffffU)) - -/* RPC Record States */ -#define RPCSVC_READ_FRAGHDR     1 -#define RPCSVC_READ_FRAG        2 -/* The size in bytes, if crossed by a fragment will be handed over to the - * vectored actor so that it can allocate its buffers the way it wants. - * In our RPC layer, we assume that vectored RPC requests/records are never - * spread over multiple RPC fragments since that prevents us from determining - * whether the record should be handled in RPC layer completely or handed to - * the vectored handler. - */ -#define RPCSVC_VECTORED_FRAGSZ  4096 -#define RPCSVC_VECTOR_READCRED          1003 -#define RPCSVC_VECTOR_READVERFSZ        1004 -#define RPCSVC_VECTOR_READVERF          1005 -#define RPCSVC_VECTOR_IGNORE            1006 -#define RPCSVC_VECTOR_READVEC           1007 -#define RPCSVC_VECTOR_READPROCHDR       1008 - -#define nfs_rpcsvc_record_vectored_baremsg(rs) (((rs)->state == RPCSVC_READ_FRAG) && (rs)->vecstate == 0) -#define nfs_rpcsvc_record_vectored_cred(rs) ((rs)->vecstate == RPCSVC_VECTOR_READCRED) -#define nfs_rpcsvc_record_vectored_verfsz(rs) ((rs)->vecstate == RPCSVC_VECTOR_READVERFSZ) -#define nfs_rpcsvc_record_vectored_verfread(rs) ((rs)->vecstate == RPCSVC_VECTOR_READVERF) -#define nfs_rpcsvc_record_vectored_ignore(rs) ((rs)->vecstate == RPCSVC_VECTOR_IGNORE) -#define nfs_rpcsvc_record_vectored_readvec(rs) ((rs)->vecstate == RPCSVC_VECTOR_READVEC) -#define nfs_rpcsvc_record_vectored_readprochdr(rs) ((rs)->vecstate == RPCSVC_VECTOR_READPROCHDR) -#define nfs_rpcsvc_record_vectored(rs) ((rs)->fragsize > RPCSVC_VECTORED_FRAGSZ) -/* Includes bytes up to and including the credential length field. The credlen - * will be followed by @credlen bytes of credential data which will have to be - * read separately by the vectored reader. After the credentials comes the - * verifier which will also have to be read separately including the 8 bytes of - * verf flavour and verflen. - */ -#define RPCSVC_BARERPC_MSGSZ    32 -#define nfs_rpcsvc_record_readfraghdr(rs)   ((rs)->state == RPCSVC_READ_FRAGHDR) -#define nfs_rpcsvc_record_readfrag(rs)      ((rs)->state == RPCSVC_READ_FRAG) - -#define nfs_rpcsvc_conn_rpcsvc(conn)        ((conn)->stage->svc) -#define RPCSVC_LOWVERS  2 -#define RPCSVC_HIGHVERS 2 - -typedef struct rpc_svc_program rpcsvc_program_t; -/* A Stage is the event handler thread together with - * the connections being served by this thread. - * It is called a stage because all the actors, i.e, protocol actors, - * defined by higher level users of the RPC layer, are executed here. - */ -typedef struct rpc_svc_stage_context { -        pthread_t               tid; -        struct event_pool       *eventpool;     /* Per-stage event-pool */ -        void                    *svc;           /* Ref to the rpcsvc_t */ -} rpcsvc_stage_t; - - -/* RPC Records and Fragments assembly state. - * This is per-connection state that is used to determine - * how much data has come in, how much more needs to be read - * and where it needs to be read. - * - * All this state is then used to re-assemble network buffers into - * RPC fragments, which are then re-assembled into RPC records. - * - * See RFC 1831: "RPC: Remote Procedure Call Protocol Specification Version 2", - * particularly the section on Record Marking Standard. - */ -typedef struct rpcsvc_record_state { - -        /* Pending messages storage -         * This memory area is currently being used to assemble -         * the latest RPC record. -         * -         * Note that this buffer contains the data other than the -         * fragment headers received from the network. This is so that we can -         * directly pass this buffer to higher layers without requiring to -         * perform memory copies and marshalling of data. -         */ -        struct iobuf            *activeiob; - -        struct iobuf            *vectoriob; -        /* The pointer into activeiob memory, into which will go the -         * contents from the next read from the network. -         */ -        char                    *fragcurrent; - -        /* Size of the currently incomplete RPC fragment. -         * This is filled in when the fragment header comes in. -         * Even though only the 31 least significant bits are used from the -         * fragment header, we use a 32 bit variable to store the size. -         */ -        uint32_t               fragsize; - -        /* The fragment header is always read in here so that -         * the RPC messages contained in a RPC records can be processed -         * separately without copying them out of the activeiob above. -         */ -        char                    fragheader[RPCSVC_FRAGHDR_SIZE]; -        char                    *hdrcurrent; - -        /* Bytes remaining to come in for the current fragment. */ -        uint32_t                remainingfrag; - -        /* It is possible for the frag header to be split over separate -         * read calls, so we need to keep track of how much is left. -         */ -        uint32_t                remainingfraghdr; - -        /* Record size, the total size of the RPC record, i.e. the total -         * of all fragment sizes received till now. Does not include the size -         * of a partial fragment which is continuing to be assembled right now. -         */ -        int                     recordsize; - -        /* Current state of the record */ -        int                     state; - -        /* Current state of the vectored reading process. */ -        int                     vecstate; - -        /* Set to non-zero when the currently partial or complete fragment is -         * the last fragment being received for the current RPC record. -         */ -        uint32_t                islastfrag; - -} rpcsvc_record_state_t; - - -#define RPCSVC_CONNSTATE_CONNECTED      1 -#define RPCSVC_CONNSTATE_DISCONNECTED   2 - -#define nfs_rpcsvc_conn_check_active(conn) ((conn)->connstate==RPCSVC_CONNSTATE_CONNECTED) - -typedef struct rpcsvc_request rpcsvc_request_t; -/* Contains the state for each connection that is used for transmitting and - * receiving RPC messages. - * - * There is also an eventidx because each connection's fd is added to the event - * pool of the stage to which a connection belongs. - * Anything that can be accessed by a RPC program must be synced through - * connlock. - */ -typedef struct rpc_conn_state { - -        /* Transport or connection state */ - -         /* Once we start working on RDMA support, this TCP specific state will -         * have to be abstracted away. -         */ -        int                     sockfd; -        int                     eventidx; -        int                     windowsize; - -        /* Reference to the stage which is handling this -         * connection. -         */ -        rpcsvc_stage_t          *stage; - -        /* RPC Records and Fragments assembly state. -         * All incoming data is staged here before being -         * called a full RPC message. -         */ -        rpcsvc_record_state_t   rstate; - -         /* It is possible that a client disconnects while -         * the higher layer RPC service is busy in a call. -         * In this case, we cannot just free the conn -         * structure, since the higher layer service could -         * still have a reference to it. -         * The refcount avoids freeing until all references -         * have been given up, although the connection is clos()ed at the first -         * call to unref. -         */ -        int                     connref; -        pthread_mutex_t         connlock; -        int                     connstate; - -        /* List of buffers awaiting transmission */ -        /* Accesses to txbufs between multiple threads calling -         * rpcsvc_submit is synced through connlock. Prefer spinlock over -         * mutex because this is a low overhead op that needs simple -         * appending to the tx list. -         */ -        struct list_head        txbufs; - -        /* Mem pool for the txbufs above. */ -        struct mem_pool         *txpool; - -        /* Memory pool for rpcsvc_request_t */ -        struct mem_pool         *rxpool; - -        /* The request which hasnt yet been handed to the RPC program because -         * this request is being treated as a vector request and so needs some -         * more data to be got from the network. -         */ -        rpcsvc_request_t        *vectoredreq; -} rpcsvc_conn_t; - - -#define RPCSVC_MAX_AUTH_BYTES   400 -typedef struct rpcsvc_auth_data { -        int             flavour; -        int             datalen; -        char            authdata[RPCSVC_MAX_AUTH_BYTES]; -} rpcsvc_auth_data_t; - -#define nfs_rpcsvc_auth_flavour(au)    ((au).flavour) - -/* The container for the RPC call handed up to an actor. - * Dynamically allocated. Lives till the call reply is completely - * transmitted. - * */ -struct rpcsvc_request { -        /* Connection over which this request came. */ -        rpcsvc_conn_t           *conn; - -        /* The identifier for the call from client. -         * Needed to pair the reply with the call. -         */ -        uint32_t                xid; - -        int                     prognum; - -        int                     progver; - -        int                     procnum; -        /* Uid and gid filled by the rpc-auth module during the authentication -         * phase. -         */ -        uid_t                   uid; -        gid_t                   gid; - -        /* Might want to move this to AUTH_UNIX specifix state since this array -         * is not available for every authenticatino scheme. -         */ -        gid_t                   auxgids[NGRPS]; -        int                     auxgidcount; - - -        /* The RPC message payload, contains the data required -         * by the program actors. This is the buffer that will need to -         * be de-xdred by the actor. -         */ -        struct iovec            msg; - -        /* The full message buffer allocated to store the RPC headers. -         * This buffer is ref'd when allocated why RPC svc and unref'd after -         * the buffer is handed to the actor. That means if the actor or any -         * higher layer wants to keep this buffer around, they too must ref it -         * right after entering the program actor. -         */ -        struct iobuf            *recordiob; - -        /* Status of the RPC call, whether it was accepted or denied. */ -        int                     rpc_stat; - -        /* In case, the call was denied, the RPC error is stored here -         * till the reply is sent. -         */ -        int                     rpc_err; - -        /* In case the failure happened because of an authentication problem -         * , this value needs to be assigned the correct auth error number. -         */ -        int                     auth_err; - -        /* There can be cases of RPC requests where the reply needs to -         * be built from multiple sources. For eg. where even the NFS reply can -         * contain a payload, as in the NFSv3 read reply. Here the RPC header -         * ,NFS header and the read data are brought together separately from -         * different buffers, so we need to stage the buffers temporarily here -         * before all of them get added to the connection's transmission list. -         */ -        struct list_head        txlist; - -        /* While the reply record is being built, this variable keeps track -         * of how many bytes have been added to the record. -         */ -        size_t                  payloadsize; - -        /* The credentials extracted from the rpc request */ -        rpcsvc_auth_data_t      cred; - -        /* The verified extracted from the rpc request. In request side -         * processing this contains the verifier sent by the client, on reply -         * side processing, it is filled with the verified that will be -         * sent to the client. -         */ -        rpcsvc_auth_data_t      verf; - -        /* Container for a RPC program wanting to store a temp -         * request-specific item. -         */ -        void                    *private; - -        /* To save a ref to the program for which this request is. */ -        rpcsvc_program_t        *program; -}; - -#define nfs_rpcsvc_request_program(req) ((rpcsvc_program_t *)((req)->program)) -#define nfs_rpcsvc_request_program_private(req) ((req)->program->private) -#define nfs_rpcsvc_request_conn(req)        (req)->conn -#define nfs_rpcsvc_program_xlator(prg)      ((prg)->actorxl) -#define nfs_rpcsvc_request_actorxl(rq)      (nfs_rpcsvc_request_program(rq))->actorxl -#define nfs_rpcsvc_request_accepted(req)    ((req)->rpc_stat == MSG_ACCEPTED) -#define nfs_rpcsvc_request_accepted_success(req) ((req)->rpc_err == SUCCESS) -#define nfs_rpcsvc_request_uid(req)         ((req)->uid) -#define nfs_rpcsvc_request_gid(req)         ((req)->gid) -#define nfs_rpcsvc_stage_service(stg)       ((rpcsvc_t *)((stg)->svc)) -#define nfs_rpcsvc_conn_stage(conn)         ((conn)->stage) -#define nfs_rpcsvc_request_service(req)     (nfs_rpcsvc_stage_service(nfs_rpcsvc_conn_stage(nfs_rpcsvc_request_conn(req)))) -#define nfs_rpcsvc_request_prog_minauth(req) (nfs_rpcsvc_request_program(req)->min_auth) -#define nfs_rpcsvc_request_cred_flavour(req) (nfs_rpcsvc_auth_flavour(req->cred)) -#define nfs_rpcsvc_request_verf_flavour(req) (nfs_rpcsvc_auth_flavour(req->verf)) - -#define nfs_rpcsvc_request_uid(req)         ((req)->uid) -#define nfs_rpcsvc_request_gid(req)         ((req)->gid) -#define nfs_rpcsvc_request_private(req)     ((req)->private) -#define nfs_rpcsvc_request_xid(req)         ((req)->xid) -#define nfs_rpcsvc_request_set_private(req,prv)  (req)->private = (void *)(prv) -#define nfs_rpcsvc_request_record_iob(rq)   ((rq)->recordiob) -#define nfs_rpcsvc_request_record_ref(req)  (iobuf_ref ((req)->recordiob)) -#define nfs_rpcsvc_request_record_unref(req) (iobuf_unref ((req)->recordiob)) -#define nfs_rpcsvc_request_procnum(rq)      ((rq)->procnum) - - -#define RPCSVC_ACTOR_SUCCESS    0 -#define RPCSVC_ACTOR_ERROR      (-1) -#define RPCSVC_ACTOR_IGNORE     (-2) - -/* Functor for every type of protocol actor - * must be defined like this. - * - * See the request structure for info on how to handle the request - * in the program actor. - * - * On successful santify checks inside the actor, it should return - * RPCSVC_ACTOR_SUCCESS. - * On an error, on which the RPC layer is expected to return a reply, the actor - * should return RPCSVC_ACTOR_ERROR. - * - */ -typedef int (*rpcsvc_actor) (rpcsvc_request_t *req); -typedef int (*rpcsvc_vector_actor) (rpcsvc_request_t *req, struct iobuf *iob); -typedef int (*rpcsvc_vector_sizer) (rpcsvc_request_t *req, ssize_t *readsize, -                                    int *newiob); - -/* Every protocol actor will also need to specify the function the RPC layer - * will use to serialize or encode the message into XDR format just before - * transmitting on the connection. - */ -typedef void *(*rpcsvc_encode_reply) (void *msg); - -/* Once the reply has been transmitted, the message will have to be de-allocated - * , so every actor will need to provide a function that deallocates the message - * it had allocated as a response. - */ -typedef void (*rpcsvc_deallocate_reply) (void *msg); - - -#define RPCSVC_NAME_MAX            32 -/* The descriptor for each procedure/actor that runs - * over the RPC service. - */ -typedef struct rpc_svc_actor_desc { -        char                    procname[RPCSVC_NAME_MAX]; -        int                     procnum; -        rpcsvc_actor            actor; - -        /* Handler for cases where the RPC requests fragments are large enough -         * to benefit from being decoded into aligned memory addresses. While -         * decoding the request in a non-vectored manner, due to the nature of -         * the XDR scheme, RPC cannot guarantee memory aligned addresses for -         * the resulting message-specific structures. Allowing a specialized -         * handler for letting the RPC program read the data from the network -         * directly into its alligned buffers. -         */ -        rpcsvc_vector_actor     vector_actor; -        rpcsvc_vector_sizer     vector_sizer; - -} rpcsvc_actor_t; - -/* Describes a program and its version along with the function pointers - * required to handle the procedures/actors of each program/version. - * Never changed ever by any thread so no need for a lock. - */ -struct rpc_svc_program { -        struct list_head        proglist; -        char                    progname[RPCSVC_NAME_MAX]; -        int                     prognum; -        int                     progver; -        uint16_t                progport;       /* Registered with portmap */ -        int                     progaddrfamily; /* AF_INET or AF_INET6 */ -        char                    *proghost;      /* Bind host, can be NULL */ -        rpcsvc_actor_t          *actors;        /* All procedure handlers */ -        int                     numactors;      /* Num actors in actor array */ -        int                     proghighvers;   /* Highest ver for program -                                                   supported by the system. */ -        int                     proglowvers;    /* Lowest ver */ - -        /* Program specific state handed to actors */ -        void                    *private; - -        /* An integer that identifies the min auth strength that is required -         * by this protocol, for eg. MOUNT3 needs AUTH_UNIX at least. -         * See RFC 1813, Section 5.2.1. -         */ -        int                     min_auth; - -        /* The translator in whose context the actor must execute. This is -         * needed to setup THIS for memory accounting to work correctly. -         */ -        xlator_t                *actorxl; -}; - - -/* Contains global state required for all the RPC services. - */ -typedef struct rpc_svc_state { - -        /* Contains the list of rpcsvc_stage_t -         * list of (program, version) handlers. -         * other options. -         */ - -        /* At this point, lock is not used to protect anything. Later, it'll -         * be used for protecting stages. -         */ -        pthread_mutex_t         rpclock; - -        /* This is the first stage that is inited, so that any RPC based -         * services that do not need multi-threaded support can just use the -         * service right away. This is not added to the stages list -         * declared later. -         * This is also the stage over which all service listeners are run. -         */ -        rpcsvc_stage_t          *defaultstage; - -        /* When we have multi-threaded RPC support, we'll use this to link -         * to the multiple Stages. -         */ -        struct list_head        stages;         /* All stages */ - -        unsigned int            memfactor; - -        /* List of the authentication schemes available. */ -        struct list_head        authschemes; - -        /* Reference to the options */ -        dict_t                  *options; - -        /* Allow insecure ports. */ -        int                     allow_insecure; - -        glusterfs_ctx_t         *ctx; - -        gf_boolean_t            register_portmap; - -        struct list_head        allprograms; -} rpcsvc_t; - - -/* All users of RPC services should use this API to register their - * procedure handlers. - */ -extern int -nfs_rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t program); - -extern int -nfs_rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t program); - -/* Inits the global RPC service data structures. - * Called in main. - */ -extern rpcsvc_t * -nfs_rpcsvc_init (glusterfs_ctx_t *ctx, dict_t *options); - - -extern int -nfs_rpcsvc_submit_message (rpcsvc_request_t * req, struct iovec msg, -                           struct iobuf *iob); - -int -nfs_rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec msgvec, -                           struct iobuf *msg); -#define nfs_rpcsvc_record_currentfrag_addr(rs) ((rs)->fragcurrent) -#define nfs_rpcsvc_record_currenthdr_addr(rs) ((rs)->hdrcurrent) - -#define nfs_rpcsvc_record_update_currentfrag(rs, size)          \ -                        do {                                    \ -                                (rs)->fragcurrent += size;      \ -                        } while (0)                             \ - -#define nfs_rpcsvc_record_update_currenthdr(rs, size)           \ -                        do {                                    \ -                                (rs)->hdrcurrent += size;       \ -                        } while (0)                             \ - - -/* These are used to differentiate between multiple txbufs which form - * a single RPC record. For eg, one purpose we use these for is to - * prevent dividing a RPC record over multiple TCP segments. Multiple - * TCP segments are possible for a single RPC record because we generally do not - * have control over how the kernel's TCP segments the buffers when putting - * them on the wire. So, on Linux, we use these to set TCP_CORK to create - * a single TCP segment from multiple txbufs that are part of the same RPC - * record. This improves network performance by reducing tiny message - * transmissions. - */ -#define RPCSVC_TXB_FIRST        0x1 -#define RPCSVC_TXB_LAST         0x2 - -/* The list of buffers appended to a connection's pending - * transmission list. - */ -typedef struct rpcsvc_txbuf { -        struct list_head        txlist; -        /* The iobuf which contains the full message to be transmitted */ -        struct iobuf            *iob; - -        /* For vectored messages from an RPC program, we need to be able -         * maintain a ref to an iobuf which we do not have access to directly -         * except through the iobref which in turn could've been passed to -         * the RPC program by a higher layer. -         * -         * So either the iob is defined or iobref is defined for a reply, -         * never both. -         */ -        struct iobref           *iobref; -        /* In order to handle non-blocking writes, we'll need to keep track of -         * how much data from an iobuf has been written and where the next -         * transmission needs to start from. This iov.base points to the base of -         * the iobuf, iov.len is the size of iobuf being used for the message -         * from the total size in the iobuf. -         */ -        struct iovec            buf; -        /* offset is the point from where the next transmission for this buffer -         * should start. -         */ -        size_t                  offset; - -        /* This is a special field that tells us what kind of transmission -         * behaviour to provide to a particular buffer. -         * See the RPCSVC_TXB_* defines for more info. -         */ -        int                     txbehave; -} rpcsvc_txbuf_t; - -extern int -nfs_rpcsvc_error_reply (rpcsvc_request_t *req); - -#define RPCSVC_PEER_STRLEN      1024 -#define RPCSVC_AUTH_ACCEPT      1 -#define RPCSVC_AUTH_REJECT      2 -#define RPCSVC_AUTH_DONTCARE    3 - -extern int -nfs_rpcsvc_conn_peername (rpcsvc_conn_t *conn, char *hostname, int hostlen); - -extern int -nfs_rpcsvc_conn_peeraddr (rpcsvc_conn_t *conn, char *addrstr, int addrlen, -                          struct sockaddr *returnsa, socklen_t sasize); - -extern int -nfs_rpcsvc_conn_peer_check (dict_t *options, char *volname,rpcsvc_conn_t *conn); - -extern int -nfs_rpcsvc_conn_privport_check (rpcsvc_t *svc, char *volname, -                                rpcsvc_conn_t *conn); -#define nfs_rpcsvc_request_seterr(req, err)                 (req)->rpc_err = err -#define nfs_rpcsvc_request_set_autherr(req, err)                        \ -        do {                                                            \ -                (req)->auth_err = err;                                  \ -                (req)->rpc_stat = MSG_DENIED;                           \ -        } while (0)                                                     \ - -extern void -nfs_rpcsvc_conn_deinit (rpcsvc_conn_t *conn); -extern void nfs_rpcsvc_conn_ref (rpcsvc_conn_t *conn); -extern void nfs_rpcsvc_conn_unref (rpcsvc_conn_t *conn); - -extern int nfs_rpcsvc_submit_vectors (rpcsvc_request_t *req); - -extern int nfs_rpcsvc_request_attach_vector (rpcsvc_request_t *req, -                                             struct iovec msgvec, -                                             struct iobuf *iob, -                                             struct iobref *ioref, -                                             int finalvector); -extern int -nfs_rpcsvc_request_attach_vectors (rpcsvc_request_t *req, struct iovec *payload, -                                   int vcount, struct iobref *piobref); - -typedef int (*auth_init_conn) (rpcsvc_conn_t *conn, void *priv); -typedef int (*auth_init_request) (rpcsvc_request_t *req, void *priv); -typedef int (*auth_request_authenticate) (rpcsvc_request_t *req, void *priv); - -/* This structure needs to be registered by every authentication scheme. - * Our authentication schemes are stored per connection because - * each connection will end up using a different authentication scheme. - */ -typedef struct rpcsvc_auth_ops { -        auth_init_conn                conn_init; -        auth_init_request             request_init; -        auth_request_authenticate     authenticate; -} rpcsvc_auth_ops_t; - -typedef struct rpcsvc_auth_flavour_desc { -        char                    authname[RPCSVC_NAME_MAX]; -        int                     authnum; -        rpcsvc_auth_ops_t       *authops; -        void                    *authprivate; -} rpcsvc_auth_t; - -typedef void * (*rpcsvc_auth_initer_t) (rpcsvc_t *svc, dict_t *options); - -struct rpcsvc_auth_list { -        struct list_head        authlist; -        rpcsvc_auth_initer_t    init; -        /* Should be the name with which we identify the auth scheme given -         * in the volfile options. -         * This should be different from the authname in rpc_auth_t -         * in way that makes it easier to specify this scheme in the volfile. -         * This is because the technical names of the schemes can be a bit -         * arcane. -         */ -        char                    name[RPCSVC_NAME_MAX]; -        rpcsvc_auth_t           *auth; -        int                     enable; -}; - -extern int -nfs_rpcsvc_auth_request_init (rpcsvc_request_t *req); - -extern int -nfs_rpcsvc_auth_init (rpcsvc_t *svc, dict_t *options); - -extern int -nfs_rpcsvc_auth_conn_init (rpcsvc_conn_t *conn); - -extern int -nfs_rpcsvc_authenticate (rpcsvc_request_t *req); - -extern int -nfs_rpcsvc_auth_array (rpcsvc_t *svc, char *volname, int *autharr, int arrlen); - -/* If the request has been sent using AUTH_UNIX, this function returns the - * auxiliary gids as an array, otherwise, it returns NULL. - * Move to auth-unix specific source file when we need to modularize the - * authentication code even further to support mode auth schemes. - */ -extern gid_t * -nfs_rpcsvc_auth_unix_auxgids (rpcsvc_request_t *req, int *arrlen); - -extern int -nfs_rpcsvc_combine_gen_spec_volume_checks (int gen, int spec); - -extern char * -nfs_rpcsvc_volume_allowed (dict_t *options, char *volname); -#endif diff --git a/xlators/nfs/lib/src/xdr-common.h b/xlators/nfs/lib/src/xdr-common.h deleted file mode 100644 index b3992ab0503..00000000000 --- a/xlators/nfs/lib/src/xdr-common.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _NFS_XDR_COMMON_H_ -#define _NFS_XDR_COMMON_H_ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include <rpc/rpc.h> -#define NFS_XDR_BYTES_PER_UNIT      4 - -/* Returns the address of the byte that follows the - * last byte used for decoding the previous xdr component. - * For eg, once the RPC call for NFS has been decoded, thie macro will return - * the address from which the NFS header starts. - */ -#define nfs_xdr_decoded_remaining_addr(xdr)        ((&xdr)->x_private) - -/* Returns the length of the remaining record after the previous decode - * operation completed. - */ -#define nfs_xdr_decoded_remaining_len(xdr)         ((&xdr)->x_handy) - -/* Returns the number of bytes used by the last encode operation. */ -#define nfs_xdr_encoded_length(xdr) (((size_t)(&xdr)->x_private) - ((size_t)(&xdr)->x_base)) - -#define nfs_xdr_decoded_length(xdr) (((size_t)(&xdr)->x_private) - ((size_t)(&xdr)->x_base)) - -#endif diff --git a/xlators/nfs/lib/src/xdr-nfs3.c b/xlators/nfs/lib/src/xdr-nfs3.c deleted file mode 100644 index febc6a69597..00000000000 --- a/xlators/nfs/lib/src/xdr-nfs3.c +++ /dev/null @@ -1,1897 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#include "xdr-nfs3.h" -#include "mem-pool.h" - -#if GF_DARWIN_HOST_OS -#define xdr_u_quad_t xdr_u_int64_t -#define xdr_quad_t   xdr_int64_t -#define xdr_uint32_t xdr_u_int32_t -#endif - -bool_t -xdr_uint64 (XDR *xdrs, uint64 *objp) -{ -	 if (!xdr_uint64_t (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_int64 (XDR *xdrs, int64 *objp) -{ -	 if (!xdr_int64_t (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_uint32 (XDR *xdrs, uint32 *objp) -{ -	 if (!xdr_uint32_t (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_int32 (XDR *xdrs, int32 *objp) -{ -	 if (!xdr_int32_t (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_filename3 (XDR *xdrs, filename3 *objp) -{ -	 if (!xdr_string (xdrs, objp, ~0)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_nfspath3 (XDR *xdrs, nfspath3 *objp) -{ -	 if (!xdr_string (xdrs, objp, ~0)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fileid3 (XDR *xdrs, fileid3 *objp) -{ -	 if (!xdr_uint64 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_cookie3 (XDR *xdrs, cookie3 *objp) -{ -	 if (!xdr_uint64 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_cookieverf3 (XDR *xdrs, cookieverf3 objp) -{ -	 if (!xdr_opaque (xdrs, objp, NFS3_COOKIEVERFSIZE)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_createverf3 (XDR *xdrs, createverf3 objp) -{ -	 if (!xdr_opaque (xdrs, objp, NFS3_CREATEVERFSIZE)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_writeverf3 (XDR *xdrs, writeverf3 objp) -{ -	 if (!xdr_opaque (xdrs, objp, NFS3_WRITEVERFSIZE)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_uid3 (XDR *xdrs, uid3 *objp) -{ -	 if (!xdr_uint32 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_gid3 (XDR *xdrs, gid3 *objp) -{ -	 if (!xdr_uint32 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_size3 (XDR *xdrs, size3 *objp) -{ -	 if (!xdr_uint64 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_offset3 (XDR *xdrs, offset3 *objp) -{ -	 if (!xdr_uint64 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mode3 (XDR *xdrs, mode3 *objp) -{ -	 if (!xdr_uint32 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_count3 (XDR *xdrs, count3 *objp) -{ -	 if (!xdr_uint32 (xdrs, objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_nfsstat3 (XDR *xdrs, nfsstat3 *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_ftype3 (XDR *xdrs, ftype3 *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_specdata3 (XDR *xdrs, specdata3 *objp) -{ -	 if (!xdr_uint32 (xdrs, &objp->specdata1)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->specdata2)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_nfs_fh3 (XDR *xdrs, nfs_fh3 *objp) -{ -	 if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, NFS3_FHSIZE)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_nfstime3 (XDR *xdrs, nfstime3 *objp) -{ -	 if (!xdr_uint32 (xdrs, &objp->seconds)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->nseconds)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fattr3 (XDR *xdrs, fattr3 *objp) -{ -	 if (!xdr_ftype3 (xdrs, &objp->type)) -		 return FALSE; -	 if (!xdr_mode3 (xdrs, &objp->mode)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->nlink)) -		 return FALSE; -	 if (!xdr_uid3 (xdrs, &objp->uid)) -		 return FALSE; -	 if (!xdr_gid3 (xdrs, &objp->gid)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->size)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->used)) -		 return FALSE; -	 if (!xdr_specdata3 (xdrs, &objp->rdev)) -		 return FALSE; -	 if (!xdr_uint64 (xdrs, &objp->fsid)) -		 return FALSE; -	 if (!xdr_fileid3 (xdrs, &objp->fileid)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->atime)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->mtime)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->ctime)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_post_op_attr (XDR *xdrs, post_op_attr *objp) -{ -	 if (!xdr_bool (xdrs, &objp->attributes_follow)) -		 return FALSE; -	switch (objp->attributes_follow) { -	case TRUE: -		 if (!xdr_fattr3 (xdrs, &objp->post_op_attr_u.attributes)) -			 return FALSE; -		break; -	case FALSE: -		break; -	default: -		return FALSE; -	} -	return TRUE; -} - -bool_t -xdr_wcc_attr (XDR *xdrs, wcc_attr *objp) -{ -	 if (!xdr_size3 (xdrs, &objp->size)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->mtime)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->ctime)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_pre_op_attr (XDR *xdrs, pre_op_attr *objp) -{ -	 if (!xdr_bool (xdrs, &objp->attributes_follow)) -		 return FALSE; -	switch (objp->attributes_follow) { -	case TRUE: -		 if (!xdr_wcc_attr (xdrs, &objp->pre_op_attr_u.attributes)) -			 return FALSE; -		break; -	case FALSE: -		break; -	default: -		return FALSE; -	} -	return TRUE; -} - -bool_t -xdr_wcc_data (XDR *xdrs, wcc_data *objp) -{ -	 if (!xdr_pre_op_attr (xdrs, &objp->before)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->after)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_post_op_fh3 (XDR *xdrs, post_op_fh3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->handle_follows)) -		 return FALSE; -	switch (objp->handle_follows) { -	case TRUE: -		 if (!xdr_nfs_fh3 (xdrs, &objp->post_op_fh3_u.handle)) -			 return FALSE; -		break; -	case FALSE: -		break; -	default: -		return FALSE; -	} -	return TRUE; -} - -bool_t -xdr_time_how (XDR *xdrs, time_how *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_set_mode3 (XDR *xdrs, set_mode3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case TRUE: -		 if (!xdr_mode3 (xdrs, &objp->set_mode3_u.mode)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_set_uid3 (XDR *xdrs, set_uid3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case TRUE: -		 if (!xdr_uid3 (xdrs, &objp->set_uid3_u.uid)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_set_gid3 (XDR *xdrs, set_gid3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case TRUE: -		 if (!xdr_gid3 (xdrs, &objp->set_gid3_u.gid)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_set_size3 (XDR *xdrs, set_size3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case TRUE: -		 if (!xdr_size3 (xdrs, &objp->set_size3_u.size)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_set_atime (XDR *xdrs, set_atime *objp) -{ -	 if (!xdr_time_how (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case SET_TO_CLIENT_TIME: -		 if (!xdr_nfstime3 (xdrs, &objp->set_atime_u.atime)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_set_mtime (XDR *xdrs, set_mtime *objp) -{ -	 if (!xdr_time_how (xdrs, &objp->set_it)) -		 return FALSE; -	switch (objp->set_it) { -	case SET_TO_CLIENT_TIME: -		 if (!xdr_nfstime3 (xdrs, &objp->set_mtime_u.mtime)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_sattr3 (XDR *xdrs, sattr3 *objp) -{ -	 if (!xdr_set_mode3 (xdrs, &objp->mode)) -		 return FALSE; -	 if (!xdr_set_uid3 (xdrs, &objp->uid)) -		 return FALSE; -	 if (!xdr_set_gid3 (xdrs, &objp->gid)) -		 return FALSE; -	 if (!xdr_set_size3 (xdrs, &objp->size)) -		 return FALSE; -	 if (!xdr_set_atime (xdrs, &objp->atime)) -		 return FALSE; -	 if (!xdr_set_mtime (xdrs, &objp->mtime)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_diropargs3 (XDR *xdrs, diropargs3 *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->dir)) -		 return FALSE; -	 if (!xdr_filename3 (xdrs, &objp->name)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_getattr3args (XDR *xdrs, getattr3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->object)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_getattr3resok (XDR *xdrs, getattr3resok *objp) -{ -	 if (!xdr_fattr3 (xdrs, &objp->obj_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_getattr3res (XDR *xdrs, getattr3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_getattr3resok (xdrs, &objp->getattr3res_u.resok)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_sattrguard3 (XDR *xdrs, sattrguard3 *objp) -{ -	 if (!xdr_bool (xdrs, &objp->check)) -		 return FALSE; -	switch (objp->check) { -	case TRUE: -		 if (!xdr_nfstime3 (xdrs, &objp->sattrguard3_u.obj_ctime)) -			 return FALSE; -		break; -	case FALSE: -		break; -	default: -		return FALSE; -	} -	return TRUE; -} - -bool_t -xdr_setattr3args (XDR *xdrs, setattr3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->object)) -		 return FALSE; -	 if (!xdr_sattr3 (xdrs, &objp->new_attributes)) -		 return FALSE; -	 if (!xdr_sattrguard3 (xdrs, &objp->guard)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_setattr3resok (XDR *xdrs, setattr3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->obj_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_setattr3resfail (XDR *xdrs, setattr3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->obj_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_setattr3res (XDR *xdrs, setattr3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_setattr3resok (xdrs, &objp->setattr3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_setattr3resfail (xdrs, &objp->setattr3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_lookup3args (XDR *xdrs, lookup3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->what)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_lookup3resok (XDR *xdrs, lookup3resok *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->object)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_lookup3resfail (XDR *xdrs, lookup3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_lookup3res (XDR *xdrs, lookup3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_lookup3resok (xdrs, &objp->lookup3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_lookup3resfail (xdrs, &objp->lookup3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_access3args (XDR *xdrs, access3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->object)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->access)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_access3resok (XDR *xdrs, access3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->access)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_access3resfail (XDR *xdrs, access3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_access3res (XDR *xdrs, access3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_access3resok (xdrs, &objp->access3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_access3resfail (xdrs, &objp->access3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_readlink3args (XDR *xdrs, readlink3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->symlink)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readlink3resok (XDR *xdrs, readlink3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->symlink_attributes)) -		 return FALSE; -	 if (!xdr_nfspath3 (xdrs, &objp->data)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readlink3resfail (XDR *xdrs, readlink3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->symlink_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readlink3res (XDR *xdrs, readlink3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_readlink3resok (xdrs, &objp->readlink3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_readlink3resfail (xdrs, &objp->readlink3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_read3args (XDR *xdrs, read3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->file)) -		 return FALSE; -	 if (!xdr_offset3 (xdrs, &objp->offset)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_read3resok_nocopy (XDR *xdrs, read3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->file_attributes)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->eof)) -		 return FALSE; -         if (!xdr_u_int (xdrs, (u_int *) &objp->data.data_len)) -                 return FALSE; -	return TRUE; -} - - -bool_t -xdr_read3resok (XDR *xdrs, read3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->file_attributes)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->eof)) -		 return FALSE; -	 if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, ~0)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_read3resfail (XDR *xdrs, read3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->file_attributes)) -		 return FALSE; -	return TRUE; -} - - -bool_t -xdr_read3res_nocopy (XDR *xdrs, read3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_read3resok_nocopy (xdrs, &objp->read3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_read3resfail (xdrs, &objp->read3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - - -bool_t -xdr_read3res (XDR *xdrs, read3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_read3resok (xdrs, &objp->read3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_read3resfail (xdrs, &objp->read3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_stable_how (XDR *xdrs, stable_how *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_write3args (XDR *xdrs, write3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->file)) -		 return FALSE; -	 if (!xdr_offset3 (xdrs, &objp->offset)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	 if (!xdr_stable_how (xdrs, &objp->stable)) -		 return FALSE; - -         /* Added specifically to avoid copies from the xdr buffer into -          * the write3args structure, which will also require an already -          * allocated buffer. That is not optimal. -          */ -         if (!xdr_u_int (xdrs, (u_int *) &objp->data.data_len)) -                 return FALSE; - -         /* The remaining bytes in the xdr buffer are the bytes that need to be -          * written. See how these bytes are extracted in the xdr_to_write3args -          * code path. Be careful, while using the write3args structure, since -          * only the data.data_len has been filled. The actual data is -          * extracted in xdr_to_write3args path. -          */ - -         /*	 if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, ~0)) -		 return FALSE; -                 */ -	return TRUE; -} - -bool_t -xdr_write3resok (XDR *xdrs, write3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->file_wcc)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	 if (!xdr_stable_how (xdrs, &objp->committed)) -		 return FALSE; -	 if (!xdr_writeverf3 (xdrs, objp->verf)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_write3resfail (XDR *xdrs, write3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->file_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_write3res (XDR *xdrs, write3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_write3resok (xdrs, &objp->write3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_write3resfail (xdrs, &objp->write3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_createmode3 (XDR *xdrs, createmode3 *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_createhow3 (XDR *xdrs, createhow3 *objp) -{ -	 if (!xdr_createmode3 (xdrs, &objp->mode)) -		 return FALSE; -	switch (objp->mode) { -	case UNCHECKED: -	case GUARDED: -		 if (!xdr_sattr3 (xdrs, &objp->createhow3_u.obj_attributes)) -			 return FALSE; -		break; -	case EXCLUSIVE: -		 if (!xdr_createverf3 (xdrs, objp->createhow3_u.verf)) -			 return FALSE; -		break; -	default: -		return FALSE; -	} -	return TRUE; -} - -bool_t -xdr_create3args (XDR *xdrs, create3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->where)) -		 return FALSE; -	 if (!xdr_createhow3 (xdrs, &objp->how)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_create3resok (XDR *xdrs, create3resok *objp) -{ -	 if (!xdr_post_op_fh3 (xdrs, &objp->obj)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_create3resfail (XDR *xdrs, create3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_create3res (XDR *xdrs, create3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_create3resok (xdrs, &objp->create3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_create3resfail (xdrs, &objp->create3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_mkdir3args (XDR *xdrs, mkdir3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->where)) -		 return FALSE; -	 if (!xdr_sattr3 (xdrs, &objp->attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mkdir3resok (XDR *xdrs, mkdir3resok *objp) -{ -	 if (!xdr_post_op_fh3 (xdrs, &objp->obj)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mkdir3resfail (XDR *xdrs, mkdir3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mkdir3res (XDR *xdrs, mkdir3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_mkdir3resok (xdrs, &objp->mkdir3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_mkdir3resfail (xdrs, &objp->mkdir3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_symlinkdata3 (XDR *xdrs, symlinkdata3 *objp) -{ -	 if (!xdr_sattr3 (xdrs, &objp->symlink_attributes)) -		 return FALSE; -	 if (!xdr_nfspath3 (xdrs, &objp->symlink_data)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_symlink3args (XDR *xdrs, symlink3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->where)) -		 return FALSE; -	 if (!xdr_symlinkdata3 (xdrs, &objp->symlink)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_symlink3resok (XDR *xdrs, symlink3resok *objp) -{ -	 if (!xdr_post_op_fh3 (xdrs, &objp->obj)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_symlink3resfail (XDR *xdrs, symlink3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_symlink3res (XDR *xdrs, symlink3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_symlink3resok (xdrs, &objp->symlink3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_symlink3resfail (xdrs, &objp->symlink3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_devicedata3 (XDR *xdrs, devicedata3 *objp) -{ -	 if (!xdr_sattr3 (xdrs, &objp->dev_attributes)) -		 return FALSE; -	 if (!xdr_specdata3 (xdrs, &objp->spec)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mknoddata3 (XDR *xdrs, mknoddata3 *objp) -{ -	 if (!xdr_ftype3 (xdrs, &objp->type)) -		 return FALSE; -	switch (objp->type) { -	case NF3CHR: -	case NF3BLK: -		 if (!xdr_devicedata3 (xdrs, &objp->mknoddata3_u.device)) -			 return FALSE; -		break; -	case NF3SOCK: -	case NF3FIFO: -		 if (!xdr_sattr3 (xdrs, &objp->mknoddata3_u.pipe_attributes)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_mknod3args (XDR *xdrs, mknod3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->where)) -		 return FALSE; -	 if (!xdr_mknoddata3 (xdrs, &objp->what)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mknod3resok (XDR *xdrs, mknod3resok *objp) -{ -	 if (!xdr_post_op_fh3 (xdrs, &objp->obj)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mknod3resfail (XDR *xdrs, mknod3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mknod3res (XDR *xdrs, mknod3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_mknod3resok (xdrs, &objp->mknod3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_mknod3resfail (xdrs, &objp->mknod3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_remove3args (XDR *xdrs, remove3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->object)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_remove3resok (XDR *xdrs, remove3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_remove3resfail (XDR *xdrs, remove3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_remove3res (XDR *xdrs, remove3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_remove3resok (xdrs, &objp->remove3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_remove3resfail (xdrs, &objp->remove3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_rmdir3args (XDR *xdrs, rmdir3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->object)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rmdir3resok (XDR *xdrs, rmdir3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rmdir3resfail (XDR *xdrs, rmdir3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->dir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rmdir3res (XDR *xdrs, rmdir3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_rmdir3resok (xdrs, &objp->rmdir3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_rmdir3resfail (xdrs, &objp->rmdir3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_rename3args (XDR *xdrs, rename3args *objp) -{ -	 if (!xdr_diropargs3 (xdrs, &objp->from)) -		 return FALSE; -	 if (!xdr_diropargs3 (xdrs, &objp->to)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rename3resok (XDR *xdrs, rename3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->fromdir_wcc)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->todir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rename3resfail (XDR *xdrs, rename3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->fromdir_wcc)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->todir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_rename3res (XDR *xdrs, rename3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_rename3resok (xdrs, &objp->rename3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_rename3resfail (xdrs, &objp->rename3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_link3args (XDR *xdrs, link3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->file)) -		 return FALSE; -	 if (!xdr_diropargs3 (xdrs, &objp->link)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_link3resok (XDR *xdrs, link3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->file_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->linkdir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_link3resfail (XDR *xdrs, link3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->file_attributes)) -		 return FALSE; -	 if (!xdr_wcc_data (xdrs, &objp->linkdir_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_link3res (XDR *xdrs, link3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_link3resok (xdrs, &objp->link3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_link3resfail (xdrs, &objp->link3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_readdir3args (XDR *xdrs, readdir3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->dir)) -		 return FALSE; -	 if (!xdr_cookie3 (xdrs, &objp->cookie)) -		 return FALSE; -	 if (!xdr_cookieverf3 (xdrs, objp->cookieverf)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_entry3 (XDR *xdrs, entry3 *objp) -{ -	 if (!xdr_fileid3 (xdrs, &objp->fileid)) -		 return FALSE; -	 if (!xdr_filename3 (xdrs, &objp->name)) -		 return FALSE; -	 if (!xdr_cookie3 (xdrs, &objp->cookie)) -		 return FALSE; -	 if (!xdr_pointer (xdrs, (char **)&objp->nextentry, sizeof (entry3), (xdrproc_t) xdr_entry3)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_dirlist3 (XDR *xdrs, dirlist3 *objp) -{ -	 if (!xdr_pointer (xdrs, (char **)&objp->entries, sizeof (entry3), (xdrproc_t) xdr_entry3)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->eof)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdir3resok (XDR *xdrs, readdir3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	 if (!xdr_cookieverf3 (xdrs, objp->cookieverf)) -		 return FALSE; -	 if (!xdr_dirlist3 (xdrs, &objp->reply)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdir3resfail (XDR *xdrs, readdir3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdir3res (XDR *xdrs, readdir3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_readdir3resok (xdrs, &objp->readdir3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_readdir3resfail (xdrs, &objp->readdir3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_readdirp3args (XDR *xdrs, readdirp3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->dir)) -		 return FALSE; -	 if (!xdr_cookie3 (xdrs, &objp->cookie)) -		 return FALSE; -	 if (!xdr_cookieverf3 (xdrs, objp->cookieverf)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->dircount)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->maxcount)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_entryp3 (XDR *xdrs, entryp3 *objp) -{ -	 if (!xdr_fileid3 (xdrs, &objp->fileid)) -		 return FALSE; -	 if (!xdr_filename3 (xdrs, &objp->name)) -		 return FALSE; -	 if (!xdr_cookie3 (xdrs, &objp->cookie)) -		 return FALSE; -	 if (!xdr_post_op_attr (xdrs, &objp->name_attributes)) -		 return FALSE; -	 if (!xdr_post_op_fh3 (xdrs, &objp->name_handle)) -		 return FALSE; -	 if (!xdr_pointer (xdrs, (char **)&objp->nextentry, sizeof (entryp3), (xdrproc_t) xdr_entryp3)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_dirlistp3 (XDR *xdrs, dirlistp3 *objp) -{ -	 if (!xdr_pointer (xdrs, (char **)&objp->entries, sizeof (entryp3), (xdrproc_t) xdr_entryp3)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->eof)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdirp3resok (XDR *xdrs, readdirp3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	 if (!xdr_cookieverf3 (xdrs, objp->cookieverf)) -		 return FALSE; -	 if (!xdr_dirlistp3 (xdrs, &objp->reply)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdirp3resfail (XDR *xdrs, readdirp3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->dir_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_readdirp3res (XDR *xdrs, readdirp3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_readdirp3resok (xdrs, &objp->readdirp3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_readdirp3resfail (xdrs, &objp->readdirp3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_fsstat3args (XDR *xdrs, fsstat3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->fsroot)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsstat3resok (XDR *xdrs, fsstat3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->tbytes)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->fbytes)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->abytes)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->tfiles)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->ffiles)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->afiles)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->invarsec)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsstat3resfail (XDR *xdrs, fsstat3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsstat3res (XDR *xdrs, fsstat3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_fsstat3resok (xdrs, &objp->fsstat3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_fsstat3resfail (xdrs, &objp->fsstat3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_fsinfo3args (XDR *xdrs, fsinfo3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->fsroot)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsinfo3resok (XDR *xdrs, fsinfo3resok *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->rtmax)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->rtpref)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->rtmult)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->wtmax)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->wtpref)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->wtmult)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->dtpref)) -		 return FALSE; -	 if (!xdr_size3 (xdrs, &objp->maxfilesize)) -		 return FALSE; -	 if (!xdr_nfstime3 (xdrs, &objp->time_delta)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->properties)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsinfo3resfail (XDR *xdrs, fsinfo3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_fsinfo3res (XDR *xdrs, fsinfo3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_fsinfo3resok (xdrs, &objp->fsinfo3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_fsinfo3resfail (xdrs, &objp->fsinfo3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_pathconf3args (XDR *xdrs, pathconf3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->object)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_pathconf3resok (XDR *xdrs, pathconf3resok *objp) -{ -	register int32_t *buf; - - -	if (xdrs->x_op == XDR_ENCODE) { -		 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -			 return FALSE; -		 if (!xdr_uint32 (xdrs, &objp->linkmax)) -			 return FALSE; -		 if (!xdr_uint32 (xdrs, &objp->name_max)) -			 return FALSE; -		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); -		if (buf == NULL) { -			 if (!xdr_bool (xdrs, &objp->no_trunc)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->chown_restricted)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->case_insensitive)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->case_preserving)) -				 return FALSE; -		} else { -			IXDR_PUT_BOOL(buf, objp->no_trunc); -			IXDR_PUT_BOOL(buf, objp->chown_restricted); -			IXDR_PUT_BOOL(buf, objp->case_insensitive); -			IXDR_PUT_BOOL(buf, objp->case_preserving); -		} -		return TRUE; -	} else if (xdrs->x_op == XDR_DECODE) { -		 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -			 return FALSE; -		 if (!xdr_uint32 (xdrs, &objp->linkmax)) -			 return FALSE; -		 if (!xdr_uint32 (xdrs, &objp->name_max)) -			 return FALSE; -		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); -		if (buf == NULL) { -			 if (!xdr_bool (xdrs, &objp->no_trunc)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->chown_restricted)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->case_insensitive)) -				 return FALSE; -			 if (!xdr_bool (xdrs, &objp->case_preserving)) -				 return FALSE; -		} else { -			objp->no_trunc = IXDR_GET_BOOL(buf); -			objp->chown_restricted = IXDR_GET_BOOL(buf); -			objp->case_insensitive = IXDR_GET_BOOL(buf); -			objp->case_preserving = IXDR_GET_BOOL(buf); -		} -	 return TRUE; -	} - -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->linkmax)) -		 return FALSE; -	 if (!xdr_uint32 (xdrs, &objp->name_max)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->no_trunc)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->chown_restricted)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->case_insensitive)) -		 return FALSE; -	 if (!xdr_bool (xdrs, &objp->case_preserving)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_pathconf3resfail (XDR *xdrs, pathconf3resfail *objp) -{ -	 if (!xdr_post_op_attr (xdrs, &objp->obj_attributes)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_pathconf3res (XDR *xdrs, pathconf3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_pathconf3resok (xdrs, &objp->pathconf3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_pathconf3resfail (xdrs, &objp->pathconf3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_commit3args (XDR *xdrs, commit3args *objp) -{ -	 if (!xdr_nfs_fh3 (xdrs, &objp->file)) -		 return FALSE; -	 if (!xdr_offset3 (xdrs, &objp->offset)) -		 return FALSE; -	 if (!xdr_count3 (xdrs, &objp->count)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_commit3resok (XDR *xdrs, commit3resok *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->file_wcc)) -		 return FALSE; -	 if (!xdr_writeverf3 (xdrs, objp->verf)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_commit3resfail (XDR *xdrs, commit3resfail *objp) -{ -	 if (!xdr_wcc_data (xdrs, &objp->file_wcc)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_commit3res (XDR *xdrs, commit3res *objp) -{ -	 if (!xdr_nfsstat3 (xdrs, &objp->status)) -		 return FALSE; -	switch (objp->status) { -	case NFS3_OK: -		 if (!xdr_commit3resok (xdrs, &objp->commit3res_u.resok)) -			 return FALSE; -		break; -	default: -		 if (!xdr_commit3resfail (xdrs, &objp->commit3res_u.resfail)) -			 return FALSE; -		break; -	} -	return TRUE; -} - -bool_t -xdr_fhandle3 (XDR *xdrs, fhandle3 *objp) -{ -	 if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (u_int *) &objp->fhandle3_len, FHSIZE3)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_dirpath (XDR *xdrs, dirpath *objp) -{ -	 if (!xdr_string (xdrs, objp, MNTPATHLEN)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_name (XDR *xdrs, name *objp) -{ -	 if (!xdr_string (xdrs, objp, MNTNAMLEN)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mountstat3 (XDR *xdrs, mountstat3 *objp) -{ -	 if (!xdr_enum (xdrs, (enum_t *) objp)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp) -{ -	 if (!xdr_fhandle3 (xdrs, &objp->fhandle)) -		 return FALSE; -	 if (!xdr_array (xdrs, (char **)&objp->auth_flavors.auth_flavors_val, (u_int *) &objp->auth_flavors.auth_flavors_len, ~0, -		sizeof (int), (xdrproc_t) xdr_int)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mountres3 (XDR *xdrs, mountres3 *objp) -{ -	 if (!xdr_mountstat3 (xdrs, &objp->fhs_status)) -		 return FALSE; -	switch (objp->fhs_status) { -	case MNT3_OK: -		 if (!xdr_mountres3_ok (xdrs, &objp->mountres3_u.mountinfo)) -			 return FALSE; -		break; -	default: -		break; -	} -	return TRUE; -} - -bool_t -xdr_mountlist (XDR *xdrs, mountlist *objp) -{ -	 if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct mountbody), (xdrproc_t) xdr_mountbody)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_mountbody (XDR *xdrs, mountbody *objp) -{ -	 if (!xdr_name (xdrs, &objp->ml_hostname)) -		 return FALSE; -	 if (!xdr_dirpath (xdrs, &objp->ml_directory)) -		 return FALSE; -	 if (!xdr_mountlist (xdrs, &objp->ml_next)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_groups (XDR *xdrs, groups *objp) -{ -	 if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct groupnode), (xdrproc_t) xdr_groupnode)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_groupnode (XDR *xdrs, groupnode *objp) -{ -	 if (!xdr_name (xdrs, &objp->gr_name)) -		 return FALSE; -	 if (!xdr_groups (xdrs, &objp->gr_next)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_exports (XDR *xdrs, exports *objp) -{ -	 if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct exportnode), (xdrproc_t) xdr_exportnode)) -		 return FALSE; -	return TRUE; -} - -bool_t -xdr_exportnode (XDR *xdrs, exportnode *objp) -{ -	 if (!xdr_dirpath (xdrs, &objp->ex_dir)) -		 return FALSE; -	 if (!xdr_groups (xdrs, &objp->ex_groups)) -		 return FALSE; -	 if (!xdr_exports (xdrs, &objp->ex_next)) -		 return FALSE; -	return TRUE; -} - -void -xdr_free_exports_list (struct exportnode *first) -{ -        struct exportnode       *elist = NULL; - -        if (!first) -                return; - -        while (first) { -                elist = first->ex_next; -                if (first->ex_dir) -                        GF_FREE (first->ex_dir); - -                if (first->ex_groups) { -                        if (first->ex_groups->gr_name) -                                GF_FREE (first->ex_groups->gr_name); -                        GF_FREE (first->ex_groups); -                } - -                GF_FREE (first); -                first = elist; -        } - -} - - -void -xdr_free_mountlist (mountlist ml) -{ -        struct mountbody        *next = NULL; - -        if (!ml) -                return; - -        while (ml) { -                GF_FREE (ml->ml_hostname); -                GF_FREE (ml->ml_directory); -                next = ml->ml_next; -                GF_FREE (ml); -                ml = next; -        } - -        return; -} - - -/* Free statements are based on the way sunrpc xdr decoding - * code performs memory allocations. - */ -void -xdr_free_write3args_nocopy (write3args *wa) -{ -        if (!wa) -                return; - -        FREE (wa->file.data.data_val); -} - - diff --git a/xlators/nfs/lib/src/xdr-nfs3.h b/xlators/nfs/lib/src/xdr-nfs3.h deleted file mode 100644 index 0530876a8de..00000000000 --- a/xlators/nfs/lib/src/xdr-nfs3.h +++ /dev/null @@ -1,1206 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _XDR_NFS3_H -#define _XDR_NFS3_H - -#include <rpc/rpc.h> -#include <sys/types.h> - -#define NFS3_FHSIZE             64 -#define NFS3_COOKIEVERFSIZE     8 -#define NFS3_CREATEVERFSIZE     8 -#define NFS3_WRITEVERFSIZE      8 - -#define NFS3_ENTRY3_FIXED_SIZE  24 -#define NFS3_POSTOPATTR_SIZE    88 -#define NFS3_READDIR_RESOK_SIZE (NFS3_POSTOPATTR_SIZE + sizeof (bool_t) + NFS3_COOKIEVERFSIZE) - -/* In size of post_op_fh3, the length of the file handle will have to be - * included separately since we have variable length fh. Here we only account - * for the field for handle_follows and for the file handle length field. - */ -#define NFS3_POSTOPFH3_FIXED_SIZE     (sizeof (bool_t) + sizeof (uint32_t)) - -/* Similarly, the size of the entry will have to include the variable length - * file handle and the length of the entry name. - */ -#define NFS3_ENTRYP3_FIXED_SIZE  (NFS3_ENTRY3_FIXED_SIZE + NFS3_POSTOPATTR_SIZE + NFS3_POSTOPFH3_FIXED_SIZE) - -typedef uint64_t uint64; -typedef int64_t int64; -typedef uint32_t uint32; -typedef int32_t int32; -typedef char *filename3; -typedef char *nfspath3; -typedef uint64 fileid3; -typedef uint64 cookie3; -typedef char cookieverf3[NFS3_COOKIEVERFSIZE]; -typedef char createverf3[NFS3_CREATEVERFSIZE]; -typedef char writeverf3[NFS3_WRITEVERFSIZE]; -typedef uint32 uid3; -typedef uint32 gid3; -typedef uint64 size3; -typedef uint64 offset3; -typedef uint32 mode3; -typedef uint32 count3; - -#define NFS3MODE_SETXUID        0x00800 -#define NFS3MODE_SETXGID        0x00400 -#define NFS3MODE_SAVESWAPTXT    0x00200 -#define NFS3MODE_ROWNER         0x00100 -#define NFS3MODE_WOWNER         0x00080 -#define NFS3MODE_XOWNER         0x00040 -#define NFS3MODE_RGROUP         0x00020 -#define NFS3MODE_WGROUP         0x00010 -#define NFS3MODE_XGROUP         0x00008 -#define NFS3MODE_ROTHER         0x00004 -#define NFS3MODE_WOTHER         0x00002 -#define NFS3MODE_XOTHER         0x00001 - -enum nfsstat3 { -	NFS3_OK = 0, -	NFS3ERR_PERM = 1, -	NFS3ERR_NOENT = 2, -	NFS3ERR_IO = 5, -	NFS3ERR_NXIO = 6, -	NFS3ERR_ACCES = 13, -	NFS3ERR_EXIST = 17, -	NFS3ERR_XDEV = 18, -	NFS3ERR_NODEV = 19, -	NFS3ERR_NOTDIR = 20, -	NFS3ERR_ISDIR = 21, -	NFS3ERR_INVAL = 22, -	NFS3ERR_FBIG = 27, -	NFS3ERR_NOSPC = 28, -	NFS3ERR_ROFS = 30, -	NFS3ERR_MLINK = 31, -	NFS3ERR_NAMETOOLONG = 63, -	NFS3ERR_NOTEMPTY = 66, -	NFS3ERR_DQUOT = 69, -	NFS3ERR_STALE = 70, -	NFS3ERR_REMOTE = 71, -	NFS3ERR_BADHANDLE = 10001, -	NFS3ERR_NOT_SYNC = 10002, -	NFS3ERR_BAD_COOKIE = 10003, -	NFS3ERR_NOTSUPP = 10004, -	NFS3ERR_TOOSMALL = 10005, -	NFS3ERR_SERVERFAULT = 10006, -	NFS3ERR_BADTYPE = 10007, -	NFS3ERR_JUKEBOX = 10008, -}; -typedef enum nfsstat3 nfsstat3; - -enum ftype3 { -	NF3REG = 1, -	NF3DIR = 2, -	NF3BLK = 3, -	NF3CHR = 4, -	NF3LNK = 5, -	NF3SOCK = 6, -	NF3FIFO = 7, -}; -typedef enum ftype3 ftype3; - -struct specdata3 { -	uint32 specdata1; -	uint32 specdata2; -}; -typedef struct specdata3 specdata3; - -struct nfs_fh3 { -	struct { -		u_int data_len; -		char *data_val; -	} data; -}; -typedef struct nfs_fh3 nfs_fh3; - -struct nfstime3 { -	uint32 seconds; -	uint32 nseconds; -}; -typedef struct nfstime3 nfstime3; - -struct fattr3 { -	ftype3 type; -	mode3 mode; -	uint32 nlink; -	uid3 uid; -	gid3 gid; -	size3 size; -	size3 used; -	specdata3 rdev; -	uint64 fsid; -	fileid3 fileid; -	nfstime3 atime; -	nfstime3 mtime; -	nfstime3 ctime; -}; -typedef struct fattr3 fattr3; - -struct post_op_attr { -	bool_t attributes_follow; -	union { -		fattr3 attributes; -	} post_op_attr_u; -}; -typedef struct post_op_attr post_op_attr; - -struct wcc_attr { -	size3 size; -	nfstime3 mtime; -	nfstime3 ctime; -}; -typedef struct wcc_attr wcc_attr; - -struct pre_op_attr { -	bool_t attributes_follow; -	union { -		wcc_attr attributes; -	} pre_op_attr_u; -}; -typedef struct pre_op_attr pre_op_attr; - -struct wcc_data { -	pre_op_attr before; -	post_op_attr after; -}; -typedef struct wcc_data wcc_data; - -struct post_op_fh3 { -	bool_t handle_follows; -	union { -		nfs_fh3 handle; -	} post_op_fh3_u; -}; -typedef struct post_op_fh3 post_op_fh3; - -enum time_how { -	DONT_CHANGE = 0, -	SET_TO_SERVER_TIME = 1, -	SET_TO_CLIENT_TIME = 2, -}; -typedef enum time_how time_how; - -struct set_mode3 { -	bool_t set_it; -	union { -		mode3 mode; -	} set_mode3_u; -}; -typedef struct set_mode3 set_mode3; - -struct set_uid3 { -	bool_t set_it; -	union { -		uid3 uid; -	} set_uid3_u; -}; -typedef struct set_uid3 set_uid3; - -struct set_gid3 { -	bool_t set_it; -	union { -		gid3 gid; -	} set_gid3_u; -}; -typedef struct set_gid3 set_gid3; - -struct set_size3 { -	bool_t set_it; -	union { -		size3 size; -	} set_size3_u; -}; -typedef struct set_size3 set_size3; - -struct set_atime { -	time_how set_it; -	union { -		nfstime3 atime; -	} set_atime_u; -}; -typedef struct set_atime set_atime; - -struct set_mtime { -	time_how set_it; -	union { -		nfstime3 mtime; -	} set_mtime_u; -}; -typedef struct set_mtime set_mtime; - -struct sattr3 { -	set_mode3 mode; -	set_uid3 uid; -	set_gid3 gid; -	set_size3 size; -	set_atime atime; -	set_mtime mtime; -}; -typedef struct sattr3 sattr3; - -struct diropargs3 { -	nfs_fh3 dir; -	filename3 name; -}; -typedef struct diropargs3 diropargs3; - -struct getattr3args { -	nfs_fh3 object; -}; -typedef struct getattr3args getattr3args; - -struct getattr3resok { -	fattr3 obj_attributes; -}; -typedef struct getattr3resok getattr3resok; - -struct getattr3res { -	nfsstat3 status; -	union { -		getattr3resok resok; -	} getattr3res_u; -}; -typedef struct getattr3res getattr3res; - -struct sattrguard3 { -	bool_t check; -	union { -		nfstime3 obj_ctime; -	} sattrguard3_u; -}; -typedef struct sattrguard3 sattrguard3; - -struct setattr3args { -	nfs_fh3 object; -	sattr3 new_attributes; -	sattrguard3 guard; -}; -typedef struct setattr3args setattr3args; - -struct setattr3resok { -	wcc_data obj_wcc; -}; -typedef struct setattr3resok setattr3resok; - -struct setattr3resfail { -	wcc_data obj_wcc; -}; -typedef struct setattr3resfail setattr3resfail; - -struct setattr3res { -	nfsstat3 status; -	union { -		setattr3resok resok; -		setattr3resfail resfail; -	} setattr3res_u; -}; -typedef struct setattr3res setattr3res; - -struct lookup3args { -	diropargs3 what; -}; -typedef struct lookup3args lookup3args; - -struct lookup3resok { -	nfs_fh3 object; -	post_op_attr obj_attributes; -	post_op_attr dir_attributes; -}; -typedef struct lookup3resok lookup3resok; - -struct lookup3resfail { -	post_op_attr dir_attributes; -}; -typedef struct lookup3resfail lookup3resfail; - -struct lookup3res { -	nfsstat3 status; -	union { -		lookup3resok resok; -		lookup3resfail resfail; -	} lookup3res_u; -}; -typedef struct lookup3res lookup3res; -#define ACCESS3_READ 0x0001 -#define ACCESS3_LOOKUP 0x0002 -#define ACCESS3_MODIFY 0x0004 -#define ACCESS3_EXTEND 0x0008 -#define ACCESS3_DELETE 0x0010 -#define ACCESS3_EXECUTE 0x0020 - -struct access3args { -	nfs_fh3 object; -	uint32 access; -}; -typedef struct access3args access3args; - -struct access3resok { -	post_op_attr obj_attributes; -	uint32 access; -}; -typedef struct access3resok access3resok; - -struct access3resfail { -	post_op_attr obj_attributes; -}; -typedef struct access3resfail access3resfail; - -struct access3res { -	nfsstat3 status; -	union { -		access3resok resok; -		access3resfail resfail; -	} access3res_u; -}; -typedef struct access3res access3res; - -struct readlink3args { -	nfs_fh3 symlink; -}; -typedef struct readlink3args readlink3args; - -struct readlink3resok { -	post_op_attr symlink_attributes; -	nfspath3 data; -}; -typedef struct readlink3resok readlink3resok; - -struct readlink3resfail { -	post_op_attr symlink_attributes; -}; -typedef struct readlink3resfail readlink3resfail; - -struct readlink3res { -	nfsstat3 status; -	union { -		readlink3resok resok; -		readlink3resfail resfail; -	} readlink3res_u; -}; -typedef struct readlink3res readlink3res; - -struct read3args { -	nfs_fh3 file; -	offset3 offset; -	count3 count; -}; -typedef struct read3args read3args; - -struct read3resok { -	post_op_attr file_attributes; -	count3 count; -	bool_t eof; -	struct { -		u_int data_len; -		char *data_val; -	} data; -}; -typedef struct read3resok read3resok; - -struct read3resfail { -	post_op_attr file_attributes; -}; -typedef struct read3resfail read3resfail; - -struct read3res { -	nfsstat3 status; -	union { -		read3resok resok; -		read3resfail resfail; -	} read3res_u; -}; -typedef struct read3res read3res; - -enum stable_how { -	UNSTABLE = 0, -	DATA_SYNC = 1, -	FILE_SYNC = 2, -}; -typedef enum stable_how stable_how; - -struct write3args { -	nfs_fh3 file; -	offset3 offset; -	count3 count; -	stable_how stable; -	struct { -		u_int data_len; -		char *data_val; -	} data; -}; -typedef struct write3args write3args; - -/* Generally, the protocol allows the file handle to be less than 64 bytes but - * our server does not return file handles less than 64b so we can safely say - * sizeof (nfs_fh3) rather than first trying to extract the fh size of the - * network followed by a sized-read of the file handle. - */ -#define NFS3_WRITE3ARGS_SIZE    (sizeof (uint32_t) + NFS3_FHSIZE + sizeof (offset3) + sizeof (count3) + sizeof (uint32_t)) -struct write3resok { -	wcc_data file_wcc; -	count3 count; -	stable_how committed; -	writeverf3 verf; -}; -typedef struct write3resok write3resok; - -struct write3resfail { -	wcc_data file_wcc; -}; -typedef struct write3resfail write3resfail; - -struct write3res { -	nfsstat3 status; -	union { -		write3resok resok; -		write3resfail resfail; -	} write3res_u; -}; -typedef struct write3res write3res; - -enum createmode3 { -	UNCHECKED = 0, -	GUARDED = 1, -	EXCLUSIVE = 2, -}; -typedef enum createmode3 createmode3; - -struct createhow3 { -	createmode3 mode; -	union { -		sattr3 obj_attributes; -		createverf3 verf; -	} createhow3_u; -}; -typedef struct createhow3 createhow3; - -struct create3args { -	diropargs3 where; -	createhow3 how; -}; -typedef struct create3args create3args; - -struct create3resok { -	post_op_fh3 obj; -	post_op_attr obj_attributes; -	wcc_data dir_wcc; -}; -typedef struct create3resok create3resok; - -struct create3resfail { -	wcc_data dir_wcc; -}; -typedef struct create3resfail create3resfail; - -struct create3res { -	nfsstat3 status; -	union { -		create3resok resok; -		create3resfail resfail; -	} create3res_u; -}; -typedef struct create3res create3res; - -struct mkdir3args { -	diropargs3 where; -	sattr3 attributes; -}; -typedef struct mkdir3args mkdir3args; - -struct mkdir3resok { -	post_op_fh3 obj; -	post_op_attr obj_attributes; -	wcc_data dir_wcc; -}; -typedef struct mkdir3resok mkdir3resok; - -struct mkdir3resfail { -	wcc_data dir_wcc; -}; -typedef struct mkdir3resfail mkdir3resfail; - -struct mkdir3res { -	nfsstat3 status; -	union { -		mkdir3resok resok; -		mkdir3resfail resfail; -	} mkdir3res_u; -}; -typedef struct mkdir3res mkdir3res; - -struct symlinkdata3 { -	sattr3 symlink_attributes; -	nfspath3 symlink_data; -}; -typedef struct symlinkdata3 symlinkdata3; - -struct symlink3args { -	diropargs3 where; -	symlinkdata3 symlink; -}; -typedef struct symlink3args symlink3args; - -struct symlink3resok { -	post_op_fh3 obj; -	post_op_attr obj_attributes; -	wcc_data dir_wcc; -}; -typedef struct symlink3resok symlink3resok; - -struct symlink3resfail { -	wcc_data dir_wcc; -}; -typedef struct symlink3resfail symlink3resfail; - -struct symlink3res { -	nfsstat3 status; -	union { -		symlink3resok resok; -		symlink3resfail resfail; -	} symlink3res_u; -}; -typedef struct symlink3res symlink3res; - -struct devicedata3 { -	sattr3 dev_attributes; -	specdata3 spec; -}; -typedef struct devicedata3 devicedata3; - -struct mknoddata3 { -	ftype3 type; -	union { -		devicedata3 device; -		sattr3 pipe_attributes; -	} mknoddata3_u; -}; -typedef struct mknoddata3 mknoddata3; - -struct mknod3args { -	diropargs3 where; -	mknoddata3 what; -}; -typedef struct mknod3args mknod3args; - -struct mknod3resok { -	post_op_fh3 obj; -	post_op_attr obj_attributes; -	wcc_data dir_wcc; -}; -typedef struct mknod3resok mknod3resok; - -struct mknod3resfail { -	wcc_data dir_wcc; -}; -typedef struct mknod3resfail mknod3resfail; - -struct mknod3res { -	nfsstat3 status; -	union { -		mknod3resok resok; -		mknod3resfail resfail; -	} mknod3res_u; -}; -typedef struct mknod3res mknod3res; - -struct remove3args { -	diropargs3 object; -}; -typedef struct remove3args remove3args; - -struct remove3resok { -	wcc_data dir_wcc; -}; -typedef struct remove3resok remove3resok; - -struct remove3resfail { -	wcc_data dir_wcc; -}; -typedef struct remove3resfail remove3resfail; - -struct remove3res { -	nfsstat3 status; -	union { -		remove3resok resok; -		remove3resfail resfail; -	} remove3res_u; -}; -typedef struct remove3res remove3res; - -struct rmdir3args { -	diropargs3 object; -}; -typedef struct rmdir3args rmdir3args; - -struct rmdir3resok { -	wcc_data dir_wcc; -}; -typedef struct rmdir3resok rmdir3resok; - -struct rmdir3resfail { -	wcc_data dir_wcc; -}; -typedef struct rmdir3resfail rmdir3resfail; - -struct rmdir3res { -	nfsstat3 status; -	union { -		rmdir3resok resok; -		rmdir3resfail resfail; -	} rmdir3res_u; -}; -typedef struct rmdir3res rmdir3res; - -struct rename3args { -	diropargs3 from; -	diropargs3 to; -}; -typedef struct rename3args rename3args; - -struct rename3resok { -	wcc_data fromdir_wcc; -	wcc_data todir_wcc; -}; -typedef struct rename3resok rename3resok; - -struct rename3resfail { -	wcc_data fromdir_wcc; -	wcc_data todir_wcc; -}; -typedef struct rename3resfail rename3resfail; - -struct rename3res { -	nfsstat3 status; -	union { -		rename3resok resok; -		rename3resfail resfail; -	} rename3res_u; -}; -typedef struct rename3res rename3res; - -struct link3args { -	nfs_fh3 file; -	diropargs3 link; -}; -typedef struct link3args link3args; - -struct link3resok { -	post_op_attr file_attributes; -	wcc_data linkdir_wcc; -}; -typedef struct link3resok link3resok; - -struct link3resfail { -	post_op_attr file_attributes; -	wcc_data linkdir_wcc; -}; -typedef struct link3resfail link3resfail; - -struct link3res { -	nfsstat3 status; -	union { -		link3resok resok; -		link3resfail resfail; -	} link3res_u; -}; -typedef struct link3res link3res; - -struct readdir3args { -	nfs_fh3 dir; -	cookie3 cookie; -	cookieverf3 cookieverf; -	count3 count; -}; -typedef struct readdir3args readdir3args; - -struct entry3 { -	fileid3 fileid; -	filename3 name; -	cookie3 cookie; -	struct entry3 *nextentry; -}; -typedef struct entry3 entry3; - -struct dirlist3 { -	entry3 *entries; -	bool_t eof; -}; -typedef struct dirlist3 dirlist3; - -struct readdir3resok { -	post_op_attr dir_attributes; -	cookieverf3 cookieverf; -	dirlist3 reply; -}; -typedef struct readdir3resok readdir3resok; - -struct readdir3resfail { -	post_op_attr dir_attributes; -}; -typedef struct readdir3resfail readdir3resfail; - -struct readdir3res { -	nfsstat3 status; -	union { -		readdir3resok resok; -		readdir3resfail resfail; -	} readdir3res_u; -}; -typedef struct readdir3res readdir3res; - -struct readdirp3args { -	nfs_fh3 dir; -	cookie3 cookie; -	cookieverf3 cookieverf; -	count3 dircount; -	count3 maxcount; -}; -typedef struct readdirp3args readdirp3args; - -struct entryp3 { -	fileid3 fileid; -	filename3 name; -	cookie3 cookie; -	post_op_attr name_attributes; -	post_op_fh3 name_handle; -	struct entryp3 *nextentry; -}; -typedef struct entryp3 entryp3; - -struct dirlistp3 { -	entryp3 *entries; -	bool_t eof; -}; -typedef struct dirlistp3 dirlistp3; - -struct readdirp3resok { -	post_op_attr dir_attributes; -	cookieverf3 cookieverf; -	dirlistp3   reply; -}; -typedef struct readdirp3resok readdirp3resok; - -struct readdirp3resfail { -	post_op_attr dir_attributes; -}; -typedef struct readdirp3resfail readdirp3resfail; - -struct readdirp3res { -	nfsstat3 status; -	union { -		readdirp3resok resok; -		readdirp3resfail resfail; -	} readdirp3res_u; -}; -typedef struct readdirp3res readdirp3res; - -struct fsstat3args { -	nfs_fh3 fsroot; -}; -typedef struct fsstat3args fsstat3args; - -struct fsstat3resok { -	post_op_attr obj_attributes; -	size3 tbytes; -	size3 fbytes; -	size3 abytes; -	size3 tfiles; -	size3 ffiles; -	size3 afiles; -	uint32 invarsec; -}; -typedef struct fsstat3resok fsstat3resok; - -struct fsstat3resfail { -	post_op_attr obj_attributes; -}; -typedef struct fsstat3resfail fsstat3resfail; - -struct fsstat3res { -	nfsstat3 status; -	union { -		fsstat3resok resok; -		fsstat3resfail resfail; -	} fsstat3res_u; -}; -typedef struct fsstat3res fsstat3res; -#define FSF3_LINK 0x0001 -#define FSF3_SYMLINK 0x0002 -#define FSF3_HOMOGENEOUS 0x0008 -#define FSF3_CANSETTIME 0x0010 - -struct fsinfo3args { -	nfs_fh3 fsroot; -}; -typedef struct fsinfo3args fsinfo3args; - -struct fsinfo3resok { -	post_op_attr obj_attributes; -	uint32 rtmax; -	uint32 rtpref; -	uint32 rtmult; -	uint32 wtmax; -	uint32 wtpref; -	uint32 wtmult; -	uint32 dtpref; -	size3 maxfilesize; -	nfstime3 time_delta; -	uint32 properties; -}; -typedef struct fsinfo3resok fsinfo3resok; - -struct fsinfo3resfail { -	post_op_attr obj_attributes; -}; -typedef struct fsinfo3resfail fsinfo3resfail; - -struct fsinfo3res { -	nfsstat3 status; -	union { -		fsinfo3resok resok; -		fsinfo3resfail resfail; -	} fsinfo3res_u; -}; -typedef struct fsinfo3res fsinfo3res; - -struct pathconf3args { -	nfs_fh3 object; -}; -typedef struct pathconf3args pathconf3args; - -struct pathconf3resok { -	post_op_attr obj_attributes; -	uint32 linkmax; -	uint32 name_max; -	bool_t no_trunc; -	bool_t chown_restricted; -	bool_t case_insensitive; -	bool_t case_preserving; -}; -typedef struct pathconf3resok pathconf3resok; - -struct pathconf3resfail { -	post_op_attr obj_attributes; -}; -typedef struct pathconf3resfail pathconf3resfail; - -struct pathconf3res { -	nfsstat3 status; -	union { -		pathconf3resok resok; -		pathconf3resfail resfail; -	} pathconf3res_u; -}; -typedef struct pathconf3res pathconf3res; - -struct commit3args { -	nfs_fh3 file; -	offset3 offset; -	count3 count; -}; -typedef struct commit3args commit3args; - -struct commit3resok { -	wcc_data file_wcc; -	writeverf3 verf; -}; -typedef struct commit3resok commit3resok; - -struct commit3resfail { -	wcc_data file_wcc; -}; -typedef struct commit3resfail commit3resfail; - -struct commit3res { -	nfsstat3 status; -	union { -		commit3resok resok; -		commit3resfail resfail; -	} commit3res_u; -}; -typedef struct commit3res commit3res; -#define MNTPATHLEN 1024 -#define MNTNAMLEN 255 -#define FHSIZE3 NFS3_FHSIZE - -typedef struct { -	u_int fhandle3_len; -	char *fhandle3_val; -} fhandle3; - -typedef char *dirpath; - -typedef char *name; - -enum mountstat3 { -	MNT3_OK = 0, -	MNT3ERR_PERM = 1, -	MNT3ERR_NOENT = 2, -	MNT3ERR_IO = 5, -	MNT3ERR_ACCES = 13, -	MNT3ERR_NOTDIR = 20, -	MNT3ERR_INVAL = 22, -	MNT3ERR_NAMETOOLONG = 63, -	MNT3ERR_NOTSUPP = 10004, -	MNT3ERR_SERVERFAULT = 10006, -}; -typedef enum mountstat3 mountstat3; - -struct mountres3_ok { -	fhandle3 fhandle; -	struct { -		u_int auth_flavors_len; -		int *auth_flavors_val; -	} auth_flavors; -}; -typedef struct mountres3_ok mountres3_ok; - -struct mountres3 { -	mountstat3 fhs_status; -	union { -		mountres3_ok mountinfo; -	} mountres3_u; -}; -typedef struct mountres3 mountres3; - -typedef struct mountbody *mountlist; - -struct mountbody { -	name ml_hostname; -	dirpath ml_directory; -	mountlist ml_next; -}; -typedef struct mountbody mountbody; - -typedef struct groupnode *groups; - -struct groupnode { -	name gr_name; -	groups gr_next; -}; -typedef struct groupnode groupnode; - -typedef struct exportnode *exports; - -struct exportnode { -	dirpath ex_dir; -	groups ex_groups; -	exports ex_next; -}; -typedef struct exportnode exportnode; - -#define NFS_PROGRAM             100003 -#define NFS_V3                  3 - -#define NFS3_NULL               0 -#define NFS3_GETATTR            1 -#define NFS3_SETATTR            2 -#define NFS3_LOOKUP             3 -#define NFS3_ACCESS             4 -#define NFS3_READLINK           5 -#define NFS3_READ               6 -#define NFS3_WRITE              7 -#define NFS3_CREATE             8 -#define NFS3_MKDIR              9 -#define NFS3_SYMLINK            10 -#define NFS3_MKNOD              11 -#define NFS3_REMOVE             12 -#define NFS3_RMDIR              13 -#define NFS3_RENAME             14 -#define NFS3_LINK               15 -#define NFS3_READDIR            16 -#define NFS3_READDIRP           17 -#define NFS3_FSSTAT             18 -#define NFS3_FSINFO             19 -#define NFS3_PATHCONF           20 -#define NFS3_COMMIT             21 -#define NFS3_PROC_COUNT         22 - -#define MOUNT_PROGRAM           100005 -#define MOUNT_V3                3 -#define MOUNT_V1                1 - -#define MOUNT3_NULL             0 -#define MOUNT3_MNT              1 -#define MOUNT3_DUMP             2 -#define MOUNT3_UMNT             3 -#define MOUNT3_UMNTALL          4 -#define MOUNT3_EXPORT           5 -#define MOUNT3_PROC_COUNT       6 - -#define MOUNT1_NULL             0 -#define MOUNT1_DUMP             2 -#define MOUNT1_UMNT             3 -#define MOUNT1_EXPORT           5 -#define MOUNT1_PROC_COUNT       6 -/* the xdr functions */ - -extern  bool_t xdr_uint64 (XDR *, uint64*); -extern  bool_t xdr_int64 (XDR *, int64*); -extern  bool_t xdr_uint32 (XDR *, uint32*); -extern  bool_t xdr_int32 (XDR *, int32*); -extern  bool_t xdr_filename3 (XDR *, filename3*); -extern  bool_t xdr_nfspath3 (XDR *, nfspath3*); -extern  bool_t xdr_fileid3 (XDR *, fileid3*); -extern  bool_t xdr_cookie3 (XDR *, cookie3*); -extern  bool_t xdr_cookieverf3 (XDR *, cookieverf3); -extern  bool_t xdr_createverf3 (XDR *, createverf3); -extern  bool_t xdr_writeverf3 (XDR *, writeverf3); -extern  bool_t xdr_uid3 (XDR *, uid3*); -extern  bool_t xdr_gid3 (XDR *, gid3*); -extern  bool_t xdr_size3 (XDR *, size3*); -extern  bool_t xdr_offset3 (XDR *, offset3*); -extern  bool_t xdr_mode3 (XDR *, mode3*); -extern  bool_t xdr_count3 (XDR *, count3*); -extern  bool_t xdr_nfsstat3 (XDR *, nfsstat3*); -extern  bool_t xdr_ftype3 (XDR *, ftype3*); -extern  bool_t xdr_specdata3 (XDR *, specdata3*); -extern  bool_t xdr_nfs_fh3 (XDR *, nfs_fh3*); -extern  bool_t xdr_nfstime3 (XDR *, nfstime3*); -extern  bool_t xdr_fattr3 (XDR *, fattr3*); -extern  bool_t xdr_post_op_attr (XDR *, post_op_attr*); -extern  bool_t xdr_wcc_attr (XDR *, wcc_attr*); -extern  bool_t xdr_pre_op_attr (XDR *, pre_op_attr*); -extern  bool_t xdr_wcc_data (XDR *, wcc_data*); -extern  bool_t xdr_post_op_fh3 (XDR *, post_op_fh3*); -extern  bool_t xdr_time_how (XDR *, time_how*); -extern  bool_t xdr_set_mode3 (XDR *, set_mode3*); -extern  bool_t xdr_set_uid3 (XDR *, set_uid3*); -extern  bool_t xdr_set_gid3 (XDR *, set_gid3*); -extern  bool_t xdr_set_size3 (XDR *, set_size3*); -extern  bool_t xdr_set_atime (XDR *, set_atime*); -extern  bool_t xdr_set_mtime (XDR *, set_mtime*); -extern  bool_t xdr_sattr3 (XDR *, sattr3*); -extern  bool_t xdr_diropargs3 (XDR *, diropargs3*); -extern  bool_t xdr_getattr3args (XDR *, getattr3args*); -extern  bool_t xdr_getattr3resok (XDR *, getattr3resok*); -extern  bool_t xdr_getattr3res (XDR *, getattr3res*); -extern  bool_t xdr_sattrguard3 (XDR *, sattrguard3*); -extern  bool_t xdr_setattr3args (XDR *, setattr3args*); -extern  bool_t xdr_setattr3resok (XDR *, setattr3resok*); -extern  bool_t xdr_setattr3resfail (XDR *, setattr3resfail*); -extern  bool_t xdr_setattr3res (XDR *, setattr3res*); -extern  bool_t xdr_lookup3args (XDR *, lookup3args*); -extern  bool_t xdr_lookup3resok (XDR *, lookup3resok*); -extern  bool_t xdr_lookup3resfail (XDR *, lookup3resfail*); -extern  bool_t xdr_lookup3res (XDR *, lookup3res*); -extern  bool_t xdr_access3args (XDR *, access3args*); -extern  bool_t xdr_access3resok (XDR *, access3resok*); -extern  bool_t xdr_access3resfail (XDR *, access3resfail*); -extern  bool_t xdr_access3res (XDR *, access3res*); -extern  bool_t xdr_readlink3args (XDR *, readlink3args*); -extern  bool_t xdr_readlink3resok (XDR *, readlink3resok*); -extern  bool_t xdr_readlink3resfail (XDR *, readlink3resfail*); -extern  bool_t xdr_readlink3res (XDR *, readlink3res*); -extern  bool_t xdr_read3args (XDR *, read3args*); -extern  bool_t xdr_read3resok (XDR *, read3resok*); -extern  bool_t xdr_read3resfail (XDR *, read3resfail*); -extern  bool_t xdr_read3res (XDR *, read3res*); -extern  bool_t xdr_read3res_nocopy (XDR *xdrs, read3res *objp); -extern  bool_t xdr_stable_how (XDR *, stable_how*); -extern  bool_t xdr_write3args (XDR *, write3args*); -extern  bool_t xdr_write3resok (XDR *, write3resok*); -extern  bool_t xdr_write3resfail (XDR *, write3resfail*); -extern  bool_t xdr_write3res (XDR *, write3res*); -extern  bool_t xdr_createmode3 (XDR *, createmode3*); -extern  bool_t xdr_createhow3 (XDR *, createhow3*); -extern  bool_t xdr_create3args (XDR *, create3args*); -extern  bool_t xdr_create3resok (XDR *, create3resok*); -extern  bool_t xdr_create3resfail (XDR *, create3resfail*); -extern  bool_t xdr_create3res (XDR *, create3res*); -extern  bool_t xdr_mkdir3args (XDR *, mkdir3args*); -extern  bool_t xdr_mkdir3resok (XDR *, mkdir3resok*); -extern  bool_t xdr_mkdir3resfail (XDR *, mkdir3resfail*); -extern  bool_t xdr_mkdir3res (XDR *, mkdir3res*); -extern  bool_t xdr_symlinkdata3 (XDR *, symlinkdata3*); -extern  bool_t xdr_symlink3args (XDR *, symlink3args*); -extern  bool_t xdr_symlink3resok (XDR *, symlink3resok*); -extern  bool_t xdr_symlink3resfail (XDR *, symlink3resfail*); -extern  bool_t xdr_symlink3res (XDR *, symlink3res*); -extern  bool_t xdr_devicedata3 (XDR *, devicedata3*); -extern  bool_t xdr_mknoddata3 (XDR *, mknoddata3*); -extern  bool_t xdr_mknod3args (XDR *, mknod3args*); -extern  bool_t xdr_mknod3resok (XDR *, mknod3resok*); -extern  bool_t xdr_mknod3resfail (XDR *, mknod3resfail*); -extern  bool_t xdr_mknod3res (XDR *, mknod3res*); -extern  bool_t xdr_remove3args (XDR *, remove3args*); -extern  bool_t xdr_remove3resok (XDR *, remove3resok*); -extern  bool_t xdr_remove3resfail (XDR *, remove3resfail*); -extern  bool_t xdr_remove3res (XDR *, remove3res*); -extern  bool_t xdr_rmdir3args (XDR *, rmdir3args*); -extern  bool_t xdr_rmdir3resok (XDR *, rmdir3resok*); -extern  bool_t xdr_rmdir3resfail (XDR *, rmdir3resfail*); -extern  bool_t xdr_rmdir3res (XDR *, rmdir3res*); -extern  bool_t xdr_rename3args (XDR *, rename3args*); -extern  bool_t xdr_rename3resok (XDR *, rename3resok*); -extern  bool_t xdr_rename3resfail (XDR *, rename3resfail*); -extern  bool_t xdr_rename3res (XDR *, rename3res*); -extern  bool_t xdr_link3args (XDR *, link3args*); -extern  bool_t xdr_link3resok (XDR *, link3resok*); -extern  bool_t xdr_link3resfail (XDR *, link3resfail*); -extern  bool_t xdr_link3res (XDR *, link3res*); -extern  bool_t xdr_readdir3args (XDR *, readdir3args*); -extern  bool_t xdr_entry3 (XDR *, entry3*); -extern  bool_t xdr_dirlist3 (XDR *, dirlist3*); -extern  bool_t xdr_readdir3resok (XDR *, readdir3resok*); -extern  bool_t xdr_readdir3resfail (XDR *, readdir3resfail*); -extern  bool_t xdr_readdir3res (XDR *, readdir3res*); -extern  bool_t xdr_readdirp3args (XDR *, readdirp3args*); -extern  bool_t xdr_entryp3 (XDR *, entryp3*); -extern  bool_t xdr_dirlistp3 (XDR *, dirlistp3*); -extern  bool_t xdr_readdirp3resok (XDR *, readdirp3resok*); -extern  bool_t xdr_readdirp3resfail (XDR *, readdirp3resfail*); -extern  bool_t xdr_readdirp3res (XDR *, readdirp3res*); -extern  bool_t xdr_fsstat3args (XDR *, fsstat3args*); -extern  bool_t xdr_fsstat3resok (XDR *, fsstat3resok*); -extern  bool_t xdr_fsstat3resfail (XDR *, fsstat3resfail*); -extern  bool_t xdr_fsstat3res (XDR *, fsstat3res*); -extern  bool_t xdr_fsinfo3args (XDR *, fsinfo3args*); -extern  bool_t xdr_fsinfo3resok (XDR *, fsinfo3resok*); -extern  bool_t xdr_fsinfo3resfail (XDR *, fsinfo3resfail*); -extern  bool_t xdr_fsinfo3res (XDR *, fsinfo3res*); -extern  bool_t xdr_pathconf3args (XDR *, pathconf3args*); -extern  bool_t xdr_pathconf3resok (XDR *, pathconf3resok*); -extern  bool_t xdr_pathconf3resfail (XDR *, pathconf3resfail*); -extern  bool_t xdr_pathconf3res (XDR *, pathconf3res*); -extern  bool_t xdr_commit3args (XDR *, commit3args*); -extern  bool_t xdr_commit3resok (XDR *, commit3resok*); -extern  bool_t xdr_commit3resfail (XDR *, commit3resfail*); -extern  bool_t xdr_commit3res (XDR *, commit3res*); -extern  bool_t xdr_fhandle3 (XDR *, fhandle3*); -extern  bool_t xdr_dirpath (XDR *, dirpath*); -extern  bool_t xdr_name (XDR *, name*); -extern  bool_t xdr_mountstat3 (XDR *, mountstat3*); -extern  bool_t xdr_mountres3_ok (XDR *, mountres3_ok*); -extern  bool_t xdr_mountres3 (XDR *, mountres3*); -extern  bool_t xdr_mountlist (XDR *, mountlist*); -extern  bool_t xdr_mountbody (XDR *, mountbody*); -extern  bool_t xdr_groups (XDR *, groups*); -extern  bool_t xdr_groupnode (XDR *, groupnode*); -extern  bool_t xdr_exports (XDR *, exports*); -extern  bool_t xdr_exportnode (XDR *, exportnode*); - -extern void xdr_free_exports_list (struct exportnode *first); -extern void xdr_free_mountlist (mountlist ml); - -extern void xdr_free_write3args_nocopy (write3args *wa); -#endif diff --git a/xlators/nfs/lib/src/xdr-rpc.c b/xlators/nfs/lib/src/xdr-rpc.c deleted file mode 100644 index 274e118a3c0..00000000000 --- a/xlators/nfs/lib/src/xdr-rpc.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include <string.h> -#include <rpc/rpc.h> -#include <rpc/pmap_clnt.h> -#include <arpa/inet.h> -#include <rpc/xdr.h> -#include <sys/uio.h> -#include <rpc/auth_unix.h> - -#include "mem-pool.h" -#include "xdr-rpc.h" -#include "xdr-common.h" -#include "logging.h" - -/* Decodes the XDR format in msgbuf into rpc_msg. - * The remaining payload is returned into payload. - */ -int -nfs_xdr_to_rpc_call (char *msgbuf, size_t len, struct rpc_msg *call, -                     struct iovec *payload, char *credbytes, char *verfbytes) -{ -        XDR                     xdr; -        char                    opaquebytes[MAX_AUTH_BYTES]; -        struct opaque_auth      *oa = NULL; - -        if ((!msgbuf) || (!call)) -                return -1; - -        memset (call, 0, sizeof (*call)); - -        oa = &call->rm_call.cb_cred; -        if (!credbytes) -                oa->oa_base = opaquebytes; -        else -                oa->oa_base = credbytes; - -        oa = &call->rm_call.cb_verf; -        if (!verfbytes) -                oa->oa_base = opaquebytes; -        else -                oa->oa_base = verfbytes; - -        xdrmem_create (&xdr, msgbuf, len, XDR_DECODE); -        if (!xdr_callmsg (&xdr, call)) -                return -1; - -        if (payload) { -                payload->iov_base = nfs_xdr_decoded_remaining_addr (xdr); -                payload->iov_len = nfs_xdr_decoded_remaining_len (xdr); -        } - -        return 0; -} - - -bool_t -nfs_true_func (XDR *s, caddr_t *a) -{ -        return TRUE; -} - - -int -nfs_rpc_fill_empty_reply (struct rpc_msg *reply, uint32_t xid) -{ -        if (!reply) -                return -1; - -        /* Setting to 0 also results in reply verifier flavor to be -         * set to AUTH_NULL which is what we want right now. -         */ -        memset (reply, 0, sizeof (*reply)); -        reply->rm_xid = xid; -        reply->rm_direction = REPLY; - -        return 0; -} - -int -nfs_rpc_fill_denied_reply (struct rpc_msg *reply, int rjstat, int auth_err) -{ -        if (!reply) -                return -1; - -        reply->rm_reply.rp_stat = MSG_DENIED; -        reply->rjcted_rply.rj_stat = rjstat; -        if (rjstat == RPC_MISMATCH) { -                /* No problem with hardocoding -                 * RPC version numbers. We only support -                 * v2 anyway. -                 */ -                reply->rjcted_rply.rj_vers.low = 2; -                reply->rjcted_rply.rj_vers.high = 2; -        } else if (rjstat == AUTH_ERROR) -                reply->rjcted_rply.rj_why = auth_err; - -        return 0; -} - - -int -nfs_rpc_fill_accepted_reply (struct rpc_msg *reply, int arstat, int proglow, -                             int proghigh, int verf, int len, char *vdata) -{ -        if (!reply) -                return -1; - -        reply->rm_reply.rp_stat = MSG_ACCEPTED; -        reply->acpted_rply.ar_stat = arstat; - -        reply->acpted_rply.ar_verf.oa_flavor = verf; -        reply->acpted_rply.ar_verf.oa_length = len; -        reply->acpted_rply.ar_verf.oa_base = vdata; -        if (arstat == PROG_MISMATCH) { -                reply->acpted_rply.ar_vers.low = proglow; -                reply->acpted_rply.ar_vers.high = proghigh; -        } else if (arstat == SUCCESS) { - -                /* This is a hack. I'd really like to build a custom -                 * XDR library because Sun RPC interface is not very flexible. -                 */ -                reply->acpted_rply.ar_results.proc = (xdrproc_t)nfs_true_func; -                reply->acpted_rply.ar_results.where = NULL; -        } - -        return 0; -} - -int -nfs_rpc_reply_to_xdr (struct rpc_msg *reply, char *dest, size_t len, -                      struct iovec *dst) -{ -        XDR             xdr; - -        if ((!dest) || (!reply) || (!dst)) -                return -1; - -        xdrmem_create (&xdr, dest, len, XDR_ENCODE); -        if (!xdr_replymsg(&xdr, reply)) -                return -1; - -        dst->iov_base = dest; -        dst->iov_len = nfs_xdr_encoded_length (xdr); - -        return 0; -} - - -int -nfs_xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au, -                           char *machname, gid_t *gids) -{ -        XDR             xdr; - -        if ((!msgbuf) || (!machname) || (!gids) || (!au)) -                return -1; - -        au->aup_machname = machname; -#ifdef GF_DARWIN_HOST_OS -        au->aup_gids = (int *)gids; -#else -        au->aup_gids = gids; -#endif - -        xdrmem_create (&xdr, msgbuf, msglen, XDR_DECODE); - -        if (!xdr_authunix_parms (&xdr, au)) -                return -1; - -        return 0; -} - -ssize_t -nfs_xdr_length_round_up (size_t len, size_t bufsize) -{ -        int     roundup = 0; - -        roundup = len % NFS_XDR_BYTES_PER_UNIT; -        if (roundup > 0) -                roundup = NFS_XDR_BYTES_PER_UNIT - roundup; - -        if ((roundup > 0) && ((roundup + len) <= bufsize)) -                len += roundup; - -        return len; -} - -int -nfs_xdr_bytes_round_up (struct iovec *vec, size_t bufsize) -{ -        vec->iov_len = nfs_xdr_length_round_up (vec->iov_len, bufsize); -        return 0; -} - -void -nfs_xdr_vector_round_up (struct iovec *vec, int vcount, uint32_t count) -{ -        uint32_t round_count = 0; - -        round_count = nfs_xdr_length_round_up (count, 1048576); -        round_count -= count; -        if (round_count == 0) -                return; - -        vec[vcount-1].iov_len += round_count; -} diff --git a/xlators/nfs/lib/src/xdr-rpc.h b/xlators/nfs/lib/src/xdr-rpc.h deleted file mode 100644 index ddcbe6655d8..00000000000 --- a/xlators/nfs/lib/src/xdr-rpc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> -  This file is part of GlusterFS. - -  GlusterFS is free software; you can redistribute it and/or modify -  it under the terms of the GNU Affero General Public License as published -  by the Free Software Foundation; either version 3 of the License, -  or (at your option) any later version. - -  GlusterFS 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 -  Affero General Public License for more details. - -  You should have received a copy of the GNU Affero General Public License -  along with this program.  If not, see -  <http://www.gnu.org/licenses/>. -*/ - -#ifndef _NFS_XDR_RPC_H -#define _NFS_XDR_RPC_H_ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include <rpc/rpc.h> -#include <rpc/pmap_clnt.h> -#include <arpa/inet.h> -#include <rpc/xdr.h> -#include <sys/uio.h> - -/* Converts a given network buffer from its XDR format to a structure - * that contains everything an RPC call needs to work. - */ -extern int -nfs_xdr_to_rpc_call (char *msgbuf, size_t len, struct rpc_msg *call, -                     struct iovec *payload, char *credbytes, char *verfbytes); - -extern int -nfs_rpc_fill_empty_reply (struct rpc_msg *reply, uint32_t xid); - -extern int -nfs_rpc_fill_denied_reply (struct rpc_msg *reply, int rjstat, int auth_err); - -extern int -nfs_rpc_fill_accepted_reply (struct rpc_msg *reply, int arstat, int proglow, -                             int proghigh, int verf, int len, char *vdata); -extern int -nfs_rpc_reply_to_xdr (struct rpc_msg *reply, char *dest, size_t len, -                      struct iovec *dst); - -extern int -nfs_xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au, -                           char *machname, gid_t *gids); -/* Macros that simplify accesing the members of an RPC call structure. */ -#define nfs_rpc_call_xid(call)              ((call)->rm_xid) -#define nfs_rpc_call_direction(call)        ((call)->rm_direction) -#define nfs_rpc_call_rpcvers(call)          ((call)->ru.RM_cmb.cb_rpcvers) -#define nfs_rpc_call_program(call)          ((call)->ru.RM_cmb.cb_prog) -#define nfs_rpc_call_progver(call)          ((call)->ru.RM_cmb.cb_vers) -#define nfs_rpc_call_progproc(call)         ((call)->ru.RM_cmb.cb_proc) -#define nfs_rpc_opaque_auth_flavour(oa)     ((oa)->oa_flavor) -#define nfs_rpc_opaque_auth_len(oa)         ((oa)->oa_length) - -#define nfs_rpc_call_cred_flavour(call)     (nfs_rpc_opaque_auth_flavour ((&(call)->ru.RM_cmb.cb_cred))) -#define nfs_rpc_call_cred_len(call)         (nfs_rpc_opaque_auth_len ((&(call)->ru.RM_cmb.cb_cred))) - - -#define nfs_rpc_call_verf_flavour(call)     (nfs_rpc_opaque_auth_flavour ((&(call)->ru.RM_cmb.cb_verf))) -#define nfs_rpc_call_verf_len(call)         (nfs_rpc_opaque_auth_len ((&(call)->ru.RM_cmb.cb_verf))) - -extern int -nfs_xdr_bytes_round_up (struct iovec *vec, size_t bufsize); - -extern ssize_t -nfs_xdr_length_round_up (size_t len, size_t bufsize); - -void -nfs_xdr_vector_round_up (struct iovec *vec, int vcount, uint32_t count); -#endif  | 
