16185db85Sdougm /* 26185db85Sdougm * CDDL HEADER START 36185db85Sdougm * 46185db85Sdougm * The contents of this file are subject to the terms of the 56185db85Sdougm * Common Development and Distribution License (the "License"). 66185db85Sdougm * You may not use this file except in compliance with the License. 76185db85Sdougm * 86185db85Sdougm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96185db85Sdougm * or http://www.opensolaris.org/os/licensing. 106185db85Sdougm * See the License for the specific language governing permissions 116185db85Sdougm * and limitations under the License. 126185db85Sdougm * 136185db85Sdougm * When distributing Covered Code, include this CDDL HEADER in each 146185db85Sdougm * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156185db85Sdougm * If applicable, add the following below this CDDL HEADER, with the 166185db85Sdougm * fields enclosed by brackets "[]" replaced with your own identifying 176185db85Sdougm * information: Portions Copyright [yyyy] [name of copyright owner] 186185db85Sdougm * 196185db85Sdougm * CDDL HEADER END 206185db85Sdougm */ 216185db85Sdougm 226185db85Sdougm /* 234bff34e3Sthurlow * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 246185db85Sdougm * Use is subject to license terms. 256185db85Sdougm */ 266185db85Sdougm 276185db85Sdougm #pragma ident "%Z%%M% %I% %E% SMI" 286185db85Sdougm 296185db85Sdougm #include <stdlib.h> 306185db85Sdougm #include <stdio.h> 316185db85Sdougm #include <string.h> 326185db85Sdougm #include <ctype.h> 336185db85Sdougm #include <unistd.h> 346185db85Sdougm #include <getopt.h> 356185db85Sdougm #include <libgen.h> 366185db85Sdougm 376185db85Sdougm #include "libshare.h" 386185db85Sdougm #include <sharemgr.h> 396185db85Sdougm 406185db85Sdougm #include <libintl.h> 416185db85Sdougm #include <locale.h> 426185db85Sdougm 43549ec3ffSdougm static int run_command(char *, int, char **, sa_handle_t); 446185db85Sdougm static void sub_command_help(char *proto); 456185db85Sdougm 466185db85Sdougm static void 476185db85Sdougm global_help() 486185db85Sdougm { 496185db85Sdougm (void) printf(gettext("usage: sharectl <command> [options]\n")); 506185db85Sdougm sub_command_help(NULL); 516185db85Sdougm } 526185db85Sdougm 536185db85Sdougm int 546185db85Sdougm main(int argc, char *argv[]) 556185db85Sdougm { 566185db85Sdougm int c; 576185db85Sdougm int help = 0; 586185db85Sdougm int rval; 596185db85Sdougm char *command; 60549ec3ffSdougm sa_handle_t handle; 616185db85Sdougm 626185db85Sdougm /* 636185db85Sdougm * make sure locale and gettext domain is setup 646185db85Sdougm */ 656185db85Sdougm (void) setlocale(LC_ALL, ""); 666185db85Sdougm (void) textdomain(TEXT_DOMAIN); 676185db85Sdougm 68549ec3ffSdougm handle = sa_init(SA_INIT_CONTROL_API); 696185db85Sdougm 706185db85Sdougm while ((c = getopt(argc, argv, "h?")) != EOF) { 716185db85Sdougm switch (c) { 726185db85Sdougm case '?': 736185db85Sdougm case 'h': 746185db85Sdougm help = 1; 756185db85Sdougm break; 766185db85Sdougm default: 776185db85Sdougm (void) printf(gettext("Invalid option: %c\n"), c); 786185db85Sdougm } 796185db85Sdougm } 806185db85Sdougm if (optind == argc || help) { 816185db85Sdougm /* no subcommand */ 826185db85Sdougm global_help(); 836185db85Sdougm exit(0); 846185db85Sdougm } 856185db85Sdougm optind = 1; 866185db85Sdougm 876185db85Sdougm /* 886185db85Sdougm * now have enough to parse rest of command line 896185db85Sdougm */ 906185db85Sdougm command = argv[optind]; 91549ec3ffSdougm rval = run_command(command, argc - optind, argv + optind, handle); 926185db85Sdougm 93549ec3ffSdougm sa_fini(handle); 946185db85Sdougm return (rval); 956185db85Sdougm } 966185db85Sdougm 976185db85Sdougm char * 986185db85Sdougm sc_get_usage(sc_usage_t index) 996185db85Sdougm { 1006185db85Sdougm char *ret = NULL; 1016185db85Sdougm 1026185db85Sdougm switch (index) { 1036185db85Sdougm case USAGE_CTL_GET: 1043472f5dcSdougm ret = gettext("get [-h | -p property ...] proto"); 1056185db85Sdougm break; 1066185db85Sdougm case USAGE_CTL_SET: 1076185db85Sdougm ret = gettext("set [-h] -p property=value ... proto"); 1086185db85Sdougm break; 1096185db85Sdougm case USAGE_CTL_STATUS: 1103472f5dcSdougm ret = gettext("status [-h | proto ...]"); 1116185db85Sdougm break; 1124bff34e3Sthurlow case USAGE_CTL_DELSECT: 1134bff34e3Sthurlow ret = gettext("delsect [-h] section proto"); 1144bff34e3Sthurlow break; 1156185db85Sdougm } 1166185db85Sdougm return (ret); 1176185db85Sdougm } 1186185db85Sdougm 119549ec3ffSdougm /*ARGSUSED*/ 1206185db85Sdougm static int 121549ec3ffSdougm sc_get(sa_handle_t handle, int flags, int argc, char *argv[]) 1226185db85Sdougm { 1236185db85Sdougm char *proto = NULL; 1246185db85Sdougm struct options *optlist = NULL; 1256185db85Sdougm int ret = SA_OK; 1266185db85Sdougm int c; 1274bff34e3Sthurlow sa_protocol_properties_t propset, propsect; 1284bff34e3Sthurlow sa_property_t prop; 1294bff34e3Sthurlow char *section, *value, *name; 1304bff34e3Sthurlow int first = 1; 1316185db85Sdougm 1326185db85Sdougm while ((c = getopt(argc, argv, "?hp:")) != EOF) { 1336185db85Sdougm switch (c) { 1346185db85Sdougm case 'p': 1356185db85Sdougm ret = add_opt(&optlist, optarg, 1); 1366185db85Sdougm if (ret != SA_OK) { 13725a68471Sdougm (void) printf(gettext( 13825a68471Sdougm "Problem with property: %s\n"), optarg); 1396185db85Sdougm return (SA_NO_MEMORY); 1406185db85Sdougm } 1416185db85Sdougm break; 1426185db85Sdougm default: 1436185db85Sdougm (void) printf(gettext("usage: %s\n"), 1446185db85Sdougm sc_get_usage(USAGE_CTL_GET)); 1456185db85Sdougm return (SA_SYNTAX_ERR); 1466185db85Sdougm case '?': 1476185db85Sdougm case 'h': 1486185db85Sdougm (void) printf(gettext("usage: %s\n"), 1496185db85Sdougm sc_get_usage(USAGE_CTL_GET)); 1506185db85Sdougm return (SA_OK); 1516185db85Sdougm break; 1526185db85Sdougm } 1536185db85Sdougm } 1546185db85Sdougm 1556185db85Sdougm if (optind >= argc) { 15625a68471Sdougm (void) printf(gettext("usage: %s\n"), 15725a68471Sdougm sc_get_usage(USAGE_CTL_GET)); 1586185db85Sdougm (void) printf(gettext("\tprotocol must be specified.\n")); 1596185db85Sdougm return (SA_INVALID_PROTOCOL); 1606185db85Sdougm } 1616185db85Sdougm 1626185db85Sdougm proto = argv[optind]; 1634bff34e3Sthurlow if (!sa_valid_protocol(proto)) { 1644bff34e3Sthurlow (void) printf(gettext("Invalid protocol specified: %s\n"), 1654bff34e3Sthurlow proto); 1664bff34e3Sthurlow return (SA_INVALID_PROTOCOL); 1674bff34e3Sthurlow } 1686185db85Sdougm propset = sa_proto_get_properties(proto); 1694bff34e3Sthurlow if (propset == NULL) 1704bff34e3Sthurlow return (ret); 1716185db85Sdougm 17225a68471Sdougm if (optlist == NULL) { 1734bff34e3Sthurlow /* Display all known properties for this protocol */ 1744bff34e3Sthurlow for (propsect = sa_get_protocol_section(propset, NULL); 1754bff34e3Sthurlow propsect != NULL; 1764bff34e3Sthurlow propsect = sa_get_next_protocol_section(propsect, NULL)) { 1774bff34e3Sthurlow section = sa_get_property_attr(propsect, 1784bff34e3Sthurlow "name"); 17925a68471Sdougm /* 1804bff34e3Sthurlow * If properties are organized into sections, as 1814bff34e3Sthurlow * in the SMB client, print the section name. 18225a68471Sdougm */ 1834bff34e3Sthurlow if (sa_proto_get_featureset(proto) & 1844bff34e3Sthurlow SA_FEATURE_HAS_SECTIONS) { 1854bff34e3Sthurlow if (!first) 1864bff34e3Sthurlow (void) printf("\n"); 1874bff34e3Sthurlow first = 0; 1884bff34e3Sthurlow (void) printf("[%s]\n", section); 1894bff34e3Sthurlow } 1904bff34e3Sthurlow /* Display properties for this section */ 1914bff34e3Sthurlow for (prop = sa_get_protocol_property(propsect, NULL); 19225a68471Sdougm prop != NULL; 1934bff34e3Sthurlow prop = sa_get_next_protocol_property(prop, NULL)) { 19425a68471Sdougm 1954bff34e3Sthurlow /* get and display the property and value */ 1964bff34e3Sthurlow name = sa_get_property_attr(prop, "type"); 1976185db85Sdougm if (name != NULL) { 1984bff34e3Sthurlow value = sa_get_property_attr(prop, 1994bff34e3Sthurlow "value"); 2004bff34e3Sthurlow (void) printf(gettext("%s=%s\n"), name, 2016185db85Sdougm value != NULL ? value : ""); 2026185db85Sdougm } 2036185db85Sdougm if (value != NULL) 2046185db85Sdougm sa_free_attr_string(value); 2056185db85Sdougm if (name != NULL) 2066185db85Sdougm sa_free_attr_string(name); 2076185db85Sdougm } 2084bff34e3Sthurlow } 2096185db85Sdougm } else { 2106185db85Sdougm struct options *opt; 2114bff34e3Sthurlow 2126185db85Sdougm /* list the specified option(s) */ 2134bff34e3Sthurlow for (opt = optlist; opt != NULL; opt = opt->next) { 2144bff34e3Sthurlow int printed = 0; 2154bff34e3Sthurlow 2164bff34e3Sthurlow for (propsect = sa_get_protocol_section(propset, NULL); 2174bff34e3Sthurlow propsect != NULL; 2184bff34e3Sthurlow propsect = sa_get_next_protocol_section(propsect, 2194bff34e3Sthurlow NULL)) { 2204bff34e3Sthurlow 2214bff34e3Sthurlow section = sa_get_property_attr(propsect, 2224bff34e3Sthurlow "name"); 2234bff34e3Sthurlow for (prop = sa_get_protocol_property(propsect, 2244bff34e3Sthurlow opt->optname); 2254bff34e3Sthurlow prop != NULL; 2264bff34e3Sthurlow prop = sa_get_next_protocol_property( 2274bff34e3Sthurlow propsect, opt->optname)) { 2284bff34e3Sthurlow value = sa_get_property_attr(prop, 2294bff34e3Sthurlow "value"); 2304bff34e3Sthurlow if (sa_proto_get_featureset(proto) & 2314bff34e3Sthurlow SA_FEATURE_HAS_SECTIONS) { 2324bff34e3Sthurlow (void) printf( 2334bff34e3Sthurlow gettext("[%s] %s=%s\n"), 2344bff34e3Sthurlow section, opt->optname, 2354bff34e3Sthurlow value != NULL ? value : ""); 2364bff34e3Sthurlow sa_free_attr_string(section); 2376185db85Sdougm } else { 2384bff34e3Sthurlow (void) printf( 2394bff34e3Sthurlow gettext("%s=%s\n"), 2404bff34e3Sthurlow opt->optname, 2414bff34e3Sthurlow value != NULL ? value : ""); 2424bff34e3Sthurlow } 2434bff34e3Sthurlow sa_free_attr_string(value); 2444bff34e3Sthurlow printed = 1; 2454bff34e3Sthurlow } 2464bff34e3Sthurlow } 2474bff34e3Sthurlow if (!printed) { 2484bff34e3Sthurlow (void) printf(gettext("%s: not defined\n"), 2496185db85Sdougm opt->optname); 2503472f5dcSdougm ret = SA_NO_SUCH_PROP; 2516185db85Sdougm } 2526185db85Sdougm } 2536185db85Sdougm } 2546185db85Sdougm return (ret); 2556185db85Sdougm } 2566185db85Sdougm 257549ec3ffSdougm /*ARGSUSED*/ 2586185db85Sdougm static int 259549ec3ffSdougm sc_set(sa_handle_t handle, int flags, int argc, char *argv[]) 2606185db85Sdougm { 2616185db85Sdougm char *proto = NULL; 2626185db85Sdougm struct options *optlist = NULL; 2634bff34e3Sthurlow sa_protocol_properties_t propsect; 2646185db85Sdougm int ret = SA_OK; 2656185db85Sdougm int c; 2664bff34e3Sthurlow int err; 26725a68471Sdougm sa_protocol_properties_t propset; 2684bff34e3Sthurlow sa_property_t prop; 2696185db85Sdougm 2706185db85Sdougm while ((c = getopt(argc, argv, "?hp:")) != EOF) { 2716185db85Sdougm switch (c) { 2726185db85Sdougm case 'p': 2736185db85Sdougm ret = add_opt(&optlist, optarg, 0); 2746185db85Sdougm if (ret != SA_OK) { 27525a68471Sdougm (void) printf(gettext( 27625a68471Sdougm "Problem with property: %s\n"), optarg); 2776185db85Sdougm return (SA_NO_MEMORY); 2786185db85Sdougm } 2796185db85Sdougm break; 2806185db85Sdougm default: 2816185db85Sdougm (void) printf(gettext("usage: %s\n"), 2826185db85Sdougm sc_get_usage(USAGE_CTL_SET)); 2836185db85Sdougm return (SA_SYNTAX_ERR); 2846185db85Sdougm case '?': 2856185db85Sdougm case 'h': 2866185db85Sdougm (void) printf(gettext("usage: %s\n"), 2876185db85Sdougm sc_get_usage(USAGE_CTL_SET)); 2886185db85Sdougm return (SA_OK); 2896185db85Sdougm break; 2906185db85Sdougm } 2916185db85Sdougm } 2926185db85Sdougm 2936185db85Sdougm if (optind >= argc) { 2946185db85Sdougm (void) printf(gettext("usage: %s\n"), 2956185db85Sdougm sc_get_usage(USAGE_CTL_SET)); 2966185db85Sdougm (void) printf(gettext("\tprotocol must be specified.\n")); 2976185db85Sdougm return (SA_INVALID_PROTOCOL); 2986185db85Sdougm } 2996185db85Sdougm 3006185db85Sdougm proto = argv[optind]; 30125a68471Sdougm if (!sa_valid_protocol(proto)) { 30225a68471Sdougm (void) printf(gettext("Invalid protocol specified: %s\n"), 30325a68471Sdougm proto); 30425a68471Sdougm return (SA_INVALID_PROTOCOL); 30525a68471Sdougm } 3066185db85Sdougm propset = sa_proto_get_properties(proto); 3074bff34e3Sthurlow if (propset == NULL) 3084bff34e3Sthurlow return (ret); 3094bff34e3Sthurlow 3106185db85Sdougm if (optlist == NULL) { 3116185db85Sdougm (void) printf(gettext("usage: %s\n"), 3126185db85Sdougm sc_get_usage(USAGE_CTL_SET)); 31325a68471Sdougm (void) printf(gettext( 31425a68471Sdougm "\tat least one property and value " 3156185db85Sdougm "must be specified\n")); 3166185db85Sdougm } else { 3176185db85Sdougm struct options *opt; 3184bff34e3Sthurlow char *section = NULL; 3194bff34e3Sthurlow /* fetch and change the specified option(s) */ 3204bff34e3Sthurlow for (opt = optlist; opt != NULL; opt = opt->next) { 3214bff34e3Sthurlow if (strncmp("section", opt->optname, 7) == 0) { 3224bff34e3Sthurlow if (section != NULL) 3234bff34e3Sthurlow free(section); 3244bff34e3Sthurlow section = strdup(opt->optvalue); 3254bff34e3Sthurlow continue; 3264bff34e3Sthurlow } 3274bff34e3Sthurlow if (sa_proto_get_featureset(proto) & 3284bff34e3Sthurlow SA_FEATURE_HAS_SECTIONS) { 3294bff34e3Sthurlow propsect = sa_get_protocol_section(propset, 3304bff34e3Sthurlow section); 3314bff34e3Sthurlow prop = sa_get_protocol_property(propsect, 3324bff34e3Sthurlow opt->optname); 3334bff34e3Sthurlow } else { 3344bff34e3Sthurlow prop = sa_get_protocol_property(propset, 3354bff34e3Sthurlow opt->optname); 3364bff34e3Sthurlow } 3374bff34e3Sthurlow if (prop == NULL && sa_proto_get_featureset(proto) & 3384bff34e3Sthurlow SA_FEATURE_ADD_PROPERTIES) { 3394bff34e3Sthurlow sa_property_t sect; 3404bff34e3Sthurlow sect = sa_create_section(section, NULL); 3414bff34e3Sthurlow sa_set_section_attr(sect, "type", proto); 3424bff34e3Sthurlow (void) sa_add_protocol_property(propset, sect); 3434bff34e3Sthurlow prop = sa_create_property( 3444bff34e3Sthurlow opt->optname, opt->optvalue); 3454bff34e3Sthurlow (void) sa_add_protocol_property(sect, prop); 3464bff34e3Sthurlow } 3476185db85Sdougm if (prop != NULL) { 3483472f5dcSdougm /* 3494bff34e3Sthurlow * "err" is used in order to prevent 3504bff34e3Sthurlow * setting ret to SA_OK if there has 3514bff34e3Sthurlow * been a real error. We want to be 3524bff34e3Sthurlow * able to return an error status on 3534bff34e3Sthurlow * exit in that case. Error messages 3544bff34e3Sthurlow * are printed for each error, so we 3554bff34e3Sthurlow * only care on exit that there was an 3564bff34e3Sthurlow * error and not the specific error 3574bff34e3Sthurlow * value. 3583472f5dcSdougm */ 3594bff34e3Sthurlow err = sa_set_protocol_property(prop, section, 3604bff34e3Sthurlow opt->optvalue); 3613472f5dcSdougm if (err != SA_OK) { 36225a68471Sdougm (void) printf(gettext( 36325a68471Sdougm "Could not set property" 3646185db85Sdougm " %s: %s\n"), 3654bff34e3Sthurlow opt->optname, sa_errorstr(err)); 3663472f5dcSdougm ret = err; 3676185db85Sdougm } 3686185db85Sdougm } else { 3694bff34e3Sthurlow (void) printf(gettext("%s: not defined\n"), 3706185db85Sdougm opt->optname); 3713472f5dcSdougm ret = SA_NO_SUCH_PROP; 3726185db85Sdougm } 3736185db85Sdougm } 3746185db85Sdougm } 3756185db85Sdougm return (ret); 3766185db85Sdougm } 3776185db85Sdougm 3786185db85Sdougm static void 3796185db85Sdougm show_status(char *proto) 3806185db85Sdougm { 3816185db85Sdougm char *status; 382*9e5da854Sdougm uint64_t features; 38325a68471Sdougm 3846185db85Sdougm status = sa_get_protocol_status(proto); 385*9e5da854Sdougm features = sa_proto_get_featureset(proto); 386*9e5da854Sdougm (void) printf("%s\t%s", proto, status ? gettext(status) : "-"); 3876185db85Sdougm if (status != NULL) 3886185db85Sdougm free(status); 389*9e5da854Sdougm /* 390*9e5da854Sdougm * Need to flag a client only protocol so test suites can 391*9e5da854Sdougm * remove it from consideration. 392*9e5da854Sdougm */ 393*9e5da854Sdougm if (!(features & SA_FEATURE_SERVER)) 394*9e5da854Sdougm (void) printf(" client"); 395*9e5da854Sdougm (void) printf("\n"); 3966185db85Sdougm } 3976185db85Sdougm 3986185db85Sdougm static int 3996185db85Sdougm valid_proto(char **protos, int num, char *proto) 4006185db85Sdougm { 4016185db85Sdougm int i; 4026185db85Sdougm for (i = 0; i < num; i++) 4036185db85Sdougm if (strcmp(protos[i], proto) == 0) 4046185db85Sdougm return (1); 4056185db85Sdougm return (0); 4066185db85Sdougm } 4076185db85Sdougm 408549ec3ffSdougm /*ARGSUSED*/ 4096185db85Sdougm static int 410549ec3ffSdougm sc_status(sa_handle_t handle, int flags, int argc, char *argv[]) 4116185db85Sdougm { 4126185db85Sdougm char **protos; 4136185db85Sdougm int ret = SA_OK; 4146185db85Sdougm int c; 4156185db85Sdougm int i; 4166185db85Sdougm int num_proto; 4176185db85Sdougm int verbose = 0; 4186185db85Sdougm 4196185db85Sdougm while ((c = getopt(argc, argv, "?hv")) != EOF) { 4206185db85Sdougm switch (c) { 4216185db85Sdougm case 'v': 4226185db85Sdougm verbose++; 4236185db85Sdougm break; 4246185db85Sdougm case '?': 4256185db85Sdougm case 'h': 4266185db85Sdougm (void) printf(gettext("usage: %s\n"), 4273472f5dcSdougm sc_get_usage(USAGE_CTL_STATUS)); 4286185db85Sdougm return (SA_OK); 4296185db85Sdougm default: 4306185db85Sdougm (void) printf(gettext("usage: %s\n"), 4313472f5dcSdougm sc_get_usage(USAGE_CTL_STATUS)); 4326185db85Sdougm return (SA_SYNTAX_ERR); 4336185db85Sdougm } 4346185db85Sdougm } 4356185db85Sdougm 4366185db85Sdougm num_proto = sa_get_protocols(&protos); 4376185db85Sdougm if (optind == argc) { 4386185db85Sdougm /* status for all protocols */ 4396185db85Sdougm for (i = 0; i < num_proto; i++) { 4406185db85Sdougm show_status(protos[i]); 4416185db85Sdougm } 4426185db85Sdougm } else { 4436185db85Sdougm for (i = optind; i < argc; i++) { 4446185db85Sdougm if (valid_proto(protos, num_proto, argv[i])) { 4456185db85Sdougm show_status(argv[i]); 4466185db85Sdougm } else { 44725a68471Sdougm (void) printf(gettext("Invalid protocol: %s\n"), 44825a68471Sdougm argv[i]); 4496185db85Sdougm ret = SA_INVALID_PROTOCOL; 4506185db85Sdougm } 4516185db85Sdougm } 4526185db85Sdougm } 4536185db85Sdougm if (protos != NULL) 4546185db85Sdougm free(protos); 4556185db85Sdougm return (ret); 4566185db85Sdougm } 4576185db85Sdougm 4584bff34e3Sthurlow /*ARGSUSED*/ 4594bff34e3Sthurlow static int 4604bff34e3Sthurlow sc_delsect(sa_handle_t handle, int flags, int argc, char *argv[]) 4614bff34e3Sthurlow { 4624bff34e3Sthurlow char *proto = NULL; 4634bff34e3Sthurlow char *section = NULL; 4644bff34e3Sthurlow sa_protocol_properties_t propset; 4654bff34e3Sthurlow sa_protocol_properties_t propsect; 4664bff34e3Sthurlow int ret = SA_OK; 4674bff34e3Sthurlow int c; 4684bff34e3Sthurlow 4694bff34e3Sthurlow while ((c = getopt(argc, argv, "?h")) != EOF) { 4704bff34e3Sthurlow switch (c) { 4714bff34e3Sthurlow default: 4724bff34e3Sthurlow ret = SA_SYNTAX_ERR; 4734bff34e3Sthurlow /*FALLTHROUGH*/ 4744bff34e3Sthurlow case '?': 4754bff34e3Sthurlow case 'h': 4764bff34e3Sthurlow (void) printf(gettext("usage: %s\n"), 4774bff34e3Sthurlow sc_get_usage(USAGE_CTL_DELSECT)); 4784bff34e3Sthurlow return (ret); 4794bff34e3Sthurlow } 4804bff34e3Sthurlow /*NOTREACHED*/ 4814bff34e3Sthurlow } 4824bff34e3Sthurlow 4834bff34e3Sthurlow section = argv[optind++]; 4844bff34e3Sthurlow 4854bff34e3Sthurlow if (optind >= argc) { 4864bff34e3Sthurlow (void) printf(gettext("usage: %s\n"), 4874bff34e3Sthurlow sc_get_usage(USAGE_CTL_DELSECT)); 4884bff34e3Sthurlow (void) printf(gettext( 4894bff34e3Sthurlow "\tsection and protocol must be specified.\n")); 4904bff34e3Sthurlow return (SA_INVALID_PROTOCOL); 4914bff34e3Sthurlow } 4924bff34e3Sthurlow 4934bff34e3Sthurlow proto = argv[optind]; 4944bff34e3Sthurlow if (!sa_valid_protocol(proto)) { 4954bff34e3Sthurlow (void) printf(gettext("Invalid protocol specified: %s\n"), 4964bff34e3Sthurlow proto); 4974bff34e3Sthurlow return (SA_INVALID_PROTOCOL); 4984bff34e3Sthurlow } 4994bff34e3Sthurlow 5004bff34e3Sthurlow if ((sa_proto_get_featureset(proto) & SA_FEATURE_HAS_SECTIONS) == 0) { 5014bff34e3Sthurlow (void) printf(gettext("Protocol %s does not have sections\n"), 5024bff34e3Sthurlow section, proto); 5034bff34e3Sthurlow return (SA_NOT_SUPPORTED); 5044bff34e3Sthurlow } 5054bff34e3Sthurlow 5064bff34e3Sthurlow propset = sa_proto_get_properties(proto); 5074bff34e3Sthurlow if (propset == NULL) { 5084bff34e3Sthurlow (void) printf(gettext("Cannot get properties for %s\n"), 5094bff34e3Sthurlow proto); 5104bff34e3Sthurlow return (SA_NO_PROPERTIES); 5114bff34e3Sthurlow } 5124bff34e3Sthurlow 5134bff34e3Sthurlow propsect = sa_get_protocol_section(propset, section); 5144bff34e3Sthurlow if (propsect == NULL) { 5154bff34e3Sthurlow (void) printf(gettext("Cannot find section %s for proto %s\n"), 5164bff34e3Sthurlow section, proto); 5174bff34e3Sthurlow return (SA_NO_SUCH_SECTION); 5184bff34e3Sthurlow } 5194bff34e3Sthurlow 5204bff34e3Sthurlow ret = sa_proto_delete_section(proto, section); 5214bff34e3Sthurlow 5224bff34e3Sthurlow return (ret); 5234bff34e3Sthurlow } 5244bff34e3Sthurlow 5256185db85Sdougm static sa_command_t commands[] = { 5266185db85Sdougm {"get", 0, sc_get, USAGE_CTL_GET}, 5276185db85Sdougm {"set", 0, sc_set, USAGE_CTL_SET}, 5286185db85Sdougm {"status", 0, sc_status, USAGE_CTL_STATUS}, 5294bff34e3Sthurlow {"delsect", 0, sc_delsect, USAGE_CTL_DELSECT}, 5306185db85Sdougm {NULL, 0, NULL, 0}, 5316185db85Sdougm }; 5326185db85Sdougm 533549ec3ffSdougm /*ARGSUSED*/ 5346185db85Sdougm void 5356185db85Sdougm sub_command_help(char *proto) 5366185db85Sdougm { 5376185db85Sdougm int i; 5386185db85Sdougm 5396185db85Sdougm (void) printf("\tsub-commands:\n"); 5406185db85Sdougm for (i = 0; commands[i].cmdname != NULL; i++) { 5416185db85Sdougm if (!(commands[i].flags & (CMD_ALIAS|CMD_NODISPLAY))) 5426185db85Sdougm (void) printf("\t%s\n", 5436185db85Sdougm sc_get_usage((sc_usage_t)commands[i].cmdidx)); 5446185db85Sdougm } 5456185db85Sdougm } 5466185db85Sdougm 5476185db85Sdougm sa_command_t * 5486185db85Sdougm sa_lookup(char *cmd) 5496185db85Sdougm { 5506185db85Sdougm int i; 5516185db85Sdougm size_t len; 5526185db85Sdougm 5536185db85Sdougm len = strlen(cmd); 5546185db85Sdougm for (i = 0; commands[i].cmdname != NULL; i++) { 5556185db85Sdougm if (strncmp(cmd, commands[i].cmdname, len) == 0) 5566185db85Sdougm return (&commands[i]); 5576185db85Sdougm } 5586185db85Sdougm return (NULL); 5596185db85Sdougm } 5606185db85Sdougm 5616185db85Sdougm static int 562549ec3ffSdougm run_command(char *command, int argc, char *argv[], sa_handle_t handle) 5636185db85Sdougm { 5646185db85Sdougm sa_command_t *cmdvec; 5656185db85Sdougm int ret; 5666185db85Sdougm 5676185db85Sdougm /* 5686185db85Sdougm * To get here, we know there should be a command due to the 5696185db85Sdougm * preprocessing done earlier. Need to find the protocol 5706185db85Sdougm * that is being affected. If no protocol, then it is ALL 5716185db85Sdougm * protocols. 5726185db85Sdougm * 5736185db85Sdougm * ??? do we really need the protocol at this level? it may be 5746185db85Sdougm * sufficient to let the commands look it up if needed since 5756185db85Sdougm * not all commands do proto specific things 5766185db85Sdougm * 5776185db85Sdougm * Known sub-commands are handled at this level. An unknown 5786185db85Sdougm * command will be passed down to the shared object that 5796185db85Sdougm * actually implements it. We can do this since the semantics 5806185db85Sdougm * of the common sub-commands is well defined. 5816185db85Sdougm */ 5826185db85Sdougm 5836185db85Sdougm cmdvec = sa_lookup(command); 5846185db85Sdougm if (cmdvec == NULL) { 5856185db85Sdougm (void) printf(gettext("command %s not found\n"), command); 5866185db85Sdougm exit(1); 5876185db85Sdougm } 5886185db85Sdougm /* 5896185db85Sdougm * need to check priviledges and restrict what can be done 5906185db85Sdougm * based on least priviledge and sub-command. 5916185db85Sdougm */ 592549ec3ffSdougm ret = cmdvec->cmdfunc(handle, NULL, argc, argv); 5936185db85Sdougm return (ret); 5946185db85Sdougm } 595