nfsmapid_test.c revision dd5829d1456ba00e6f704e6a88e7eaae608e3c1b
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * CDDL HEADER START
c0c79a3f09914f35651895ffc111883455b7f62dtz *
c0c79a3f09914f35651895ffc111883455b7f62dtz * The contents of this file are subject to the terms of the
c0c79a3f09914f35651895ffc111883455b7f62dtz * Common Development and Distribution License (the "License").
c0c79a3f09914f35651895ffc111883455b7f62dtz * You may not use this file except in compliance with the License.
c0c79a3f09914f35651895ffc111883455b7f62dtz *
c0c79a3f09914f35651895ffc111883455b7f62dtz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c0c79a3f09914f35651895ffc111883455b7f62dtz * or http://www.opensolaris.org/os/licensing.
c0c79a3f09914f35651895ffc111883455b7f62dtz * See the License for the specific language governing permissions
c0c79a3f09914f35651895ffc111883455b7f62dtz * and limitations under the License.
c0c79a3f09914f35651895ffc111883455b7f62dtz *
c0c79a3f09914f35651895ffc111883455b7f62dtz * When distributing Covered Code, include this CDDL HEADER in each
c0c79a3f09914f35651895ffc111883455b7f62dtz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c0c79a3f09914f35651895ffc111883455b7f62dtz * If applicable, add the following below this CDDL HEADER, with the
c0c79a3f09914f35651895ffc111883455b7f62dtz * fields enclosed by brackets "[]" replaced with your own identifying
c0c79a3f09914f35651895ffc111883455b7f62dtz * information: Portions Copyright [yyyy] [name of copyright owner]
c0c79a3f09914f35651895ffc111883455b7f62dtz *
c0c79a3f09914f35651895ffc111883455b7f62dtz * CDDL HEADER END
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
cd3e933325e68e23516a196a8fea7f49b1e497c3Ali Bahrami * Use is subject to license terms.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz#pragma ident "%Z%%M% %I% %E% SMI"
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Test nfsmapid. This program is not shipped on the binary release.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <stdio.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <stdlib.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <stropts.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <strings.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <signal.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <fcntl.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <locale.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <unistd.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <netconfig.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <door.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/types.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/utsname.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/param.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/errno.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/cred.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/systm.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/kmem.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <sys/debug.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <rpcsvc/nfs4_prot.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz#include <nfs/nfsid_map.h>
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic char nobody_str[] = "nobody";
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int nfs_idmap_str_uid(utf8string *, uid_t *);
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int nfs_idmap_uid_str(uid_t, utf8string *);
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int nfs_idmap_str_gid(utf8string *, gid_t *);
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int nfs_idmap_gid_str(gid_t, utf8string *);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic void
c0c79a3f09914f35651895ffc111883455b7f62dtzusage()
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz fprintf(stderr, gettext(
c0c79a3f09914f35651895ffc111883455b7f62dtz "\nUsage:\tstr2uid string\n"
c0c79a3f09914f35651895ffc111883455b7f62dtz "\tstr2gid string\n"
c0c79a3f09914f35651895ffc111883455b7f62dtz "\tuid2str uid\n"
c0c79a3f09914f35651895ffc111883455b7f62dtz "\tgid2str gid\n"
c0c79a3f09914f35651895ffc111883455b7f62dtz "\techo string\n"
c0c79a3f09914f35651895ffc111883455b7f62dtz "\texit|quit\n"));
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int read_line(char *buf, int size)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz int len;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /* read the next line. If cntl-d, return with zero char count */
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("\n> "));
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (fgets(buf, size, stdin) == NULL)
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz len = strlen(buf);
c0c79a3f09914f35651895ffc111883455b7f62dtz buf[--len] = '\0';
c0c79a3f09914f35651895ffc111883455b7f62dtz return (len);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzstatic int
c0c79a3f09914f35651895ffc111883455b7f62dtzparse_input_line(char *input_line, int *argc, char ***argv)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz const char nil = '\0';
c0c79a3f09914f35651895ffc111883455b7f62dtz char *chptr;
c0c79a3f09914f35651895ffc111883455b7f62dtz int chr_cnt;
c0c79a3f09914f35651895ffc111883455b7f62dtz int arg_cnt = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz int ch_was_space = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz int ch_is_space;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz chr_cnt = strlen(input_line);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /* Count the arguments in the input_line string */
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz *argc = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz for (chptr = &input_line[0]; *chptr != nil; chptr++) {
c0c79a3f09914f35651895ffc111883455b7f62dtz ch_is_space = isspace(*chptr);
c0c79a3f09914f35651895ffc111883455b7f62dtz if (ch_is_space && !ch_was_space) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (*argc)++;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz ch_was_space = ch_is_space;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (ch_was_space) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (*argc)--;
c0c79a3f09914f35651895ffc111883455b7f62dtz } /* minus trailing spaces */
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /* Now that we know how many args calloc the argv array */
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz *argv = calloc((*argc)+1, sizeof (char *));
c0c79a3f09914f35651895ffc111883455b7f62dtz chptr = (char *)(&input_line[0]);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz for (ch_was_space = 1; *chptr != nil; chptr++) {
c0c79a3f09914f35651895ffc111883455b7f62dtz ch_is_space = isspace(*chptr);
c0c79a3f09914f35651895ffc111883455b7f62dtz if (ch_is_space) {
c0c79a3f09914f35651895ffc111883455b7f62dtz *chptr = nil; /* replace each space with nil */
c0c79a3f09914f35651895ffc111883455b7f62dtz } else if (ch_was_space) { /* begining of word? */
c0c79a3f09914f35651895ffc111883455b7f62dtz (*argv)[arg_cnt++] = chptr; /* new argument ? */
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz ch_was_space = ch_is_space;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz return (chr_cnt);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzchar *
c0c79a3f09914f35651895ffc111883455b7f62dtzmapstat(int stat)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz switch (stat) {
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_OK:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_OK");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NUMSTR:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_NUMSTR");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_UNMAPPABLE:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_UNMAPPABLE");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INVALID:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_INVALID");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INTERNAL:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_INTERNAL");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADDOMAIN:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_BADDOMAIN");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADID:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_BADID");
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NOTFOUND:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("NFSMAPID_NOTFOUND");
c0c79a3f09914f35651895ffc111883455b7f62dtz case EINVAL:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("EINVAL");
c0c79a3f09914f35651895ffc111883455b7f62dtz case ECOMM:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("ECOMM");
c0c79a3f09914f35651895ffc111883455b7f62dtz case ENOMEM:
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("ENOMEM");
c0c79a3f09914f35651895ffc111883455b7f62dtz default:
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(" unknown error %d ", stat);
c0c79a3f09914f35651895ffc111883455b7f62dtz return ("...");
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtzdo_test(char *input_buf)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz int argc, seal_argc;
c0c79a3f09914f35651895ffc111883455b7f62dtz char **argv, **argv_array;
c0c79a3f09914f35651895ffc111883455b7f62dtz char *cmd;
c0c79a3f09914f35651895ffc111883455b7f62dtz int i, bufsize = 512;
c0c79a3f09914f35651895ffc111883455b7f62dtz char str_buf[512];
c0c79a3f09914f35651895ffc111883455b7f62dtz utf8string str;
c0c79a3f09914f35651895ffc111883455b7f62dtz uid_t uid;
c0c79a3f09914f35651895ffc111883455b7f62dtz gid_t gid;
c0c79a3f09914f35651895ffc111883455b7f62dtz int stat;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz argv = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (parse_input_line(input_buf, &argc, &argv) == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("\n"));
c0c79a3f09914f35651895ffc111883455b7f62dtz return (1);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * remember argv_array address, which is memory calloc'd by
c0c79a3f09914f35651895ffc111883455b7f62dtz * parse_input_line, so it can be free'd at the end of the loop.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz argv_array = argv;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (argc < 1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz cmd = argv[0];
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (strcmp(cmd, "str2uid") == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (argc < 2) {
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww str.utf8string_val = argv[1];
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww str.utf8string_len = strlen(argv[1]);
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww stat = nfs_idmap_str_uid(&str, &uid);
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww printf(gettext("%u stat=%s \n"), uid, mapstat(stat));
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww
0bd81b6f8fb7804214192b87b0aa3f03fcf87c45gww } else if (strcmp(cmd, "str2gid") == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (argc < 2) {
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz str.utf8string_val = argv[1];
c0c79a3f09914f35651895ffc111883455b7f62dtz str.utf8string_len = strlen(argv[1]);
c0c79a3f09914f35651895ffc111883455b7f62dtz stat = nfs_idmap_str_gid(&str, &gid);
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("%u stat=%s \n"), gid, mapstat(stat));
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz } else if (strcmp(cmd, "uid2str") == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (argc < 2) {
cd3e933325e68e23516a196a8fea7f49b1e497c3Ali Bahrami usage();
cd3e933325e68e23516a196a8fea7f49b1e497c3Ali Bahrami free(argv_array);
cd3e933325e68e23516a196a8fea7f49b1e497c3Ali Bahrami return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz uid = atoi(argv[1]);
c0c79a3f09914f35651895ffc111883455b7f62dtz bzero(str_buf, bufsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz str.utf8string_val = str_buf;
c0c79a3f09914f35651895ffc111883455b7f62dtz stat = nfs_idmap_uid_str(uid, &str);
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("%s stat=%s\n"), str.utf8string_val,
c0c79a3f09914f35651895ffc111883455b7f62dtz mapstat(stat));
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz } else if (strcmp(cmd, "gid2str") == 0) {
57b598f5829606393ded70b44d927a5a004392b8tz if (argc < 2) {
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz gid = atoi(argv[1]);
c0c79a3f09914f35651895ffc111883455b7f62dtz bzero(str_buf, bufsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz str.utf8string_val = str_buf;
c0c79a3f09914f35651895ffc111883455b7f62dtz stat = nfs_idmap_gid_str(gid, &str);
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("%s stat=%s\n"), str.utf8string_val,
c0c79a3f09914f35651895ffc111883455b7f62dtz mapstat(stat));
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz } else if (strcmp(cmd, "echo") == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz for (i = 1; i < argc; i++)
c0c79a3f09914f35651895ffc111883455b7f62dtz printf("%s ", argv[i]);
c0c79a3f09914f35651895ffc111883455b7f62dtz printf("\n");
c0c79a3f09914f35651895ffc111883455b7f62dtz } else if (strcmp(cmd, "exit") == 0 ||
c0c79a3f09914f35651895ffc111883455b7f62dtz strcmp(cmd, "quit") == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz printf(gettext("\n"));
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (1);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz } else
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /* free argv array */
c0c79a3f09914f35651895ffc111883455b7f62dtz free(argv_array);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtzmain(int argc, char **argv)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz char buf[512];
c0c79a3f09914f35651895ffc111883455b7f62dtz int len, ret;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) setlocale(LC_ALL, "");
c0c79a3f09914f35651895ffc111883455b7f62dtz#ifndef TEXT_DOMAIN
c0c79a3f09914f35651895ffc111883455b7f62dtz#define TEXT_DOMAIN ""
c0c79a3f09914f35651895ffc111883455b7f62dtz#endif
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) textdomain(TEXT_DOMAIN);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz usage();
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Loop, repeatedly calling parse_input_line() to get the
c0c79a3f09914f35651895ffc111883455b7f62dtz * next line and parse it into argc and argv. Act on the
c0c79a3f09914f35651895ffc111883455b7f62dtz * arguements found on the line.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz do {
c0c79a3f09914f35651895ffc111883455b7f62dtz len = read_line(buf, 512);
c0c79a3f09914f35651895ffc111883455b7f62dtz if (len)
c0c79a3f09914f35651895ffc111883455b7f62dtz ret = do_test(buf);
c0c79a3f09914f35651895ffc111883455b7f62dtz } while (!ret);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz return (0);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz#define NFSMAPID_DOOR "/var/run/nfsmapid_door"
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Gen the door handle for connecting to the nfsmapid process.
c0c79a3f09914f35651895ffc111883455b7f62dtz * Keep the door cached. This call may be made quite often.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtznfs_idmap_doorget()
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz static int doorfd = -1;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (doorfd != -1)
c0c79a3f09914f35651895ffc111883455b7f62dtz return (doorfd);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((doorfd = open(NFSMAPID_DOOR, O_RDWR)) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz perror(NFSMAPID_DOOR);
c0c79a3f09914f35651895ffc111883455b7f62dtz exit(1);
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz return (doorfd);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Convert a user utf-8 string identifier into its local uid.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtznfs_idmap_str_uid(utf8string *u8s, uid_t *uid)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_arg *mapargp;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *mapresp = &mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *resp = mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_arg_t door_args;
c0c79a3f09914f35651895ffc111883455b7f62dtz int doorfd;
c0c79a3f09914f35651895ffc111883455b7f62dtz int error = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz static int msg_done = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!u8s || !u8s->utf8string_val || !u8s->utf8string_len ||
c0c79a3f09914f35651895ffc111883455b7f62dtz (u8s->utf8string_val[0] == '\0')) {
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (bcmp(u8s->utf8string_val, "nobody", 6) == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * If "nobody", just short circuit and bail
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz *uid = UID_NOBODY;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((mapargp = malloc(MAPID_ARG_LEN(u8s->utf8string_len))) == NULL) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) fprintf(stderr, "Unable to malloc %d bytes\n",
c0c79a3f09914f35651895ffc111883455b7f62dtz MAPID_ARG_LEN(u8s->utf8string_len));
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ENOMEM;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->cmd = NFSMAPID_STR_UID;
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->u_arg.len = u8s->utf8string_len;
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) bcopy(u8s->utf8string_val, mapargp->str, mapargp->u_arg.len);
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->str[mapargp->u_arg.len] = '\0';
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_ptr = (char *)mapargp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_size = MAPID_ARG_LEN(mapargp->u_arg.len);
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_ptr = NULL;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_num = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rbuf = (char *)mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rsize = sizeof (struct mapid_res);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * call to the nfsmapid daemon
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((doorfd = nfs_idmap_doorget()) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!msg_done) {
c0c79a3f09914f35651895ffc111883455b7f62dtz fprintf(stderr, "nfs_idmap_str_uid: Can't communicate"
c0c79a3f09914f35651895ffc111883455b7f62dtz " with mapping daemon nfsmapid\n");
c0c79a3f09914f35651895ffc111883455b7f62dtz msg_done = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ECOMM;
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (door_call(doorfd, &door_args) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz perror("door_call failed");
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz resp = (struct mapid_res *)door_args.rbuf;
c0c79a3f09914f35651895ffc111883455b7f62dtz switch (resp->status) {
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_OK:
c0c79a3f09914f35651895ffc111883455b7f62dtz *uid = resp->u_res.uid;
c0c79a3f09914f35651895ffc111883455b7f62dtz break;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NUMSTR:
c0c79a3f09914f35651895ffc111883455b7f62dtz *uid = resp->u_res.uid;
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto out;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz default:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_UNMAPPABLE:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INVALID:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INTERNAL:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADDOMAIN:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADID:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NOTFOUND:
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2u_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzs2u_done:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (error)
c0c79a3f09914f35651895ffc111883455b7f62dtz *uid = UID_NOBODY;
c0c79a3f09914f35651895ffc111883455b7f62dtzout:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp != mapresp)
c0c79a3f09914f35651895ffc111883455b7f62dtz munmap(door_args.rbuf, door_args.rsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (error);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Convert a uid into its utf-8 string representation.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtznfs_idmap_uid_str(uid_t uid, /* uid to map */
c0c79a3f09914f35651895ffc111883455b7f62dtz utf8string *u8s) /* resulting utf-8 string for uid */
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_arg maparg;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *mapresp = &mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *resp = mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_arg_t door_args;
c0c79a3f09914f35651895ffc111883455b7f62dtz int doorfd;
c0c79a3f09914f35651895ffc111883455b7f62dtz int error = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz static int msg_done = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (uid == UID_NOBODY) {
c0c79a3f09914f35651895ffc111883455b7f62dtz u8s->utf8string_len = strlen("nobody");
c0c79a3f09914f35651895ffc111883455b7f62dtz u8s->utf8string_val = nobody_str;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto u2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Daemon call...
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz maparg.cmd = NFSMAPID_UID_STR;
c0c79a3f09914f35651895ffc111883455b7f62dtz maparg.u_arg.uid = uid;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_ptr = (char *)&maparg;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_size = sizeof (struct mapid_arg);
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_ptr = NULL;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_num = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rbuf = (char *)mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rsize = sizeof (struct mapid_res);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((doorfd = nfs_idmap_doorget()) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!msg_done) {
c0c79a3f09914f35651895ffc111883455b7f62dtz fprintf(stderr, "nfs_idmap_uid_str: Can't "
c0c79a3f09914f35651895ffc111883455b7f62dtz "communicate with mapping daemon nfsmapid\n");
c0c79a3f09914f35651895ffc111883455b7f62dtz msg_done = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ECOMM;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto u2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (door_call(doorfd, &door_args) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz perror("door_call failed");
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto u2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz resp = (struct mapid_res *)door_args.rbuf;
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp->status != NFSMAPID_OK) {
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto u2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp->u_res.len != strlen(resp->str)) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) fprintf(stderr, "Incorrect length %d expected %d\n",
c0c79a3f09914f35651895ffc111883455b7f62dtz resp->u_res.len, strlen(resp->str));
c0c79a3f09914f35651895ffc111883455b7f62dtz error = NFSMAPID_INVALID;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto u2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz u8s->utf8string_len = resp->u_res.len;
c0c79a3f09914f35651895ffc111883455b7f62dtz bcopy(resp->str, u8s->utf8string_val, u8s->utf8string_len);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzu2s_done:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp != mapresp)
c0c79a3f09914f35651895ffc111883455b7f62dtz munmap(door_args.rbuf, door_args.rsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (error);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Convert a group utf-8 string identifier into its local gid.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtznfs_idmap_str_gid(utf8string *u8s, gid_t *gid)
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_arg *mapargp;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *mapresp = &mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *resp = mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_arg_t door_args;
c0c79a3f09914f35651895ffc111883455b7f62dtz int doorfd;
c0c79a3f09914f35651895ffc111883455b7f62dtz int error = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz static int msg_done = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!u8s || !u8s->utf8string_val || !u8s->utf8string_len ||
c0c79a3f09914f35651895ffc111883455b7f62dtz (u8s->utf8string_val[0] == '\0')) {
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (bcmp(u8s->utf8string_val, "nobody", 6) == 0) {
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * If "nobody", just short circuit and bail
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz *gid = GID_NOBODY;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((mapargp = malloc(MAPID_ARG_LEN(u8s->utf8string_len))) == NULL) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) fprintf(stderr, "Unable to malloc %d bytes\n",
c0c79a3f09914f35651895ffc111883455b7f62dtz MAPID_ARG_LEN(u8s->utf8string_len));
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ENOMEM;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->cmd = NFSMAPID_STR_GID;
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->u_arg.len = u8s->utf8string_len;
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) bcopy(u8s->utf8string_val, mapargp->str, mapargp->u_arg.len);
c0c79a3f09914f35651895ffc111883455b7f62dtz mapargp->str[mapargp->u_arg.len] = '\0';
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_ptr = (char *)mapargp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_size = MAPID_ARG_LEN(mapargp->u_arg.len);
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_ptr = NULL;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_num = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rbuf = (char *)mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rsize = sizeof (struct mapid_res);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * call to the nfsmapid daemon
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((doorfd = nfs_idmap_doorget()) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!msg_done) {
c0c79a3f09914f35651895ffc111883455b7f62dtz fprintf(stderr, "nfs_idmap_str_uid: Can't communicate"
c0c79a3f09914f35651895ffc111883455b7f62dtz " with mapping daemon nfsmapid\n");
c0c79a3f09914f35651895ffc111883455b7f62dtz msg_done = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ECOMM;
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (door_call(doorfd, &door_args) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz perror("door_call failed");
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz free(mapargp);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz resp = (struct mapid_res *)door_args.rbuf;
c0c79a3f09914f35651895ffc111883455b7f62dtz switch (resp->status) {
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_OK:
c0c79a3f09914f35651895ffc111883455b7f62dtz *gid = resp->u_res.gid;
c0c79a3f09914f35651895ffc111883455b7f62dtz break;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NUMSTR:
c0c79a3f09914f35651895ffc111883455b7f62dtz *gid = resp->u_res.gid;
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto out;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz default:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_UNMAPPABLE:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INVALID:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_INTERNAL:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADDOMAIN:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_BADID:
c0c79a3f09914f35651895ffc111883455b7f62dtz case NFSMAPID_NOTFOUND:
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto s2g_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzs2g_done:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (error)
c0c79a3f09914f35651895ffc111883455b7f62dtz *gid = GID_NOBODY;
c0c79a3f09914f35651895ffc111883455b7f62dtzout:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp != mapresp)
c0c79a3f09914f35651895ffc111883455b7f62dtz munmap(door_args.rbuf, door_args.rsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (error);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz/*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Convert a gid into its utf-8 string representation.
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtzint
c0c79a3f09914f35651895ffc111883455b7f62dtznfs_idmap_gid_str(gid_t gid, /* gid to map */
c0c79a3f09914f35651895ffc111883455b7f62dtz utf8string *g8s) /* resulting utf-8 string for gid */
c0c79a3f09914f35651895ffc111883455b7f62dtz{
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_arg maparg;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *mapresp = &mapres;
c0c79a3f09914f35651895ffc111883455b7f62dtz struct mapid_res *resp = mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_arg_t door_args;
c0c79a3f09914f35651895ffc111883455b7f62dtz int error = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz int doorfd;
c0c79a3f09914f35651895ffc111883455b7f62dtz static int msg_done = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (gid == GID_NOBODY) {
c0c79a3f09914f35651895ffc111883455b7f62dtz g8s->utf8string_len = strlen("nobody");
c0c79a3f09914f35651895ffc111883455b7f62dtz g8s->utf8string_val = nobody_str;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto g2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz /*
c0c79a3f09914f35651895ffc111883455b7f62dtz * Daemon call...
c0c79a3f09914f35651895ffc111883455b7f62dtz */
c0c79a3f09914f35651895ffc111883455b7f62dtz maparg.cmd = NFSMAPID_GID_STR;
c0c79a3f09914f35651895ffc111883455b7f62dtz maparg.u_arg.gid = gid;
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_ptr = (char *)&maparg;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.data_size = sizeof (struct mapid_arg);
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_ptr = NULL;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.desc_num = 0;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rbuf = (char *)mapresp;
c0c79a3f09914f35651895ffc111883455b7f62dtz door_args.rsize = sizeof (struct mapid_res);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if ((doorfd = nfs_idmap_doorget()) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz if (!msg_done) {
c0c79a3f09914f35651895ffc111883455b7f62dtz fprintf(stderr, "nfs_idmap_uid_str: Can't "
c0c79a3f09914f35651895ffc111883455b7f62dtz "communicate with mapping daemon nfsmapid\n");
c0c79a3f09914f35651895ffc111883455b7f62dtz msg_done = 1;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz error = ECOMM;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto g2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (door_call(doorfd, &door_args) == -1) {
c0c79a3f09914f35651895ffc111883455b7f62dtz perror("door_call failed");
c0c79a3f09914f35651895ffc111883455b7f62dtz error = EINVAL;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto g2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz resp = (struct mapid_res *)door_args.rbuf;
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp->status != NFSMAPID_OK) {
c0c79a3f09914f35651895ffc111883455b7f62dtz error = resp->status;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto g2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp->u_res.len != strlen(resp->str)) {
c0c79a3f09914f35651895ffc111883455b7f62dtz (void) fprintf(stderr, "Incorrect length %d expected %d\n",
c0c79a3f09914f35651895ffc111883455b7f62dtz resp->u_res.len, strlen(resp->str));
c0c79a3f09914f35651895ffc111883455b7f62dtz error = NFSMAPID_INVALID;
c0c79a3f09914f35651895ffc111883455b7f62dtz goto g2s_done;
c0c79a3f09914f35651895ffc111883455b7f62dtz }
c0c79a3f09914f35651895ffc111883455b7f62dtz g8s->utf8string_len = resp->u_res.len;
c0c79a3f09914f35651895ffc111883455b7f62dtz bcopy(resp->str, g8s->utf8string_val, g8s->utf8string_len);
c0c79a3f09914f35651895ffc111883455b7f62dtz
c0c79a3f09914f35651895ffc111883455b7f62dtzg2s_done:
c0c79a3f09914f35651895ffc111883455b7f62dtz if (resp != mapresp)
c0c79a3f09914f35651895ffc111883455b7f62dtz munmap(door_args.rbuf, door_args.rsize);
c0c79a3f09914f35651895ffc111883455b7f62dtz return (error);
c0c79a3f09914f35651895ffc111883455b7f62dtz}
c0c79a3f09914f35651895ffc111883455b7f62dtz