138494Sobrien/* 2310490Scy * Copyright (c) 1997-2014 Erez Zadok 338494Sobrien * Copyright (c) 1990 Jan-Simon Pendry 438494Sobrien * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 538494Sobrien * Copyright (c) 1990 The Regents of the University of California. 638494Sobrien * All rights reserved. 738494Sobrien * 838494Sobrien * This code is derived from software contributed to Berkeley by 938494Sobrien * Jan-Simon Pendry at Imperial College, London. 1038494Sobrien * 1138494Sobrien * Redistribution and use in source and binary forms, with or without 1238494Sobrien * modification, are permitted provided that the following conditions 1338494Sobrien * are met: 1438494Sobrien * 1. Redistributions of source code must retain the above copyright 1538494Sobrien * notice, this list of conditions and the following disclaimer. 1638494Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1738494Sobrien * notice, this list of conditions and the following disclaimer in the 1838494Sobrien * documentation and/or other materials provided with the distribution. 19310490Scy * 3. Neither the name of the University nor the names of its contributors 2038494Sobrien * may be used to endorse or promote products derived from this software 2138494Sobrien * without specific prior written permission. 2238494Sobrien * 2338494Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2438494Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2538494Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2638494Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2738494Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2838494Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2938494Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3038494Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3138494Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3238494Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3338494Sobrien * SUCH DAMAGE. 3438494Sobrien * 3538494Sobrien * 36174313Sobrien * File: am-utils/amd/amq_subr.c 3738494Sobrien * 3838494Sobrien */ 3938494Sobrien/* 4042633Sobrien * Auxiliary routines for amq tool 4138494Sobrien */ 4238494Sobrien 4338494Sobrien#ifdef HAVE_CONFIG_H 4438494Sobrien# include <config.h> 4538494Sobrien#endif /* HAVE_CONFIG_H */ 4638494Sobrien#include <am_defs.h> 4738494Sobrien#include <amd.h> 4838494Sobrien 4938494Sobrien/* forward definitions */ 5038494Sobrienbool_t xdr_amq_mount_tree_node(XDR *xdrs, amq_mount_tree *objp); 5138494Sobrienbool_t xdr_amq_mount_subtree(XDR *xdrs, amq_mount_tree *objp); 5238494Sobrien 5338494Sobrien 5438494Sobrienvoidp 5538494Sobrienamqproc_null_1_svc(voidp argp, struct svc_req *rqstp) 5638494Sobrien{ 5738494Sobrien static char res; 5838494Sobrien 5938494Sobrien return (voidp) &res; 6038494Sobrien} 6138494Sobrien 6238494Sobrien 6338494Sobrien/* 6438494Sobrien * Return a sub-tree of mounts 6538494Sobrien */ 6638494Sobrienamq_mount_tree_p * 6738494Sobrienamqproc_mnttree_1_svc(voidp argp, struct svc_req *rqstp) 6838494Sobrien{ 6938494Sobrien static am_node *mp; 7038494Sobrien 7138494Sobrien mp = find_ap(*(char **) argp); 72131706Smbr return (amq_mount_tree_p *) ((void *)&mp); 7338494Sobrien} 7438494Sobrien 7538494Sobrien 7638494Sobrien/* 7738494Sobrien * Unmount a single node 7838494Sobrien */ 79310490Scyint * 8038494Sobrienamqproc_umnt_1_svc(voidp argp, struct svc_req *rqstp) 8138494Sobrien{ 82310490Scy static int res = AMQ_UMNT_OK; 8338494Sobrien am_node *mp = find_ap(*(char **) argp); 8438494Sobrien 8538494Sobrien if (mp) 8638494Sobrien forcibly_timeout_mp(mp); 8738494Sobrien 88310490Scy return &res; 8938494Sobrien} 9038494Sobrien 9138494Sobrien 9238494Sobrien/* 93310490Scy * Synchronously unmount a single node - parent side. 94310490Scy */ 95310490Scyint * 96310490Scyamqproc_sync_umnt_1_svc_parent(voidp argp, struct svc_req *rqstp) 97310490Scy{ 98310490Scy amqproc_umnt_1_svc(argp, rqstp); 99310490Scy return NULL; 100310490Scy} 101310490Scy 102310490Scy 103310490Scy/* 104310490Scy * Synchronously unmount a single node - child side. 105310490Scy */ 106310490Scyamq_sync_umnt * 107310490Scyamqproc_sync_umnt_1_svc_child(voidp argp, struct svc_req *rqstp) 108310490Scy{ 109310490Scy static amq_sync_umnt rv; 110310490Scy amq_sync_umnt buf; 111310490Scy ssize_t n; 112310490Scy 113310490Scy am_node *mp = find_ap(*(char **) argp); 114310490Scy 115310490Scy memset(&rv, 0, sizeof(rv)); 116310490Scy rv.au_etype = AMQ_UMNT_READ; 117310490Scy if (mp && mp->am_fd[0] >= 0) { 118310490Scy n = read(mp->am_fd[0], &buf, sizeof(buf)); 119310490Scy if (n == sizeof(buf)) 120310490Scy rv = buf; 121310490Scy } 122310490Scy return &rv; 123310490Scy} 124310490Scy 125310490Scy 126310490Scy/* 127310490Scy * Synchronously unmount a single node - use if we can't fork (asynchronous). 128310490Scy */ 129310490Scyamq_sync_umnt * 130310490Scyamqproc_sync_umnt_1_svc_async(voidp argp, struct svc_req *rqstp) 131310490Scy{ 132310490Scy static amq_sync_umnt rv; 133310490Scy 134310490Scy memset(&rv, 0, sizeof(rv)); 135310490Scy rv.au_etype = AMQ_UMNT_FORK; 136310490Scy rv.au_errno = errno; 137310490Scy 138310490Scy amqproc_umnt_1_svc(argp, rqstp); 139310490Scy 140310490Scy return &rv; 141310490Scy} 142310490Scy 143310490Scy 144310490Scy/* 14538494Sobrien * Return global statistics 14638494Sobrien */ 14738494Sobrienamq_mount_stats * 14838494Sobrienamqproc_stats_1_svc(voidp argp, struct svc_req *rqstp) 14938494Sobrien{ 150131706Smbr return (amq_mount_stats *) ((void *)&amd_stats); 15138494Sobrien} 15238494Sobrien 15338494Sobrien 15438494Sobrien/* 15538494Sobrien * Return the entire tree of mount nodes 15638494Sobrien */ 15738494Sobrienamq_mount_tree_list * 15838494Sobrienamqproc_export_1_svc(voidp argp, struct svc_req *rqstp) 15938494Sobrien{ 16038494Sobrien static amq_mount_tree_list aml; 161174313Sobrien static am_node *mp; 16238494Sobrien 163174313Sobrien mp = get_exported_ap(0); 164174313Sobrien aml.amq_mount_tree_list_val = (amq_mount_tree_p *) ((void *) &mp); 16538494Sobrien aml.amq_mount_tree_list_len = 1; /* XXX */ 16638494Sobrien 16738494Sobrien return &aml; 16838494Sobrien} 16938494Sobrien 17038494Sobrien 17138494Sobrienint * 17238494Sobrienamqproc_setopt_1_svc(voidp argp, struct svc_req *rqstp) 17338494Sobrien{ 17438494Sobrien static int rc; 17538494Sobrien amq_setopt *opt = (amq_setopt *) argp; 17638494Sobrien 17738494Sobrien rc = 0; 17838494Sobrien 17938494Sobrien switch (opt->as_opt) { 18038494Sobrien 18138494Sobrien case AMOPT_DEBUG: 18238494Sobrien if (debug_option(opt->as_str)) 18338494Sobrien rc = EINVAL; 18438494Sobrien break; 18538494Sobrien 18638494Sobrien case AMOPT_LOGFILE: 18738494Sobrien if (gopt.logfile && opt->as_str 18838494Sobrien && STREQ(gopt.logfile, opt->as_str)) { 189174313Sobrien if (switch_to_logfile(opt->as_str, orig_umask, 0)) 19038494Sobrien rc = EINVAL; 19138494Sobrien } else { 19238494Sobrien rc = EACCES; 19338494Sobrien } 19438494Sobrien break; 19538494Sobrien 19638494Sobrien case AMOPT_XLOG: 19738494Sobrien if (switch_option(opt->as_str)) 19838494Sobrien rc = EINVAL; 19938494Sobrien break; 20038494Sobrien 20138494Sobrien case AMOPT_FLUSHMAPC: 20238494Sobrien if (amd_state == Run) { 20338494Sobrien plog(XLOG_INFO, "amq says flush cache"); 20438494Sobrien do_mapc_reload = 0; 205174313Sobrien flush_nfs_fhandle_cache((fserver *) NULL); 206174313Sobrien flush_srvr_nfs_cache((fserver *) NULL); 20738494Sobrien } 20838494Sobrien break; 20938494Sobrien } 21038494Sobrien 21138494Sobrien return &rc; 21238494Sobrien} 21338494Sobrien 21438494Sobrien 21538494Sobrienamq_mount_info_list * 21638494Sobrienamqproc_getmntfs_1_svc(voidp argp, struct svc_req *rqstp) 21738494Sobrien{ 218174313Sobrien return (amq_mount_info_list *) ((void *)&mfhead); /* XXX */ 21938494Sobrien} 22038494Sobrien 221310490Scyextern qelem map_list_head; 222310490Scyamq_map_info_list * 223310490Scyamqproc_getmapinfo_1_svc(voidp argp, struct svc_req *rqstp) 224310490Scy{ 225310490Scy return (amq_map_info_list *) ((void *)&map_list_head); /* XXX */ 226310490Scy} 22738494Sobrien 22838494Sobrienamq_string * 22938494Sobrienamqproc_getvers_1_svc(voidp argp, struct svc_req *rqstp) 23038494Sobrien{ 23138494Sobrien static amq_string res; 23238494Sobrien 23338494Sobrien res = get_version_string(); 23438494Sobrien return &res; 23538494Sobrien} 23638494Sobrien 23738494Sobrien 23838494Sobrien/* get PID of remote amd */ 23938494Sobrienint * 24038494Sobrienamqproc_getpid_1_svc(voidp argp, struct svc_req *rqstp) 24138494Sobrien{ 24238494Sobrien static int res; 24338494Sobrien 24438494Sobrien res = getpid(); 24538494Sobrien return &res; 24638494Sobrien} 24738494Sobrien 24838494Sobrien 24938494Sobrien/* 250174313Sobrien * Process PAWD string of remote pawd tool. 251174313Sobrien * 252174313Sobrien * We repeat the resolution of the string until the resolved string resolves 253174313Sobrien * to itself. This ensures that we follow path resolutions through all 254174313Sobrien * possible Amd mount points until we reach some sort of convergence. To 255174313Sobrien * prevent possible infinite loops, we break out of this loop if the strings 256174313Sobrien * do not converge after MAX_PAWD_TRIES times. 257174313Sobrien */ 258174313Sobrienamq_string * 259174313Sobrienamqproc_pawd_1_svc(voidp argp, struct svc_req *rqstp) 260174313Sobrien{ 261174313Sobrien static amq_string res; 262174313Sobrien#define MAX_PAWD_TRIES 10 263174313Sobrien int index, len, maxagain = MAX_PAWD_TRIES; 264174313Sobrien am_node *mp; 265174313Sobrien char *mountpoint; 266174313Sobrien char *dir = *(char **) argp; 267174313Sobrien static char tmp_buf[MAXPATHLEN]; 268174313Sobrien char prev_buf[MAXPATHLEN]; 269174313Sobrien 270174313Sobrien tmp_buf[0] = prev_buf[0] = '\0'; /* default is empty string: no match */ 271174313Sobrien do { 272174313Sobrien for (mp = get_first_exported_ap(&index); 273174313Sobrien mp; 274174313Sobrien mp = get_next_exported_ap(&index)) { 275310490Scy if (STREQ(mp->am_al->al_mnt->mf_ops->fs_type, "toplvl")) 276174313Sobrien continue; 277310490Scy if (STREQ(mp->am_al->al_mnt->mf_ops->fs_type, "auto")) 278174313Sobrien continue; 279310490Scy mountpoint = (mp->am_link ? mp->am_link : mp->am_al->al_mnt->mf_mount); 280174313Sobrien len = strlen(mountpoint); 281174313Sobrien if (len == 0) 282174313Sobrien continue; 283174313Sobrien if (!NSTREQ(mountpoint, dir, len)) 284174313Sobrien continue; 285174313Sobrien if (dir[len] != '\0' && dir[len] != '/') 286174313Sobrien continue; 287174313Sobrien xstrlcpy(tmp_buf, mp->am_path, sizeof(tmp_buf)); 288174313Sobrien xstrlcat(tmp_buf, &dir[len], sizeof(tmp_buf)); 289174313Sobrien break; 290174313Sobrien } /* end of "for" loop */ 291174313Sobrien /* once tmp_buf and prev_buf are equal, break out of "do" loop */ 292174313Sobrien if (STREQ(tmp_buf, prev_buf)) 293174313Sobrien break; 294174313Sobrien else 295174313Sobrien xstrlcpy(prev_buf, tmp_buf, sizeof(prev_buf)); 296174313Sobrien } while (--maxagain); 297174313Sobrien /* check if we couldn't resolve the string after MAX_PAWD_TRIES times */ 298174313Sobrien if (maxagain <= 0) 299174313Sobrien plog(XLOG_WARNING, "path \"%s\" did not resolve after %d tries", 300174313Sobrien tmp_buf, MAX_PAWD_TRIES); 301174313Sobrien 302174313Sobrien res = tmp_buf; 303174313Sobrien return &res; 304174313Sobrien} 305174313Sobrien 306174313Sobrien 307174313Sobrien/* 30838494Sobrien * XDR routines. 30938494Sobrien */ 31038494Sobrien 31138494Sobrien 31238494Sobrienbool_t 31338494Sobrienxdr_amq_setopt(XDR *xdrs, amq_setopt *objp) 31438494Sobrien{ 315174313Sobrien if (!xdr_enum(xdrs, (enum_t *) ((voidp) &objp->as_opt))) { 31638494Sobrien return (FALSE); 31738494Sobrien } 31838494Sobrien if (!xdr_string(xdrs, &objp->as_str, AMQ_STRLEN)) { 31938494Sobrien return (FALSE); 32038494Sobrien } 32138494Sobrien return (TRUE); 32238494Sobrien} 32338494Sobrien 32438494Sobrien 32538494Sobrien/* 32638494Sobrien * More XDR routines - Should be used for OUTPUT ONLY. 32738494Sobrien */ 32838494Sobrienbool_t 32938494Sobrienxdr_amq_mount_tree_node(XDR *xdrs, amq_mount_tree *objp) 33038494Sobrien{ 33138494Sobrien am_node *mp = (am_node *) objp; 33238790Sobrien long mtime; 33338494Sobrien 334310490Scy if (!xdr_amq_string(xdrs, &mp->am_al->al_mnt->mf_info)) { 33538494Sobrien return (FALSE); 33638494Sobrien } 33738494Sobrien if (!xdr_amq_string(xdrs, &mp->am_path)) { 33838494Sobrien return (FALSE); 33938494Sobrien } 340310490Scy if (!xdr_amq_string(xdrs, mp->am_link ? &mp->am_link : &mp->am_al->al_mnt->mf_mount)) { 34138494Sobrien return (FALSE); 34238494Sobrien } 343310490Scy if (!xdr_amq_string(xdrs, &mp->am_al->al_mnt->mf_ops->fs_type)) { 34438494Sobrien return (FALSE); 34538494Sobrien } 34638790Sobrien mtime = mp->am_stats.s_mtime; 34738790Sobrien if (!xdr_long(xdrs, &mtime)) { 34838494Sobrien return (FALSE); 34938494Sobrien } 35038494Sobrien if (!xdr_u_short(xdrs, &mp->am_stats.s_uid)) { 35138494Sobrien return (FALSE); 35238494Sobrien } 35338494Sobrien if (!xdr_int(xdrs, &mp->am_stats.s_getattr)) { 35438494Sobrien return (FALSE); 35538494Sobrien } 35638494Sobrien if (!xdr_int(xdrs, &mp->am_stats.s_lookup)) { 35738494Sobrien return (FALSE); 35838494Sobrien } 35938494Sobrien if (!xdr_int(xdrs, &mp->am_stats.s_readdir)) { 36038494Sobrien return (FALSE); 36138494Sobrien } 36238494Sobrien if (!xdr_int(xdrs, &mp->am_stats.s_readlink)) { 36338494Sobrien return (FALSE); 36438494Sobrien } 36538494Sobrien if (!xdr_int(xdrs, &mp->am_stats.s_statfs)) { 36638494Sobrien return (FALSE); 36738494Sobrien } 36838494Sobrien return (TRUE); 36938494Sobrien} 37038494Sobrien 37138494Sobrien 37238494Sobrienbool_t 37338494Sobrienxdr_amq_mount_subtree(XDR *xdrs, amq_mount_tree *objp) 37438494Sobrien{ 37538494Sobrien am_node *mp = (am_node *) objp; 37638494Sobrien 37738494Sobrien if (!xdr_amq_mount_tree_node(xdrs, objp)) { 37838494Sobrien return (FALSE); 37938494Sobrien } 380174313Sobrien if (!xdr_pointer(xdrs, 381174313Sobrien (char **) ((voidp) &mp->am_osib), 382174313Sobrien sizeof(amq_mount_tree), 383174313Sobrien (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) { 38438494Sobrien return (FALSE); 38538494Sobrien } 386174313Sobrien if (!xdr_pointer(xdrs, 387174313Sobrien (char **) ((voidp) &mp->am_child), 388174313Sobrien sizeof(amq_mount_tree), 389174313Sobrien (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) { 39038494Sobrien return (FALSE); 39138494Sobrien } 39238494Sobrien return (TRUE); 39338494Sobrien} 39438494Sobrien 39538494Sobrien 39638494Sobrienbool_t 39738494Sobrienxdr_amq_mount_tree(XDR *xdrs, amq_mount_tree *objp) 39838494Sobrien{ 39938494Sobrien am_node *mp = (am_node *) objp; 400174313Sobrien am_node *mnil = NULL; 40138494Sobrien 40238494Sobrien if (!xdr_amq_mount_tree_node(xdrs, objp)) { 40338494Sobrien return (FALSE); 40438494Sobrien } 405174313Sobrien if (!xdr_pointer(xdrs, 406174313Sobrien (char **) ((voidp) &mnil), 407174313Sobrien sizeof(amq_mount_tree), 408174313Sobrien (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) { 40938494Sobrien return (FALSE); 41038494Sobrien } 411174313Sobrien if (!xdr_pointer(xdrs, 412174313Sobrien (char **) ((voidp) &mp->am_child), 413174313Sobrien sizeof(amq_mount_tree), 414174313Sobrien (XDRPROC_T_TYPE) xdr_amq_mount_subtree)) { 41538494Sobrien return (FALSE); 41638494Sobrien } 41738494Sobrien return (TRUE); 41838494Sobrien} 41938494Sobrien 42038494Sobrien 42138494Sobrienbool_t 42238494Sobrienxdr_amq_mount_tree_p(XDR *xdrs, amq_mount_tree_p *objp) 42338494Sobrien{ 42438494Sobrien if (!xdr_pointer(xdrs, (char **) objp, sizeof(amq_mount_tree), (XDRPROC_T_TYPE) xdr_amq_mount_tree)) { 42538494Sobrien return (FALSE); 42638494Sobrien } 42738494Sobrien return (TRUE); 42838494Sobrien} 42938494Sobrien 43038494Sobrien 43138494Sobrienbool_t 43238494Sobrienxdr_amq_mount_stats(XDR *xdrs, amq_mount_stats *objp) 43338494Sobrien{ 43438494Sobrien if (!xdr_int(xdrs, &objp->as_drops)) { 43538494Sobrien return (FALSE); 43638494Sobrien } 43738494Sobrien if (!xdr_int(xdrs, &objp->as_stale)) { 43838494Sobrien return (FALSE); 43938494Sobrien } 44038494Sobrien if (!xdr_int(xdrs, &objp->as_mok)) { 44138494Sobrien return (FALSE); 44238494Sobrien } 44338494Sobrien if (!xdr_int(xdrs, &objp->as_merr)) { 44438494Sobrien return (FALSE); 44538494Sobrien } 44638494Sobrien if (!xdr_int(xdrs, &objp->as_uerr)) { 44738494Sobrien return (FALSE); 44838494Sobrien } 44938494Sobrien return (TRUE); 45038494Sobrien} 45138494Sobrien 45238494Sobrien 45338494Sobrien 45438494Sobrienbool_t 45538494Sobrienxdr_amq_mount_tree_list(XDR *xdrs, amq_mount_tree_list *objp) 45638494Sobrien{ 45738494Sobrien if (!xdr_array(xdrs, 458174313Sobrien (char **) ((voidp) &objp->amq_mount_tree_list_val), 45938494Sobrien (u_int *) &objp->amq_mount_tree_list_len, 46038494Sobrien ~0, 46138494Sobrien sizeof(amq_mount_tree_p), 46238494Sobrien (XDRPROC_T_TYPE) xdr_amq_mount_tree_p)) { 46338494Sobrien return (FALSE); 46438494Sobrien } 46538494Sobrien return (TRUE); 46638494Sobrien} 46738494Sobrien 46838494Sobrien 46938494Sobrienbool_t 47038494Sobrienxdr_amq_mount_info_qelem(XDR *xdrs, qelem *qhead) 47138494Sobrien{ 47238494Sobrien mntfs *mf; 47338494Sobrien u_int len = 0; 47438494Sobrien 475310490Scy /* 476310490Scy * Compute length of list 477310490Scy */ 47838494Sobrien for (mf = AM_LAST(mntfs, qhead); mf != HEAD(mntfs, qhead); mf = PREV(mntfs, mf)) { 479174313Sobrien if (!(mf->mf_fsflags & FS_AMQINFO)) 48038494Sobrien continue; 48138494Sobrien len++; 48238494Sobrien } 48338494Sobrien xdr_u_int(xdrs, &len); 48438494Sobrien 48538494Sobrien /* 48638494Sobrien * Send individual data items 48738494Sobrien */ 48838494Sobrien for (mf = AM_LAST(mntfs, qhead); mf != HEAD(mntfs, qhead); mf = PREV(mntfs, mf)) { 48938494Sobrien int up; 490174313Sobrien if (!(mf->mf_fsflags & FS_AMQINFO)) 49138494Sobrien continue; 49238494Sobrien 49338494Sobrien if (!xdr_amq_string(xdrs, &mf->mf_ops->fs_type)) { 49438494Sobrien return (FALSE); 49538494Sobrien } 49638494Sobrien if (!xdr_amq_string(xdrs, &mf->mf_mount)) { 49738494Sobrien return (FALSE); 49838494Sobrien } 49938494Sobrien if (!xdr_amq_string(xdrs, &mf->mf_info)) { 50038494Sobrien return (FALSE); 50138494Sobrien } 50238494Sobrien if (!xdr_amq_string(xdrs, &mf->mf_server->fs_host)) { 50338494Sobrien return (FALSE); 50438494Sobrien } 50538494Sobrien if (!xdr_int(xdrs, &mf->mf_error)) { 50638494Sobrien return (FALSE); 50738494Sobrien } 50838494Sobrien if (!xdr_int(xdrs, &mf->mf_refc)) { 50938494Sobrien return (FALSE); 51038494Sobrien } 511174313Sobrien if (FSRV_ERROR(mf->mf_server) || FSRV_ISDOWN(mf->mf_server)) 51238494Sobrien up = 0; 513174313Sobrien else if (FSRV_ISUP(mf->mf_server)) 514174313Sobrien up = 1; 51538494Sobrien else 516174313Sobrien up = -1; 51738494Sobrien if (!xdr_int(xdrs, &up)) { 51838494Sobrien return (FALSE); 51938494Sobrien } 52038494Sobrien } 52138494Sobrien return (TRUE); 52238494Sobrien} 52338494Sobrien 524310490Scybool_t 525310490Scyxdr_amq_map_info_qelem(XDR *xdrs, qelem *qhead) 526310490Scy{ 527310490Scy mnt_map *m; 528310490Scy u_int len = 0; 529310490Scy int x; 530310490Scy char *n; 53138494Sobrien 532310490Scy /* 533310490Scy * Compute length of list 534310490Scy */ 535310490Scy ITER(m, mnt_map, qhead) { 536310490Scy len++; 537310490Scy } 538310490Scy 539310490Scy if (!xdr_u_int(xdrs, &len)) 540310490Scy return (FALSE); 541310490Scy 542310490Scy /* 543310490Scy * Send individual data items 544310490Scy */ 545310490Scy ITER(m, mnt_map, qhead) { 546310490Scy if (!xdr_amq_string(xdrs, &m->map_name)) { 547310490Scy return (FALSE); 548310490Scy } 549310490Scy 550310490Scy n = m->wildcard ? m->wildcard : ""; 551310490Scy if (!xdr_amq_string(xdrs, &n)) { 552310490Scy return (FALSE); 553310490Scy } 554310490Scy 555310490Scy if (!xdr_long(xdrs, (long *) &m->modify)) { 556310490Scy return (FALSE); 557310490Scy } 558310490Scy 559310490Scy x = m->flags; 560310490Scy if (!xdr_int(xdrs, &x)) { 561310490Scy return (FALSE); 562310490Scy } 563310490Scy 564310490Scy x = m->nentries; 565310490Scy if (!xdr_int(xdrs, &x)) { 566310490Scy return (FALSE); 567310490Scy } 568310490Scy 569310490Scy x = m->reloads; 570310490Scy if (!xdr_int(xdrs, &x)) { 571310490Scy return (FALSE); 572310490Scy } 573310490Scy 574310490Scy if (!xdr_int(xdrs, &m->refc)) { 575310490Scy return (FALSE); 576310490Scy } 577310490Scy 578310490Scy if (m->isup) 579310490Scy x = (*m->isup)(m, m->map_name); 580310490Scy else 581310490Scy x = -1; 582310490Scy if (!xdr_int(xdrs, &x)) { 583310490Scy return (FALSE); 584310490Scy } 585310490Scy } 586310490Scy return (TRUE); 587310490Scy} 588310490Scy 58938494Sobrienbool_t 59038494Sobrienxdr_pri_free(XDRPROC_T_TYPE xdr_args, caddr_t args_ptr) 59138494Sobrien{ 59238494Sobrien XDR xdr; 59338494Sobrien 59438494Sobrien xdr.x_op = XDR_FREE; 59538494Sobrien return ((*xdr_args) (&xdr, (caddr_t *) args_ptr)); 59638494Sobrien} 597