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