15331Samw /* 25331Samw * CDDL HEADER START 35331Samw * 45331Samw * The contents of this file are subject to the terms of the 55331Samw * Common Development and Distribution License (the "License"). 65331Samw * You may not use this file except in compliance with the License. 75331Samw * 85331Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95331Samw * or http://www.opensolaris.org/os/licensing. 105331Samw * See the License for the specific language governing permissions 115331Samw * and limitations under the License. 125331Samw * 135331Samw * When distributing Covered Code, include this CDDL HEADER in each 145331Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155331Samw * If applicable, add the following below this CDDL HEADER, with the 165331Samw * fields enclosed by brackets "[]" replaced with your own identifying 175331Samw * information: Portions Copyright [yyyy] [name of copyright owner] 185331Samw * 195331Samw * CDDL HEADER END 205331Samw */ 215331Samw /* 22*5772Sas200622 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 235331Samw * Use is subject to license terms. 245331Samw */ 255331Samw 265331Samw #pragma ident "%Z%%M% %I% %E% SMI" 275331Samw 285331Samw /* 295331Samw * This module contains smbadm CLI which offers smb configuration 305331Samw * functionalities. 315331Samw */ 325331Samw #include <stdlib.h> 335331Samw #include <stdio.h> 345331Samw #include <syslog.h> 355331Samw #include <strings.h> 365331Samw #include <limits.h> 375331Samw #include <getopt.h> 385331Samw #include <libintl.h> 395331Samw #include <zone.h> 405331Samw #include <grp.h> 415331Samw #include <libgen.h> 425331Samw 435331Samw #include <smbsrv/libsmb.h> 445331Samw 455331Samw typedef enum { 465331Samw HELP_ADD_MEMBER, 475331Samw HELP_CREATE, 485331Samw HELP_DELETE, 495331Samw HELP_DEL_MEMBER, 505331Samw HELP_GET, 515331Samw HELP_JOIN, 525331Samw HELP_LIST, 535331Samw HELP_RENAME, 545331Samw HELP_SET, 555331Samw HELP_SHOW, 565331Samw HELP_UDISABLE, 575331Samw HELP_UENABLE 585331Samw } smbadm_help_t; 595331Samw 605331Samw typedef struct smbadm_cmdinfo { 615331Samw char *name; 625331Samw int (*func)(int, char **); 635331Samw smbadm_help_t usage; 645331Samw } smbadm_cmdinfo_t; 655331Samw 665331Samw smbadm_cmdinfo_t *curcmd; 675331Samw static char *progname; 685331Samw 695331Samw static int smbadm_join(int, char **); 705331Samw static int smbadm_list(int, char **); 715331Samw static int smbadm_group_create(int, char **); 725331Samw static int smbadm_group_delete(int, char **); 735331Samw static int smbadm_group_rename(int, char **); 745331Samw static int smbadm_group_show(int, char **); 755331Samw static int smbadm_group_getprop(int, char **); 765331Samw static int smbadm_group_setprop(int, char **); 775331Samw static int smbadm_group_addmember(int, char **); 785331Samw static int smbadm_group_delmember(int, char **); 795331Samw static int smbadm_user_disable(int, char **); 805331Samw static int smbadm_user_enable(int, char **); 815331Samw 825331Samw static smbadm_cmdinfo_t smbadm_cmdtable[] = 835331Samw { 845331Samw { "add-member", smbadm_group_addmember, HELP_ADD_MEMBER }, 855331Samw { "create", smbadm_group_create, HELP_CREATE }, 865331Samw { "delete", smbadm_group_delete, HELP_DELETE }, 875331Samw { "disable-user", smbadm_user_disable, HELP_UDISABLE }, 885331Samw { "enable-user", smbadm_user_enable, HELP_UENABLE }, 895331Samw { "get", smbadm_group_getprop, HELP_GET }, 905331Samw { "join", smbadm_join, HELP_JOIN }, 915331Samw { "list", smbadm_list, HELP_LIST }, 925331Samw { "remove-member", smbadm_group_delmember, HELP_DEL_MEMBER }, 935331Samw { "rename", smbadm_group_rename, HELP_RENAME }, 945331Samw { "set", smbadm_group_setprop, HELP_SET }, 955331Samw { "show", smbadm_group_show, HELP_SHOW }, 965331Samw }; 975331Samw 985331Samw #define SMBADM_NCMD (sizeof (smbadm_cmdtable) / sizeof (smbadm_cmdtable[0])) 995331Samw 1005331Samw typedef struct smbadm_prop { 1015331Samw char *p_name; 1025331Samw char *p_value; 1035331Samw } smbadm_prop_t; 1045331Samw 1055331Samw typedef struct smbadm_prop_handle { 1065331Samw char *p_name; 1075331Samw char *p_dispvalue; 1085331Samw int (*p_setfn)(char *, smbadm_prop_t *); 1095331Samw int (*p_getfn)(char *, smbadm_prop_t *); 1105331Samw boolean_t (*p_chkfn)(smbadm_prop_t *); 1115331Samw } smbadm_prop_handle_t; 1125331Samw 1135331Samw static boolean_t smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval); 1145331Samw static int smbadm_prop_parse(char *arg, smbadm_prop_t *prop); 1155331Samw static smbadm_prop_handle_t *smbadm_prop_gethandle(char *pname); 1165331Samw 1175331Samw static boolean_t smbadm_chkprop_priv(smbadm_prop_t *prop); 1185331Samw static int smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop); 1195331Samw static int smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop); 1205331Samw static int smbadm_setprop_backup(char *gname, smbadm_prop_t *prop); 1215331Samw static int smbadm_getprop_backup(char *gname, smbadm_prop_t *prop); 1225331Samw static int smbadm_setprop_restore(char *gname, smbadm_prop_t *prop); 1235331Samw static int smbadm_getprop_restore(char *gname, smbadm_prop_t *prop); 1245331Samw static int smbadm_setprop_desc(char *gname, smbadm_prop_t *prop); 1255331Samw static int smbadm_getprop_desc(char *gname, smbadm_prop_t *prop); 1265331Samw 1275331Samw static smbadm_prop_handle_t smbadm_ptable[] = { 1285331Samw {"backup", "on | off", smbadm_setprop_backup, 1295331Samw smbadm_getprop_backup, smbadm_chkprop_priv }, 1305331Samw {"restore", "on | off", smbadm_setprop_restore, 1315331Samw smbadm_getprop_restore, smbadm_chkprop_priv }, 1325331Samw {"take-ownership", "on | off", smbadm_setprop_tkowner, 1335331Samw smbadm_getprop_tkowner, smbadm_chkprop_priv }, 1345331Samw {"description", "<string>", smbadm_setprop_desc, 1355331Samw smbadm_getprop_desc, NULL }, 1365331Samw }; 1375331Samw 1385331Samw static const char *smbadm_pwd_strerror(int error); 1395331Samw 1405331Samw /* 1415331Samw * Number of supported properties 1425331Samw */ 1435331Samw #define SMBADM_NPROP (sizeof (smbadm_ptable) / sizeof (smbadm_ptable[0])) 1445331Samw 1455331Samw static void 1465331Samw smbadm_cmdusage(FILE *fp, smbadm_cmdinfo_t *cmd) 1475331Samw { 1485331Samw switch (cmd->usage) { 1495331Samw case HELP_ADD_MEMBER: 1505331Samw (void) fprintf(fp, 1515331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 1525331Samw cmd->name); 1535331Samw return; 1545331Samw 1555331Samw case HELP_CREATE: 1565331Samw (void) fprintf(fp, gettext("\t%s [-d description] group\n"), 1575331Samw cmd->name); 1585331Samw return; 1595331Samw 1605331Samw case HELP_DELETE: 1615331Samw (void) fprintf(fp, gettext("\t%s group\n"), cmd->name); 1625331Samw return; 1635331Samw 1645331Samw case HELP_UDISABLE: 1655331Samw case HELP_UENABLE: 1665331Samw (void) fprintf(fp, gettext("\t%s user\n"), cmd->name); 1675331Samw return; 1685331Samw 1695331Samw case HELP_GET: 1705331Samw (void) fprintf(fp, gettext("\t%s [[-p property] ...] group\n"), 1715331Samw cmd->name); 1725331Samw return; 1735331Samw 1745331Samw case HELP_JOIN: 1755331Samw (void) fprintf(fp, gettext("\t%s -u username domain\n" 1765331Samw "\t%s -w workgroup\n"), cmd->name, cmd->name); 1775331Samw return; 1785331Samw 1795331Samw case HELP_LIST: 1805331Samw (void) fprintf(fp, gettext("\t%s\n"), cmd->name); 1815331Samw return; 1825331Samw 1835331Samw case HELP_DEL_MEMBER: 1845331Samw (void) fprintf(fp, 1855331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 1865331Samw cmd->name); 1875331Samw return; 1885331Samw 1895331Samw case HELP_RENAME: 1905331Samw (void) fprintf(fp, gettext("\t%s group new-group\n"), 1915331Samw cmd->name); 1925331Samw return; 1935331Samw 1945331Samw case HELP_SET: 1955331Samw (void) fprintf(fp, gettext("\t%s -p property=value " 1965331Samw "[[-p property=value] ...] group\n"), cmd->name); 1975331Samw return; 1985331Samw 1995331Samw case HELP_SHOW: 2005331Samw (void) fprintf(fp, gettext("\t%s [-m] [-p] [group]\n"), 2015331Samw cmd->name); 2025331Samw return; 2035331Samw 2045331Samw } 2055331Samw 2065331Samw abort(); 2075331Samw /* NOTREACHED */ 2085331Samw } 2095331Samw 2105331Samw static void 2115331Samw smbadm_usage(boolean_t requested) 2125331Samw { 2135331Samw FILE *fp = requested ? stdout : stderr; 2145331Samw boolean_t show_props = B_FALSE; 2155331Samw int i; 2165331Samw 2175331Samw if (curcmd == NULL) { 2185331Samw (void) fprintf(fp, 2195331Samw gettext("usage: %s [-h | <command> [options]]\n"), 2205331Samw progname); 2215331Samw (void) fprintf(fp, 2225331Samw gettext("where 'command' is one of the following:\n\n")); 2235331Samw 2245331Samw for (i = 0; i < SMBADM_NCMD; i++) 2255331Samw smbadm_cmdusage(fp, &smbadm_cmdtable[i]); 2265331Samw 2275331Samw (void) fprintf(fp, 2285331Samw gettext("\nFor property list, run %s %s|%s\n"), 2295331Samw progname, "get", "set"); 2305331Samw 2315331Samw exit(requested ? 0 : 2); 2325331Samw } 2335331Samw 2345331Samw (void) fprintf(fp, gettext("usage:\n")); 2355331Samw smbadm_cmdusage(fp, curcmd); 2365331Samw 2375331Samw if (strcmp(curcmd->name, "get") == 0 || 2385331Samw strcmp(curcmd->name, "set") == 0) 2395331Samw show_props = B_TRUE; 2405331Samw 2415331Samw if (show_props) { 2425331Samw (void) fprintf(fp, 2435331Samw gettext("\nThe following properties are supported:\n")); 2445331Samw 2455331Samw (void) fprintf(fp, "\n\t%-16s %s\n\n", 2465331Samw "PROPERTY", "VALUES"); 2475331Samw 2485331Samw for (i = 0; i < SMBADM_NPROP; i++) { 2495331Samw (void) fprintf(fp, "\t%-16s %s\n", 2505331Samw smbadm_ptable[i].p_name, 2515331Samw smbadm_ptable[i].p_dispvalue); 2525331Samw } 2535331Samw } 2545331Samw 2555331Samw exit(requested ? 0 : 2); 2565331Samw } 2575331Samw 2585331Samw /* 2595331Samw * smbadm_join 2605331Samw * 2615331Samw * Join the given domain/workgroup 2625331Samw */ 2635331Samw static int 2645331Samw smbadm_join(int argc, char **argv) 2655331Samw { 2665331Samw char option; 2675331Samw smb_joininfo_t jdi; 2685331Samw boolean_t join_w = B_FALSE; 2695331Samw boolean_t join_d = B_FALSE; 2705331Samw uint32_t status; 2715331Samw 2725331Samw bzero(&jdi, sizeof (jdi)); 2735331Samw 2745331Samw while ((option = getopt(argc, argv, "u:w:")) != -1) { 2755331Samw switch (option) { 2765331Samw case 'w': 2775331Samw (void) strlcpy(jdi.domain_name, optarg, 2785331Samw sizeof (jdi.domain_name)); 2795331Samw jdi.mode = SMB_SECMODE_WORKGRP; 2805331Samw join_w = B_TRUE; 2815331Samw break; 2825331Samw 2835331Samw case 'u': 2845331Samw /* admin username */ 2855331Samw (void) strlcpy(jdi.domain_username, optarg, 2865331Samw sizeof (jdi.domain_username)); 2875331Samw jdi.mode = SMB_SECMODE_DOMAIN; 2885331Samw join_d = B_TRUE; 2895331Samw break; 2905331Samw 2915331Samw default: 2925331Samw smbadm_usage(B_FALSE); 2935331Samw } 2945331Samw } 2955331Samw 2965331Samw if (join_w && join_d) { 2975331Samw (void) fprintf(stderr, 2985331Samw gettext("domain and workgroup " 2995331Samw "can not be specified together\n")); 3005331Samw smbadm_usage(B_FALSE); 3015331Samw } 3025331Samw 3035331Samw if (join_d && (argv[optind] != NULL)) { 3045331Samw (void) strlcpy(jdi.domain_name, argv[optind], 3055331Samw sizeof (jdi.domain_name)); 3065331Samw } 3075331Samw 3085331Samw if (*jdi.domain_name == '\0') { 3095331Samw (void) fprintf(stderr, gettext("missing %s name\n"), 3105331Samw (join_d) ? "domain" : "workgroup"); 3115331Samw smbadm_usage(B_FALSE); 3125331Samw } 3135331Samw 3145331Samw if (join_d && *jdi.domain_username == '\0') { 3155331Samw (void) fprintf(stderr, gettext("missing username\n")); 3165331Samw smbadm_usage(B_FALSE); 3175331Samw } 3185331Samw 3195331Samw if (join_w) { 3205331Samw status = smb_join(&jdi); 3215331Samw if (status == NT_STATUS_SUCCESS) { 3225331Samw (void) printf( 3235331Samw gettext("Successfully joined workgroup '%s'\n"), 3245331Samw jdi.domain_name); 3255331Samw return (0); 3265331Samw } 3275331Samw 3285331Samw (void) fprintf(stderr, 3295331Samw gettext("failed to join workgroup '%s' (%s)\n"), 3305331Samw jdi.domain_name, xlate_nt_status(status)); 3315331Samw 3325331Samw return (1); 3335331Samw } 3345331Samw 3355331Samw /* Join the domain */ 3365331Samw if (*jdi.domain_passwd == '\0') { 3375331Samw char *p = NULL; 3385331Samw char *prompt = gettext("Enter domain password: "); 3395331Samw p = getpassphrase(prompt); 3405331Samw if (!p) { 3415331Samw (void) fprintf(stderr, gettext("missing password\n")); 3425331Samw smbadm_usage(B_FALSE); 3435331Samw } 3445331Samw 3455331Samw (void) strlcpy(jdi.domain_passwd, p, 3465331Samw sizeof (jdi.domain_passwd)); 3475331Samw } 3485331Samw 3495331Samw (void) printf(gettext("Joining '%s' ... this may take a minute ...\n"), 3505331Samw jdi.domain_name); 3515331Samw 3525331Samw status = smb_join(&jdi); 3535331Samw 3545331Samw switch (status) { 3555331Samw case NT_STATUS_SUCCESS: 3565331Samw (void) printf(gettext("Successfully joined domain '%s'\n"), 3575331Samw jdi.domain_name); 3585331Samw return (0); 3595331Samw 3605331Samw case NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND: 3615331Samw (void) fprintf(stderr, gettext("failed to find " 3625331Samw "any domain controllers for '%s'\n"), 3635331Samw jdi.domain_name); 3645331Samw break; 3655331Samw 3665331Samw default: 3675331Samw (void) fprintf(stderr, 3685331Samw gettext("failed to join domain '%s' (%s)\n"), 3695331Samw jdi.domain_name, xlate_nt_status(status)); 3705331Samw } 3715331Samw 3725331Samw return (1); 3735331Samw } 3745331Samw 3755331Samw /* 3765331Samw * smbadm_list 3775331Samw * 3785331Samw * Displays current security mode and domain/workgroup name. 3795331Samw */ 3805331Samw /*ARGSUSED*/ 3815331Samw static int 3825331Samw smbadm_list(int argc, char **argv) 3835331Samw { 3845331Samw char resource_domain[SMB_PI_MAX_DOMAIN]; 3855331Samw int sec_mode; 3865331Samw char *modename; 3875331Samw 3885331Samw if (smbd_get_security_mode(&sec_mode)) { 3895331Samw (void) fprintf(stderr, 3905331Samw gettext("failed to get the security mode\n")); 3915331Samw return (1); 3925331Samw } 3935331Samw 3945331Samw modename = (sec_mode == SMB_SECMODE_DOMAIN) ? "domain" : "workgroup"; 3955331Samw 3965331Samw (void) printf(gettext("security mode: %s\n"), 3975331Samw smb_config_secmode_tostr(sec_mode)); 3985331Samw 3995331Samw if (smbd_get_param(SMB_CI_DOMAIN_NAME, resource_domain) != 0) { 4005331Samw (void) fprintf(stderr, 4015331Samw gettext("failed to get the %s name\n"), modename); 4025331Samw return (1); 4035331Samw } 4045331Samw 405*5772Sas200622 (void) printf(gettext("%s name: %s\n"), modename, resource_domain); 4065331Samw return (0); 4075331Samw } 4085331Samw 4095331Samw /* 4105331Samw * smbadm_group_create 4115331Samw * 4125331Samw * Creates a local SMB group 4135331Samw */ 4145331Samw static int 4155331Samw smbadm_group_create(int argc, char **argv) 4165331Samw { 4175331Samw char *gname = NULL; 4185331Samw char *desc = NULL; 4195331Samw char option; 420*5772Sas200622 int status; 4215331Samw 4225331Samw while ((option = getopt(argc, argv, "d:")) != -1) { 4235331Samw switch (option) { 4245331Samw case 'd': 4255331Samw desc = optarg; 4265331Samw break; 4275331Samw 4285331Samw default: 4295331Samw smbadm_usage(B_FALSE); 4305331Samw } 4315331Samw } 4325331Samw 4335331Samw gname = argv[optind]; 4345331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 4355331Samw (void) fprintf(stderr, gettext("missing group name\n")); 4365331Samw smbadm_usage(B_FALSE); 4375331Samw } 4385331Samw 4395331Samw if (getgrnam(gname) == NULL) { 4405331Samw (void) fprintf(stderr, 441*5772Sas200622 gettext("failed to get the Solaris group '%s'\n"), gname); 4425331Samw (void) fprintf(stderr, 443*5772Sas200622 gettext("use 'groupadd' to add '%s'\n"), gname); 4445331Samw return (1); 4455331Samw } 4465331Samw 447*5772Sas200622 status = smb_lgrp_add(gname, desc); 448*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 4495331Samw (void) fprintf(stderr, 4505331Samw gettext("failed to create the group (%s)\n"), 451*5772Sas200622 smb_lgrp_strerror(status)); 4525331Samw } else { 453*5772Sas200622 (void) printf(gettext("'%s' created.\n"), 4545331Samw gname); 4555331Samw } 4565331Samw 4575331Samw return (status); 4585331Samw } 4595331Samw 4605331Samw /* 4615331Samw * smbadm_group_dump_members 4625331Samw * 4635331Samw * Dump group members details. 4645331Samw */ 4655331Samw static void 466*5772Sas200622 smbadm_group_dump_members(smb_gsid_t *members, int num) 4675331Samw { 468*5772Sas200622 char sidstr[NT_SID_FMTBUF_SIZE]; 4695331Samw int i; 4705331Samw 471*5772Sas200622 if (num == 0) { 4725331Samw (void) printf(gettext("\tNo members\n")); 4735331Samw return; 4745331Samw } 4755331Samw 4765331Samw (void) printf(gettext("\tMembers:\n")); 477*5772Sas200622 for (i = 0; i < num; i++) { 478*5772Sas200622 (void) smb_lookup_sid(members[i].gs_sid, sidstr, 479*5772Sas200622 sizeof (sidstr)); 480*5772Sas200622 (void) printf(gettext("\t\t%s\n"), sidstr); 4815331Samw } 4825331Samw } 4835331Samw 4845331Samw /* 4855331Samw * smbadm_group_dump_privs 4865331Samw * 4875331Samw * Dump group privilege details. 4885331Samw */ 4895331Samw static void 490*5772Sas200622 smbadm_group_dump_privs(smb_privset_t *privs) 4915331Samw { 492*5772Sas200622 smb_privinfo_t *pinfo; 493*5772Sas200622 char *pstatus; 4945331Samw int i; 4955331Samw 4965331Samw (void) printf(gettext("\tPrivileges: \n")); 4975331Samw 498*5772Sas200622 for (i = 0; i < privs->priv_cnt; i++) { 499*5772Sas200622 pinfo = smb_priv_getbyvalue(privs->priv[i].luid.lo_part); 500*5772Sas200622 if ((pinfo == NULL) || (pinfo->flags & PF_PRESENTABLE) == 0) 5015331Samw continue; 5025331Samw 503*5772Sas200622 switch (privs->priv[i].attrs) { 504*5772Sas200622 case SE_PRIVILEGE_ENABLED: 505*5772Sas200622 pstatus = "On"; 506*5772Sas200622 break; 507*5772Sas200622 case SE_PRIVILEGE_DISABLED: 508*5772Sas200622 pstatus = "Off"; 509*5772Sas200622 break; 510*5772Sas200622 default: 511*5772Sas200622 pstatus = "Unknown"; 512*5772Sas200622 break; 5135331Samw } 514*5772Sas200622 (void) printf(gettext("\t\t%s: %s\n"), pinfo->name, pstatus); 5155331Samw } 5165331Samw 517*5772Sas200622 if (privs->priv_cnt == 0) 5185331Samw (void) printf(gettext("\t\tNo privileges\n")); 5195331Samw } 5205331Samw 5215331Samw /* 5225331Samw * smbadm_group_dump 5235331Samw * 5245331Samw * Dump group details. 5255331Samw */ 526*5772Sas200622 static void 527*5772Sas200622 smbadm_group_dump(smb_group_t *grp, boolean_t show_mem, boolean_t show_privs) 5285331Samw { 529*5772Sas200622 char sidstr[NT_SID_FMTBUF_SIZE]; 5305331Samw 531*5772Sas200622 (void) printf(gettext("%s (%s)\n"), grp->sg_name, grp->sg_cmnt); 5325331Samw 533*5772Sas200622 nt_sid_format2(grp->sg_id.gs_sid, sidstr); 534*5772Sas200622 (void) printf(gettext("\tSID: %s\n"), sidstr); 5355331Samw 536*5772Sas200622 if (show_privs) 537*5772Sas200622 smbadm_group_dump_privs(grp->sg_privs); 5385331Samw 539*5772Sas200622 if (show_mem) 540*5772Sas200622 smbadm_group_dump_members(grp->sg_members, grp->sg_nmembers); 5415331Samw } 5425331Samw 5435331Samw /* 5445331Samw * smbadm_group_show 5455331Samw * 5465331Samw */ 5475331Samw static int 5485331Samw smbadm_group_show(int argc, char **argv) 5495331Samw { 5505331Samw char *gname = NULL; 5515331Samw boolean_t show_privs; 5525331Samw boolean_t show_members; 5535331Samw char option; 554*5772Sas200622 int status; 555*5772Sas200622 smb_group_t grp; 556*5772Sas200622 smb_giter_t gi; 5575331Samw 5585331Samw show_privs = show_members = B_FALSE; 5595331Samw 5605331Samw while ((option = getopt(argc, argv, "mp")) != -1) { 5615331Samw switch (option) { 5625331Samw case 'm': 5635331Samw show_members = B_TRUE; 5645331Samw break; 5655331Samw case 'p': 5665331Samw show_privs = B_TRUE; 5675331Samw break; 5685331Samw 5695331Samw default: 5705331Samw smbadm_usage(B_FALSE); 5715331Samw } 5725331Samw } 5735331Samw 5745331Samw gname = argv[optind]; 5755331Samw if (optind >= argc || gname == NULL || *gname == '\0') 5765331Samw gname = "*"; 5775331Samw 578*5772Sas200622 if (strcmp(gname, "*")) { 579*5772Sas200622 status = smb_lgrp_getbyname(gname, &grp); 580*5772Sas200622 if (status == SMB_LGRP_SUCCESS) { 581*5772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 582*5772Sas200622 smb_lgrp_free(&grp); 583*5772Sas200622 } else { 584*5772Sas200622 (void) fprintf(stderr, 585*5772Sas200622 gettext("failed to find '%s' (%s)\n"), 586*5772Sas200622 gname, smb_lgrp_strerror(status)); 587*5772Sas200622 } 588*5772Sas200622 return (status); 5895331Samw } 5905331Samw 591*5772Sas200622 status = smb_lgrp_iteropen(&gi); 592*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 593*5772Sas200622 (void) fprintf(stderr, 594*5772Sas200622 gettext("failed to list groups (%s)\n"), 595*5772Sas200622 smb_lgrp_strerror(status)); 596*5772Sas200622 return (status); 5975331Samw } 5985331Samw 599*5772Sas200622 while (smb_lgrp_iterate(&gi, &grp) == SMB_LGRP_SUCCESS) { 600*5772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 601*5772Sas200622 smb_lgrp_free(&grp); 602*5772Sas200622 } 603*5772Sas200622 smb_lgrp_iterclose(&gi); 604*5772Sas200622 605*5772Sas200622 return (0); 6065331Samw } 6075331Samw 6085331Samw /* 6095331Samw * smbadm_group_delete 6105331Samw */ 6115331Samw static int 6125331Samw smbadm_group_delete(int argc, char **argv) 6135331Samw { 6145331Samw char *gname = NULL; 615*5772Sas200622 int status; 6165331Samw 6175331Samw gname = argv[optind]; 6185331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 6195331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6205331Samw smbadm_usage(B_FALSE); 6215331Samw } 6225331Samw 623*5772Sas200622 status = smb_lgrp_delete(gname); 624*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 6255331Samw (void) fprintf(stderr, 6265331Samw gettext("failed to delete the group (%s)\n"), 627*5772Sas200622 smb_lgrp_strerror(status)); 6285331Samw } else { 629*5772Sas200622 (void) printf(gettext("'%s' deleted.\n"), 6305331Samw gname); 6315331Samw } 6325331Samw 6335331Samw return (status); 6345331Samw } 6355331Samw 6365331Samw /* 6375331Samw * smbadm_group_rename 6385331Samw */ 6395331Samw static int 6405331Samw smbadm_group_rename(int argc, char **argv) 6415331Samw { 6425331Samw char *gname = NULL; 6435331Samw char *ngname = NULL; 644*5772Sas200622 int status; 6455331Samw 6465331Samw gname = argv[optind]; 6475331Samw if (optind++ >= argc || gname == NULL || *gname == '\0') { 6485331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6495331Samw smbadm_usage(B_FALSE); 6505331Samw } 6515331Samw 6525331Samw ngname = argv[optind]; 6535331Samw if (optind >= argc || ngname == NULL || *ngname == '\0') { 6545331Samw (void) fprintf(stderr, gettext("missing new group name\n")); 6555331Samw smbadm_usage(B_FALSE); 6565331Samw } 6575331Samw 658*5772Sas200622 if (getgrnam(ngname) == NULL) { 6595331Samw (void) fprintf(stderr, 660*5772Sas200622 gettext("failed to get the Solaris group '%s'\n"), ngname); 6615331Samw (void) fprintf(stderr, 662*5772Sas200622 gettext("use 'groupadd' to add '%s'\n"), ngname); 6635331Samw return (1); 6645331Samw } 6655331Samw 666*5772Sas200622 status = smb_lgrp_rename(gname, ngname); 667*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 668*5772Sas200622 if (status == SMB_LGRP_EXISTS) 669*5772Sas200622 (void) fprintf(stderr, 670*5772Sas200622 gettext("failed to rename '%s' (%s already " 671*5772Sas200622 "exists)\n"), gname, ngname); 672*5772Sas200622 else 673*5772Sas200622 (void) fprintf(stderr, 674*5772Sas200622 gettext("failed to rename '%s' (%s)\n"), gname, 675*5772Sas200622 smb_lgrp_strerror(status)); 6765331Samw } else { 677*5772Sas200622 (void) printf(gettext("'%s' renamed to '%s'\n"), gname, ngname); 6785331Samw } 6795331Samw 6805331Samw return (status); 6815331Samw } 6825331Samw 6835331Samw /* 6845331Samw * smbadm_group_setprop 6855331Samw * 6865331Samw * Set the group properties. 6875331Samw */ 6885331Samw static int 6895331Samw smbadm_group_setprop(int argc, char **argv) 6905331Samw { 6915331Samw char *gname = NULL; 6925331Samw smbadm_prop_t props[SMBADM_NPROP]; 6935331Samw smbadm_prop_handle_t *phandle; 6945331Samw char option; 6955331Samw int pcnt = 0; 6965331Samw int ret; 6975331Samw int p; 6985331Samw 6995331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 7005331Samw 7015331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 7025331Samw switch (option) { 7035331Samw case 'p': 7045331Samw if (pcnt >= SMBADM_NPROP) { 7055331Samw (void) fprintf(stderr, 7065331Samw gettext("exceeded number of supported" 7075331Samw " properties\n")); 7085331Samw smbadm_usage(B_FALSE); 7095331Samw } 7105331Samw 711*5772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 712*5772Sas200622 smbadm_usage(B_FALSE); 7135331Samw break; 7145331Samw 7155331Samw default: 7165331Samw smbadm_usage(B_FALSE); 7175331Samw } 7185331Samw } 7195331Samw 7205331Samw if (pcnt == 0) { 7215331Samw (void) fprintf(stderr, 7225331Samw gettext("missing property=value argument\n")); 7235331Samw smbadm_usage(B_FALSE); 7245331Samw } 7255331Samw 7265331Samw gname = argv[optind]; 7275331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 7285331Samw (void) fprintf(stderr, gettext("missing group name\n")); 7295331Samw smbadm_usage(B_FALSE); 7305331Samw } 7315331Samw 7325331Samw for (p = 0; p < pcnt; p++) { 7335331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 7345331Samw if (phandle) { 7355331Samw if (phandle->p_setfn(gname, &props[p]) != 0) 7365331Samw ret = 1; 7375331Samw } 7385331Samw } 7395331Samw 7405331Samw return (ret); 7415331Samw } 7425331Samw 7435331Samw /* 7445331Samw * smbadm_group_getprop 7455331Samw * 7465331Samw * Get the group properties. 7475331Samw */ 7485331Samw static int 7495331Samw smbadm_group_getprop(int argc, char **argv) 7505331Samw { 7515331Samw char *gname = NULL; 7525331Samw smbadm_prop_t props[SMBADM_NPROP]; 7535331Samw smbadm_prop_handle_t *phandle; 7545331Samw char option; 7555331Samw int pcnt = 0; 7565331Samw int ret; 7575331Samw int p; 7585331Samw 7595331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 7605331Samw 7615331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 7625331Samw switch (option) { 7635331Samw case 'p': 7645331Samw if (pcnt >= SMBADM_NPROP) { 7655331Samw (void) fprintf(stderr, 7665331Samw gettext("exceeded number of supported" 7675331Samw " properties\n")); 7685331Samw smbadm_usage(B_FALSE); 7695331Samw } 7705331Samw 771*5772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 772*5772Sas200622 smbadm_usage(B_FALSE); 7735331Samw break; 7745331Samw 7755331Samw default: 7765331Samw smbadm_usage(B_FALSE); 7775331Samw } 7785331Samw } 7795331Samw 7805331Samw gname = argv[optind]; 7815331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 7825331Samw (void) fprintf(stderr, gettext("missing group name\n")); 7835331Samw smbadm_usage(B_FALSE); 7845331Samw } 7855331Samw 7865331Samw if (pcnt == 0) { 7875331Samw /* 7885331Samw * If no property has be specified then get 7895331Samw * all the properties. 7905331Samw */ 7915331Samw pcnt = SMBADM_NPROP; 7925331Samw for (p = 0; p < pcnt; p++) 7935331Samw props[p].p_name = smbadm_ptable[p].p_name; 7945331Samw } 7955331Samw 7965331Samw for (p = 0; p < pcnt; p++) { 7975331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 7985331Samw if (phandle) { 7995331Samw if (phandle->p_getfn(gname, &props[p]) != 0) 8005331Samw ret = 1; 8015331Samw } 8025331Samw } 8035331Samw 8045331Samw return (ret); 8055331Samw } 8065331Samw 8075331Samw /* 8085331Samw * smbadm_group_addmember 8095331Samw * 8105331Samw */ 8115331Samw static int 8125331Samw smbadm_group_addmember(int argc, char **argv) 8135331Samw { 8145331Samw char *gname = NULL; 8155331Samw char **mname; 8165331Samw char option; 817*5772Sas200622 smb_gsid_t msid; 818*5772Sas200622 int status; 8195331Samw int mcnt = 0; 8205331Samw int ret = 0; 8215331Samw int i; 8225331Samw 8235331Samw 8245331Samw mname = (char **)malloc(argc * sizeof (char *)); 8255331Samw if (mname == NULL) { 8265331Samw (void) fprintf(stderr, gettext("out of memory\n")); 8275331Samw return (1); 8285331Samw } 8295331Samw bzero(mname, argc * sizeof (char *)); 8305331Samw 8315331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 8325331Samw switch (option) { 8335331Samw case 'm': 8345331Samw mname[mcnt++] = optarg; 8355331Samw break; 8365331Samw 8375331Samw default: 8385331Samw free(mname); 8395331Samw smbadm_usage(B_FALSE); 8405331Samw } 8415331Samw } 8425331Samw 8435331Samw if (mcnt == 0) { 8445331Samw (void) fprintf(stderr, gettext("missing member name\n")); 8455331Samw free(mname); 8465331Samw smbadm_usage(B_FALSE); 8475331Samw } 8485331Samw 8495331Samw gname = argv[optind]; 8505331Samw if (optind >= argc || gname == NULL || *gname == 0) { 8515331Samw (void) fprintf(stderr, gettext("missing group name\n")); 8525331Samw free(mname); 8535331Samw smbadm_usage(B_FALSE); 8545331Samw } 8555331Samw 8565331Samw 8575331Samw for (i = 0; i < mcnt; i++) { 8585331Samw if (mname[i] == NULL) 8595331Samw continue; 8605331Samw 861*5772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 862*5772Sas200622 (void) fprintf(stderr, 863*5772Sas200622 gettext("failed to add %s " 864*5772Sas200622 "(could not obtain the SID)\n"), 865*5772Sas200622 mname[i]); 866*5772Sas200622 continue; 867*5772Sas200622 } 868*5772Sas200622 869*5772Sas200622 status = smb_lgrp_add_member(gname, msid.gs_sid, msid.gs_type); 870*5772Sas200622 free(msid.gs_sid); 871*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 8725331Samw (void) fprintf(stderr, 8735331Samw gettext("failed to add %s (%s)\n"), 874*5772Sas200622 mname[i], smb_lgrp_strerror(status)); 8755331Samw ret = 1; 876*5772Sas200622 } else { 877*5772Sas200622 (void) printf(gettext("'%s' is now a member of '%s'\n"), 878*5772Sas200622 mname[i], gname); 8795331Samw } 8805331Samw } 8815331Samw 8825331Samw free(mname); 8835331Samw return (ret); 8845331Samw } 8855331Samw 8865331Samw /* 8875331Samw * smbadm_group_delmember 8885331Samw */ 8895331Samw static int 8905331Samw smbadm_group_delmember(int argc, char **argv) 8915331Samw { 8925331Samw char *gname = NULL; 8935331Samw char **mname; 8945331Samw char option; 895*5772Sas200622 smb_gsid_t msid; 896*5772Sas200622 int status; 8975331Samw int mcnt = 0; 8985331Samw int ret = 0; 8995331Samw int i; 9005331Samw 9015331Samw mname = (char **)malloc(argc * sizeof (char *)); 9025331Samw if (mname == NULL) { 9035331Samw (void) fprintf(stderr, gettext("out of memory\n")); 9045331Samw return (1); 9055331Samw } 9065331Samw bzero(mname, argc * sizeof (char *)); 9075331Samw 9085331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 9095331Samw switch (option) { 9105331Samw case 'm': 9115331Samw mname[mcnt++] = optarg; 9125331Samw break; 9135331Samw 9145331Samw default: 9155331Samw free(mname); 9165331Samw smbadm_usage(B_FALSE); 9175331Samw } 9185331Samw } 9195331Samw 9205331Samw if (mcnt == 0) { 9215331Samw (void) fprintf(stderr, gettext("missing member name\n")); 9225331Samw free(mname); 9235331Samw smbadm_usage(B_FALSE); 9245331Samw } 9255331Samw 9265331Samw gname = argv[optind]; 9275331Samw if (optind >= argc || gname == NULL || *gname == 0) { 9285331Samw (void) fprintf(stderr, gettext("missing group name\n")); 9295331Samw free(mname); 9305331Samw smbadm_usage(B_FALSE); 9315331Samw } 9325331Samw 9335331Samw 9345331Samw for (i = 0; i < mcnt; i++) { 9355331Samw if (mname[i] == NULL) 9365331Samw continue; 9375331Samw 938*5772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 939*5772Sas200622 (void) fprintf(stderr, 940*5772Sas200622 gettext("failed to remove %s " 941*5772Sas200622 "(could not obtain the SID)\n"), 942*5772Sas200622 mname[i]); 943*5772Sas200622 continue; 944*5772Sas200622 } 945*5772Sas200622 946*5772Sas200622 status = smb_lgrp_del_member(gname, msid.gs_sid, msid.gs_type); 947*5772Sas200622 free(msid.gs_sid); 948*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 9495331Samw (void) fprintf(stderr, 9505331Samw gettext("failed to remove %s (%s)\n"), 951*5772Sas200622 mname[i], smb_lgrp_strerror(status)); 9525331Samw ret = 1; 9535331Samw } else { 9545331Samw (void) printf( 955*5772Sas200622 gettext("'%s' has been removed from %s\n"), 9565331Samw mname[i], gname); 9575331Samw } 9585331Samw } 9595331Samw 9605331Samw return (ret); 9615331Samw } 9625331Samw 9635331Samw static int 9645331Samw smbadm_user_disable(int argc, char **argv) 9655331Samw { 9665331Samw int error; 9675331Samw char *user = NULL; 9685331Samw 9695331Samw user = argv[optind]; 9705331Samw if (optind >= argc || user == NULL || *user == '\0') { 9715331Samw (void) fprintf(stderr, gettext("missing user name\n")); 9725331Samw smbadm_usage(B_FALSE); 9735331Samw } 9745331Samw 9755331Samw error = smb_pwd_setcntl(user, SMB_PWC_DISABLE); 9765331Samw if (error == SMB_PWE_SUCCESS) 9775331Samw (void) printf(gettext("%s is disabled.\n"), user); 9785331Samw else 9795331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 9805331Samw 9815331Samw return (error); 9825331Samw } 9835331Samw 9845331Samw static int 9855331Samw smbadm_user_enable(int argc, char **argv) 9865331Samw { 9875331Samw int error; 9885331Samw char *user = NULL; 9895331Samw 9905331Samw user = argv[optind]; 9915331Samw if (optind >= argc || user == NULL || *user == '\0') { 9925331Samw (void) fprintf(stderr, gettext("missing user name\n")); 9935331Samw smbadm_usage(B_FALSE); 9945331Samw } 9955331Samw 9965331Samw error = smb_pwd_setcntl(user, SMB_PWC_ENABLE); 9975331Samw if (error == SMB_PWE_SUCCESS) 9985331Samw (void) printf(gettext("%s is enabled.\n"), user); 9995331Samw else 10005331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 10015331Samw 10025331Samw return (error); 10035331Samw } 10045331Samw 10055331Samw 10065331Samw int 10075331Samw main(int argc, char **argv) 10085331Samw { 1009*5772Sas200622 int ret; 10105331Samw int i; 10115331Samw 10125331Samw (void) malloc(0); /* satisfy libumem dependency */ 10135331Samw 10145331Samw progname = basename(argv[0]); 10155331Samw 10165331Samw if (getzoneid() != GLOBAL_ZONEID) { 10175331Samw (void) fprintf(stderr, 10185331Samw gettext("cannot execute in non-global zone\n")); 10195331Samw return (0); 10205331Samw } 10215331Samw 10225331Samw if (is_system_labeled()) { 10235331Samw (void) fprintf(stderr, 10245331Samw gettext("Trusted Extensions not supported\n")); 10255331Samw return (0); 10265331Samw } 10275331Samw 10285331Samw if (argc < 2) { 10295331Samw (void) fprintf(stderr, gettext("missing command\n")); 10305331Samw smbadm_usage(B_FALSE); 10315331Samw } 10325331Samw 10335331Samw /* 10345331Samw * Special case "cmd --help/-?" 10355331Samw */ 10365331Samw if (strcmp(argv[1], "-?") == 0 || 10375331Samw strcmp(argv[1], "--help") == 0 || 10385331Samw strcmp(argv[1], "-h") == 0) 10395331Samw smbadm_usage(B_TRUE); 10405331Samw 10415331Samw for (i = 0; i < SMBADM_NCMD; ++i) { 10425331Samw curcmd = &smbadm_cmdtable[i]; 10435331Samw if (strcasecmp(argv[1], curcmd->name) == 0) { 10445331Samw if (argc > 2) { 10455331Samw /* cmd subcmd --help/-? */ 10465331Samw if (strcmp(argv[2], "-?") == 0 || 10475331Samw strcmp(argv[2], "--help") == 0 || 10485331Samw strcmp(argv[2], "-h") == 0) 10495331Samw smbadm_usage(B_TRUE); 10505331Samw } 10515331Samw 1052*5772Sas200622 if (smb_idmap_start() != 0) { 1053*5772Sas200622 (void) fprintf(stderr, 1054*5772Sas200622 gettext("failed to contact idmap service")); 1055*5772Sas200622 return (1); 1056*5772Sas200622 } 1057*5772Sas200622 1058*5772Sas200622 if ((ret = smb_lgrp_start()) != SMB_LGRP_SUCCESS) { 1059*5772Sas200622 (void) fprintf(stderr, 1060*5772Sas200622 gettext("failed to initialize (%s)"), 1061*5772Sas200622 smb_lgrp_strerror(ret)); 1062*5772Sas200622 smb_idmap_stop(); 1063*5772Sas200622 return (1); 1064*5772Sas200622 } 1065*5772Sas200622 1066*5772Sas200622 ret = curcmd->func(argc - 1, &argv[1]); 1067*5772Sas200622 smb_lgrp_stop(); 1068*5772Sas200622 smb_idmap_stop(); 1069*5772Sas200622 return (ret); 10705331Samw } 10715331Samw } 10725331Samw 10735331Samw curcmd = NULL; 10745331Samw (void) fprintf(stderr, gettext("unknown subcommand (%s)\n"), argv[1]); 10755331Samw smbadm_usage(B_FALSE); 10765331Samw return (2); 10775331Samw } 10785331Samw 10795331Samw static boolean_t 10805331Samw smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval) 10815331Samw { 10825331Samw smbadm_prop_handle_t *pinfo; 10835331Samw int i; 10845331Samw 10855331Samw for (i = 0; i < SMBADM_NPROP; i++) { 10865331Samw pinfo = &smbadm_ptable[i]; 10875331Samw if (strcmp(pinfo->p_name, prop->p_name) == 0) { 10885331Samw if (pinfo->p_chkfn && chkval) 10895331Samw return (pinfo->p_chkfn(prop)); 10905331Samw 10915331Samw return (B_TRUE); 10925331Samw } 10935331Samw } 10945331Samw 10955331Samw (void) fprintf(stderr, 10965331Samw gettext("unrecognized property '%s'\n"), prop->p_name); 10975331Samw 10985331Samw return (B_FALSE); 10995331Samw } 11005331Samw 11015331Samw static int 11025331Samw smbadm_prop_parse(char *arg, smbadm_prop_t *prop) 11035331Samw { 11045331Samw boolean_t parse_value; 11055331Samw char *equal; 11065331Samw 11075331Samw if (arg == NULL) 11085331Samw return (2); 11095331Samw 11105331Samw prop->p_name = prop->p_value = NULL; 11115331Samw 11125331Samw if (strcmp(curcmd->name, "set") == 0) 11135331Samw parse_value = B_TRUE; 11145331Samw else 11155331Samw parse_value = B_FALSE; 11165331Samw 11175331Samw prop->p_name = arg; 11185331Samw 11195331Samw if (parse_value) { 11205331Samw equal = strchr(arg, '='); 11215331Samw if (equal == NULL) 11225331Samw return (2); 11235331Samw 11245331Samw *equal++ = '\0'; 11255331Samw prop->p_value = equal; 11265331Samw } 11275331Samw 11285331Samw if (smbadm_prop_validate(prop, parse_value) == B_FALSE) 11295331Samw return (2); 11305331Samw 11315331Samw return (0); 11325331Samw } 11335331Samw 11345331Samw static smbadm_prop_handle_t * 11355331Samw smbadm_prop_gethandle(char *pname) 11365331Samw { 11375331Samw int i; 11385331Samw 11395331Samw for (i = 0; i < SMBADM_NPROP; i++) 11405331Samw if (strcmp(pname, smbadm_ptable[i].p_name) == 0) 11415331Samw return (&smbadm_ptable[i]); 11425331Samw 11435331Samw return (NULL); 11445331Samw } 11455331Samw 11465331Samw static int 11475331Samw smbadm_setprop_desc(char *gname, smbadm_prop_t *prop) 11485331Samw { 1149*5772Sas200622 int status; 11505331Samw 1151*5772Sas200622 status = smb_lgrp_setcmnt(gname, prop->p_value); 1152*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 11535331Samw (void) fprintf(stderr, 11545331Samw gettext("failed to modify the group description (%s)\n"), 1155*5772Sas200622 smb_lgrp_strerror(status)); 11565331Samw return (1); 11575331Samw } 11585331Samw 11595331Samw (void) printf(gettext("Successfully modified " 11605331Samw "'%s' description\n"), gname); 11615331Samw 11625331Samw return (0); 11635331Samw } 11645331Samw 11655331Samw static int 11665331Samw smbadm_getprop_desc(char *gname, smbadm_prop_t *prop) 11675331Samw { 1168*5772Sas200622 char *cmnt = NULL; 1169*5772Sas200622 int status; 11705331Samw 1171*5772Sas200622 status = smb_lgrp_getcmnt(gname, &cmnt); 1172*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 11735331Samw (void) fprintf(stderr, 1174*5772Sas200622 gettext("failed to get the group description (%s)\n"), 1175*5772Sas200622 smb_lgrp_strerror(status)); 11765331Samw return (1); 11775331Samw } 11785331Samw 1179*5772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, cmnt); 1180*5772Sas200622 free(cmnt); 11815331Samw return (0); 11825331Samw } 11835331Samw 11845331Samw static int 1185*5772Sas200622 smbadm_group_setpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 11865331Samw { 1187*5772Sas200622 boolean_t enable; 1188*5772Sas200622 int status; 11895331Samw int ret; 11905331Samw 11915331Samw if (strcasecmp(prop->p_value, "on") == 0) { 11925331Samw (void) printf(gettext("Enabling %s privilege "), prop->p_name); 1193*5772Sas200622 enable = B_TRUE; 11945331Samw } else { 11955331Samw (void) printf(gettext("Disabling %s privilege "), prop->p_name); 1196*5772Sas200622 enable = B_FALSE; 11975331Samw } 11985331Samw 1199*5772Sas200622 status = smb_lgrp_setpriv(gname, priv_id, enable); 1200*5772Sas200622 if (status == SMB_LGRP_SUCCESS) { 12015331Samw (void) printf(gettext("succeeded\n")); 12025331Samw ret = 0; 12035331Samw } else { 1204*5772Sas200622 (void) printf(gettext("failed: %s\n"), 1205*5772Sas200622 smb_lgrp_strerror(status)); 12065331Samw ret = 1; 12075331Samw } 12085331Samw 12095331Samw return (ret); 12105331Samw } 12115331Samw 12125331Samw static int 1213*5772Sas200622 smbadm_group_getpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 12145331Samw { 1215*5772Sas200622 boolean_t enable; 1216*5772Sas200622 int status; 12175331Samw 1218*5772Sas200622 status = smb_lgrp_getpriv(gname, priv_id, &enable); 1219*5772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12205331Samw (void) fprintf(stderr, gettext("failed to get %s (%s)\n"), 1221*5772Sas200622 prop->p_name, smb_lgrp_strerror(status)); 12225331Samw return (1); 12235331Samw } 12245331Samw 1225*5772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, 1226*5772Sas200622 (enable) ? "On" : "Off"); 12275331Samw 12285331Samw return (0); 12295331Samw } 12305331Samw 12315331Samw static int 12325331Samw smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop) 12335331Samw { 12345331Samw return (smbadm_group_setpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 12355331Samw } 12365331Samw 12375331Samw static int 12385331Samw smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop) 12395331Samw { 12405331Samw return (smbadm_group_getpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 12415331Samw } 12425331Samw 12435331Samw static int 12445331Samw smbadm_setprop_backup(char *gname, smbadm_prop_t *prop) 12455331Samw { 12465331Samw return (smbadm_group_setpriv(gname, SE_BACKUP_LUID, prop)); 12475331Samw } 12485331Samw 12495331Samw static int 12505331Samw smbadm_getprop_backup(char *gname, smbadm_prop_t *prop) 12515331Samw { 12525331Samw return (smbadm_group_getpriv(gname, SE_BACKUP_LUID, prop)); 12535331Samw } 12545331Samw 12555331Samw static int 12565331Samw smbadm_setprop_restore(char *gname, smbadm_prop_t *prop) 12575331Samw { 12585331Samw return (smbadm_group_setpriv(gname, SE_RESTORE_LUID, prop)); 12595331Samw } 12605331Samw 12615331Samw static int 12625331Samw smbadm_getprop_restore(char *gname, smbadm_prop_t *prop) 12635331Samw { 12645331Samw return (smbadm_group_getpriv(gname, SE_RESTORE_LUID, prop)); 12655331Samw } 12665331Samw 12675331Samw static boolean_t 12685331Samw smbadm_chkprop_priv(smbadm_prop_t *prop) 12695331Samw { 12705331Samw if (prop->p_value == NULL || *prop->p_value == '\0') { 12715331Samw (void) fprintf(stderr, 12725331Samw gettext("missing value for '%s'\n"), prop->p_name); 12735331Samw return (B_FALSE); 12745331Samw } 12755331Samw 12765331Samw if (strcasecmp(prop->p_value, "on") == 0) 12775331Samw return (B_TRUE); 12785331Samw 12795331Samw if (strcasecmp(prop->p_value, "off") == 0) 12805331Samw return (B_TRUE); 12815331Samw 12825331Samw (void) fprintf(stderr, 12835331Samw gettext("%s: unrecognized value for '%s' property\n"), 12845331Samw prop->p_value, prop->p_name); 12855331Samw 12865331Samw return (B_FALSE); 12875331Samw } 12885331Samw 12895331Samw static const char * 12905331Samw smbadm_pwd_strerror(int error) 12915331Samw { 12925331Samw switch (error) { 12935331Samw case SMB_PWE_SUCCESS: 12945331Samw return (gettext("Success.")); 12955331Samw 12965331Samw case SMB_PWE_USER_UNKNOWN: 12975331Samw return (gettext("User does not exist.")); 12985331Samw 12995331Samw case SMB_PWE_USER_DISABLE: 13005331Samw return (gettext("User is disable.")); 13015331Samw 13025331Samw case SMB_PWE_CLOSE_FAILED: 13035331Samw case SMB_PWE_OPEN_FAILED: 13045331Samw case SMB_PWE_WRITE_FAILED: 13055331Samw case SMB_PWE_UPDATE_FAILED: 13065331Samw return (gettext("Unexpected failure. " 13075331Samw "SMB password database unchanged.")); 13085331Samw 13095331Samw case SMB_PWE_STAT_FAILED: 13105331Samw return (gettext("stat of SMB password file failed.")); 13115331Samw 13125331Samw case SMB_PWE_BUSY: 13135331Samw return (gettext("SMB password database busy. " 13145331Samw "Try again later.")); 13155331Samw 13165331Samw case SMB_PWE_DENIED: 13175331Samw return (gettext("Operation not permitted.")); 13185331Samw 13195331Samw case SMB_PWE_SYSTEM_ERROR: 13205331Samw return (gettext("System error.")); 13215331Samw } 13225331Samw 13235331Samw return (gettext("Unknown error code.")); 13245331Samw } 13255331Samw 13265331Samw /* 13275331Samw * Enable libumem debugging by default on DEBUG builds. 13285331Samw */ 13295331Samw #ifdef DEBUG 13305331Samw const char * 13315331Samw _umem_debug_init(void) 13325331Samw { 13335331Samw return ("default,verbose"); /* $UMEM_DEBUG setting */ 13345331Samw } 13355331Samw 13365331Samw const char * 13375331Samw _umem_logging_init(void) 13385331Samw { 13395331Samw return ("fail,contents"); /* $UMEM_LOGGING setting */ 13405331Samw } 13415331Samw #endif 1342