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 /* 225772Sas200622 * 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 606139Sjb150015 #define SMBADM_CMDF_GROUP 0x01 616139Sjb150015 625331Samw typedef struct smbadm_cmdinfo { 635331Samw char *name; 645331Samw int (*func)(int, char **); 655331Samw smbadm_help_t usage; 666139Sjb150015 uint32_t flags; 675331Samw } smbadm_cmdinfo_t; 685331Samw 695331Samw smbadm_cmdinfo_t *curcmd; 705331Samw static char *progname; 715331Samw 725331Samw static int smbadm_join(int, char **); 735331Samw static int smbadm_list(int, char **); 745331Samw static int smbadm_group_create(int, char **); 755331Samw static int smbadm_group_delete(int, char **); 765331Samw static int smbadm_group_rename(int, char **); 775331Samw static int smbadm_group_show(int, char **); 785331Samw static int smbadm_group_getprop(int, char **); 795331Samw static int smbadm_group_setprop(int, char **); 805331Samw static int smbadm_group_addmember(int, char **); 815331Samw static int smbadm_group_delmember(int, char **); 825331Samw static int smbadm_user_disable(int, char **); 835331Samw static int smbadm_user_enable(int, char **); 845331Samw 855331Samw static smbadm_cmdinfo_t smbadm_cmdtable[] = 865331Samw { 876139Sjb150015 { "add-member", smbadm_group_addmember, HELP_ADD_MEMBER, 886139Sjb150015 SMBADM_CMDF_GROUP }, 896139Sjb150015 { "create", smbadm_group_create, HELP_CREATE, 906139Sjb150015 SMBADM_CMDF_GROUP }, 916139Sjb150015 { "delete", smbadm_group_delete, HELP_DELETE, 926139Sjb150015 SMBADM_CMDF_GROUP }, 936139Sjb150015 { "disable-user", smbadm_user_disable, HELP_UDISABLE, 0 }, 946139Sjb150015 { "enable-user", smbadm_user_enable, HELP_UENABLE, 0 }, 956139Sjb150015 { "get", smbadm_group_getprop, HELP_GET, 966139Sjb150015 SMBADM_CMDF_GROUP }, 976139Sjb150015 { "join", smbadm_join, HELP_JOIN, 0 }, 986139Sjb150015 { "list", smbadm_list, HELP_LIST, 0 }, 996139Sjb150015 { "remove-member", smbadm_group_delmember, HELP_DEL_MEMBER, 1006139Sjb150015 SMBADM_CMDF_GROUP }, 1016139Sjb150015 { "rename", smbadm_group_rename, HELP_RENAME, 1026139Sjb150015 SMBADM_CMDF_GROUP }, 1036139Sjb150015 { "set", smbadm_group_setprop, HELP_SET, 1046139Sjb150015 SMBADM_CMDF_GROUP }, 1056139Sjb150015 { "show", smbadm_group_show, HELP_SHOW, 1066139Sjb150015 SMBADM_CMDF_GROUP }, 1075331Samw }; 1085331Samw 1095331Samw #define SMBADM_NCMD (sizeof (smbadm_cmdtable) / sizeof (smbadm_cmdtable[0])) 1105331Samw 1115331Samw typedef struct smbadm_prop { 1125331Samw char *p_name; 1135331Samw char *p_value; 1145331Samw } smbadm_prop_t; 1155331Samw 1165331Samw typedef struct smbadm_prop_handle { 1175331Samw char *p_name; 1185331Samw char *p_dispvalue; 1195331Samw int (*p_setfn)(char *, smbadm_prop_t *); 1205331Samw int (*p_getfn)(char *, smbadm_prop_t *); 1215331Samw boolean_t (*p_chkfn)(smbadm_prop_t *); 1225331Samw } smbadm_prop_handle_t; 1235331Samw 1245331Samw static boolean_t smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval); 1255331Samw static int smbadm_prop_parse(char *arg, smbadm_prop_t *prop); 1265331Samw static smbadm_prop_handle_t *smbadm_prop_gethandle(char *pname); 1275331Samw 1285331Samw static boolean_t smbadm_chkprop_priv(smbadm_prop_t *prop); 1295331Samw static int smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop); 1305331Samw static int smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop); 1315331Samw static int smbadm_setprop_backup(char *gname, smbadm_prop_t *prop); 1325331Samw static int smbadm_getprop_backup(char *gname, smbadm_prop_t *prop); 1335331Samw static int smbadm_setprop_restore(char *gname, smbadm_prop_t *prop); 1345331Samw static int smbadm_getprop_restore(char *gname, smbadm_prop_t *prop); 1355331Samw static int smbadm_setprop_desc(char *gname, smbadm_prop_t *prop); 1365331Samw static int smbadm_getprop_desc(char *gname, smbadm_prop_t *prop); 1375331Samw 1385331Samw static smbadm_prop_handle_t smbadm_ptable[] = { 1395331Samw {"backup", "on | off", smbadm_setprop_backup, 1405331Samw smbadm_getprop_backup, smbadm_chkprop_priv }, 1415331Samw {"restore", "on | off", smbadm_setprop_restore, 1425331Samw smbadm_getprop_restore, smbadm_chkprop_priv }, 1435331Samw {"take-ownership", "on | off", smbadm_setprop_tkowner, 1445331Samw smbadm_getprop_tkowner, smbadm_chkprop_priv }, 1455331Samw {"description", "<string>", smbadm_setprop_desc, 1465331Samw smbadm_getprop_desc, NULL }, 1475331Samw }; 1485331Samw 1496139Sjb150015 static int smbadm_grpcmd_init(void); 1506139Sjb150015 static void smbadm_grpcmd_fini(void); 1515331Samw static const char *smbadm_pwd_strerror(int error); 1525331Samw 1535331Samw /* 1545331Samw * Number of supported properties 1555331Samw */ 1565331Samw #define SMBADM_NPROP (sizeof (smbadm_ptable) / sizeof (smbadm_ptable[0])) 1575331Samw 1585331Samw static void 1595331Samw smbadm_cmdusage(FILE *fp, smbadm_cmdinfo_t *cmd) 1605331Samw { 1615331Samw switch (cmd->usage) { 1625331Samw case HELP_ADD_MEMBER: 1635331Samw (void) fprintf(fp, 1645331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 1655331Samw cmd->name); 1665331Samw return; 1675331Samw 1685331Samw case HELP_CREATE: 1695331Samw (void) fprintf(fp, gettext("\t%s [-d description] group\n"), 1705331Samw cmd->name); 1715331Samw return; 1725331Samw 1735331Samw case HELP_DELETE: 1745331Samw (void) fprintf(fp, gettext("\t%s group\n"), cmd->name); 1755331Samw return; 1765331Samw 1775331Samw case HELP_UDISABLE: 1785331Samw case HELP_UENABLE: 1795331Samw (void) fprintf(fp, gettext("\t%s user\n"), cmd->name); 1805331Samw return; 1815331Samw 1825331Samw case HELP_GET: 1835331Samw (void) fprintf(fp, gettext("\t%s [[-p property] ...] group\n"), 1845331Samw cmd->name); 1855331Samw return; 1865331Samw 1875331Samw case HELP_JOIN: 1885331Samw (void) fprintf(fp, gettext("\t%s -u username domain\n" 1895331Samw "\t%s -w workgroup\n"), cmd->name, cmd->name); 1905331Samw return; 1915331Samw 1925331Samw case HELP_LIST: 1935331Samw (void) fprintf(fp, gettext("\t%s\n"), cmd->name); 1945331Samw return; 1955331Samw 1965331Samw case HELP_DEL_MEMBER: 1975331Samw (void) fprintf(fp, 1985331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 1995331Samw cmd->name); 2005331Samw return; 2015331Samw 2025331Samw case HELP_RENAME: 2035331Samw (void) fprintf(fp, gettext("\t%s group new-group\n"), 2045331Samw cmd->name); 2055331Samw return; 2065331Samw 2075331Samw case HELP_SET: 2085331Samw (void) fprintf(fp, gettext("\t%s -p property=value " 2095331Samw "[[-p property=value] ...] group\n"), cmd->name); 2105331Samw return; 2115331Samw 2125331Samw case HELP_SHOW: 2135331Samw (void) fprintf(fp, gettext("\t%s [-m] [-p] [group]\n"), 2145331Samw cmd->name); 2155331Samw return; 2165331Samw 2175331Samw } 2185331Samw 2195331Samw abort(); 2205331Samw /* NOTREACHED */ 2215331Samw } 2225331Samw 2235331Samw static void 2245331Samw smbadm_usage(boolean_t requested) 2255331Samw { 2265331Samw FILE *fp = requested ? stdout : stderr; 2275331Samw boolean_t show_props = B_FALSE; 2285331Samw int i; 2295331Samw 2305331Samw if (curcmd == NULL) { 2315331Samw (void) fprintf(fp, 2325331Samw gettext("usage: %s [-h | <command> [options]]\n"), 2335331Samw progname); 2345331Samw (void) fprintf(fp, 2355331Samw gettext("where 'command' is one of the following:\n\n")); 2365331Samw 2375331Samw for (i = 0; i < SMBADM_NCMD; i++) 2385331Samw smbadm_cmdusage(fp, &smbadm_cmdtable[i]); 2395331Samw 2405331Samw (void) fprintf(fp, 2415331Samw gettext("\nFor property list, run %s %s|%s\n"), 2425331Samw progname, "get", "set"); 2435331Samw 2445331Samw exit(requested ? 0 : 2); 2455331Samw } 2465331Samw 2475331Samw (void) fprintf(fp, gettext("usage:\n")); 2485331Samw smbadm_cmdusage(fp, curcmd); 2495331Samw 2505331Samw if (strcmp(curcmd->name, "get") == 0 || 2515331Samw strcmp(curcmd->name, "set") == 0) 2525331Samw show_props = B_TRUE; 2535331Samw 2545331Samw if (show_props) { 2555331Samw (void) fprintf(fp, 2565331Samw gettext("\nThe following properties are supported:\n")); 2575331Samw 2585331Samw (void) fprintf(fp, "\n\t%-16s %s\n\n", 2595331Samw "PROPERTY", "VALUES"); 2605331Samw 2615331Samw for (i = 0; i < SMBADM_NPROP; i++) { 2625331Samw (void) fprintf(fp, "\t%-16s %s\n", 2635331Samw smbadm_ptable[i].p_name, 2645331Samw smbadm_ptable[i].p_dispvalue); 2655331Samw } 2665331Samw } 2675331Samw 2685331Samw exit(requested ? 0 : 2); 2695331Samw } 2705331Samw 2715331Samw /* 2725331Samw * smbadm_join 2735331Samw * 2745331Samw * Join the given domain/workgroup 2755331Samw */ 2765331Samw static int 2775331Samw smbadm_join(int argc, char **argv) 2785331Samw { 2795331Samw char option; 2805331Samw smb_joininfo_t jdi; 2815331Samw boolean_t join_w = B_FALSE; 2825331Samw boolean_t join_d = B_FALSE; 2835331Samw uint32_t status; 284*6600Sas200622 char curdom[MAXHOSTNAMELEN]; 2855331Samw 2865331Samw bzero(&jdi, sizeof (jdi)); 2875331Samw 2885331Samw while ((option = getopt(argc, argv, "u:w:")) != -1) { 2895331Samw switch (option) { 2905331Samw case 'w': 2915331Samw (void) strlcpy(jdi.domain_name, optarg, 2925331Samw sizeof (jdi.domain_name)); 2935331Samw jdi.mode = SMB_SECMODE_WORKGRP; 2945331Samw join_w = B_TRUE; 2955331Samw break; 2965331Samw 2975331Samw case 'u': 2985331Samw /* admin username */ 2995331Samw (void) strlcpy(jdi.domain_username, optarg, 3005331Samw sizeof (jdi.domain_username)); 3015331Samw jdi.mode = SMB_SECMODE_DOMAIN; 3025331Samw join_d = B_TRUE; 3035331Samw break; 3045331Samw 3055331Samw default: 3065331Samw smbadm_usage(B_FALSE); 3075331Samw } 3085331Samw } 3095331Samw 3105331Samw if (join_w && join_d) { 3115331Samw (void) fprintf(stderr, 3125331Samw gettext("domain and workgroup " 3135331Samw "can not be specified together\n")); 3145331Samw smbadm_usage(B_FALSE); 3155331Samw } 3165331Samw 3175331Samw if (join_d && (argv[optind] != NULL)) { 3185331Samw (void) strlcpy(jdi.domain_name, argv[optind], 3195331Samw sizeof (jdi.domain_name)); 3205331Samw } 3215331Samw 3225331Samw if (*jdi.domain_name == '\0') { 3235331Samw (void) fprintf(stderr, gettext("missing %s name\n"), 3245331Samw (join_d) ? "domain" : "workgroup"); 3255331Samw smbadm_usage(B_FALSE); 3265331Samw } 3275331Samw 3285331Samw if (join_d && *jdi.domain_username == '\0') { 3295331Samw (void) fprintf(stderr, gettext("missing username\n")); 3305331Samw smbadm_usage(B_FALSE); 3315331Samw } 3325331Samw 3335331Samw if (join_w) { 3345331Samw status = smb_join(&jdi); 3355331Samw if (status == NT_STATUS_SUCCESS) { 3365331Samw (void) printf( 3375331Samw gettext("Successfully joined workgroup '%s'\n"), 3385331Samw jdi.domain_name); 3395331Samw return (0); 3405331Samw } 3415331Samw 3425331Samw (void) fprintf(stderr, 3435331Samw gettext("failed to join workgroup '%s' (%s)\n"), 3445331Samw jdi.domain_name, xlate_nt_status(status)); 3455331Samw 3465331Samw return (1); 3475331Samw } 3485331Samw 349*6600Sas200622 if (smb_config_get_secmode() == SMB_SECMODE_DOMAIN) { 350*6600Sas200622 (void) smb_getdomainname(curdom, MAXHOSTNAMELEN); 351*6600Sas200622 if (*curdom != 0 && strncasecmp(curdom, jdi.domain_name, 352*6600Sas200622 strlen(curdom))) { 3536139Sjb150015 char reply[8]; 3546139Sjb150015 355*6600Sas200622 (void) printf(gettext("This system has already " 356*6600Sas200622 "joined to '%s' domain.\n" 357*6600Sas200622 "Would you like to join the new domain " 358*6600Sas200622 "[yes/no]? "), 359*6600Sas200622 curdom); 3606139Sjb150015 (void) scanf("%8s", reply); 3616139Sjb150015 (void) trim_whitespace(reply); 3626139Sjb150015 if (strncasecmp(reply, "yes", 3) != 0) 3636139Sjb150015 return (0); 3646139Sjb150015 } 3656139Sjb150015 } 3666139Sjb150015 3675331Samw /* Join the domain */ 3685331Samw if (*jdi.domain_passwd == '\0') { 3695331Samw char *p = NULL; 3705331Samw char *prompt = gettext("Enter domain password: "); 3715331Samw p = getpassphrase(prompt); 3725331Samw if (!p) { 3735331Samw (void) fprintf(stderr, gettext("missing password\n")); 3745331Samw smbadm_usage(B_FALSE); 3755331Samw } 3765331Samw 3775331Samw (void) strlcpy(jdi.domain_passwd, p, 3785331Samw sizeof (jdi.domain_passwd)); 3795331Samw } 3805331Samw 3815331Samw (void) printf(gettext("Joining '%s' ... this may take a minute ...\n"), 3825331Samw jdi.domain_name); 3835331Samw 3845331Samw status = smb_join(&jdi); 3855331Samw 3865331Samw switch (status) { 3875331Samw case NT_STATUS_SUCCESS: 3885331Samw (void) printf(gettext("Successfully joined domain '%s'\n"), 3895331Samw jdi.domain_name); 3906432Sas200622 3915331Samw return (0); 3925331Samw 3935331Samw case NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND: 3945331Samw (void) fprintf(stderr, gettext("failed to find " 3955331Samw "any domain controllers for '%s'\n"), 3965331Samw jdi.domain_name); 3975331Samw break; 3985331Samw 3995331Samw default: 4005331Samw (void) fprintf(stderr, 4015331Samw gettext("failed to join domain '%s' (%s)\n"), 4025331Samw jdi.domain_name, xlate_nt_status(status)); 4035331Samw } 4045331Samw 4055331Samw return (1); 4065331Samw } 4075331Samw 4085331Samw /* 4095331Samw * smbadm_list 4105331Samw * 4115331Samw * Displays current security mode and domain/workgroup name. 4125331Samw */ 4135331Samw /*ARGSUSED*/ 4145331Samw static int 4155331Samw smbadm_list(int argc, char **argv) 4165331Samw { 4176139Sjb150015 char domain[MAXHOSTNAMELEN]; 4186139Sjb150015 char modename[16]; 4196139Sjb150015 int rc; 4205331Samw 4216139Sjb150015 rc = smb_config_getstr(SMB_CI_SECURITY, modename, sizeof (modename)); 4226139Sjb150015 if (rc != SMBD_SMF_OK) { 4235331Samw (void) fprintf(stderr, 4245331Samw gettext("failed to get the security mode\n")); 4255331Samw return (1); 4265331Samw } 4275331Samw 4286139Sjb150015 (void) printf(gettext("security mode: %s\n"), modename); 4295331Samw 4306139Sjb150015 if (smb_getdomainname(domain, sizeof (domain)) != 0) { 4316139Sjb150015 (void) fprintf(stderr, gettext("failed to get the %s name\n"), 4326139Sjb150015 modename); 4335331Samw return (1); 4345331Samw } 4355331Samw 4366139Sjb150015 (void) printf(gettext("%s name: %s\n"), modename, domain); 4375331Samw return (0); 4385331Samw } 4395331Samw 4405331Samw /* 4415331Samw * smbadm_group_create 4425331Samw * 4435331Samw * Creates a local SMB group 4445331Samw */ 4455331Samw static int 4465331Samw smbadm_group_create(int argc, char **argv) 4475331Samw { 4485331Samw char *gname = NULL; 4495331Samw char *desc = NULL; 4505331Samw char option; 4515772Sas200622 int status; 4525331Samw 4535331Samw while ((option = getopt(argc, argv, "d:")) != -1) { 4545331Samw switch (option) { 4555331Samw case 'd': 4565331Samw desc = optarg; 4575331Samw break; 4585331Samw 4595331Samw default: 4605331Samw smbadm_usage(B_FALSE); 4615331Samw } 4625331Samw } 4635331Samw 4645331Samw gname = argv[optind]; 4655331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 4665331Samw (void) fprintf(stderr, gettext("missing group name\n")); 4675331Samw smbadm_usage(B_FALSE); 4685331Samw } 4695331Samw 4705331Samw if (getgrnam(gname) == NULL) { 4715331Samw (void) fprintf(stderr, 4725772Sas200622 gettext("failed to get the Solaris group '%s'\n"), gname); 4735331Samw (void) fprintf(stderr, 4745772Sas200622 gettext("use 'groupadd' to add '%s'\n"), gname); 4755331Samw return (1); 4765331Samw } 4775331Samw 4785772Sas200622 status = smb_lgrp_add(gname, desc); 4795772Sas200622 if (status != SMB_LGRP_SUCCESS) { 4805331Samw (void) fprintf(stderr, 4815331Samw gettext("failed to create the group (%s)\n"), 4825772Sas200622 smb_lgrp_strerror(status)); 4835331Samw } else { 4845772Sas200622 (void) printf(gettext("'%s' created.\n"), 4855331Samw gname); 4865331Samw } 4875331Samw 4885331Samw return (status); 4895331Samw } 4905331Samw 4915331Samw /* 4925331Samw * smbadm_group_dump_members 4935331Samw * 4945331Samw * Dump group members details. 4955331Samw */ 4965331Samw static void 4975772Sas200622 smbadm_group_dump_members(smb_gsid_t *members, int num) 4985331Samw { 4996432Sas200622 char sidstr[SMB_SID_STRSZ]; 5005331Samw int i; 5015331Samw 5025772Sas200622 if (num == 0) { 5035331Samw (void) printf(gettext("\tNo members\n")); 5045331Samw return; 5055331Samw } 5065331Samw 5075331Samw (void) printf(gettext("\tMembers:\n")); 5085772Sas200622 for (i = 0; i < num; i++) { 509*6600Sas200622 *sidstr = '\0'; 510*6600Sas200622 if (smb_lookup_sid(members[i].gs_sid, sidstr, 511*6600Sas200622 sizeof (sidstr)) == NT_STATUS_SUCCESS) 512*6600Sas200622 (void) printf(gettext("\t\t%s\n"), sidstr); 513*6600Sas200622 else 514*6600Sas200622 (void) printf(gettext("\t\tERROR! Invalid SID\n")); 5155331Samw } 5165331Samw } 5175331Samw 5185331Samw /* 5195331Samw * smbadm_group_dump_privs 5205331Samw * 5215331Samw * Dump group privilege details. 5225331Samw */ 5235331Samw static void 5245772Sas200622 smbadm_group_dump_privs(smb_privset_t *privs) 5255331Samw { 5265772Sas200622 smb_privinfo_t *pinfo; 5275772Sas200622 char *pstatus; 5285331Samw int i; 5295331Samw 5305331Samw (void) printf(gettext("\tPrivileges: \n")); 5315331Samw 5325772Sas200622 for (i = 0; i < privs->priv_cnt; i++) { 5335772Sas200622 pinfo = smb_priv_getbyvalue(privs->priv[i].luid.lo_part); 5345772Sas200622 if ((pinfo == NULL) || (pinfo->flags & PF_PRESENTABLE) == 0) 5355331Samw continue; 5365331Samw 5375772Sas200622 switch (privs->priv[i].attrs) { 5385772Sas200622 case SE_PRIVILEGE_ENABLED: 5395772Sas200622 pstatus = "On"; 5405772Sas200622 break; 5415772Sas200622 case SE_PRIVILEGE_DISABLED: 5425772Sas200622 pstatus = "Off"; 5435772Sas200622 break; 5445772Sas200622 default: 5455772Sas200622 pstatus = "Unknown"; 5465772Sas200622 break; 5475331Samw } 5485772Sas200622 (void) printf(gettext("\t\t%s: %s\n"), pinfo->name, pstatus); 5495331Samw } 5505331Samw 5515772Sas200622 if (privs->priv_cnt == 0) 5525331Samw (void) printf(gettext("\t\tNo privileges\n")); 5535331Samw } 5545331Samw 5555331Samw /* 5565331Samw * smbadm_group_dump 5575331Samw * 5585331Samw * Dump group details. 5595331Samw */ 5605772Sas200622 static void 5615772Sas200622 smbadm_group_dump(smb_group_t *grp, boolean_t show_mem, boolean_t show_privs) 5625331Samw { 5636432Sas200622 char sidstr[SMB_SID_STRSZ]; 5645331Samw 5655772Sas200622 (void) printf(gettext("%s (%s)\n"), grp->sg_name, grp->sg_cmnt); 5665331Samw 5676432Sas200622 smb_sid_tostr(grp->sg_id.gs_sid, sidstr); 5685772Sas200622 (void) printf(gettext("\tSID: %s\n"), sidstr); 5695331Samw 5705772Sas200622 if (show_privs) 5715772Sas200622 smbadm_group_dump_privs(grp->sg_privs); 5725331Samw 5735772Sas200622 if (show_mem) 5745772Sas200622 smbadm_group_dump_members(grp->sg_members, grp->sg_nmembers); 5755331Samw } 5765331Samw 5775331Samw /* 5785331Samw * smbadm_group_show 5795331Samw * 5805331Samw */ 5815331Samw static int 5825331Samw smbadm_group_show(int argc, char **argv) 5835331Samw { 5845331Samw char *gname = NULL; 5855331Samw boolean_t show_privs; 5865331Samw boolean_t show_members; 5875331Samw char option; 5885772Sas200622 int status; 5895772Sas200622 smb_group_t grp; 5905772Sas200622 smb_giter_t gi; 5915331Samw 5925331Samw show_privs = show_members = B_FALSE; 5935331Samw 5945331Samw while ((option = getopt(argc, argv, "mp")) != -1) { 5955331Samw switch (option) { 5965331Samw case 'm': 5975331Samw show_members = B_TRUE; 5985331Samw break; 5995331Samw case 'p': 6005331Samw show_privs = B_TRUE; 6015331Samw break; 6025331Samw 6035331Samw default: 6045331Samw smbadm_usage(B_FALSE); 6055331Samw } 6065331Samw } 6075331Samw 6085331Samw gname = argv[optind]; 6095331Samw if (optind >= argc || gname == NULL || *gname == '\0') 6105331Samw gname = "*"; 6115331Samw 6125772Sas200622 if (strcmp(gname, "*")) { 6135772Sas200622 status = smb_lgrp_getbyname(gname, &grp); 6145772Sas200622 if (status == SMB_LGRP_SUCCESS) { 6155772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 6165772Sas200622 smb_lgrp_free(&grp); 6175772Sas200622 } else { 6185772Sas200622 (void) fprintf(stderr, 6195772Sas200622 gettext("failed to find '%s' (%s)\n"), 6205772Sas200622 gname, smb_lgrp_strerror(status)); 6215772Sas200622 } 6225772Sas200622 return (status); 6235331Samw } 6245331Samw 6256432Sas200622 if ((status = smb_lgrp_iteropen(&gi)) != SMB_LGRP_SUCCESS) { 6265772Sas200622 (void) fprintf(stderr, 6275772Sas200622 gettext("failed to list groups (%s)\n"), 6285772Sas200622 smb_lgrp_strerror(status)); 6295772Sas200622 return (status); 6305331Samw } 6315331Samw 6326432Sas200622 while ((status = smb_lgrp_iterate(&gi, &grp)) == SMB_LGRP_SUCCESS) { 6335772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 6345772Sas200622 smb_lgrp_free(&grp); 6355772Sas200622 } 6366432Sas200622 6375772Sas200622 smb_lgrp_iterclose(&gi); 6385772Sas200622 6396432Sas200622 if (status != SMB_LGRP_NO_MORE) { 6406432Sas200622 (void) fprintf(stderr, 6416432Sas200622 gettext("failed to get all the groups (%s)\n"), 6426432Sas200622 smb_lgrp_strerror(status)); 6436432Sas200622 return (status); 6446432Sas200622 } 6456432Sas200622 6465772Sas200622 return (0); 6475331Samw } 6485331Samw 6495331Samw /* 6505331Samw * smbadm_group_delete 6515331Samw */ 6525331Samw static int 6535331Samw smbadm_group_delete(int argc, char **argv) 6545331Samw { 6555331Samw char *gname = NULL; 6565772Sas200622 int status; 6575331Samw 6585331Samw gname = argv[optind]; 6595331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 6605331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6615331Samw smbadm_usage(B_FALSE); 6625331Samw } 6635331Samw 6645772Sas200622 status = smb_lgrp_delete(gname); 6655772Sas200622 if (status != SMB_LGRP_SUCCESS) { 6665331Samw (void) fprintf(stderr, 6675331Samw gettext("failed to delete the group (%s)\n"), 6685772Sas200622 smb_lgrp_strerror(status)); 6695331Samw } else { 6705772Sas200622 (void) printf(gettext("'%s' deleted.\n"), 6715331Samw gname); 6725331Samw } 6735331Samw 6745331Samw return (status); 6755331Samw } 6765331Samw 6775331Samw /* 6785331Samw * smbadm_group_rename 6795331Samw */ 6805331Samw static int 6815331Samw smbadm_group_rename(int argc, char **argv) 6825331Samw { 6835331Samw char *gname = NULL; 6845331Samw char *ngname = NULL; 6855772Sas200622 int status; 6865331Samw 6875331Samw gname = argv[optind]; 6885331Samw if (optind++ >= argc || gname == NULL || *gname == '\0') { 6895331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6905331Samw smbadm_usage(B_FALSE); 6915331Samw } 6925331Samw 6935331Samw ngname = argv[optind]; 6945331Samw if (optind >= argc || ngname == NULL || *ngname == '\0') { 6955331Samw (void) fprintf(stderr, gettext("missing new group name\n")); 6965331Samw smbadm_usage(B_FALSE); 6975331Samw } 6985331Samw 6995772Sas200622 if (getgrnam(ngname) == NULL) { 7005331Samw (void) fprintf(stderr, 7015772Sas200622 gettext("failed to get the Solaris group '%s'\n"), ngname); 7025331Samw (void) fprintf(stderr, 7035772Sas200622 gettext("use 'groupadd' to add '%s'\n"), ngname); 7045331Samw return (1); 7055331Samw } 7065331Samw 7075772Sas200622 status = smb_lgrp_rename(gname, ngname); 7085772Sas200622 if (status != SMB_LGRP_SUCCESS) { 7095772Sas200622 if (status == SMB_LGRP_EXISTS) 7105772Sas200622 (void) fprintf(stderr, 7115772Sas200622 gettext("failed to rename '%s' (%s already " 7125772Sas200622 "exists)\n"), gname, ngname); 7135772Sas200622 else 7145772Sas200622 (void) fprintf(stderr, 7155772Sas200622 gettext("failed to rename '%s' (%s)\n"), gname, 7165772Sas200622 smb_lgrp_strerror(status)); 7175331Samw } else { 7185772Sas200622 (void) printf(gettext("'%s' renamed to '%s'\n"), gname, ngname); 7195331Samw } 7205331Samw 7215331Samw return (status); 7225331Samw } 7235331Samw 7245331Samw /* 7255331Samw * smbadm_group_setprop 7265331Samw * 7275331Samw * Set the group properties. 7285331Samw */ 7295331Samw static int 7305331Samw smbadm_group_setprop(int argc, char **argv) 7315331Samw { 7325331Samw char *gname = NULL; 7335331Samw smbadm_prop_t props[SMBADM_NPROP]; 7345331Samw smbadm_prop_handle_t *phandle; 7355331Samw char option; 7365331Samw int pcnt = 0; 7375331Samw int ret; 7385331Samw int p; 7395331Samw 7405331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 7415331Samw 7425331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 7435331Samw switch (option) { 7445331Samw case 'p': 7455331Samw if (pcnt >= SMBADM_NPROP) { 7465331Samw (void) fprintf(stderr, 7475331Samw gettext("exceeded number of supported" 7485331Samw " properties\n")); 7495331Samw smbadm_usage(B_FALSE); 7505331Samw } 7515331Samw 7525772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 7535772Sas200622 smbadm_usage(B_FALSE); 7545331Samw break; 7555331Samw 7565331Samw default: 7575331Samw smbadm_usage(B_FALSE); 7585331Samw } 7595331Samw } 7605331Samw 7615331Samw if (pcnt == 0) { 7625331Samw (void) fprintf(stderr, 7635331Samw gettext("missing property=value argument\n")); 7645331Samw smbadm_usage(B_FALSE); 7655331Samw } 7665331Samw 7675331Samw gname = argv[optind]; 7685331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 7695331Samw (void) fprintf(stderr, gettext("missing group name\n")); 7705331Samw smbadm_usage(B_FALSE); 7715331Samw } 7725331Samw 7735331Samw for (p = 0; p < pcnt; p++) { 7745331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 7755331Samw if (phandle) { 7765331Samw if (phandle->p_setfn(gname, &props[p]) != 0) 7775331Samw ret = 1; 7785331Samw } 7795331Samw } 7805331Samw 7815331Samw return (ret); 7825331Samw } 7835331Samw 7845331Samw /* 7855331Samw * smbadm_group_getprop 7865331Samw * 7875331Samw * Get the group properties. 7885331Samw */ 7895331Samw static int 7905331Samw smbadm_group_getprop(int argc, char **argv) 7915331Samw { 7925331Samw char *gname = NULL; 7935331Samw smbadm_prop_t props[SMBADM_NPROP]; 7945331Samw smbadm_prop_handle_t *phandle; 7955331Samw char option; 7965331Samw int pcnt = 0; 7975331Samw int ret; 7985331Samw int p; 7995331Samw 8005331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 8015331Samw 8025331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 8035331Samw switch (option) { 8045331Samw case 'p': 8055331Samw if (pcnt >= SMBADM_NPROP) { 8065331Samw (void) fprintf(stderr, 8075331Samw gettext("exceeded number of supported" 8085331Samw " properties\n")); 8095331Samw smbadm_usage(B_FALSE); 8105331Samw } 8115331Samw 8125772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 8135772Sas200622 smbadm_usage(B_FALSE); 8145331Samw break; 8155331Samw 8165331Samw default: 8175331Samw smbadm_usage(B_FALSE); 8185331Samw } 8195331Samw } 8205331Samw 8215331Samw gname = argv[optind]; 8225331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 8235331Samw (void) fprintf(stderr, gettext("missing group name\n")); 8245331Samw smbadm_usage(B_FALSE); 8255331Samw } 8265331Samw 8275331Samw if (pcnt == 0) { 8285331Samw /* 8295331Samw * If no property has be specified then get 8305331Samw * all the properties. 8315331Samw */ 8325331Samw pcnt = SMBADM_NPROP; 8335331Samw for (p = 0; p < pcnt; p++) 8345331Samw props[p].p_name = smbadm_ptable[p].p_name; 8355331Samw } 8365331Samw 8375331Samw for (p = 0; p < pcnt; p++) { 8385331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 8395331Samw if (phandle) { 8405331Samw if (phandle->p_getfn(gname, &props[p]) != 0) 8415331Samw ret = 1; 8425331Samw } 8435331Samw } 8445331Samw 8455331Samw return (ret); 8465331Samw } 8475331Samw 8485331Samw /* 8495331Samw * smbadm_group_addmember 8505331Samw * 8515331Samw */ 8525331Samw static int 8535331Samw smbadm_group_addmember(int argc, char **argv) 8545331Samw { 8555331Samw char *gname = NULL; 8565331Samw char **mname; 8575331Samw char option; 8585772Sas200622 smb_gsid_t msid; 8595772Sas200622 int status; 8605331Samw int mcnt = 0; 8615331Samw int ret = 0; 8625331Samw int i; 8635331Samw 8645331Samw 8655331Samw mname = (char **)malloc(argc * sizeof (char *)); 8665331Samw if (mname == NULL) { 8675331Samw (void) fprintf(stderr, gettext("out of memory\n")); 8685331Samw return (1); 8695331Samw } 8705331Samw bzero(mname, argc * sizeof (char *)); 8715331Samw 8725331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 8735331Samw switch (option) { 8745331Samw case 'm': 8755331Samw mname[mcnt++] = optarg; 8765331Samw break; 8775331Samw 8785331Samw default: 8795331Samw free(mname); 8805331Samw smbadm_usage(B_FALSE); 8815331Samw } 8825331Samw } 8835331Samw 8845331Samw if (mcnt == 0) { 8855331Samw (void) fprintf(stderr, gettext("missing member name\n")); 8865331Samw free(mname); 8875331Samw smbadm_usage(B_FALSE); 8885331Samw } 8895331Samw 8905331Samw gname = argv[optind]; 8915331Samw if (optind >= argc || gname == NULL || *gname == 0) { 8925331Samw (void) fprintf(stderr, gettext("missing group name\n")); 8935331Samw free(mname); 8945331Samw smbadm_usage(B_FALSE); 8955331Samw } 8965331Samw 8975331Samw 8985331Samw for (i = 0; i < mcnt; i++) { 8995331Samw if (mname[i] == NULL) 9005331Samw continue; 9015331Samw 9025772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 9035772Sas200622 (void) fprintf(stderr, 9045772Sas200622 gettext("failed to add %s " 9055772Sas200622 "(could not obtain the SID)\n"), 9065772Sas200622 mname[i]); 9075772Sas200622 continue; 9085772Sas200622 } 9095772Sas200622 9105772Sas200622 status = smb_lgrp_add_member(gname, msid.gs_sid, msid.gs_type); 9115772Sas200622 free(msid.gs_sid); 9125772Sas200622 if (status != SMB_LGRP_SUCCESS) { 9135331Samw (void) fprintf(stderr, 9145331Samw gettext("failed to add %s (%s)\n"), 9155772Sas200622 mname[i], smb_lgrp_strerror(status)); 9165331Samw ret = 1; 9175772Sas200622 } else { 9185772Sas200622 (void) printf(gettext("'%s' is now a member of '%s'\n"), 9195772Sas200622 mname[i], gname); 9205331Samw } 9215331Samw } 9225331Samw 9235331Samw free(mname); 9245331Samw return (ret); 9255331Samw } 9265331Samw 9275331Samw /* 9285331Samw * smbadm_group_delmember 9295331Samw */ 9305331Samw static int 9315331Samw smbadm_group_delmember(int argc, char **argv) 9325331Samw { 9335331Samw char *gname = NULL; 9345331Samw char **mname; 9355331Samw char option; 9365772Sas200622 smb_gsid_t msid; 9375772Sas200622 int status; 9385331Samw int mcnt = 0; 9395331Samw int ret = 0; 9405331Samw int i; 9415331Samw 9425331Samw mname = (char **)malloc(argc * sizeof (char *)); 9435331Samw if (mname == NULL) { 9445331Samw (void) fprintf(stderr, gettext("out of memory\n")); 9455331Samw return (1); 9465331Samw } 9475331Samw bzero(mname, argc * sizeof (char *)); 9485331Samw 9495331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 9505331Samw switch (option) { 9515331Samw case 'm': 9525331Samw mname[mcnt++] = optarg; 9535331Samw break; 9545331Samw 9555331Samw default: 9565331Samw free(mname); 9575331Samw smbadm_usage(B_FALSE); 9585331Samw } 9595331Samw } 9605331Samw 9615331Samw if (mcnt == 0) { 9625331Samw (void) fprintf(stderr, gettext("missing member name\n")); 9635331Samw free(mname); 9645331Samw smbadm_usage(B_FALSE); 9655331Samw } 9665331Samw 9675331Samw gname = argv[optind]; 9685331Samw if (optind >= argc || gname == NULL || *gname == 0) { 9695331Samw (void) fprintf(stderr, gettext("missing group name\n")); 9705331Samw free(mname); 9715331Samw smbadm_usage(B_FALSE); 9725331Samw } 9735331Samw 9745331Samw 9755331Samw for (i = 0; i < mcnt; i++) { 9765331Samw if (mname[i] == NULL) 9775331Samw continue; 9785331Samw 9795772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 9805772Sas200622 (void) fprintf(stderr, 9815772Sas200622 gettext("failed to remove %s " 9825772Sas200622 "(could not obtain the SID)\n"), 9835772Sas200622 mname[i]); 9845772Sas200622 continue; 9855772Sas200622 } 9865772Sas200622 9875772Sas200622 status = smb_lgrp_del_member(gname, msid.gs_sid, msid.gs_type); 9885772Sas200622 free(msid.gs_sid); 9895772Sas200622 if (status != SMB_LGRP_SUCCESS) { 9905331Samw (void) fprintf(stderr, 9915331Samw gettext("failed to remove %s (%s)\n"), 9925772Sas200622 mname[i], smb_lgrp_strerror(status)); 9935331Samw ret = 1; 9945331Samw } else { 9955331Samw (void) printf( 9965772Sas200622 gettext("'%s' has been removed from %s\n"), 9975331Samw mname[i], gname); 9985331Samw } 9995331Samw } 10005331Samw 10015331Samw return (ret); 10025331Samw } 10035331Samw 10045331Samw static int 10055331Samw smbadm_user_disable(int argc, char **argv) 10065331Samw { 10075331Samw int error; 10085331Samw char *user = NULL; 10095331Samw 10105331Samw user = argv[optind]; 10115331Samw if (optind >= argc || user == NULL || *user == '\0') { 10125331Samw (void) fprintf(stderr, gettext("missing user name\n")); 10135331Samw smbadm_usage(B_FALSE); 10145331Samw } 10155331Samw 10165331Samw error = smb_pwd_setcntl(user, SMB_PWC_DISABLE); 10175331Samw if (error == SMB_PWE_SUCCESS) 10185331Samw (void) printf(gettext("%s is disabled.\n"), user); 10195331Samw else 10205331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 10215331Samw 10225331Samw return (error); 10235331Samw } 10245331Samw 10255331Samw static int 10265331Samw smbadm_user_enable(int argc, char **argv) 10275331Samw { 10285331Samw int error; 10295331Samw char *user = NULL; 10305331Samw 10315331Samw user = argv[optind]; 10325331Samw if (optind >= argc || user == NULL || *user == '\0') { 10335331Samw (void) fprintf(stderr, gettext("missing user name\n")); 10345331Samw smbadm_usage(B_FALSE); 10355331Samw } 10365331Samw 10375331Samw error = smb_pwd_setcntl(user, SMB_PWC_ENABLE); 10385331Samw if (error == SMB_PWE_SUCCESS) 10395331Samw (void) printf(gettext("%s is enabled.\n"), user); 10405331Samw else 10415331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 10425331Samw 10435331Samw return (error); 10445331Samw } 10455331Samw 10465331Samw 10475331Samw int 10485331Samw main(int argc, char **argv) 10495331Samw { 10505772Sas200622 int ret; 10515331Samw int i; 10525331Samw 10535331Samw (void) malloc(0); /* satisfy libumem dependency */ 10545331Samw 10555331Samw progname = basename(argv[0]); 10565331Samw 10575331Samw if (getzoneid() != GLOBAL_ZONEID) { 10585331Samw (void) fprintf(stderr, 10595331Samw gettext("cannot execute in non-global zone\n")); 10605331Samw return (0); 10615331Samw } 10625331Samw 10635331Samw if (is_system_labeled()) { 10645331Samw (void) fprintf(stderr, 10655331Samw gettext("Trusted Extensions not supported\n")); 10665331Samw return (0); 10675331Samw } 10685331Samw 10695331Samw if (argc < 2) { 10705331Samw (void) fprintf(stderr, gettext("missing command\n")); 10715331Samw smbadm_usage(B_FALSE); 10725331Samw } 10735331Samw 10745331Samw /* 10755331Samw * Special case "cmd --help/-?" 10765331Samw */ 10775331Samw if (strcmp(argv[1], "-?") == 0 || 10785331Samw strcmp(argv[1], "--help") == 0 || 10795331Samw strcmp(argv[1], "-h") == 0) 10805331Samw smbadm_usage(B_TRUE); 10815331Samw 10825331Samw for (i = 0; i < SMBADM_NCMD; ++i) { 10835331Samw curcmd = &smbadm_cmdtable[i]; 10845331Samw if (strcasecmp(argv[1], curcmd->name) == 0) { 10855331Samw if (argc > 2) { 10865331Samw /* cmd subcmd --help/-? */ 10875331Samw if (strcmp(argv[2], "-?") == 0 || 10885331Samw strcmp(argv[2], "--help") == 0 || 10895331Samw strcmp(argv[2], "-h") == 0) 10905331Samw smbadm_usage(B_TRUE); 10915331Samw } 10925331Samw 10936139Sjb150015 if ((ret = smbadm_grpcmd_init()) != 0) 10946139Sjb150015 return (ret); 10955772Sas200622 10965772Sas200622 ret = curcmd->func(argc - 1, &argv[1]); 10976139Sjb150015 10986139Sjb150015 smbadm_grpcmd_fini(); 10995772Sas200622 return (ret); 11005331Samw } 11015331Samw } 11025331Samw 11035331Samw curcmd = NULL; 11045331Samw (void) fprintf(stderr, gettext("unknown subcommand (%s)\n"), argv[1]); 11055331Samw smbadm_usage(B_FALSE); 11065331Samw return (2); 11075331Samw } 11085331Samw 11096139Sjb150015 static int 11106139Sjb150015 smbadm_grpcmd_init(void) 11116139Sjb150015 { 11126139Sjb150015 int rc; 11136139Sjb150015 11146139Sjb150015 if (curcmd->flags & SMBADM_CMDF_GROUP) { 11156139Sjb150015 if (smb_idmap_start() != 0) { 11166139Sjb150015 (void) fprintf(stderr, 11176139Sjb150015 gettext("failed to contact idmap service\n")); 11186139Sjb150015 return (1); 11196139Sjb150015 } 11206139Sjb150015 11216139Sjb150015 if ((rc = smb_lgrp_start()) != SMB_LGRP_SUCCESS) { 11226139Sjb150015 (void) fprintf(stderr, 11236139Sjb150015 gettext("failed to initialize (%s)\n"), 11246139Sjb150015 smb_lgrp_strerror(rc)); 11256139Sjb150015 smb_idmap_stop(); 11266139Sjb150015 return (1); 11276139Sjb150015 } 11286139Sjb150015 } 11296139Sjb150015 11306139Sjb150015 return (0); 11316139Sjb150015 } 11326139Sjb150015 11336139Sjb150015 static void 11346139Sjb150015 smbadm_grpcmd_fini(void) 11356139Sjb150015 { 11366139Sjb150015 if (curcmd->flags & SMBADM_CMDF_GROUP) { 11376139Sjb150015 smb_lgrp_stop(); 11386139Sjb150015 smb_idmap_stop(); 11396139Sjb150015 } 11406139Sjb150015 } 11416139Sjb150015 11425331Samw static boolean_t 11435331Samw smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval) 11445331Samw { 11455331Samw smbadm_prop_handle_t *pinfo; 11465331Samw int i; 11475331Samw 11485331Samw for (i = 0; i < SMBADM_NPROP; i++) { 11495331Samw pinfo = &smbadm_ptable[i]; 11505331Samw if (strcmp(pinfo->p_name, prop->p_name) == 0) { 11515331Samw if (pinfo->p_chkfn && chkval) 11525331Samw return (pinfo->p_chkfn(prop)); 11535331Samw 11545331Samw return (B_TRUE); 11555331Samw } 11565331Samw } 11575331Samw 11585331Samw (void) fprintf(stderr, 11595331Samw gettext("unrecognized property '%s'\n"), prop->p_name); 11605331Samw 11615331Samw return (B_FALSE); 11625331Samw } 11635331Samw 11645331Samw static int 11655331Samw smbadm_prop_parse(char *arg, smbadm_prop_t *prop) 11665331Samw { 11675331Samw boolean_t parse_value; 11685331Samw char *equal; 11695331Samw 11705331Samw if (arg == NULL) 11715331Samw return (2); 11725331Samw 11735331Samw prop->p_name = prop->p_value = NULL; 11745331Samw 11755331Samw if (strcmp(curcmd->name, "set") == 0) 11765331Samw parse_value = B_TRUE; 11775331Samw else 11785331Samw parse_value = B_FALSE; 11795331Samw 11805331Samw prop->p_name = arg; 11815331Samw 11825331Samw if (parse_value) { 11835331Samw equal = strchr(arg, '='); 11845331Samw if (equal == NULL) 11855331Samw return (2); 11865331Samw 11875331Samw *equal++ = '\0'; 11885331Samw prop->p_value = equal; 11895331Samw } 11905331Samw 11915331Samw if (smbadm_prop_validate(prop, parse_value) == B_FALSE) 11925331Samw return (2); 11935331Samw 11945331Samw return (0); 11955331Samw } 11965331Samw 11975331Samw static smbadm_prop_handle_t * 11985331Samw smbadm_prop_gethandle(char *pname) 11995331Samw { 12005331Samw int i; 12015331Samw 12025331Samw for (i = 0; i < SMBADM_NPROP; i++) 12035331Samw if (strcmp(pname, smbadm_ptable[i].p_name) == 0) 12045331Samw return (&smbadm_ptable[i]); 12055331Samw 12065331Samw return (NULL); 12075331Samw } 12085331Samw 12095331Samw static int 12105331Samw smbadm_setprop_desc(char *gname, smbadm_prop_t *prop) 12115331Samw { 12125772Sas200622 int status; 12135331Samw 12145772Sas200622 status = smb_lgrp_setcmnt(gname, prop->p_value); 12155772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12165331Samw (void) fprintf(stderr, 12175331Samw gettext("failed to modify the group description (%s)\n"), 12185772Sas200622 smb_lgrp_strerror(status)); 12195331Samw return (1); 12205331Samw } 12215331Samw 12225331Samw (void) printf(gettext("Successfully modified " 12235331Samw "'%s' description\n"), gname); 12245331Samw 12255331Samw return (0); 12265331Samw } 12275331Samw 12285331Samw static int 12295331Samw smbadm_getprop_desc(char *gname, smbadm_prop_t *prop) 12305331Samw { 12315772Sas200622 char *cmnt = NULL; 12325772Sas200622 int status; 12335331Samw 12345772Sas200622 status = smb_lgrp_getcmnt(gname, &cmnt); 12355772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12365331Samw (void) fprintf(stderr, 12375772Sas200622 gettext("failed to get the group description (%s)\n"), 12385772Sas200622 smb_lgrp_strerror(status)); 12395331Samw return (1); 12405331Samw } 12415331Samw 12425772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, cmnt); 12435772Sas200622 free(cmnt); 12445331Samw return (0); 12455331Samw } 12465331Samw 12475331Samw static int 12485772Sas200622 smbadm_group_setpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 12495331Samw { 12505772Sas200622 boolean_t enable; 12515772Sas200622 int status; 12525331Samw int ret; 12535331Samw 12545331Samw if (strcasecmp(prop->p_value, "on") == 0) { 12555331Samw (void) printf(gettext("Enabling %s privilege "), prop->p_name); 12565772Sas200622 enable = B_TRUE; 12575331Samw } else { 12585331Samw (void) printf(gettext("Disabling %s privilege "), prop->p_name); 12595772Sas200622 enable = B_FALSE; 12605331Samw } 12615331Samw 12625772Sas200622 status = smb_lgrp_setpriv(gname, priv_id, enable); 12635772Sas200622 if (status == SMB_LGRP_SUCCESS) { 12645331Samw (void) printf(gettext("succeeded\n")); 12655331Samw ret = 0; 12665331Samw } else { 12675772Sas200622 (void) printf(gettext("failed: %s\n"), 12685772Sas200622 smb_lgrp_strerror(status)); 12695331Samw ret = 1; 12705331Samw } 12715331Samw 12725331Samw return (ret); 12735331Samw } 12745331Samw 12755331Samw static int 12765772Sas200622 smbadm_group_getpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 12775331Samw { 12785772Sas200622 boolean_t enable; 12795772Sas200622 int status; 12805331Samw 12815772Sas200622 status = smb_lgrp_getpriv(gname, priv_id, &enable); 12825772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12835331Samw (void) fprintf(stderr, gettext("failed to get %s (%s)\n"), 12845772Sas200622 prop->p_name, smb_lgrp_strerror(status)); 12855331Samw return (1); 12865331Samw } 12875331Samw 12885772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, 12895772Sas200622 (enable) ? "On" : "Off"); 12905331Samw 12915331Samw return (0); 12925331Samw } 12935331Samw 12945331Samw static int 12955331Samw smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop) 12965331Samw { 12975331Samw return (smbadm_group_setpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 12985331Samw } 12995331Samw 13005331Samw static int 13015331Samw smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop) 13025331Samw { 13035331Samw return (smbadm_group_getpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 13045331Samw } 13055331Samw 13065331Samw static int 13075331Samw smbadm_setprop_backup(char *gname, smbadm_prop_t *prop) 13085331Samw { 13095331Samw return (smbadm_group_setpriv(gname, SE_BACKUP_LUID, prop)); 13105331Samw } 13115331Samw 13125331Samw static int 13135331Samw smbadm_getprop_backup(char *gname, smbadm_prop_t *prop) 13145331Samw { 13155331Samw return (smbadm_group_getpriv(gname, SE_BACKUP_LUID, prop)); 13165331Samw } 13175331Samw 13185331Samw static int 13195331Samw smbadm_setprop_restore(char *gname, smbadm_prop_t *prop) 13205331Samw { 13215331Samw return (smbadm_group_setpriv(gname, SE_RESTORE_LUID, prop)); 13225331Samw } 13235331Samw 13245331Samw static int 13255331Samw smbadm_getprop_restore(char *gname, smbadm_prop_t *prop) 13265331Samw { 13275331Samw return (smbadm_group_getpriv(gname, SE_RESTORE_LUID, prop)); 13285331Samw } 13295331Samw 13305331Samw static boolean_t 13315331Samw smbadm_chkprop_priv(smbadm_prop_t *prop) 13325331Samw { 13335331Samw if (prop->p_value == NULL || *prop->p_value == '\0') { 13345331Samw (void) fprintf(stderr, 13355331Samw gettext("missing value for '%s'\n"), prop->p_name); 13365331Samw return (B_FALSE); 13375331Samw } 13385331Samw 13395331Samw if (strcasecmp(prop->p_value, "on") == 0) 13405331Samw return (B_TRUE); 13415331Samw 13425331Samw if (strcasecmp(prop->p_value, "off") == 0) 13435331Samw return (B_TRUE); 13445331Samw 13455331Samw (void) fprintf(stderr, 13465331Samw gettext("%s: unrecognized value for '%s' property\n"), 13475331Samw prop->p_value, prop->p_name); 13485331Samw 13495331Samw return (B_FALSE); 13505331Samw } 13515331Samw 13525331Samw static const char * 13535331Samw smbadm_pwd_strerror(int error) 13545331Samw { 13555331Samw switch (error) { 13565331Samw case SMB_PWE_SUCCESS: 13575331Samw return (gettext("Success.")); 13585331Samw 13595331Samw case SMB_PWE_USER_UNKNOWN: 13605331Samw return (gettext("User does not exist.")); 13615331Samw 13625331Samw case SMB_PWE_USER_DISABLE: 13635331Samw return (gettext("User is disable.")); 13645331Samw 13655331Samw case SMB_PWE_CLOSE_FAILED: 13665331Samw case SMB_PWE_OPEN_FAILED: 13675331Samw case SMB_PWE_WRITE_FAILED: 13685331Samw case SMB_PWE_UPDATE_FAILED: 13695331Samw return (gettext("Unexpected failure. " 13705331Samw "SMB password database unchanged.")); 13715331Samw 13725331Samw case SMB_PWE_STAT_FAILED: 13735331Samw return (gettext("stat of SMB password file failed.")); 13745331Samw 13755331Samw case SMB_PWE_BUSY: 13765331Samw return (gettext("SMB password database busy. " 13775331Samw "Try again later.")); 13785331Samw 13795331Samw case SMB_PWE_DENIED: 13805331Samw return (gettext("Operation not permitted.")); 13815331Samw 13825331Samw case SMB_PWE_SYSTEM_ERROR: 13835331Samw return (gettext("System error.")); 13845331Samw } 13855331Samw 13865331Samw return (gettext("Unknown error code.")); 13875331Samw } 13885331Samw 13895331Samw /* 13905331Samw * Enable libumem debugging by default on DEBUG builds. 13915331Samw */ 13925331Samw #ifdef DEBUG 13935331Samw const char * 13945331Samw _umem_debug_init(void) 13955331Samw { 13965331Samw return ("default,verbose"); /* $UMEM_DEBUG setting */ 13975331Samw } 13985331Samw 13995331Samw const char * 14005331Samw _umem_logging_init(void) 14015331Samw { 14025331Samw return ("fail,contents"); /* $UMEM_LOGGING setting */ 14035331Samw } 14045331Samw #endif 1405