2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * CDDL HEADER START
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * The contents of this file are subject to the terms of the
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Common Development and Distribution License (the "License").
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * You may not use this file except in compliance with the License.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * or http://www.opensolaris.org/os/licensing.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * See the License for the specific language governing permissions
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * and limitations under the License.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * When distributing Covered Code, include this CDDL HEADER in each
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * If applicable, add the following below this CDDL HEADER, with the
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * fields enclosed by brackets "[]" replaced with your own identifying
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * information: Portions Copyright [yyyy] [name of copyright owner]
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * CDDL HEADER END
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Use is subject to license terms.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <stdio.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <unistd.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <strings.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <string.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/types.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/stat.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/errno.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <limits.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <libnvpair.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <dlfcn.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <link.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rp_plugin.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <fcntl.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <uuid/uuid.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpc/types.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpc/xdr.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpc/auth.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpc/clnt.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpc/rpc_msg.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/param.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/nfs4.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <rpcsvc/nfs4_prot.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * str_to_utf8 - converts a null-terminated C string to a utf8 string
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowutf8string *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstr_to_utf8(char *nm, utf8string *str)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (str == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nm == NULL || *nm == '\0') {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow str->utf8string_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow str->utf8string_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow len = strlen(nm);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow str->utf8string_val = malloc(len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (str->utf8string_val == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow str->utf8string_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow str->utf8string_len = len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bcopy(nm, str->utf8string_val, len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (str);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Converts a utf8 string to a C string.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * kmem_allocs a new string if not supplied
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowchar *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowutf8_to_str(utf8string *str, uint_t *lenp, char *s)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *sp;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *u8p;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int i;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (str == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow u8p = str->utf8string_val;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow len = str->utf8string_len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (len <= 0 || u8p == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (s)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *s = '\0';
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sp = s;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (sp == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sp = malloc(len + 1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (sp == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * At least check for embedded nulls
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow for (i = 0; i < len; i++) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sp[i] = u8p[i];
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (u8p[i] == '\0') {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (s == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(sp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sp[len] = '\0';
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *lenp = len + 1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (sp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowvoid
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowprint_referral_summary(fs_locations4 *fsl)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int i, j;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow uint_t l;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *s;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fs_location4 *fs;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fsl == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("NULL\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow for (i = 0; i < fsl->locations.locations_len; i++) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (i > 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fs = &fsl->locations.locations_val[i];
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow for (j = 0; j < fs->server.server_len; j++) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow s = utf8_to_str(&fs->server.server_val[j], &l, NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (j > 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf(",");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("%s", s ? s : "");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (s)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(s);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf(":");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow for (j = 0; j < fs->rootpath.pathname4_len; j++) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow s = utf8_to_str(&fs->rootpath.pathname4_val[j],
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow &l, NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("/%s", s ? s : "");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (s)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(s);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fs->rootpath.pathname4_len == 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("/");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow printf("\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * There is a kernel copy of this routine in nfs4_srv.c.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Changes should be kept in sync.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstatic int
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlownfs4_create_components(char *path, component4 *comp4)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int slen, plen, ncomp;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *ori_path, *nxtc, buf[MAXNAMELEN];
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (path == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (0);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow plen = strlen(path) + 1; /* include the terminator */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ori_path = path;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ncomp = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /* count number of components in the path */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow for (nxtc = path; nxtc < ori_path + plen; nxtc++) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (*nxtc == '/' || *nxtc == '\0' || *nxtc == '\n') {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((slen = nxtc - path) == 0) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow path = nxtc + 1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow continue;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (comp4 != NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bcopy(path, buf, slen);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow buf[slen] = '\0';
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (str_to_utf8(buf, &comp4[ncomp]) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ncomp++; /* 1 valid component */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow path = nxtc + 1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (*nxtc == '\0' || *nxtc == '\n')
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow break;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (ncomp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * There is a kernel copy of this routine in nfs4_srv.c.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Changes should be kept in sync.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowint
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowmake_pathname4(char *path, pathname4 *pathname)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int ncomp;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow component4 *comp4;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (pathname == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (0);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (path == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (0);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /* count number of components to alloc buffer */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((ncomp = nfs4_create_components(path, NULL)) == 0) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (0);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow comp4 = calloc(ncomp * sizeof (component4), 1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (comp4 == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (0);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /* copy components into allocated buffer */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ncomp = nfs4_create_components(path, comp4);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_val = comp4;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow pathname->pathname4_len = ncomp;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (ncomp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowbool_t
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowxdr_component4(register XDR *xdrs, component4 *objp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_utf8string(xdrs, objp))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (TRUE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowbool_t
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowxdr_utf8string(register XDR *xdrs, utf8string *objp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (xdrs->x_op != XDR_FREE)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (xdr_bytes(xdrs, (char **)&objp->utf8string_val,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (uint_t *)&objp->utf8string_len, NFS4_MAX_UTF8STRING));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (TRUE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowbool_t
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowxdr_pathname4(register XDR *xdrs, pathname4 *objp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_array(xdrs, (char **)&objp->pathname4_val,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (uint_t *)&objp->pathname4_len, NFS4_MAX_PATHNAME4,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sizeof (component4), (xdrproc_t)xdr_component4))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (TRUE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowbool_t
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowxdr_fs_location4(register XDR *xdrs, fs_location4 *objp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (xdrs->x_op == XDR_DECODE) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow objp->server.server_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow objp->rootpath.pathname4_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_array(xdrs, (char **)&objp->server.server_val,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (uint_t *)&objp->server.server_len, ~0,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sizeof (utf8string), (xdrproc_t)xdr_utf8string))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_pathname4(xdrs, &objp->rootpath))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (TRUE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowbool_t
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowxdr_fs_locations4(register XDR *xdrs, fs_locations4 *objp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (xdrs->x_op == XDR_DECODE) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow objp->fs_root.pathname4_len = 0;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow objp->fs_root.pathname4_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow objp->locations.locations_val = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_pathname4(xdrs, &objp->fs_root))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (!xdr_array(xdrs, (char **)&objp->locations.locations_val,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (uint_t *)&objp->locations.locations_len, ~0,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow sizeof (fs_location4), (xdrproc_t)xdr_fs_location4))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (FALSE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (TRUE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}