c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER START
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The contents of this file are subject to the terms of the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Common Development and Distribution License (the "License").
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You may not use this file except in compliance with the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * or http://www.opensolaris.org/os/licensing.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * See the License for the specific language governing permissions
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * and limitations under the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * When distributing Covered Code, include this CDDL HEADER in each
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If applicable, add the following below this CDDL HEADER, with the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * fields enclosed by brackets "[]" replaced with your own identifying
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * information: Portions Copyright [yyyy] [name of copyright owner]
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER END
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
23a1ccea6aac035f084a7a4cdc968687d1b02dafRoger A. Faulkner
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdio.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdlib.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <locale.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <strings.h>
821da340f9590922ba8761a64fadda18843a0e88dm#include <errno.h>
821da340f9590922ba8761a64fadda18843a0e88dm#include <limits.h>
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen#include <syslog.h>
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <stdarg.h>
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#include <note.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "idmap_engine.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "idmap_priv.h"
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai#include "namemaps.h"
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai#include "libadutils.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Initialization values for pids/rids: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define UNDEFINED_UID (uid_t)-1
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define UNDEFINED_GID (gid_t)-1
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define UNDEFINED_RID (idmap_rid_t)-1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm#define CHECK_NULL(s) (s != NULL ? s : "null")
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * used in do_show for the type of argument, which can be winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * unixname, uid, gid, sid or not given at all:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_SID 0x010 /* sid */
cd37da7426f0c49c14ad9a8a07638ca971477566nw#define TYPE_USID 0x011 /* usid */
cd37da7426f0c49c14ad9a8a07638ca971477566nw#define TYPE_GSID 0x012 /* gsid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_WN 0x110 /* winname */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define TYPE_WU 0x111 /* winuser */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define TYPE_WG 0x112 /* wingroup */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_UID 0x001 /* uid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_GID 0x002 /* gid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_PID 0x000 /* pid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define TYPE_UN 0x100 /* unixname */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define TYPE_UU 0x101 /* unixuser */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define TYPE_UG 0x102 /* unixgroup */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define IS_WIN 0x010 /* mask for the windows types */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define IS_NAME 0x100 /* mask for string name types */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define IS_USER 0x001 /* mask for user types */
8e22821528b08c6dba4e8176351560f316f6d0dedm#define IS_GROUP 0x002 /* mask for group types */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm#define TYPE_INVALID 0x1000 /* Invalid input */
479ac37569625bae44ffb80071d4bc865fc710eddm#define TYPE_AUTO 0xaaa /* Autodetection required */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Identity type strings */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define ID_WINNAME "winname"
8e22821528b08c6dba4e8176351560f316f6d0dedm#define ID_UNIXUSER "unixuser"
8e22821528b08c6dba4e8176351560f316f6d0dedm#define ID_UNIXGROUP "unixgroup"
8e22821528b08c6dba4e8176351560f316f6d0dedm#define ID_WINUSER "winuser"
8e22821528b08c6dba4e8176351560f316f6d0dedm#define ID_WINGROUP "wingroup"
cd37da7426f0c49c14ad9a8a07638ca971477566nw#define ID_USID "usid"
cd37da7426f0c49c14ad9a8a07638ca971477566nw#define ID_GSID "gsid"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define ID_SID "sid"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define ID_UID "uid"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define ID_GID "gid"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm#define ID_UNKNOWN "unknown"
479ac37569625bae44ffb80071d4bc865fc710eddm
cd37da7426f0c49c14ad9a8a07638ca971477566nw#define INHIBITED(str) (str == NULL || *str == 0 || strcmp(str, "\"\"") == 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nwtypedef struct {
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *identity;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int code;
cd37da7426f0c49c14ad9a8a07638ca971477566nw} id_code_t;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nwid_code_t identity2code[] = {
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_WINNAME, TYPE_WN},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_UNIXUSER, TYPE_UU},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_UNIXGROUP, TYPE_UG},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_WINUSER, TYPE_WU},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_WINGROUP, TYPE_WG},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_USID, TYPE_USID},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_GSID, TYPE_GSID},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_SID, TYPE_SID},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_UID, TYPE_UID},
cd37da7426f0c49c14ad9a8a07638ca971477566nw {ID_GID, TYPE_GID}
cd37da7426f0c49c14ad9a8a07638ca971477566nw};
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Flags */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define f_FLAG 'f'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define t_FLAG 't'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define d_FLAG 'd'
479ac37569625bae44ffb80071d4bc865fc710eddm#define D_FLAG 'D'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define F_FLAG 'F'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define a_FLAG 'a'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define n_FLAG 'n'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define c_FLAG 'c'
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp#define v_FLAG 'v'
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#define V_FLAG 'V'
479ac37569625bae44ffb80071d4bc865fc710eddm#define j_FLAG 'j'
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* used in the function do_import */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define MAX_INPUT_LINE_SZ 2047
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwtypedef struct {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_wuser;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int direction;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw boolean_t is_nt4;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *unixname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *winname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *windomain;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *sidprefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_rid_t rid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t pid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw} name_mapping_t;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Formats of the output:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Idmap reads/prints mappings in several formats: ordinary mappings,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * name mappings in Samba username map format (smbusers), Netapp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * usermap.cfg.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * DEFAULT_FORMAT are in fact the idmap subcommands suitable for
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * piping to idmap standart input. For example
8e22821528b08c6dba4e8176351560f316f6d0dedm * add -d winuser:bob@foo.com unixuser:fred
8e22821528b08c6dba4e8176351560f316f6d0dedm * add -d winuser:bob2bar.com unixuser:fred
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * SMBUSERS is the format of Samba username map (smbusers). For full
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * documentation, search for "username map" in smb.conf manpage.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The format is for example
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * fred = bob@foo.com bob2@bar.com
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * USERMAP_CFG is the format of Netapp usermap.cfg file. Search
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * http://www.netapp.com/ for more documentation. IP qualifiers are not
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * supported.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The format is for example
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * bob@foo.com => fred
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * "Bob With Spaces"@bar.com => fred #comment
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The previous formats were for name rules. MAPPING_NAME and
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * MAPPING_ID are for the actual mappings, as seen in show/dump
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * commands. MAPPING_NAME prefers the string names of the user over
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * their numerical identificators. MAPPING_ID prints just the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * identificators.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Example of the MAPPING_NAME:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * winname:bob@foo.com -> unixname:fred
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Example of the MAPPING_ID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * sid:S-1-2-3-4 -> uid:5678
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwtypedef enum {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw UNDEFINED_FORMAT = -1,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw DEFAULT_FORMAT = 0,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw MAPPING_ID,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw MAPPING_NAME,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw USERMAP_CFG,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw SMBUSERS
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw} format_t;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nwtypedef struct {
cd37da7426f0c49c14ad9a8a07638ca971477566nw format_t format;
cd37da7426f0c49c14ad9a8a07638ca971477566nw FILE *file;
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_t *last;
cd37da7426f0c49c14ad9a8a07638ca971477566nw} print_handle_t;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * idmap_api batch related variables:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * idmap can operate in two modes. It the batch mode, the idmap_api
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * batch is committed at the end of a batch of several
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * commands. At the end of input file, typically. This mode is used
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * for processing input from a file.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * In the non-batch mode, each command is committed immediately. This
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * mode is used for tty input.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Are we in the batch mode? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int batch_mode = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm/* Self describing stricture for positions */
8e22821528b08c6dba4e8176351560f316f6d0dedmstruct pos_sds {
8e22821528b08c6dba4e8176351560f316f6d0dedm int size;
8e22821528b08c6dba4e8176351560f316f6d0dedm int last;
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t *pos[1];
8e22821528b08c6dba4e8176351560f316f6d0dedm};
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic struct pos_sds *positions;
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Handles for idmap_api batch */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic idmap_udt_handle_t *udt = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
61b364a9162c5e321625fcd2f640da7e1dd2417ejptypedef struct {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp char *user;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp char *passwd;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp char *auth;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp char *windomain;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp int direction;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp idmap_nm_handle_t *handle;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp} namemaps_t;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic namemaps_t namemaps = {NULL, NULL, NULL, NULL, 0, NULL};
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Do we need to commit the udt batch at the end? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int udt_used;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Command handlers */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_show_mapping(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_dump(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_import(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_list_name_mappings(flag_t *f, int argc, char **argv,
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_add_name_mapping(flag_t *f, int argc, char **argv,
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_remove_name_mapping(flag_t *f, int argc, char **argv,
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t *pos);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int do_flush(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_exit(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_export(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int do_help(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int do_set_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int do_unset_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int do_get_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States/* Command names and their handlers to be passed to idmap_engine */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic cmd_ops_t commands[] = {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "show",
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright "c(create)v(verbose)V(trace)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_show_mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "dump",
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp "n(names)v(verbose)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_dump
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "import",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "F(flush)f:(file)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_import
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "export",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "f:(file)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_export
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "list",
8e22821528b08c6dba4e8176351560f316f6d0dedm "",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_list_name_mappings
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "add",
8e22821528b08c6dba4e8176351560f316f6d0dedm "d(directional)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_add_name_mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "remove",
8e22821528b08c6dba4e8176351560f316f6d0dedm "a(all)t(to)f(from)d(directional)",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_remove_name_mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "flush",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "a(all)",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States do_flush
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "exit",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_exit
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw },
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "help",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do_help
479ac37569625bae44ffb80071d4bc865fc710eddm },
479ac37569625bae44ffb80071d4bc865fc710eddm {
479ac37569625bae44ffb80071d4bc865fc710eddm "set-namemap",
479ac37569625bae44ffb80071d4bc865fc710eddm "a:(authentication)D:(bindDN)j:(passwd-file)",
479ac37569625bae44ffb80071d4bc865fc710eddm do_set_namemap
479ac37569625bae44ffb80071d4bc865fc710eddm },
479ac37569625bae44ffb80071d4bc865fc710eddm {
479ac37569625bae44ffb80071d4bc865fc710eddm "get-namemap",
479ac37569625bae44ffb80071d4bc865fc710eddm "",
479ac37569625bae44ffb80071d4bc865fc710eddm do_get_namemap
479ac37569625bae44ffb80071d4bc865fc710eddm },
479ac37569625bae44ffb80071d4bc865fc710eddm {
479ac37569625bae44ffb80071d4bc865fc710eddm "unset-namemap",
479ac37569625bae44ffb80071d4bc865fc710eddm "a:(authentication)D:(bindDN)j:(passwd-file):",
479ac37569625bae44ffb80071d4bc865fc710eddm do_unset_namemap
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw};
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
8e22821528b08c6dba4e8176351560f316f6d0dedm/* Print error message, possibly with a position */
8e22821528b08c6dba4e8176351560f316f6d0dedm/* printflike */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic void
cd37da7426f0c49c14ad9a8a07638ca971477566nwprint_error(cmd_pos_t *pos, const char *format, ...)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm size_t length;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm va_list ap;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm va_start(ap, format);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (pos != NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm length = strlen(pos->line);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm /* Skip newlines etc at the end: */
8e22821528b08c6dba4e8176351560f316f6d0dedm while (length > 0 && isspace(pos->line[length - 1]))
8e22821528b08c6dba4e8176351560f316f6d0dedm length--;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) fprintf(stderr,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Error at line %d: %.*s\n"),
8e22821528b08c6dba4e8176351560f316f6d0dedm pos->linenum,
8e22821528b08c6dba4e8176351560f316f6d0dedm length,
8e22821528b08c6dba4e8176351560f316f6d0dedm pos->line);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) vfprintf(stderr, format, ap);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm va_end(ap);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/* Inits positions sds. 0 means everything went OK, -1 for errors */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwinit_positions()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm int init_size = 32; /* Initial size of the positions array */
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm positions = (struct pos_sds *) malloc(sizeof (struct pos_sds) +
8e22821528b08c6dba4e8176351560f316f6d0dedm (init_size - 1) * sizeof (cmd_pos_t *));
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
8e22821528b08c6dba4e8176351560f316f6d0dedm return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->size = init_size;
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->last = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm return (0);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/* Free the positions array */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic void
cd37da7426f0c49c14ad9a8a07638ca971477566nwfini_positions()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm int i;
8e22821528b08c6dba4e8176351560f316f6d0dedm for (i = 0; i < positions->last; i++) {
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions->pos[i] == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm continue;
8e22821528b08c6dba4e8176351560f316f6d0dedm free(positions->pos[i]->line);
8e22821528b08c6dba4e8176351560f316f6d0dedm free(positions->pos[i]);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm free(positions);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm positions = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Add another position to the positions array. 0 means everything
8e22821528b08c6dba4e8176351560f316f6d0dedm * went OK, -1 for errors
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwpositions_add(cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions->last >= positions->size) {
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->size *= 2;
8e22821528b08c6dba4e8176351560f316f6d0dedm positions = (struct pos_sds *)realloc(positions,
8e22821528b08c6dba4e8176351560f316f6d0dedm sizeof (struct pos_sds) +
8e22821528b08c6dba4e8176351560f316f6d0dedm (positions->size - 1) * sizeof (cmd_pos_t *));
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto nomemory;
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (pos == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->pos[positions->last] = NULL;
8e22821528b08c6dba4e8176351560f316f6d0dedm else {
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->pos[positions->last] = (cmd_pos_t *)calloc(1,
8e22821528b08c6dba4e8176351560f316f6d0dedm sizeof (cmd_pos_t));
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions->pos[positions->last] == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto nomemory;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm *positions->pos[positions->last] = *pos;
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->pos[positions->last]->line = strdup(pos->line);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions->pos[positions->last]->line == NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto nomemory;
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm positions->last++;
8e22821528b08c6dba4e8176351560f316f6d0dedm return (0);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedmnomemory:
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
8e22821528b08c6dba4e8176351560f316f6d0dedm return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm/*
821da340f9590922ba8761a64fadda18843a0e88dm * Compare two strings just like strcmp, but stop before the end of
821da340f9590922ba8761a64fadda18843a0e88dm * the s2
821da340f9590922ba8761a64fadda18843a0e88dm */
821da340f9590922ba8761a64fadda18843a0e88dmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwstrcmp_no0(const char *s1, const char *s2)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
821da340f9590922ba8761a64fadda18843a0e88dm return (strncmp(s1, s2, strlen(s2)));
821da340f9590922ba8761a64fadda18843a0e88dm}
821da340f9590922ba8761a64fadda18843a0e88dm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Print help message */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic void
cd37da7426f0c49c14ad9a8a07638ca971477566nwhelp()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "idmap\n"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "idmap -f command-file\n"
8e22821528b08c6dba4e8176351560f316f6d0dedm "idmap add [-d] name1 name2\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap dump [-n] [-v]\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap export [-f file] format\n"
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "idmap flush [-a]\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap get-namemap name\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap help\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap import [-F] [-f file] format\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap list\n"
8e22821528b08c6dba4e8176351560f316f6d0dedm "idmap remove -a\n"
cd37da7426f0c49c14ad9a8a07638ca971477566nw "idmap remove [-f|-t] name\n"
8e22821528b08c6dba4e8176351560f316f6d0dedm "idmap remove [-d] name1 name2\n"
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh "idmap set-namemap [-a authenticationMethod] [-D bindDN]\n"
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh " [-j passwdfile] name1 name2\n"
479ac37569625bae44ffb80071d4bc865fc710eddm "idmap show [-c] [-v] identity [targettype]\n"
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh "idmap unset-namemap [-a authenticationMethod] [-D bindDN]\n"
fd9ee8b58485b20072eeef1310a88ff348d5e7fajoyce mcintosh " [-j passwdfile] name [targettype]\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* The handler for the "help" command. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_help(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw help();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Initialization of the commands which perform write operations */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwinit_udt_batch()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_udt_create(&udt);
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Error initiating transaction (%s)"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (init_positions() < 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Finalization of the write commands */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwinit_udt_command()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udt_used = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (batch_mode)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (init_udt_batch());
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* If everythings is OK, send the udt batch to idmapd */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwfini_udt_command(int ok, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm int rc = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm int64_t failpos;
8e22821528b08c6dba4e8176351560f316f6d0dedm idmap_stat stat, stat1;
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t *reported_pos;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (batch_mode)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (0);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (udt == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Internal error: uninitiated batch.\n"));
8e22821528b08c6dba4e8176351560f316f6d0dedm return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (ok && udt_used) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw stat = idmap_udt_commit(udt);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (stat == IDMAP_SUCCESS)
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm stat1 = idmap_udt_get_error_index(udt, &failpos);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (stat1 != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Error diagnosing transaction (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat1));
8e22821528b08c6dba4e8176351560f316f6d0dedm goto out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (failpos < 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm reported_pos = pos;
8e22821528b08c6dba4e8176351560f316f6d0dedm else
8e22821528b08c6dba4e8176351560f316f6d0dedm reported_pos = positions->pos[failpos];
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(reported_pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Error commiting transaction (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedmout:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_udt_destroy(udt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udt = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udt_used = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm fini_positions();
8e22821528b08c6dba4e8176351560f316f6d0dedm return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp/*
61b364a9162c5e321625fcd2f640da7e1dd2417ejp * Compare two possibly NULL strings
61b364a9162c5e321625fcd2f640da7e1dd2417ejp */
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic int
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstrcasecmp_null(char *a, char *b)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (a == NULL && b == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (0);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (a == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (b == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (strcasecmp(a, b));
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp/*
61b364a9162c5e321625fcd2f640da7e1dd2417ejp * Compare two possibly NULL strings
61b364a9162c5e321625fcd2f640da7e1dd2417ejp */
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic int
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstrcmp_null(char *a, char *b)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (a == NULL && b == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (0);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (a == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (b == NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (strcmp(a, b));
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic void
61b364a9162c5e321625fcd2f640da7e1dd2417ejpfree_null(char **ptr)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (*ptr != NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp free(*ptr);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp *ptr = NULL;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic
61b364a9162c5e321625fcd2f640da7e1dd2417ejpvoid
61b364a9162c5e321625fcd2f640da7e1dd2417ejpnamemaps_free()
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp free_null(&namemaps.user);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (namemaps.passwd != NULL)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp (void) memset(namemaps.passwd, 0, strlen(namemaps.passwd));
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp free_null(&namemaps.passwd);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp free_null(&namemaps.auth);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp free_null(&namemaps.windomain);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps.direction = IDMAP_DIRECTION_UNDEF;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (namemaps.handle != NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp idmap_fini_namemaps(namemaps.handle);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps.handle = NULL;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp/* Initialization of the commands which perform write operations */
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic
61b364a9162c5e321625fcd2f640da7e1dd2417ejpint
61b364a9162c5e321625fcd2f640da7e1dd2417ejpinit_nm_command(char *user, char *passwd, char *auth, char *windomain,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp int direction, cmd_pos_t *pos)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp idmap_stat stat;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (namemaps.handle != NULL && (
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strcmp_null(user, namemaps.user) != 0 ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strcmp_null(passwd, namemaps.passwd) != 0 ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strcasecmp_null(auth, namemaps.auth) != 0 ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strcasecmp_null(windomain, namemaps.windomain) != 0 ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp direction != namemaps.direction)) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps_free();
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (namemaps.handle == NULL) {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_init_namemaps(&namemaps.handle, user,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp passwd, auth, windomain, direction);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (stat != IDMAP_SUCCESS) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp gettext("Error: could not perform directory-based "
61b364a9162c5e321625fcd2f640da7e1dd2417ejp "name mapping operation (%s)"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps_free();
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (user != NULL && (namemaps.user = strdup(user)) == NULL ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp passwd != NULL && (namemaps.passwd =
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strdup(passwd)) == NULL ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp auth != NULL && (namemaps.auth = strdup(auth)) == NULL ||
61b364a9162c5e321625fcd2f640da7e1dd2417ejp windomain != NULL && (namemaps.windomain =
61b364a9162c5e321625fcd2f640da7e1dd2417ejp strdup(windomain)) == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps_free();
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps.direction = direction;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp }
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (0);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp/* Cleanup after the xxx-namemaps commands */
61b364a9162c5e321625fcd2f640da7e1dd2417ejpstatic void
61b364a9162c5e321625fcd2f640da7e1dd2417ejpfini_nm_command()
61b364a9162c5e321625fcd2f640da7e1dd2417ejp{
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (batch_mode)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp namemaps_free();
61b364a9162c5e321625fcd2f640da7e1dd2417ejp}
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Convert numeric expression of the direction to it's string form */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwdirection2string(int direction)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (direction) {
8e22821528b08c6dba4e8176351560f316f6d0dedm case IDMAP_DIRECTION_BI:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return ("==");
8e22821528b08c6dba4e8176351560f316f6d0dedm case IDMAP_DIRECTION_W2U:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return ("=>");
8e22821528b08c6dba4e8176351560f316f6d0dedm case IDMAP_DIRECTION_U2W:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return ("<=");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
821da340f9590922ba8761a64fadda18843a0e88dm /* This can never happen: */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Internal error: invalid direction.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return ("");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* never reached */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm/*
821da340f9590922ba8761a64fadda18843a0e88dm * Returns 1 if c is a shell-meta-character requiring quoting, 0
821da340f9590922ba8761a64fadda18843a0e88dm * otherwise.
821da340f9590922ba8761a64fadda18843a0e88dm *
821da340f9590922ba8761a64fadda18843a0e88dm * We don't quote '*' and ':' because they cannot do any harm
821da340f9590922ba8761a64fadda18843a0e88dm * a) they have no meaning to idmap_engine b) even ifsomebody copy &
821da340f9590922ba8761a64fadda18843a0e88dm * paste idmap output to a shell commandline, there is the identity
821da340f9590922ba8761a64fadda18843a0e88dm * type string in front of them. On the other hand, '*' and ':' are
821da340f9590922ba8761a64fadda18843a0e88dm * everywhere.
821da340f9590922ba8761a64fadda18843a0e88dm */
821da340f9590922ba8761a64fadda18843a0e88dmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwis_shell_special(char c)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
821da340f9590922ba8761a64fadda18843a0e88dm if (isspace(c))
821da340f9590922ba8761a64fadda18843a0e88dm return (1);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (strchr("&^{}#;'\"\\`!$()[]><|~", c) != NULL)
821da340f9590922ba8761a64fadda18843a0e88dm return (1);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm}
821da340f9590922ba8761a64fadda18843a0e88dm
8e22821528b08c6dba4e8176351560f316f6d0dedm/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Returns 1 if c is a shell-meta-character requiring quoting even
8e22821528b08c6dba4e8176351560f316f6d0dedm * inside double quotes, 0 otherwise. It means \, " and $ .
8e22821528b08c6dba4e8176351560f316f6d0dedm *
8e22821528b08c6dba4e8176351560f316f6d0dedm * This set of characters is a subset of those in is_shell_special().
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwis_dq_special(char c)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
8e22821528b08c6dba4e8176351560f316f6d0dedm if (strchr("\\\"$", c) != NULL)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (1);
8e22821528b08c6dba4e8176351560f316f6d0dedm return (0);
8e22821528b08c6dba4e8176351560f316f6d0dedm}
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm
821da340f9590922ba8761a64fadda18843a0e88dm/*
821da340f9590922ba8761a64fadda18843a0e88dm * Quote any shell meta-characters in the given string. If 'quote' is
821da340f9590922ba8761a64fadda18843a0e88dm * true then use double-quotes to quote the whole string, else use
821da340f9590922ba8761a64fadda18843a0e88dm * back-slash to quote each individual meta-character.
821da340f9590922ba8761a64fadda18843a0e88dm *
821da340f9590922ba8761a64fadda18843a0e88dm * The resulting string is placed in *res. Callers must free *res if the
821da340f9590922ba8761a64fadda18843a0e88dm * return value isn't 0 (even if the given string had no meta-chars).
821da340f9590922ba8761a64fadda18843a0e88dm * If there are any errors this returns -1, else 0.
821da340f9590922ba8761a64fadda18843a0e88dm */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwshell_app(char **res, char *string, int quote)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
821da340f9590922ba8761a64fadda18843a0e88dm int i, j;
821da340f9590922ba8761a64fadda18843a0e88dm uint_t noss = 0; /* Number Of Shell Special chars in the input */
821da340f9590922ba8761a64fadda18843a0e88dm uint_t noqb = 0; /* Number Of Quotes and Backslahes in the input */
821da340f9590922ba8761a64fadda18843a0e88dm char *out;
821da340f9590922ba8761a64fadda18843a0e88dm size_t len_orig = strlen(string);
821da340f9590922ba8761a64fadda18843a0e88dm size_t len;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (INHIBITED(string)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = strdup("\"\"");
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (out == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw *res = out;
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (0);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
821da340f9590922ba8761a64fadda18843a0e88dm /* First, let us count how many characters we need to quote: */
821da340f9590922ba8761a64fadda18843a0e88dm for (i = 0; i < len_orig; i++) {
821da340f9590922ba8761a64fadda18843a0e88dm if (is_shell_special(string[i])) {
821da340f9590922ba8761a64fadda18843a0e88dm noss++;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (is_dq_special(string[i]))
821da340f9590922ba8761a64fadda18843a0e88dm noqb++;
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* Do we need to quote at all? */
821da340f9590922ba8761a64fadda18843a0e88dm if (noss == 0) {
821da340f9590922ba8761a64fadda18843a0e88dm out = strdup(string);
821da340f9590922ba8761a64fadda18843a0e88dm if (out == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
821da340f9590922ba8761a64fadda18843a0e88dm return (-1);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm *res = out;
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* What is the length of the result? */
821da340f9590922ba8761a64fadda18843a0e88dm if (quote)
821da340f9590922ba8761a64fadda18843a0e88dm len = strlen(string) + 2 + noqb + 1; /* 2 for quotation marks */
821da340f9590922ba8761a64fadda18843a0e88dm else
821da340f9590922ba8761a64fadda18843a0e88dm len = strlen(string) + noss + 1;
821da340f9590922ba8761a64fadda18843a0e88dm
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = (char *)malloc(len);
821da340f9590922ba8761a64fadda18843a0e88dm if (out == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm j = 0;
821da340f9590922ba8761a64fadda18843a0e88dm if (quote)
821da340f9590922ba8761a64fadda18843a0e88dm out[j++] = '"';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm for (i = 0; i < len_orig; i++) {
821da340f9590922ba8761a64fadda18843a0e88dm /* Quote the dangerous chars by a backslash */
8e22821528b08c6dba4e8176351560f316f6d0dedm if (quote && is_dq_special(string[i]) ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw (!quote && is_shell_special(string[i]))) {
821da340f9590922ba8761a64fadda18843a0e88dm out[j++] = '\\';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
821da340f9590922ba8761a64fadda18843a0e88dm out[j++] = string[i];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm if (quote)
821da340f9590922ba8761a64fadda18843a0e88dm out[j++] = '"';
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm out[j] = '\0';
821da340f9590922ba8761a64fadda18843a0e88dm *res = out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Assemble string form sid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwsid_format(name_mapping_t *nm)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *to;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t len;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *typestring;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (nm->is_wuser) {
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_YES:
cd37da7426f0c49c14ad9a8a07638ca971477566nw typestring = ID_USID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_NO:
cd37da7426f0c49c14ad9a8a07638ca971477566nw typestring = ID_GSID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw default:
cd37da7426f0c49c14ad9a8a07638ca971477566nw typestring = ID_SID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* 'usid:' + sidprefix + '-' + rid + '\0' */
cd37da7426f0c49c14ad9a8a07638ca971477566nw len = strlen(nm->sidprefix) + 7 + 3 * sizeof (nm->rid);
cd37da7426f0c49c14ad9a8a07638ca971477566nw to = (char *)malloc(len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (to == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) snprintf(to, len, "%s:%s-%u", typestring, nm->sidprefix,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->rid);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (to);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Assemble string form uid or gid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwpid_format(uid_t from, int is_user)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *to;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t len;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* ID_UID ":" + uid + '\0' */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw len = 5 + 3 * sizeof (uid_t);
cd37da7426f0c49c14ad9a8a07638ca971477566nw to = (char *)malloc(len);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (to == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm (void) snprintf(to, len, "%s:%u", is_user ? ID_UID : ID_GID, from);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (to);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm/* Assemble winname, e.g. "winuser:bob@foo.sun.com", from name_mapping_t */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwnm2winqn(name_mapping_t *nm, char **winqn)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t length = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_domain = 1;
8e22821528b08c6dba4e8176351560f316f6d0dedm char *prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Sometimes there are no text names. Return a sid, then. */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->winname == NULL && nm->sidprefix != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *winqn = sid_format(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (nm->is_wuser) {
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_YES:
8e22821528b08c6dba4e8176351560f316f6d0dedm prefix = ID_WINUSER ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_NO:
8e22821528b08c6dba4e8176351560f316f6d0dedm prefix = ID_WINGROUP ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_UNKNOWN:
8e22821528b08c6dba4e8176351560f316f6d0dedm prefix = ID_WINNAME ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw length = strlen(prefix);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->winname != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw length += strlen(nm->winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Windomain is not mandatory: */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->windomain == NULL || INHIBITED(nm->winname))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_domain = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw length += strlen(nm->windomain) + 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = (char *)malloc(length + 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (out == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp "%s.\n", strerror(ENOMEM));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) strcpy(out, prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* LINTED E_NOP_IF_STMT */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->winname == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw ;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (!is_domain)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, nm->winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (nm->is_nt4) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, nm->windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, "\\");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, nm->winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, nm->winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, "@");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, nm->windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *winqn = out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * Assemble a text unixname, e.g. unixuser:fred. Use only for
cd37da7426f0c49c14ad9a8a07638ca971477566nw * mapping, not namerules - there an empty name means inhibited
cd37da7426f0c49c14ad9a8a07638ca971477566nw * mappings, while here pid is printed if there is no name.
cd37da7426f0c49c14ad9a8a07638ca971477566nw */
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic
cd37da7426f0c49c14ad9a8a07638ca971477566nwint
cd37da7426f0c49c14ad9a8a07638ca971477566nwnm2unixname(name_mapping_t *nm, char **unixname)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t length = 0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *out, *it, *prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Sometimes there is no name, just pid: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm->unixname == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm->pid == UNDEFINED_UID)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *unixname = pid_format(nm->pid, nm->is_user);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm if (shell_app(&it, nm->unixname, 0))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm switch (nm->is_user) {
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_YES:
8e22821528b08c6dba4e8176351560f316f6d0dedm prefix = ID_UNIXUSER ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_NO:
8e22821528b08c6dba4e8176351560f316f6d0dedm prefix = ID_UNIXGROUP ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_UNKNOWN:
479ac37569625bae44ffb80071d4bc865fc710eddm prefix = ID_UNIXUSER ":";
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm length = strlen(prefix) + strlen(it);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = (char *)malloc(length + 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (out == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp "%s.\n", strerror(ENOMEM));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(it);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm (void) strcpy(out, prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcat(out, it);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(it);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *unixname = out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/* Allocate a new name_mapping_t and initialize the values. */
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic name_mapping_t *
cd37da7426f0c49c14ad9a8a07638ca971477566nwname_mapping_init()
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_t *nm = (name_mapping_t *)malloc(sizeof (name_mapping_t));
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (NULL);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->winname = nm->windomain = nm->unixname = nm->sidprefix = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->rid = UNDEFINED_RID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_nt4 = B_FALSE;
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_UNKNOWN;
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_UNKNOWN;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->direction = IDMAP_DIRECTION_UNDEF;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->pid = UNDEFINED_UID;
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (nm);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/* Free name_mapping_t */
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic void
cd37da7426f0c49c14ad9a8a07638ca971477566nwname_mapping_fini(name_mapping_t *nm)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(nm->winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(nm->windomain);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(nm->unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(nm->sidprefix);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(nm);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwname_mapping_cpy(name_mapping_t *to, name_mapping_t *from)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(to->winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(to->windomain);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(to->unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(to->sidprefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) memcpy(to, from, sizeof (name_mapping_t));
cd37da7426f0c49c14ad9a8a07638ca971477566nw to->winname = to->windomain = to->unixname = to->sidprefix = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (from->winname != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw to->winname = strdup(from->winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (to->winname == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (from->windomain != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw to->windomain = strdup(from->windomain);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (to->windomain == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (from->unixname != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw to->unixname = strdup(from->unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (to->unixname == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (from->sidprefix != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw to->sidprefix = strdup(from->sidprefix);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (to->sidprefix == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (0);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwname_mapping_format(name_mapping_t *nm, char **out)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *winname = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *winname1 = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *unixname = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int maxlen;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw *out = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm2winqn(nm, &winname1) < 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (shell_app(&winname, winname1, 1)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm2unixname(nm, &unixname)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* 10 is strlen("add -d\t\t\n") + 1 */
cd37da7426f0c49c14ad9a8a07638ca971477566nw maxlen = 10 + strlen(unixname) + strlen(winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw *out = (char *)malloc(maxlen);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->direction == IDMAP_DIRECTION_U2W) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) snprintf(*out, maxlen, "add -d\t%s\t%s\n",
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname, winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) snprintf(*out, maxlen, "add %s\t%s\t%s\n",
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->direction == IDMAP_DIRECTION_BI? "" : "-d",
cd37da7426f0c49c14ad9a8a07638ca971477566nw winname, unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(unixname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/* Initialize print_mapping variables. Must be called before print_mapping */
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic print_handle_t *
cd37da7426f0c49c14ad9a8a07638ca971477566nwprint_mapping_init(format_t f, FILE *fi)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_handle_t *out;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = (print_handle_t *)malloc(sizeof (print_handle_t));
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (out == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (NULL);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw out->format = f;
cd37da7426f0c49c14ad9a8a07638ca971477566nw out->file = fi;
cd37da7426f0c49c14ad9a8a07638ca971477566nw out->last = name_mapping_init();
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (out->last == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (NULL);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Finalize print_mapping. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwprint_mapping_fini(print_handle_t *pnm)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *out = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int rc = 0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (pnm->format) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case SMBUSERS:
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->last->unixname != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(pnm->file, "\n");
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw case DEFAULT_FORMAT:
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->last->unixname == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw rc = name_mapping_format(pnm->last, &out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (rc >= 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(pnm->file, "%s", out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(out);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_fini(pnm->last);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(pnm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (rc);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwusermap_cfg_string(char *in)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw int len;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *out;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (INHIBITED(in))
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (strdup("\"\""));
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw len = strlen(in);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (len == strcspn(in, " \t#"))
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (strdup(in));
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw out = malloc(len + 3);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (out == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (NULL);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
99df425ee36cdbe6a1228c3cd4fc606b64d8dfc2dm (void) snprintf(out, len + 3, "\"%s\"", in);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * This prints both name rules and ordinary mappings, based on the pnm_format
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * set in print_mapping_init().
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwprint_mapping(print_handle_t *pnm, name_mapping_t *nm)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *dirstring;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *winname = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *unixname = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw FILE *f = pnm->file;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (pnm->format) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case MAPPING_NAME:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm2winqn(nm, &winname) < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm2unixname(nm, &unixname) < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* LINTED E_CASE_FALLTHRU */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case MAPPING_ID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->format == MAPPING_ID) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm->sidprefix == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("SID not given.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw winname = sid_format(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (winname == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw unixname = pid_format(nm->pid, nm->is_user);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (unixname == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw dirstring = direction2string(nm->direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(f, "%s\t%s\t%s\n", winname, dirstring,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw unixname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case SMBUSERS:
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm->is_user != IDMAP_YES || nm->is_wuser != IDMAP_YES) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Group rule: "));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f = stderr;
8e22821528b08c6dba4e8176351560f316f6d0dedm } else if (nm->direction == IDMAP_DIRECTION_U2W) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Opposite direction of the mapping: "));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f = stderr;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (INHIBITED(nm->winname) || INHIBITED(nm->unixname)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(NULL, gettext("Inhibited rule: "));
cd37da7426f0c49c14ad9a8a07638ca971477566nw f = stderr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
821da340f9590922ba8761a64fadda18843a0e88dm if (shell_app(&winname, nm->winname, 1))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname = INHIBITED(nm->unixname) ? "\"\"" : nm->unixname;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->file != f) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(f, "%s=%s\n", unixname, winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (pnm->last->unixname != NULL &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw strcmp(pnm->last->unixname, unixname) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(f, " %s", winname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->last->unixname != NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(f, "\n");
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(pnm->last->unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw pnm->last->unixname = strdup(unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->last->unixname == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(NULL,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp "%s.\n", strerror(ENOMEM));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(f, "%s=%s", unixname, winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw unixname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case USERMAP_CFG:
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm->is_user != IDMAP_YES || nm->is_wuser != IDMAP_YES) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Group rule: "));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f = stderr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw dirstring = direction2string(nm->direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if ((winname = usermap_cfg_string(nm->winname)) == NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw (unixname = usermap_cfg_string(nm->unixname)) == NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw (windomain = usermap_cfg_string(nm->windomain)) == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(NULL, "%s.\n", strerror(ENOMEM));
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(windomain);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->windomain == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(f, "%s\t%s\t%s\n",
cd37da7426f0c49c14ad9a8a07638ca971477566nw winname, dirstring, unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(f, nm->is_nt4 ?
cd37da7426f0c49c14ad9a8a07638ca971477566nw "%s\\%s\t%s\t%s\n" :
cd37da7426f0c49c14ad9a8a07638ca971477566nw "%2$s@%1$s\t%3$s\t%4$s\n",
cd37da7426f0c49c14ad9a8a07638ca971477566nw windomain, winname, dirstring, unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* This is a format for namerules */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case DEFAULT_FORMAT:
cd37da7426f0c49c14ad9a8a07638ca971477566nw /*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * If nm is the same as the last one except is_wuser, we combine
cd37da7426f0c49c14ad9a8a07638ca971477566nw * winuser & wingroup to winname
cd37da7426f0c49c14ad9a8a07638ca971477566nw */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->direction == pnm->last->direction &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_user == pnm->last->is_user &&
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw strcmp_null(pnm->last->unixname, nm->unixname) == 0 &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw strcmp_null(pnm->last->winname, nm->winname) == 0 &&
cd37da7426f0c49c14ad9a8a07638ca971477566nw strcmp_null(pnm->last->windomain, nm->windomain) == 0) {
479ac37569625bae44ffb80071d4bc865fc710eddm pnm->last->is_wuser = IDMAP_UNKNOWN;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (pnm->last->unixname != NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw pnm->last->winname != NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *out = NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (name_mapping_format(pnm->last, &out) < 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) fprintf(f, "%s", out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(out);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (name_mapping_cpy(pnm->last, nm) < 0)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
821da340f9590922ba8761a64fadda18843a0e88dm /* This can never happen: */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Internal error: invalid print format.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(winname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(unixname);
cd37da7426f0c49c14ad9a8a07638ca971477566nw free(windomain);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpstatic
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpvoid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpprint_how(idmap_how *how)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_namerule *rule;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp name_mapping_t nm;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp char *rule_text;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp switch (how->map_type) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_DS_AD:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tAD Directory\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("DN:\t%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.ad.dn));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Attribute:\t%s=%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.ad.attr),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.ad.value));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_DS_NLDAP:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tNative LDAP Directory\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("DN:\t%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.nldap.dn));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Attribute:\t%s=%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.nldap.attr),
479ac37569625bae44ffb80071d4bc865fc710eddm CHECK_NULL(how->idmap_how_u.nldap.value));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_RULE_BASED:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tName Rule\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp rule = &how->idmap_how_u.rule;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp /*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * The name rules as specified by the user can have a
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * "winname", "winuser" or "wingroup". "Winname" rules are
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * decomposed to a "winuser" and "wingroup" rules by idmap.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Currently is_wuser is a boolean. Due to these reasons
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * the returned is_wuser does not represent the original rule.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * It is therefore better set is_wuser to unknown.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.is_user = rule->is_user;
479ac37569625bae44ffb80071d4bc865fc710eddm nm.is_wuser = IDMAP_UNKNOWN;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.direction = rule->direction;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.winname = rule->winname;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.windomain = rule->windomain;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.unixname = rule->unixname;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.is_nt4 = rule->is_nt4;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (name_mapping_format(&nm, &rule_text) == 0) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Rule:\t%s"), rule_text);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(rule_text);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_EPHEMERAL:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tEphemeral\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_LOCAL_SID:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tLocal SID\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_KNOWN_SID:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Method:\tWell-Known mapping\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case IDMAP_MAP_TYPE_IDMU:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) printf(gettext("Method:\tIDMU\n"));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) printf(gettext("DN:\t%s\n"),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.dn));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) printf(gettext("Attribute:\t%s=%s\n"),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.attr),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.value));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpstatic
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpvoid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpprint_info(idmap_info *info)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (info->how.map_type != IDMAP_MAP_TYPE_UNKNOWN) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp switch (info->src) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_SRC_NEW:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Source:\tNew\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_SRC_CACHE:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Source:\tCache\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_SRC_HARD_CODED:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Source:\tHard Coded\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_SRC_ALGORITHMIC:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf(gettext("Source:\tAlgorithmic\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp print_how(&info->how);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (info->trace != NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(gettext("Trace:\n"));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trace_print(stdout, "\t", info->trace);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpstatic
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpvoid
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejpprint_error_info(idmap_info *info)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_how *how = &info->how;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_namerule *rule;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp name_mapping_t nm;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp char *rule_text;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright (void) memset(&nm, 0, sizeof (nm));
fc724630b14603e4c1147df68b7bf45f7de7431fAlan Wright
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp switch (how->map_type) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_DS_AD:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gettext("Failed Method:\tAD Directory\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("DN:\t%s\n"),
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.ad.dn);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Attribute:\t%s=%s\n"),
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.ad.attr,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.ad.value);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_DS_NLDAP:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gettext("Failed Method:\tNative LDAP Directory\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("DN:\t%s\n"),
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.nldap.dn);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Attribute:\t%s=%s\n"),
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.nldap.attr,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp how->idmap_how_u.nldap.value);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_RULE_BASED:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Failed Method:\tName Rule\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp rule = &how->idmap_how_u.rule;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp /*
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * The name rules as specified by the user can have a
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * "winname", "winuser" or "wingroup". "Winname" rules are
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * decomposed to a "winuser" and "wingroup" rules by idmap.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * Currently is_wuser is a boolean. Due to these reasons
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * the returned is_wuser does not represent the original rule.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp * It is therefore better to set is_wuser to unknown.
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.is_user = rule->is_user;
479ac37569625bae44ffb80071d4bc865fc710eddm nm.is_wuser = IDMAP_UNKNOWN;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.direction = rule->direction;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.winname = rule->winname;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.windomain = rule->windomain;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.unixname = rule->unixname;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp nm.is_nt4 = rule->is_nt4;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (name_mapping_format(&nm, &rule_text) == 0) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Rule:\t%s"), rule_text);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(rule_text);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_EPHEMERAL:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Failed Method:\tEphemeral\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_LOCAL_SID:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr, gettext("Failed Method:\tLocal SID\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp case IDMAP_MAP_TYPE_KNOWN_SID:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) fprintf(stderr,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp gettext("Failed Method:\tWell-Known mapping\n"));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp break;
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai case IDMAP_MAP_TYPE_IDMU:
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) fprintf(stderr,
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai gettext("Failed Method:\tIDMU\n"));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) fprintf(stderr, gettext("DN:\t%s\n"),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.dn));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai (void) fprintf(stderr, gettext("Attribute:\t%s=%s\n"),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.attr),
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai CHECK_NULL(how->idmap_how_u.idmu.value));
e3f2c991a8548408db0a2787bd8b43d5124821d3Keyur Desai break;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (info->trace != NULL) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright (void) printf(gettext("Trace:\n"));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright idmap_trace_print(stderr, "\t", info->trace);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp}
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* dump command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_dump(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_stat stat;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_iter_t *ihandle;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int rc = 0;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp boolean_t is_user;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp boolean_t is_wuser;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp print_handle_t *ph;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp int flag = 0;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_info info;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw ph = print_mapping_init(f[n_FLAG] != NULL ? MAPPING_NAME : MAPPING_ID,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw stdout);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (ph == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (f[v_FLAG] != NULL)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp flag = IDMAP_REQ_FLG_MAPPING_INFO;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_iter_mappings(&ihandle, flag);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (stat < 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Iteration handle not obtained (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
cd37da7426f0c49c14ad9a8a07638ca971477566nw rc = -1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto cleanup;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw do {
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_t *nm = name_mapping_init();
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = idmap_iter_next_mapping(ihandle,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->sidprefix, &nm->rid, &nm->pid,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->winname, &nm->windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->unixname, &is_user, &is_wuser,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &nm->direction, &info);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = is_user ? IDMAP_YES : IDMAP_NO;
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = is_wuser ? IDMAP_YES : IDMAP_NO;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (stat >= 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping(ph, nm);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright print_how(&info.how);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_info_free(&info);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp }
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw } while (stat > 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* IDMAP_ERR_NOTFOUND indicates end of the list */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (stat < 0 && stat != IDMAP_ERR_NOTFOUND) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Error during iteration (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
cd37da7426f0c49c14ad9a8a07638ca971477566nw rc = -1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto cleanup;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_iter_destroy(ihandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping_fini(ph);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm/*
821da340f9590922ba8761a64fadda18843a0e88dm * Convert pid from string to it's numerical representation. If it is
821da340f9590922ba8761a64fadda18843a0e88dm * a valid string, i.e. number of a proper length, return 1. Otherwise
821da340f9590922ba8761a64fadda18843a0e88dm * print an error message and return 0.
821da340f9590922ba8761a64fadda18843a0e88dm */
821da340f9590922ba8761a64fadda18843a0e88dmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwpid_convert(char *string, uid_t *number, int type, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
821da340f9590922ba8761a64fadda18843a0e88dm int i;
821da340f9590922ba8761a64fadda18843a0e88dm long long ll;
821da340f9590922ba8761a64fadda18843a0e88dm char *type_string;
821da340f9590922ba8761a64fadda18843a0e88dm size_t len = strlen(string);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (type == TYPE_GID)
821da340f9590922ba8761a64fadda18843a0e88dm type_string = ID_GID;
821da340f9590922ba8761a64fadda18843a0e88dm else if (type == TYPE_UID)
821da340f9590922ba8761a64fadda18843a0e88dm type_string = ID_UID;
821da340f9590922ba8761a64fadda18843a0e88dm else
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm for (i = 0; i < len; i++) {
821da340f9590922ba8761a64fadda18843a0e88dm if (!isdigit(string[i])) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("\"%s\" is not a valid %s: the non-digit"
cd37da7426f0c49c14ad9a8a07638ca971477566nw " character '%c' found.\n"), string,
821da340f9590922ba8761a64fadda18843a0e88dm type_string, string[i]);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm ll = atoll(string);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* Isn't it too large? */
821da340f9590922ba8761a64fadda18843a0e88dm if (type == TYPE_UID && (uid_t)ll != ll ||
821da340f9590922ba8761a64fadda18843a0e88dm type == TYPE_GID && (gid_t)ll != ll) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("%llu: too large for a %s.\n"), ll,
821da340f9590922ba8761a64fadda18843a0e88dm type_string);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm *number = (uid_t)ll;
821da340f9590922ba8761a64fadda18843a0e88dm return (1);
821da340f9590922ba8761a64fadda18843a0e88dm}
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm/*
821da340f9590922ba8761a64fadda18843a0e88dm * Convert SID from string to prefix and rid. If it has a valid
821da340f9590922ba8761a64fadda18843a0e88dm * format, i.e. S(\-\d+)+, return 1. Otherwise print an error
821da340f9590922ba8761a64fadda18843a0e88dm * message and return 0.
821da340f9590922ba8761a64fadda18843a0e88dm */
821da340f9590922ba8761a64fadda18843a0e88dmstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwsid_convert(char *from, char **prefix, idmap_rid_t *rid, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
821da340f9590922ba8761a64fadda18843a0e88dm int i, j;
821da340f9590922ba8761a64fadda18843a0e88dm char *cp;
821da340f9590922ba8761a64fadda18843a0e88dm char *ecp;
821da340f9590922ba8761a64fadda18843a0e88dm char *prefix_end;
821da340f9590922ba8761a64fadda18843a0e88dm u_longlong_t a;
821da340f9590922ba8761a64fadda18843a0e88dm unsigned long r;
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (strcmp_no0(from, "S-1-") != 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": it doesn't start "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "with \"%s\".\n"), ID_SID, from, "S-1-");
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (strlen(from) <= strlen("S-1-")) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": the authority and RID parts are"
cd37da7426f0c49c14ad9a8a07638ca971477566nw " missing.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* count '-'s */
821da340f9590922ba8761a64fadda18843a0e88dm for (j = 0, cp = strchr(from, '-');
cd37da7426f0c49c14ad9a8a07638ca971477566nw cp != NULL;
cd37da7426f0c49c14ad9a8a07638ca971477566nw j++, cp = strchr(cp + 1, '-')) {
821da340f9590922ba8761a64fadda18843a0e88dm /* can't end on a '-' */
821da340f9590922ba8761a64fadda18843a0e88dm if (*(cp + 1) == '\0') {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": '-' at the end.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm } else if (*(cp + 1) == '-') {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": double '-'.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* check that we only have digits and '-' */
821da340f9590922ba8761a64fadda18843a0e88dm i = strspn(from + 1, "0123456789-") + 1;
821da340f9590922ba8761a64fadda18843a0e88dm if (i < strlen(from)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": invalid character '%c'.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from, from[i]);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm cp = from + strlen("S-1-");
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* 64-bit safe parsing of unsigned 48-bit authority value */
821da340f9590922ba8761a64fadda18843a0e88dm errno = 0;
821da340f9590922ba8761a64fadda18843a0e88dm a = strtoull(cp, &ecp, 10);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* errors parsing the authority or too many bits */
821da340f9590922ba8761a64fadda18843a0e88dm if (cp == ecp || (a == 0 && errno == EINVAL)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Invalid %s \"%s\": unable to parse the "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "authority \"%.*s\".\n"), ID_SID, from, ecp - cp,
cd37da7426f0c49c14ad9a8a07638ca971477566nw cp);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if ((a == ULLONG_MAX && errno == ERANGE) ||
821da340f9590922ba8761a64fadda18843a0e88dm (a & 0x0000ffffffffffffULL) != a) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": the authority "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "\"%.*s\" is too large.\n"), ID_SID, from,
821da340f9590922ba8761a64fadda18843a0e88dm ecp - cp, cp);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm cp = ecp;
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (j < 3) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": must have at least one RID.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm for (i = 2; i < j; i++) {
821da340f9590922ba8761a64fadda18843a0e88dm if (*cp++ != '-') {
821da340f9590922ba8761a64fadda18843a0e88dm /* Should never happen */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": internal error:"
cd37da7426f0c49c14ad9a8a07638ca971477566nw " '-' missing.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm /* 32-bit safe parsing of unsigned 32-bit RID */
821da340f9590922ba8761a64fadda18843a0e88dm errno = 0;
821da340f9590922ba8761a64fadda18843a0e88dm r = strtoul(cp, &ecp, 10);
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* errors parsing the RID */
821da340f9590922ba8761a64fadda18843a0e88dm if (cp == ecp || (r == 0 && errno == EINVAL)) {
821da340f9590922ba8761a64fadda18843a0e88dm /* should never happen */
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Invalid %s \"%s\": internal error: "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "unable to parse the RID "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "after \"%.*s\".\n"), ID_SID,
cd37da7426f0c49c14ad9a8a07638ca971477566nw from, cp - from, from);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm if (r == ULONG_MAX && errno == ERANGE) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": the RID \"%.*s\""
cd37da7426f0c49c14ad9a8a07638ca971477566nw " is too large.\n"), ID_SID,
821da340f9590922ba8761a64fadda18843a0e88dm from, ecp - cp, cp);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm prefix_end = cp;
821da340f9590922ba8761a64fadda18843a0e88dm cp = ecp;
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* check that all of the string SID has been consumed */
821da340f9590922ba8761a64fadda18843a0e88dm if (*cp != '\0') {
821da340f9590922ba8761a64fadda18843a0e88dm /* Should never happen */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Invalid %s \"%s\": internal error: "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "something is still left.\n"),
821da340f9590922ba8761a64fadda18843a0e88dm ID_SID, from);
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm *rid = (idmap_rid_t)r;
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm /* -1 for the '-' at the end: */
821da340f9590922ba8761a64fadda18843a0e88dm *prefix = strndup(from, prefix_end - from - 1);
821da340f9590922ba8761a64fadda18843a0e88dm if (*prefix == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp "%s.\n", strerror(ENOMEM));
821da340f9590922ba8761a64fadda18843a0e88dm return (0);
821da340f9590922ba8761a64fadda18843a0e88dm }
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm return (1);
821da340f9590922ba8761a64fadda18843a0e88dm}
821da340f9590922ba8761a64fadda18843a0e88dm
821da340f9590922ba8761a64fadda18843a0e88dm/* Does the line start with USERMAP_CFG IP qualifier? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwucp_is_IP_qualifier(char *line)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *it;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it = line + strcspn(line, " \t\n#:");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (*(it + 1) == ':' ? 1 : 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * returns interior of quotation marks in USERMAP_CFG. In this format,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * there cannot be a protected quotation mark inside.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwucp_qm_interior(char **line, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *out;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *qm = strchr(*line + 1, '"');
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (qm == NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Unclosed quotations\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw out = strndup(*line + 1, qm - *line - 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *line = qm + 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (out);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Grab next token from the line in USERMAP_CFG format. terminators,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * the 3rd parameter, contains all the characters which can terminate
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * the token. line_num is the line number of input used for error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * reporting.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *
cd37da7426f0c49c14ad9a8a07638ca971477566nwucp_grab_token(char **line, cmd_pos_t *pos, const char *terminators)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (**line == '"')
8e22821528b08c6dba4e8176351560f316f6d0dedm token = ucp_qm_interior(line, pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int length = strcspn(*line, terminators);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw token = strndup(*line, length);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *line += length;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (token);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
8e22821528b08c6dba4e8176351560f316f6d0dedm * Convert a line in usermap.cfg format to name_mapping.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return values: -1 for error, 0 for empty line, 1 for a mapping
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * found.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwucp_line2nm(char *line, cmd_pos_t *pos, name_mapping_t *nm)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *it;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *token2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char separator;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_direction = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it = line + strspn(line, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* empty or comment lines are OK: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*it == '\0' || *it == '#')
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We do not support network qualifiers */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (ucp_is_IP_qualifier(it)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Unable to handle network qualifier.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* The windows name: */
8e22821528b08c6dba4e8176351560f316f6d0dedm token = ucp_grab_token(&it, pos, " \t#\\\n@=<");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (token == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw separator = *it;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Didn't we bump to the end of line? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (separator == '\0' || separator == '#') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(token);
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("UNIX_name not found.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Do we have a domainname? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (separator == '\\' || separator == '@') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it ++;
8e22821528b08c6dba4e8176351560f316f6d0dedm token2 = ucp_grab_token(&it, pos, " \t\n#");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (token2 == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(token);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (*it == '\0' || *it == '#') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(token);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(token2);
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("UNIX_name not found.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (separator == '\\') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain = token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname = token2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->is_nt4 = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain = token2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname = token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->is_nt4 = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname = token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->is_nt4 = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it = it + strspn(it, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Direction string is optional: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strncmp(it, "==", 2) == 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_BI;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_direction = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (strncmp(it, "<=", 2) == 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_U2W;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_direction = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (strncmp(it, "=>", 2) == 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_W2U;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_direction = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_BI;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_direction = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_direction) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it += 2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it += strspn(it, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*it == '\0' || *it == '#') {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("UNIX_name not found.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Now unixname: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it += strspn(it, " \t\n");
8e22821528b08c6dba4e8176351560f316f6d0dedm token = ucp_grab_token(&it, pos, " \t\n#");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (token == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* nm->winname to be freed by name_mapping_fini */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Neither here we support IP qualifiers */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (ucp_is_IP_qualifier(token)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Unable to handle network qualifier.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(token);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname = token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw it += strspn(it, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Does something remain on the line */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*it != '\0' && *it != '#') {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Unrecognized parameters \"%s\".\n"), it);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Parse SMBUSERS line to name_mapping_t. if line is NULL, then
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * pasrsing of the previous line is continued. line_num is input line
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * number used for error reporting.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return values:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rc -1: error
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rc = 0: mapping found and the line is finished,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * rc = 1: mapping found and there remains other on the line
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwsup_line2nm(char *line, cmd_pos_t *pos, name_mapping_t *nm)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw static char *ll = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw static char *unixname = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw static size_t unixname_l = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (line != NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ll = line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw unixname = ll += strspn(ll, " \t");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*ll == '\0' || *ll == '#')
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw unixname_l = strcspn(ll, " \t:=#\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ll += unixname_l;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*ll == '\0'|| *ll == '#')
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ll += strspn(ll, " \t:=#\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*ll == '\0'|| *ll == '#')
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm token = ucp_grab_token(&ll, pos, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (token == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->is_nt4 = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_W2U;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname = token;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname = strndup(unixname, unixname_l);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm->unixname == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ll += strspn(ll, " \t\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Parse line to name_mapping_t. Basicaly just a format switch. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwline2nm(char *line, cmd_pos_t *pos, name_mapping_t *nm, format_t f)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (f) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case USERMAP_CFG:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (line == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
8e22821528b08c6dba4e8176351560f316f6d0dedm return (ucp_line2nm(line, pos, nm));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case SMBUSERS:
8e22821528b08c6dba4e8176351560f316f6d0dedm return (sup_line2nm(line, pos, nm));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
821da340f9590922ba8761a64fadda18843a0e88dm /* This can never happen */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Internal error: invalid line format.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Examine -f flag and return the appropriate format_t */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic format_t
cd37da7426f0c49c14ad9a8a07638ca971477566nwff2format(char *ff, int is_mandatory)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (ff == NULL && is_mandatory) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL, gettext("Format not given.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (UNDEFINED_FORMAT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (ff == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (DEFAULT_FORMAT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strcasecmp(ff, "usermap.cfg") == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (USERMAP_CFG);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strcasecmp(ff, "smbusers") == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (SMBUSERS);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("The only known formats are: \"usermap.cfg\" and "
cd37da7426f0c49c14ad9a8a07638ca971477566nw "\"smbusers\".\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (UNDEFINED_FORMAT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Delete all namerules of the given type */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
8e22821528b08c6dba4e8176351560f316f6d0dedmflush_nm(boolean_t is_user, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = idmap_udt_flush_namerules(udt);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stat < 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_user ? gettext("Unable to flush users (%s).\n")
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw : gettext("Unable to flush groups (%s).\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (positions_add(pos) < 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* import command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_import(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_t *nm;
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t pos2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char line[MAX_INPUT_LINE_SZ];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw format_t format;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw FILE *file = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (batch_mode) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Import is not allowed in the batch mode.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw format = ff2format(argv[0], 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (format == UNDEFINED_FORMAT)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (init_udt_command())
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We don't flush groups in the usermap.cfg nor smbusers format */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[F_FLAG] != NULL &&
8e22821528b08c6dba4e8176351560f316f6d0dedm flush_nm(B_TRUE, pos) < 0 &&
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (format == USERMAP_CFG || format == SMBUSERS ||
8e22821528b08c6dba4e8176351560f316f6d0dedm flush_nm(B_FALSE, pos) < 0)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Where we import from? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[f_FLAG] == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw file = stdin;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw file = fopen(f[f_FLAG], "r");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (file == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw perror(f[f_FLAG]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm pos2.linenum = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm pos2.line = line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw while (fgets(line, MAX_INPUT_LINE_SZ, file)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *line2 = line;
8e22821528b08c6dba4e8176351560f316f6d0dedm pos2.linenum++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * In SMBUSERS format there can be more mappings on
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * each line. So we need the internal cycle for each line.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw do {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm = name_mapping_init();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = line2nm(line2, &pos2, nm, format);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw line2 = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc < 1) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw stat = idmap_udt_add_namerule(udt, nm->windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_user ? B_TRUE : B_FALSE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_wuser ? B_TRUE : B_FALSE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname, nm->is_nt4, nm->direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stat < 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(&pos2,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Transaction error (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc >= 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = positions_add(&pos2);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } while (rc >= 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc < 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Import canceled.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
8e22821528b08c6dba4e8176351560f316f6d0dedm if (fini_udt_command((rc < 0 ? 0 : 1), pos))
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (file != NULL && file != stdin)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fclose(file);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * List name mappings in the format specified. list_users /
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * list_groups determine which type to list. The output goes to the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * file fi.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
8e22821528b08c6dba4e8176351560f316f6d0dedmlist_name_mappings(format_t format, FILE *fi)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_t *ihandle;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_t *nm;
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t is_user;
cd37da7426f0c49c14ad9a8a07638ca971477566nw boolean_t is_wuser;
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_handle_t *ph;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_iter_namerules(NULL, 0, 0, NULL, NULL, &ihandle);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (stat < 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(NULL,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Iteration handle not obtained (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_iter_destroy(ihandle);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw ph = print_mapping_init(format, fi);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (ph == NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw do {
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm = name_mapping_init();
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_destroy(ihandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = idmap_iter_next_namerule(ihandle, &nm->windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->winname, &nm->unixname, &is_user, &is_wuser,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->is_nt4, &nm->direction);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (stat >= 0) {
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = is_user ? IDMAP_YES : IDMAP_NO;
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = is_wuser ? IDMAP_YES : IDMAP_NO;
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping(ph, nm);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw } while (stat > 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping_fini(ph);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (stat < 0 && stat != IDMAP_ERR_NOTFOUND) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(NULL,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Error during iteration (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_iter_destroy(ihandle);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw idmap_iter_destroy(ihandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
821da340f9590922ba8761a64fadda18843a0e88dm/* Export command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
cd37da7426f0c49c14ad9a8a07638ca971477566nwdo_export(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw format_t format;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw FILE *fi;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw format = ff2format(argv[0], 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (format == UNDEFINED_FORMAT)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Where do we output to? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[f_FLAG] == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw fi = stdout;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw fi = fopen(f[f_FLAG], "w");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (fi == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw perror(f[f_FLAG]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* List the requested types: */
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = list_name_mappings(format, fi);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (fi != NULL && fi != stdout)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fclose(fi);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* List command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_list_name_mappings(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* List the requested types: */
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = list_name_mappings(DEFAULT_FORMAT, stdout);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* This is just a debug function for dumping flags */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic void
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwprint_flags(flag_t *f)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int c;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (c = 0; c < FLAG_ALPHABET_SIZE; c++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[c] == FLAG_SET)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) printf("FLAG: -%c, VALUE: %p\n", c,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void *) f[c]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (f[c])
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) printf("FLAG: -%c, VALUE: %s\n", c, f[c]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm/* Convert string like sid or winname to the identity type code */
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
479ac37569625bae44ffb80071d4bc865fc710eddmstring2type(char *str, cmd_pos_t *pos) {
479ac37569625bae44ffb80071d4bc865fc710eddm int i;
479ac37569625bae44ffb80071d4bc865fc710eddm int code = TYPE_INVALID;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm for (i = 0; i < sizeof (identity2code) / sizeof (id_code_t); i++) {
479ac37569625bae44ffb80071d4bc865fc710eddm if (strcasecmp(identity2code[i].identity, str) == 0) {
479ac37569625bae44ffb80071d4bc865fc710eddm code = identity2code[i].code;
479ac37569625bae44ffb80071d4bc865fc710eddm break;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (code == TYPE_INVALID) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Error: invalid identity type \"%s\"\n"), str);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm return (code);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * Split argument to its identity code and a name part
cd37da7426f0c49c14ad9a8a07638ca971477566nw * return values:
479ac37569625bae44ffb80071d4bc865fc710eddm * TYPE_INVALID for unknown identity
479ac37569625bae44ffb80071d4bc865fc710eddm * TYPE_AUTO for no identity (to be autodetected)
479ac37569625bae44ffb80071d4bc865fc710eddm * <TYPE_XXX> for known identity
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwget_identity(char *arg, char **name, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *it;
479ac37569625bae44ffb80071d4bc865fc710eddm int code = TYPE_INVALID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if ((it = strchr(arg, ':')) == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw *name = arg;
479ac37569625bae44ffb80071d4bc865fc710eddm return (TYPE_AUTO);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw *it = '\0';
479ac37569625bae44ffb80071d4bc865fc710eddm code = string2type(arg, pos);
479ac37569625bae44ffb80071d4bc865fc710eddm *it = ':'; /* restore the original string: */
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw *name = it + 1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw/*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * This function splits name to the relevant pieces: is_user, winname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw * windomain unixname. E.g. for winname, it strdups nm->winname and possibly
cd37da7426f0c49c14ad9a8a07638ca971477566nw * nm->windomain and return TYPE_WN.
cd37da7426f0c49c14ad9a8a07638ca971477566nw *
cd37da7426f0c49c14ad9a8a07638ca971477566nw * If there is already one of the text fields allocated, it is OK.
cd37da7426f0c49c14ad9a8a07638ca971477566nw * Return values:
cd37da7426f0c49c14ad9a8a07638ca971477566nw * -1 ... syntax error
cd37da7426f0c49c14ad9a8a07638ca971477566nw * 0 ... it wasnt possible to determine
cd37da7426f0c49c14ad9a8a07638ca971477566nw * <TYPE_XXX> otherwise
cd37da7426f0c49c14ad9a8a07638ca971477566nw */
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwname2parts(char *name, name_mapping_t *nm, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw char *it;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int code;
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw code = get_identity(name, &it, pos);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (code) {
479ac37569625bae44ffb80071d4bc865fc710eddm case TYPE_INVALID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* syntax error: */
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm case TYPE_AUTO:
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* autodetection: */
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm->winname != NULL && nm->is_wuser != IDMAP_UNKNOWN)
479ac37569625bae44ffb80071d4bc865fc710eddm code = nm->is_wuser == IDMAP_YES ? TYPE_UU : TYPE_UG;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (nm->unixname != NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw strchr(name, '@') != NULL ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw strchr(name, '\\') != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm /* btw, nm->is_user can never be IDMAP_UNKNOWN here */
cd37da7426f0c49c14ad9a8a07638ca971477566nw code = TYPE_WN;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (0);
cd37da7426f0c49c14ad9a8a07638ca971477566nw /* If the code was guessed succesfully, we are OK. */
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw default:
cd37da7426f0c49c14ad9a8a07638ca971477566nw name = it;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (code & IS_WIN) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (code & IS_USER)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_YES;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (code & IS_GROUP)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_NO;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (code & IS_USER)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_YES;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp else if (code & IS_GROUP)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_NO;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (code & IS_WIN && code & IS_NAME) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->winname != NULL || nm->windomain != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if ((it = strchr(name, '@')) != NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm int length = it - name + 1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->winname = (char *)malloc(length);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strncpy(nm->winname, name, length - 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname[length - 1] = '\0';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain = strdup(it + 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if ((it = strrchr(name, '\\')) != NULL) {
8e22821528b08c6dba4e8176351560f316f6d0dedm int length = it - name + 1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->windomain = (char *)malloc(length);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strncpy(nm->windomain, name, length - 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain[length - 1] = '\0';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname = strdup(it + 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->is_nt4 = B_TRUE;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->winname = strdup(name);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (!(code & IS_WIN) && code & IS_NAME) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (nm->unixname != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strlen(name) == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname = strdup("\"\"");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname = strdup(name);
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (code & IS_WIN && !(code & IS_NAME)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (!sid_convert(name, &nm->sidprefix, &nm->rid, pos))
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * it is (!(code & TYPE_WIN) && !(code & TYPE_NAME)) here - the other
cd37da7426f0c49c14ad9a8a07638ca971477566nw * possiblities are exhausted.
cd37da7426f0c49c14ad9a8a07638ca971477566nw */
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (!pid_convert(name, &nm->pid, code, pos))
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw else
cd37da7426f0c49c14ad9a8a07638ca971477566nw return (code);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw}
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw/*
cd37da7426f0c49c14ad9a8a07638ca971477566nw * Cycle through add/remove arguments until they are identified or found
cd37da7426f0c49c14ad9a8a07638ca971477566nw * invalid.
cd37da7426f0c49c14ad9a8a07638ca971477566nw */
cd37da7426f0c49c14ad9a8a07638ca971477566nwstatic
479ac37569625bae44ffb80071d4bc865fc710eddmname_mapping_t *
479ac37569625bae44ffb80071d4bc865fc710eddmargs2nm(int *is_first_win, int argc, char **argv,
cd37da7426f0c49c14ad9a8a07638ca971477566nw cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
cd37da7426f0c49c14ad9a8a07638ca971477566nw int code;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int i;
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_t *nm;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm = name_mapping_init();
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm return (NULL);
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw for (i = 0; i < 2 * argc - 1; i++) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw code = name2parts(argv[i % 2], nm, pos);
cd37da7426f0c49c14ad9a8a07638ca971477566nw switch (code) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw case -1:
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
cd37da7426f0c49c14ad9a8a07638ca971477566nw case 0:
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (i > 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("Missing identity type"
cd37da7426f0c49c14ad9a8a07638ca971477566nw " cannot be determined for %s.\n"),
cd37da7426f0c49c14ad9a8a07638ca971477566nw argv[i % 2]);
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw break;
cd37da7426f0c49c14ad9a8a07638ca971477566nw default:
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (!(code & IS_NAME)) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos,
cd37da7426f0c49c14ad9a8a07638ca971477566nw gettext("%s is not a valid name\n"),
cd37da7426f0c49c14ad9a8a07638ca971477566nw argv[i % 2]);
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (argc == 2 && nm->winname == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos, gettext("No windows identity found.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (argc == 2 && nm->unixname == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_error(pos, gettext("No unix identity found.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm if (argc == 1 && nm->winname == NULL && nm->unixname == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos, gettext("No identity type determined.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm if (is_first_win != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm *is_first_win = code & IS_WIN;
479ac37569625bae44ffb80071d4bc865fc710eddm return (nm);
479ac37569625bae44ffb80071d4bc865fc710eddmfail:
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_fini(nm);
479ac37569625bae44ffb80071d4bc865fc710eddm return (NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* add command handler. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_add_name_mapping(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_t *nm;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_first_win;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_wuser;
cd37da7426f0c49c14ad9a8a07638ca971477566nw print_handle_t *ph;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm /* Exactly two arguments must be specified */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc < 2) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos, gettext("Not enough arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (argc > 2) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos, gettext("Too many arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm nm = args2nm(&is_first_win, argc, argv, pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[d_FLAG] != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->direction = is_first_win
cd37da7426f0c49c14ad9a8a07638ca971477566nw ? IDMAP_DIRECTION_W2U
cd37da7426f0c49c14ad9a8a07638ca971477566nw : IDMAP_DIRECTION_U2W;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_BI;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Now let us write it: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (init_udt_command()) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm for (is_wuser = IDMAP_YES; is_wuser >= IDMAP_NO; is_wuser--) {
479ac37569625bae44ffb80071d4bc865fc710eddm /* nm->is_wuser can be IDMAP_YES, IDMAP_NO or IDMAP_UNKNOWN */
479ac37569625bae44ffb80071d4bc865fc710eddm if ((is_wuser == IDMAP_YES && nm->is_wuser == IDMAP_NO) ||
479ac37569625bae44ffb80071d4bc865fc710eddm (is_wuser == IDMAP_NO && nm->is_wuser == IDMAP_YES))
cd37da7426f0c49c14ad9a8a07638ca971477566nw continue;
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = idmap_udt_add_namerule(udt, nm->windomain,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_user ? B_TRUE : B_FALSE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_wuser ? B_TRUE : B_FALSE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->winname, nm->unixname, nm->is_nt4, nm->direction);
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We echo the mapping */
cd37da7426f0c49c14ad9a8a07638ca971477566nw ph = print_mapping_init(DEFAULT_FORMAT, stdout);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (ph == NULL) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw rc = -1;
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto cleanup;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping(ph, nm);
cd37da7426f0c49c14ad9a8a07638ca971477566nw (void) print_mapping_fini(ph);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Mapping not created (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc == 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = positions_add(pos);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (fini_udt_command(1, pos))
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* remove command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_remove_name_mapping(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_t *nm;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_first_win;
cd37da7426f0c49c14ad9a8a07638ca971477566nw int is_wuser;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* "-a" means we flush all of them */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[a_FLAG] != NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Too many arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (init_udt_command())
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = flush_nm(B_TRUE, pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc >= 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = flush_nm(B_FALSE, pos);
8e22821528b08c6dba4e8176351560f316f6d0dedm
8e22821528b08c6dba4e8176351560f316f6d0dedm if (fini_udt_command(rc ? 0 : 1, pos))
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Contrary to add_name_mapping, we can have only one argument */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc < 1) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos, gettext("Not enough arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (argc > 2) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos, gettext("Too many arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* both -f and -t: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f[f_FLAG] != NULL && f[t_FLAG] != NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* -d with a single argument: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw argc == 1 && f[d_FLAG] != NULL ||
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* -f or -t with two arguments: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw argc == 2 && (f[f_FLAG] != NULL || f[t_FLAG] != NULL)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Direction ambiguous.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Similar to do_add_name_mapping - see the comments
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * there. Except we may have only one argument here.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
479ac37569625bae44ffb80071d4bc865fc710eddm nm = args2nm(&is_first_win, argc, argv, pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If the direction is not specified by a -d/-f/-t flag, then it
8e22821528b08c6dba4e8176351560f316f6d0dedm * is IDMAP_DIRECTION_UNDEF, because in that case we want to
8e22821528b08c6dba4e8176351560f316f6d0dedm * remove any mapping. If it was IDMAP_DIRECTION_BI, idmap_api would
8e22821528b08c6dba4e8176351560f316f6d0dedm * delete a bidirectional one only.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f[d_FLAG] != NULL || f[f_FLAG] != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->direction = is_first_win
8e22821528b08c6dba4e8176351560f316f6d0dedm ? IDMAP_DIRECTION_W2U
8e22821528b08c6dba4e8176351560f316f6d0dedm : IDMAP_DIRECTION_U2W;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (f[t_FLAG] != NULL)
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->direction = is_first_win
cd37da7426f0c49c14ad9a8a07638ca971477566nw ? IDMAP_DIRECTION_U2W
cd37da7426f0c49c14ad9a8a07638ca971477566nw : IDMAP_DIRECTION_W2U;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->direction = IDMAP_DIRECTION_UNDEF;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (init_udt_command()) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm for (is_wuser = IDMAP_YES; is_wuser >= IDMAP_NO; is_wuser--) {
479ac37569625bae44ffb80071d4bc865fc710eddm if ((is_wuser == IDMAP_YES && nm->is_wuser == IDMAP_NO) ||
479ac37569625bae44ffb80071d4bc865fc710eddm (is_wuser == IDMAP_NO && nm->is_wuser == IDMAP_YES))
8e22821528b08c6dba4e8176351560f316f6d0dedm continue;
8e22821528b08c6dba4e8176351560f316f6d0dedm
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = idmap_udt_rm_namerule(udt,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_user ? B_TRUE : B_FALSE,
cd37da7426f0c49c14ad9a8a07638ca971477566nw is_wuser ? B_TRUE : B_FALSE,
8e22821528b08c6dba4e8176351560f316f6d0dedm nm->windomain, nm->winname, nm->unixname, nm->direction);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
8e22821528b08c6dba4e8176351560f316f6d0dedm gettext("Mapping not deleted (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
8e22821528b08c6dba4e8176351560f316f6d0dedm break;
8e22821528b08c6dba4e8176351560f316f6d0dedm }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm if (rc == 0)
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = positions_add(pos);
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
8e22821528b08c6dba4e8176351560f316f6d0dedm if (fini_udt_command(1, pos))
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States/* flush command handler */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesdo_flush(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States NOTE(ARGUNUSED(argv))
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States idmap_flush_op op;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States idmap_stat stat;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (argc > 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States print_error(pos,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States gettext("Too many arguments.\n"));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (f[a_FLAG] != NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States op = IDMAP_FLUSH_DELETE;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States op = IDMAP_FLUSH_EXPIRE;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_flush(op);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (stat != IDMAP_SUCCESS) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States print_error(pos,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States gettext("%s\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = -1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* exit command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_FUNC_ARG_UNUSED */
cd37da7426f0c49c14ad9a8a07638ca971477566nwdo_exit(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* debug command handler: just print the parameters */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_STATIC_UNUSED */
8e22821528b08c6dba4e8176351560f316f6d0dedmdebug_print_params(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#if 0
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *leaktest = (char *)malloc(100);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw print_flags(f);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < argc; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) printf("Argument %d: %s\n", i, argv[i]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fflush(stdout);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * From name_mapping_t, asseble a string containing identity of the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * given type.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
cd37da7426f0c49c14ad9a8a07638ca971477566nwnm2type(name_mapping_t *nm, int type, char **to)
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (type) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_SID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw case TYPE_USID:
cd37da7426f0c49c14ad9a8a07638ca971477566nw case TYPE_GSID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm->sidprefix == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
cd37da7426f0c49c14ad9a8a07638ca971477566nw *to = sid_format(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_WN:
8e22821528b08c6dba4e8176351560f316f6d0dedm case TYPE_WU:
8e22821528b08c6dba4e8176351560f316f6d0dedm case TYPE_WG:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (nm2winqn(nm, to));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_UID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_GID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_PID:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *to = pid_format(nm->pid, nm->is_user);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (*to == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case TYPE_UN:
8e22821528b08c6dba4e8176351560f316f6d0dedm case TYPE_UU:
8e22821528b08c6dba4e8176351560f316f6d0dedm case TYPE_UG:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (nm2unixname(nm, to));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
821da340f9590922ba8761a64fadda18843a0e88dm /* This can never happen: */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(NULL,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Internal error: invalid name type.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* never reached */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* show command handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
8e22821528b08c6dba4e8176351560f316f6d0dedmdo_show_mapping(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat stat = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int flag;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_stat map_stat = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int type_from;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int type_to;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_t *nm = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *fromname;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *toname;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_info info;
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) memset(&info, 0, sizeof (info));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc == 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("No identity given\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (argc > 2) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Too many arguments.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright flag = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (f[c_FLAG] == NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright flag |= IDMAP_REQ_FLG_NO_NEW_ID_ALLOC;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (f[v_FLAG] != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright flag |= IDMAP_REQ_FLG_MAPPING_INFO;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (f[V_FLAG] != NULL)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright flag |= IDMAP_REQ_FLG_TRACE;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm = name_mapping_init();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw type_from = name2parts(argv[0], nm, pos);
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_from <= 0) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = IDMAP_ERR_ARG;
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto cleanup;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Second, determine type_to: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc < 2) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw type_to = type_from & IS_WIN ? TYPE_PID : TYPE_SID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (type_from & IS_NAME)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw type_to |= IS_NAME;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else {
479ac37569625bae44ffb80071d4bc865fc710eddm type_to = string2type(argv[1], pos);
479ac37569625bae44ffb80071d4bc865fc710eddm if (type_to == TYPE_INVALID) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw stat = IDMAP_ERR_ARG;
cd37da7426f0c49c14ad9a8a07638ca971477566nw goto cleanup;
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw }
cd37da7426f0c49c14ad9a8a07638ca971477566nw
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_to & IS_WIN) {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_to & IS_USER)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_YES;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (type_to & IS_GROUP)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_NO;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_wuser = IDMAP_UNKNOWN;
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else {
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_to & IS_USER)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_YES;
cd37da7426f0c49c14ad9a8a07638ca971477566nw else if (type_to & IS_GROUP)
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_NO;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Are both arguments the same OS side? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (!(type_from & IS_WIN ^ type_to & IS_WIN)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Direction ambiguous.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw stat = IDMAP_ERR_ARG;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * We have two interfaces for retrieving the mappings:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * idmap_get_sidbyuid & comp (the batch interface) and
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * idmap_get_w2u_mapping & comp. We want to use both of them, because
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * the former mimicks kernel interface better and the later offers the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * string names. In the batch case, our batch has always size 1.
cd37da7426f0c49c14ad9a8a07638ca971477566nw *
cd37da7426f0c49c14ad9a8a07638ca971477566nw * Btw, type_from cannot be IDMAP_PID, because there is no type string
cd37da7426f0c49c14ad9a8a07638ca971477566nw * for it.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
479ac37569625bae44ffb80071d4bc865fc710eddm
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_from & IS_NAME || type_to & IS_NAME ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw type_from == TYPE_GSID || type_from == TYPE_USID ||
cd37da7426f0c49c14ad9a8a07638ca971477566nw type_to == TYPE_GSID || type_to == TYPE_USID) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (type_from & IS_WIN) {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh map_stat = idmap_get_w2u_mapping(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->windomain,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &nm->is_user, &nm->is_wuser,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->pid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->unixname,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &nm->direction,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh map_stat = idmap_get_u2w_mapping(
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->pid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->unixname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
cd37da7426f0c49c14ad9a8a07638ca971477566nw nm->is_user, &nm->is_wuser,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->winname,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->windomain,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &nm->direction,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* batch handle */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_handle_t *ghandle = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* To be passed to idmap_get_uidbysid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gid_t gid = UNDEFINED_GID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* To be passed to idmap_get_gidbysid */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw uid_t uid = UNDEFINED_UID;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Create an in-memory structure for all the batch: */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh stat = idmap_get_create(&ghandle);
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Unable to create handle for communicating"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw " with idmapd(1M) (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_destroy(ghandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Schedule the request: */
cd37da7426f0c49c14ad9a8a07638ca971477566nw if (type_to == TYPE_UID) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp stat = idmap_getext_uidbysid(ghandle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &uid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &map_stat);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (type_to == TYPE_GID) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp stat = idmap_getext_gidbysid(ghandle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &gid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &map_stat);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (type_to == TYPE_PID) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp stat = idmap_getext_pidbysid(ghandle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->rid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->pid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->is_user,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &map_stat);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (type_from == TYPE_UID) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp stat = idmap_getext_sidbyuid(ghandle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->pid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &map_stat);
cd37da7426f0c49c14ad9a8a07638ca971477566nw } else if (type_from == TYPE_GID) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp stat = idmap_getext_sidbygid(ghandle,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (gid_t)nm->pid,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flag,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->sidprefix,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &nm->rid,
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp &info,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw &map_stat);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
821da340f9590922ba8761a64fadda18843a0e88dm /* This can never happen: */
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
821da340f9590922ba8761a64fadda18843a0e88dm gettext("Internal error in show.\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw exit(1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stat < 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Request for %.3s not sent (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh argv[0], idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_destroy(ghandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Send the batch to idmapd and obtain results: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw stat = idmap_get_mappings(ghandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (stat < 0) {
8e22821528b08c6dba4e8176351560f316f6d0dedm print_error(pos,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Mappings not obtained because of"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw " RPC problem (%s)\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_destroy(ghandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Destroy the batch handle: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw idmap_get_destroy(ghandle);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (type_to == TYPE_UID)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->pid = uid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else if (type_to == TYPE_GID)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw nm->pid = (uid_t)gid;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If there was -c flag, we do output whatever we can even in
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * the case of error:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (map_stat < 0 && flag & IDMAP_REQ_FLG_NO_NEW_ID_ALLOC)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp goto errormsg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm /*
8e22821528b08c6dba4e8176351560f316f6d0dedm * idmapd returns fallback uid/gid in case of errors. However
8e22821528b08c6dba4e8176351560f316f6d0dedm * it uses special sentinel value i.e 4294967295 (or -1) to
8e22821528b08c6dba4e8176351560f316f6d0dedm * indicate that falbback pid is not available either. In such
8e22821528b08c6dba4e8176351560f316f6d0dedm * case idmap(1M) should not display the mapping because there
8e22821528b08c6dba4e8176351560f316f6d0dedm * is no fallback mapping.
8e22821528b08c6dba4e8176351560f316f6d0dedm */
8e22821528b08c6dba4e8176351560f316f6d0dedm
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if ((type_to == TYPE_UID || type_to == TYPE_GID ||
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp type_to == TYPE_PID) && nm->pid == UNDEFINED_UID)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp goto errormsg;
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm2type(nm, type_from, &fromname) < 0)
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp goto errormsg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm2type(nm, type_to, &toname) < 0) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (!(flag & IDMAP_REQ_FLG_NO_NEW_ID_ALLOC))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) printf("%s -> %s:%u\n",
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw fromname,
cd37da7426f0c49c14ad9a8a07638ca971477566nw type_to & IS_GROUP ? ID_GID : ID_UID,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw UID_NOBODY);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(fromname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp } else {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp (void) printf("%s -> %s\n", fromname, toname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(fromname);
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp free(toname);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejperrormsg:
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp if (map_stat < 0) {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp print_error(pos, gettext("Error:\t%s\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(map_stat));
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp print_error_info(&info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright } else {
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp print_info(&info);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
48258c6b4e17f36ab09fba0bd6307d1fec9dcbcejp idmap_info_free(&info);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (nm != NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw name_mapping_fini(nm);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (stat < 0 || map_stat < 0 ? -1 : 0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
479ac37569625bae44ffb80071d4bc865fc710eddmflags2cred(flag_t *f, char **user, char **passwd, cmd_pos_t *pos)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm *user = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm *passwd = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (f[D_FLAG] == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm return (0); /* GSSAPI authentification => OK */
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm *user = strdup(f[D_FLAG]);
479ac37569625bae44ffb80071d4bc865fc710eddm if (*user == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm /* Password: */
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (f[j_FLAG] != NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm char line[MAX_INPUT_LINE_SZ];
479ac37569625bae44ffb80071d4bc865fc710eddm int i;
479ac37569625bae44ffb80071d4bc865fc710eddm FILE *file = fopen(f[j_FLAG], "r");
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (file == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Failed to open password file \"%s\": (%s)"
479ac37569625bae44ffb80071d4bc865fc710eddm ".\n"), f[j_FLAG], strerror(errno));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm /* The password is the fist line, we ignore the rest: */
479ac37569625bae44ffb80071d4bc865fc710eddm if (fgets(line, MAX_INPUT_LINE_SZ, file) == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("The password file \"%s\" is empty.\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm f[j_FLAG]);
479ac37569625bae44ffb80071d4bc865fc710eddm (void) fclose(file);
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (fclose(file) != 0) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Unable to close the password file \"%s\""
479ac37569625bae44ffb80071d4bc865fc710eddm ".\n"), f[j_FLAG], strerror(errno));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm /* Trim the eol: */
479ac37569625bae44ffb80071d4bc865fc710eddm for (i = strlen(line) - 1;
479ac37569625bae44ffb80071d4bc865fc710eddm i >= 0 && (line[i] == '\r' || line[i] == '\n');
479ac37569625bae44ffb80071d4bc865fc710eddm i--)
479ac37569625bae44ffb80071d4bc865fc710eddm line[i] = '\0';
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm *passwd = strdup(line);
479ac37569625bae44ffb80071d4bc865fc710eddm if (*passwd == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (!batch_mode) {
479ac37569625bae44ffb80071d4bc865fc710eddm /* If in the interactive mode, read the terminal input: */
479ac37569625bae44ffb80071d4bc865fc710eddm char *it = getpassphrase("Enter password:");
479ac37569625bae44ffb80071d4bc865fc710eddm if (it == NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(NULL,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Failed to get password (%s).\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm strerror(errno));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm *passwd = strdup(it);
479ac37569625bae44ffb80071d4bc865fc710eddm (void) memset(it, 0, strlen(it));
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (*passwd == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm } else {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos, gettext("No password given.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm goto fail;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm return (0);
479ac37569625bae44ffb80071d4bc865fc710eddmfail:
479ac37569625bae44ffb80071d4bc865fc710eddm if (*passwd != NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm (void) memset(*passwd, 0, strlen(*passwd));
479ac37569625bae44ffb80071d4bc865fc710eddm free(*passwd);
479ac37569625bae44ffb80071d4bc865fc710eddm *passwd = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm free(*user);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
479ac37569625bae44ffb80071d4bc865fc710eddmdo_set_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_stat stat;
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_t *nm;
479ac37569625bae44ffb80071d4bc865fc710eddm int is_first_win;
479ac37569625bae44ffb80071d4bc865fc710eddm char *user;
479ac37569625bae44ffb80071d4bc865fc710eddm char *passwd;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (argc < 2) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Not enough arguments: two names needed for a "
479ac37569625bae44ffb80071d4bc865fc710eddm "namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (argc > 2) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Too many arguments: two names needed for a "
479ac37569625bae44ffb80071d4bc865fc710eddm "namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm = args2nm(&is_first_win, argc, argv, pos);
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (flags2cred(f, &user, &passwd, pos) < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm->direction = is_first_win ? IDMAP_DIRECTION_W2U
479ac37569625bae44ffb80071d4bc865fc710eddm : IDMAP_DIRECTION_U2W;
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (init_nm_command(user, passwd, f[a_FLAG], nm->windomain,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp nm->direction, pos) < 0)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
61b364a9162c5e321625fcd2f640da7e1dd2417ejp
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp stat = idmap_set_namemap(namemaps.handle, nm->winname, nm->unixname,
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user, nm->is_wuser, nm->direction);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Failed to set namemap (%s).\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (passwd != NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm (void) memset(passwd, 0, strlen(passwd));
479ac37569625bae44ffb80071d4bc865fc710eddm free(passwd);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm free(user);
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp fini_nm_command();
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_fini(nm);
479ac37569625bae44ffb80071d4bc865fc710eddm return (stat != IDMAP_SUCCESS ? -1 : 0);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
479ac37569625bae44ffb80071d4bc865fc710eddmdo_unset_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_stat stat;
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_t *nm;
479ac37569625bae44ffb80071d4bc865fc710eddm int is_first_win;
479ac37569625bae44ffb80071d4bc865fc710eddm char *user;
479ac37569625bae44ffb80071d4bc865fc710eddm char *passwd;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (argc < 1) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Not enough arguments: a name needed to unset a "
479ac37569625bae44ffb80071d4bc865fc710eddm "namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (argc > 2) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Too many arguments: Only target name and type is "
479ac37569625bae44ffb80071d4bc865fc710eddm "needed to unset namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm = args2nm(&is_first_win, 1, argv, pos);
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (flags2cred(f, &user, &passwd, pos) < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm->direction = is_first_win ? IDMAP_DIRECTION_W2U
479ac37569625bae44ffb80071d4bc865fc710eddm : IDMAP_DIRECTION_U2W;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (argc > 1 && !is_first_win) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Target type \"%s\" is redundant.\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm argv[1]);
479ac37569625bae44ffb80071d4bc865fc710eddm stat = IDMAP_ERR_ARG;
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (argc > 1) {
479ac37569625bae44ffb80071d4bc865fc710eddm switch (string2type(argv[1], pos)) {
479ac37569625bae44ffb80071d4bc865fc710eddm case TYPE_INVALID:
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_fini(nm);
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm case TYPE_UU:
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_YES;
479ac37569625bae44ffb80071d4bc865fc710eddm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case TYPE_UG:
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user = IDMAP_NO;
479ac37569625bae44ffb80071d4bc865fc710eddm break;
479ac37569625bae44ffb80071d4bc865fc710eddm default:
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Invalid target type \"%s\": here the "
479ac37569625bae44ffb80071d4bc865fc710eddm "possible target type is unixuser or "
479ac37569625bae44ffb80071d4bc865fc710eddm "unixgroup.\n"), argv[1]);
479ac37569625bae44ffb80071d4bc865fc710eddm stat = IDMAP_ERR_ARG;
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (init_nm_command(user, passwd, f[a_FLAG], nm->windomain,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp nm->direction, pos) < 0)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp stat = idmap_unset_namemap(namemaps.handle, nm->winname, nm->unixname,
479ac37569625bae44ffb80071d4bc865fc710eddm nm->is_user, nm->is_wuser, nm->direction);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Failed to unset namemap (%s).\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmcleanup:
479ac37569625bae44ffb80071d4bc865fc710eddm if (passwd != NULL) {
479ac37569625bae44ffb80071d4bc865fc710eddm (void) memset(passwd, 0, strlen(passwd));
479ac37569625bae44ffb80071d4bc865fc710eddm free(passwd);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm free(user);
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp fini_nm_command();
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_fini(nm);
479ac37569625bae44ffb80071d4bc865fc710eddm return (stat == IDMAP_SUCCESS ? 0 : -1);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmstatic int
479ac37569625bae44ffb80071d4bc865fc710eddm/* LINTED E_FUNC_ARG_UNUSED */
479ac37569625bae44ffb80071d4bc865fc710eddmdo_get_namemap(flag_t *f, int argc, char **argv, cmd_pos_t *pos)
479ac37569625bae44ffb80071d4bc865fc710eddm{
479ac37569625bae44ffb80071d4bc865fc710eddm idmap_stat stat;
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_t *nm;
479ac37569625bae44ffb80071d4bc865fc710eddm int is_first_win;
479ac37569625bae44ffb80071d4bc865fc710eddm int is_source_ad;
479ac37569625bae44ffb80071d4bc865fc710eddm char *winname = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm char *unixname = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm char *unixuser = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm char *unixgroup = NULL;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (argc < 1) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Not enough arguments: a name needed to get a "
479ac37569625bae44ffb80071d4bc865fc710eddm "namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (argc > 1) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Too many arguments: just one name needed to get "
479ac37569625bae44ffb80071d4bc865fc710eddm "a namemap.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm = args2nm(&is_first_win, argc, argv, pos);
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm nm->direction = is_first_win ? IDMAP_DIRECTION_W2U
479ac37569625bae44ffb80071d4bc865fc710eddm : IDMAP_DIRECTION_U2W;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm /* nm->is_user is IDMAP_UNKNOWN for IDMAP_DIRECTION_W2U */
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm->is_user == IDMAP_YES) {
479ac37569625bae44ffb80071d4bc865fc710eddm unixuser = strdup(nm->unixname);
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixuser == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm } else if (nm->is_user == IDMAP_NO) {
479ac37569625bae44ffb80071d4bc865fc710eddm unixgroup = strdup(nm->unixname);
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixgroup == NULL) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp print_error(pos, "%s.\n", strerror(ENOMEM));
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (init_nm_command(NULL, NULL, NULL, nm->windomain,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp nm->direction, pos) < 0)
61b364a9162c5e321625fcd2f640da7e1dd2417ejp return (-1);
479ac37569625bae44ffb80071d4bc865fc710eddm
61b364a9162c5e321625fcd2f640da7e1dd2417ejp stat = idmap_get_namemap(namemaps.handle, &is_source_ad, &nm->winname,
61b364a9162c5e321625fcd2f640da7e1dd2417ejp &nm->windomain, &nm->is_wuser, &unixuser, &unixgroup);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (stat != IDMAP_SUCCESS) {
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Failed to get namemap info (%s).\n"),
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh idmap_stat2string(stat));
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm2winqn(nm, &winname) < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm switch (is_source_ad) {
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_YES:
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixuser == NULL && unixgroup == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("\t\tNo namemap found in AD.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm else {
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("AD namemaps for %s\n"), winname);
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixuser != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("\t\t->\t%s:%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm ID_UNIXUSER, unixuser);
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixgroup != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("\t\t->\t%s:%s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm ID_UNIXGROUP, unixgroup);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm break;
479ac37569625bae44ffb80071d4bc865fc710eddm case IDMAP_NO:
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm2unixname(nm, &unixname) < 0)
479ac37569625bae44ffb80071d4bc865fc710eddm goto cleanup;
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm if (nm->winname == NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("\t\tNo namemap found in "
479ac37569625bae44ffb80071d4bc865fc710eddm "native LDAP.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm else {
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("Native LDAP namemap for %s\n"),
479ac37569625bae44ffb80071d4bc865fc710eddm unixname);
479ac37569625bae44ffb80071d4bc865fc710eddm (void) printf(gettext("\t\t->\t%s\n"), winname);
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm break;
479ac37569625bae44ffb80071d4bc865fc710eddm default:
479ac37569625bae44ffb80071d4bc865fc710eddm /*
479ac37569625bae44ffb80071d4bc865fc710eddm * This can never happen; the error must be recognized in
479ac37569625bae44ffb80071d4bc865fc710eddm * args2nm
479ac37569625bae44ffb80071d4bc865fc710eddm */
479ac37569625bae44ffb80071d4bc865fc710eddm print_error(pos,
479ac37569625bae44ffb80071d4bc865fc710eddm gettext("Internal error: unknown source of namemaps.\n"));
479ac37569625bae44ffb80071d4bc865fc710eddm }
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddmcleanup:
61b364a9162c5e321625fcd2f640da7e1dd2417ejp fini_nm_command();
479ac37569625bae44ffb80071d4bc865fc710eddm name_mapping_fini(nm);
479ac37569625bae44ffb80071d4bc865fc710eddm if (winname != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm free(winname);
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixuser != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm free(unixuser);
479ac37569625bae44ffb80071d4bc865fc710eddm if (unixgroup != NULL)
479ac37569625bae44ffb80071d4bc865fc710eddm free(unixgroup);
479ac37569625bae44ffb80071d4bc865fc710eddm return (stat == IDMAP_SUCCESS ? 0 : -1);
479ac37569625bae44ffb80071d4bc865fc710eddm}
479ac37569625bae44ffb80071d4bc865fc710eddm
479ac37569625bae44ffb80071d4bc865fc710eddm
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen/* printflike */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaistatic
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullenvoid
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desaiidmap_cli_logger(int pri, const char *format, ...)
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen{
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen va_list args;
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai if (pri == LOG_DEBUG)
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai return;
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen va_start(args, format);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen (void) vfprintf(stderr, format, args);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen (void) fprintf(stderr, "\n");
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen va_end(args);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen}
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
479ac37569625bae44ffb80071d4bc865fc710eddm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* main function. Returns 1 for error, 0 otherwise */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
cd37da7426f0c49c14ad9a8a07638ca971477566nwmain(int argc, char *argv[])
cd37da7426f0c49c14ad9a8a07638ca971477566nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* set locale and domain for internationalization */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) setlocale(LC_ALL, "");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) textdomain(TEXT_DOMAIN);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen /* Redirect logging */
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai idmap_set_logger(idmap_cli_logger);
c586600796766c83eb9485c446886fd9ed2359a9Keyur Desai adutils_set_logger(idmap_cli_logger);
7a8a68f5e3efbaec1a375c2d50bd20b566631755Julian Pullen
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* idmap_engine determines the batch_mode: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = engine_init(sizeof (commands) / sizeof (cmd_ops_t),
cd37da7426f0c49c14ad9a8a07638ca971477566nw commands,
cd37da7426f0c49c14ad9a8a07638ca971477566nw argc - 1,
cd37da7426f0c49c14ad9a8a07638ca971477566nw argv + 1,
cd37da7426f0c49c14ad9a8a07638ca971477566nw &batch_mode);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) engine_fini();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (rc == IDMAP_ENG_ERROR_SILENT)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw help();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw udt_used = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (batch_mode) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (init_udt_batch() < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = run_engine(argc - 1, argv + 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (batch_mode) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw batch_mode = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm if (fini_udt_command(rc == 0 ? 1 : 0, NULL))
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = -1;
61b364a9162c5e321625fcd2f640da7e1dd2417ejp fini_nm_command();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) engine_fini();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc == 0 ? 0 : 1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}