17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5cb5caa98Sdjl * Common Development and Distribution License (the "License"). 6cb5caa98Sdjl * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22dd1104fbSMichen Chang * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 24*33f5ff17SMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate /* 287c478bd9Sstevel@tonic-gate * ldapclient command. To make (initiailize) or uninitialize a machines as 297c478bd9Sstevel@tonic-gate * and LDAP client. This command MUST be run as root (or it will simply exit). 307c478bd9Sstevel@tonic-gate * 317c478bd9Sstevel@tonic-gate * -I Install. No file_backup/recover for installing only (no doc). 327c478bd9Sstevel@tonic-gate * 337c478bd9Sstevel@tonic-gate * init Initialze (create) an LDAP client from a profile stored 347c478bd9Sstevel@tonic-gate * in a directory-server. 357c478bd9Sstevel@tonic-gate * manual Initialze (create) an LDAP client by hand (-file option 367c478bd9Sstevel@tonic-gate * reads from file). 377c478bd9Sstevel@tonic-gate * mod Modify the LDAP client configuration on this machine by hand. 387c478bd9Sstevel@tonic-gate * list List the contents of the LDAP client cache files. 397c478bd9Sstevel@tonic-gate * uninit Uninitialize this machine. 407c478bd9Sstevel@tonic-gate * 417c478bd9Sstevel@tonic-gate * -v Verbose flag. 427c478bd9Sstevel@tonic-gate * -q Quiet flag (mutually exclusive with -v). 437c478bd9Sstevel@tonic-gate * 447c478bd9Sstevel@tonic-gate * -a attrName=attrVal 457c478bd9Sstevel@tonic-gate * <attrName> can be one of the following: 467c478bd9Sstevel@tonic-gate * 477c478bd9Sstevel@tonic-gate * attributeMap 487c478bd9Sstevel@tonic-gate * Attribute map. Can be multiple instances of this option. 497c478bd9Sstevel@tonic-gate * (no former option) 507c478bd9Sstevel@tonic-gate * authenticationMethod 517c478bd9Sstevel@tonic-gate * Authentication method (formerly -a) 527c478bd9Sstevel@tonic-gate * bindTimeLimit 537c478bd9Sstevel@tonic-gate * Bind time limit. (no former option) 547c478bd9Sstevel@tonic-gate * certificatePath 557c478bd9Sstevel@tonic-gate * Path to certificates used for secure bind (no former option) 567c478bd9Sstevel@tonic-gate * credentialLevel 577c478bd9Sstevel@tonic-gate * Client credential level (no former option) 587c478bd9Sstevel@tonic-gate * defaultServerList 597c478bd9Sstevel@tonic-gate * Default server (no former option) Refer to DUA Config 607c478bd9Sstevel@tonic-gate * Schema draft. 617c478bd9Sstevel@tonic-gate * defaultSearchBase 627c478bd9Sstevel@tonic-gate * Search Base DN. e.g. dc=eng,dc=sun,dc=com (formerly -b) 637c478bd9Sstevel@tonic-gate * defaultSearchScope 647c478bd9Sstevel@tonic-gate * Search scope. (formerly -s) 657c478bd9Sstevel@tonic-gate * domainName 667c478bd9Sstevel@tonic-gate * Hosts lookup domain (DNS) Ex. eng.sun.com (formerly -d) 677c478bd9Sstevel@tonic-gate * followReferrals 687c478bd9Sstevel@tonic-gate * Search dereference. followref or noref (default followref) 697c478bd9Sstevel@tonic-gate * (formerly -r) 707c478bd9Sstevel@tonic-gate * objectclassMap 717c478bd9Sstevel@tonic-gate * Objectclass map. Can be multiple instances of this option. 727c478bd9Sstevel@tonic-gate * (no former option) 737c478bd9Sstevel@tonic-gate * preferredServerList 747c478bd9Sstevel@tonic-gate * Server preference list. Comma ',' seperated list of IPaddr. 757c478bd9Sstevel@tonic-gate * (formerly -p) 767c478bd9Sstevel@tonic-gate * profileName 777c478bd9Sstevel@tonic-gate * Profile name to use for init (ldapclient) or 787c478bd9Sstevel@tonic-gate * generate (gen_profile). (formerly -P) 797c478bd9Sstevel@tonic-gate * profileTTL 807c478bd9Sstevel@tonic-gate * Client info TTL. If set to 0 this information will not be 817c478bd9Sstevel@tonic-gate * automatically updated by the ldap_cachemgr(1M). 827c478bd9Sstevel@tonic-gate * (formerly -e) 837c478bd9Sstevel@tonic-gate * proxyDN 847c478bd9Sstevel@tonic-gate * Binding DN. Ex. cn=client,ou=people,cd=eng,dc=sun,dc=com 857c478bd9Sstevel@tonic-gate * (formerly -D) 867c478bd9Sstevel@tonic-gate * proxyPassword 877c478bd9Sstevel@tonic-gate * Client password not needed for authentication "none". 887c478bd9Sstevel@tonic-gate * (formerly -w) 89dd1104fbSMichen Chang * adminDN 90dd1104fbSMichen Chang * Administrator DN for updating naming data. 91dd1104fbSMichen Chang * adminPassword 92dd1104fbSMichen Chang * Administrator password 93dd1104fbSMichen Chang * enableShadowUpdate 94dd1104fbSMichen Chang * Allow Administrator to change shadow data in LDAP 957c478bd9Sstevel@tonic-gate * searchTimeLimit 967c478bd9Sstevel@tonic-gate * Timeout value. (formerly -o) 977c478bd9Sstevel@tonic-gate * serviceSearchDescriptor 987c478bd9Sstevel@tonic-gate * Service search scope. (no former option) 997c478bd9Sstevel@tonic-gate * serviceAuthenticationMethod 1007c478bd9Sstevel@tonic-gate * Service authenticaion method (no former option) 1017c478bd9Sstevel@tonic-gate * serviceCredentialLevel 1027c478bd9Sstevel@tonic-gate * Service credential level (no former option) 1037c478bd9Sstevel@tonic-gate * 1047c478bd9Sstevel@tonic-gate */ 1057c478bd9Sstevel@tonic-gate 1067c478bd9Sstevel@tonic-gate #include <stdlib.h> 1077c478bd9Sstevel@tonic-gate #include <stdio.h> 1087c478bd9Sstevel@tonic-gate #include <unistd.h> 1097c478bd9Sstevel@tonic-gate #include <errno.h> 1107c478bd9Sstevel@tonic-gate #include <sys/types.h> 1117c478bd9Sstevel@tonic-gate #include <time.h> 1127c478bd9Sstevel@tonic-gate #include <sys/param.h> 1137c478bd9Sstevel@tonic-gate #include <sys/stat.h> 1147c478bd9Sstevel@tonic-gate #include <sys/systeminfo.h> 1157c478bd9Sstevel@tonic-gate #include <fcntl.h> 1167c478bd9Sstevel@tonic-gate #include <xti.h> 1177c478bd9Sstevel@tonic-gate #include <strings.h> 1187c478bd9Sstevel@tonic-gate #include <limits.h> 1197c478bd9Sstevel@tonic-gate #include <locale.h> 1207c478bd9Sstevel@tonic-gate #include <syslog.h> 1217c478bd9Sstevel@tonic-gate #include <libscf.h> 1227c478bd9Sstevel@tonic-gate #include <assert.h> 123e1dd0a2fSth160488 124e1dd0a2fSth160488 #include "standalone.h" 1257c478bd9Sstevel@tonic-gate 1267c478bd9Sstevel@tonic-gate #if !defined(TEXT_DOMAIN) 1277c478bd9Sstevel@tonic-gate #define TEXT_DOMAIN "SUNW_OST_OSCMD" 1287c478bd9Sstevel@tonic-gate #endif 1297c478bd9Sstevel@tonic-gate 1307c478bd9Sstevel@tonic-gate /* error codes */ 1317c478bd9Sstevel@tonic-gate /* The manpage doc only allows for SUCCESS(0), FAIL(1) and CRED(2) on exit */ 1327c478bd9Sstevel@tonic-gate #define CLIENT_SUCCESS 0 1337c478bd9Sstevel@tonic-gate #define CLIENT_ERR_PARSE -1 1347c478bd9Sstevel@tonic-gate #define CLIENT_ERR_FAIL 1 1357c478bd9Sstevel@tonic-gate #define CLIENT_ERR_CREDENTIAL 2 1367c478bd9Sstevel@tonic-gate #define CLIENT_ERR_MEMORY 3 1377c478bd9Sstevel@tonic-gate #define CLIENT_ERR_RESTORE 4 1387c478bd9Sstevel@tonic-gate #define CLIENT_ERR_RENAME 5 1397c478bd9Sstevel@tonic-gate #define CLIENT_ERR_RECOVER 6 1407c478bd9Sstevel@tonic-gate #define CLIENT_ERR_TIMEDOUT 7 1417c478bd9Sstevel@tonic-gate #define CLIENT_ERR_MAINTENANCE 8 1427c478bd9Sstevel@tonic-gate 1437c478bd9Sstevel@tonic-gate /* Reset flag for start_services() */ 1447c478bd9Sstevel@tonic-gate #define START_INIT 1 1457c478bd9Sstevel@tonic-gate #define START_RESET 2 1467c478bd9Sstevel@tonic-gate #define START_UNINIT 3 1477c478bd9Sstevel@tonic-gate 1487c478bd9Sstevel@tonic-gate /* Reset flag for stop_services() */ 1497c478bd9Sstevel@tonic-gate #define STATE_NOSAVE 0 1507c478bd9Sstevel@tonic-gate #define STATE_SAVE 1 1517c478bd9Sstevel@tonic-gate 1527c478bd9Sstevel@tonic-gate /* files to (possibiliy) restore */ 1537c478bd9Sstevel@tonic-gate #define LDAP_RESTORE_DIR "/var/ldap/restore" 1547c478bd9Sstevel@tonic-gate 1557c478bd9Sstevel@tonic-gate #define DOMAINNAME_DIR "/etc" 1567c478bd9Sstevel@tonic-gate #define DOMAINNAME_FILE "defaultdomain" 1577c478bd9Sstevel@tonic-gate #define DOMAINNAME DOMAINNAME_DIR "/" DOMAINNAME_FILE 1587c478bd9Sstevel@tonic-gate #define DOMAINNAME_BACK LDAP_RESTORE_DIR "/" DOMAINNAME_FILE 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate #define NSSWITCH_DIR "/etc" 1617c478bd9Sstevel@tonic-gate #define NSSWITCH_FILE "nsswitch.conf" 1627c478bd9Sstevel@tonic-gate #define NSSWITCH_CONF NSSWITCH_DIR "/" NSSWITCH_FILE 1637c478bd9Sstevel@tonic-gate #define NSSWITCH_BACK LDAP_RESTORE_DIR "/" NSSWITCH_FILE 1647c478bd9Sstevel@tonic-gate #define NSSWITCH_LDAP "/etc/nsswitch.ldap" 1657c478bd9Sstevel@tonic-gate 1667c478bd9Sstevel@tonic-gate #define YP_BIND_DIR "/var/yp/binding" 1677c478bd9Sstevel@tonic-gate 1687c478bd9Sstevel@tonic-gate /* Define the service FMRIs */ 1697c478bd9Sstevel@tonic-gate #define SENDMAIL_FMRI "network/smtp:sendmail" 1707c478bd9Sstevel@tonic-gate #define NSCD_FMRI "system/name-service-cache:default" 1717c478bd9Sstevel@tonic-gate #define AUTOFS_FMRI "system/filesystem/autofs:default" 1727c478bd9Sstevel@tonic-gate #define LDAP_FMRI "network/ldap/client:default" 1737c478bd9Sstevel@tonic-gate #define YP_FMRI "network/nis/client:default" 1747c478bd9Sstevel@tonic-gate #define NS_MILESTONE_FMRI "milestone/name-services:default" 1757c478bd9Sstevel@tonic-gate 1767c478bd9Sstevel@tonic-gate /* Define flags for checking if services were enabled */ 1777c478bd9Sstevel@tonic-gate #define SENDMAIL_ON 0x1 1787c478bd9Sstevel@tonic-gate #define NSCD_ON 0x10 1797c478bd9Sstevel@tonic-gate #define AUTOFS_ON 0x100 1807c478bd9Sstevel@tonic-gate 1817c478bd9Sstevel@tonic-gate #define CMD_DOMAIN_START "/usr/bin/domainname" 1827c478bd9Sstevel@tonic-gate 1837c478bd9Sstevel@tonic-gate /* Command to copy files */ 1847c478bd9Sstevel@tonic-gate #define CMD_CP "/bin/cp -f" 1857c478bd9Sstevel@tonic-gate #define CMD_MV "/bin/mv -f" 1867c478bd9Sstevel@tonic-gate #define CMD_RM "/bin/rm -f" 1877c478bd9Sstevel@tonic-gate 1887c478bd9Sstevel@tonic-gate #define TO_DEV_NULL " >/dev/null 2>&1" 1897c478bd9Sstevel@tonic-gate 1907c478bd9Sstevel@tonic-gate /* Files that need to be just removed */ 1917c478bd9Sstevel@tonic-gate #define LDAP_CACHE_LOG "/var/ldap/cachemgr.log" 1927c478bd9Sstevel@tonic-gate 1937c478bd9Sstevel@tonic-gate /* Output defines to supress if quiet mode set */ 1947c478bd9Sstevel@tonic-gate #define CLIENT_FPUTS if (!mode_quiet) (void) fputs 1957c478bd9Sstevel@tonic-gate #define CLIENT_FPRINTF if (!mode_quiet) (void) fprintf 1967c478bd9Sstevel@tonic-gate #define CLIENT_FPUTC if (!mode_quiet) (void) fputc 1977c478bd9Sstevel@tonic-gate 1987c478bd9Sstevel@tonic-gate #define restart_service(fmri, waitflag)\ 1997c478bd9Sstevel@tonic-gate do_service(fmri, waitflag, RESTART_SERVICE,\ 2007c478bd9Sstevel@tonic-gate SCF_STATE_STRING_ONLINE) 2017c478bd9Sstevel@tonic-gate #define start_service(fmri, waitflag) \ 2027c478bd9Sstevel@tonic-gate do_service(fmri, waitflag, START_SERVICE,\ 2037c478bd9Sstevel@tonic-gate SCF_STATE_STRING_ONLINE) 2047c478bd9Sstevel@tonic-gate #define disable_service(fmri, waitflag) \ 2057c478bd9Sstevel@tonic-gate do_service(fmri, waitflag, STOP_SERVICE,\ 2067c478bd9Sstevel@tonic-gate SCF_STATE_STRING_DISABLED) 2077c478bd9Sstevel@tonic-gate 2087c478bd9Sstevel@tonic-gate /* 2097c478bd9Sstevel@tonic-gate * There isn't a domainName defined as a param, so we set a value here 2107c478bd9Sstevel@tonic-gate * (1001) should be big enough 2117c478bd9Sstevel@tonic-gate */ 2127c478bd9Sstevel@tonic-gate #define LOCAL_DOMAIN_P 1001 2137c478bd9Sstevel@tonic-gate 2147c478bd9Sstevel@tonic-gate #define START_SERVICE 1 2157c478bd9Sstevel@tonic-gate #define STOP_SERVICE 2 2167c478bd9Sstevel@tonic-gate #define RESTART_SERVICE 3 2177c478bd9Sstevel@tonic-gate 2187c478bd9Sstevel@tonic-gate #define DEFAULT_TIMEOUT 60000000 2197c478bd9Sstevel@tonic-gate 2207c478bd9Sstevel@tonic-gate #define INIT_WAIT_USECS 50000 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate /* Used to turn off profile checking */ 2237c478bd9Sstevel@tonic-gate #define CACHETTL_OFF "0" 2247c478bd9Sstevel@tonic-gate 2257c478bd9Sstevel@tonic-gate /* Globals */ 2267c478bd9Sstevel@tonic-gate static char *cmd; 2277c478bd9Sstevel@tonic-gate 2287c478bd9Sstevel@tonic-gate static char *dname = NULL; 2297c478bd9Sstevel@tonic-gate static char dname_buf[BUFSIZ]; 2307c478bd9Sstevel@tonic-gate 2317c478bd9Sstevel@tonic-gate static boolean_t sysid_install = B_FALSE; 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate static int mode_verbose = 0; 2347c478bd9Sstevel@tonic-gate static int mode_quiet = 0; 2357c478bd9Sstevel@tonic-gate static int gen = 0; 2367c478bd9Sstevel@tonic-gate 2377c478bd9Sstevel@tonic-gate static int gStartLdap = 0; 2387c478bd9Sstevel@tonic-gate static int gStartYp = 0; 2397c478bd9Sstevel@tonic-gate 2407c478bd9Sstevel@tonic-gate static int enableFlag = 0; 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate /* multival_t is used to hold params that can have more than one value */ 2437c478bd9Sstevel@tonic-gate typedef struct { 2447c478bd9Sstevel@tonic-gate int count; 2457c478bd9Sstevel@tonic-gate char **optlist; 2467c478bd9Sstevel@tonic-gate } multival_t; 2477c478bd9Sstevel@tonic-gate 2487c478bd9Sstevel@tonic-gate static multival_t *multival_new(); 2497c478bd9Sstevel@tonic-gate static int multival_add(multival_t *list, char *opt); 2507c478bd9Sstevel@tonic-gate static void multival_free(multival_t *list); 2517c478bd9Sstevel@tonic-gate 2527c478bd9Sstevel@tonic-gate /* 2537c478bd9Sstevel@tonic-gate * clientopts_t is used to hold and pass around the param values from 2547c478bd9Sstevel@tonic-gate * the cmd line 2557c478bd9Sstevel@tonic-gate */ 2567c478bd9Sstevel@tonic-gate typedef struct { 2577c478bd9Sstevel@tonic-gate multival_t *attributeMap; 2587c478bd9Sstevel@tonic-gate char *authenticationMethod; 2597c478bd9Sstevel@tonic-gate char *bindTimeLimit; 2607c478bd9Sstevel@tonic-gate char *certificatePath; 2617c478bd9Sstevel@tonic-gate char *credentialLevel; 2627c478bd9Sstevel@tonic-gate char *defaultSearchBase; 2637c478bd9Sstevel@tonic-gate char *defaultServerList; 2647c478bd9Sstevel@tonic-gate char *domainName; 2657c478bd9Sstevel@tonic-gate char *followReferrals; 2667c478bd9Sstevel@tonic-gate multival_t *objectclassMap; 2677c478bd9Sstevel@tonic-gate char *preferredServerList; 2687c478bd9Sstevel@tonic-gate char *profileName; 2697c478bd9Sstevel@tonic-gate char *profileTTL; 2707c478bd9Sstevel@tonic-gate char *proxyDN; 2717c478bd9Sstevel@tonic-gate char *proxyPassword; 272dd1104fbSMichen Chang char *enableShadowUpdate; 273dd1104fbSMichen Chang char *adminDN; 274dd1104fbSMichen Chang char *adminPassword; 275e1dd0a2fSth160488 char *bindDN; 276e1dd0a2fSth160488 char *bindPasswd; 2777c478bd9Sstevel@tonic-gate char *defaultSearchScope; 2787c478bd9Sstevel@tonic-gate char *searchTimeLimit; 2797c478bd9Sstevel@tonic-gate multival_t *serviceAuthenticationMethod; 2807c478bd9Sstevel@tonic-gate multival_t *serviceCredentialLevel; 2817c478bd9Sstevel@tonic-gate multival_t *serviceSearchDescriptor; 2827c478bd9Sstevel@tonic-gate } clientopts_t; 2837c478bd9Sstevel@tonic-gate 2847c478bd9Sstevel@tonic-gate static clientopts_t *clientopts_new(); 2857c478bd9Sstevel@tonic-gate static void clientopts_free(clientopts_t *list); 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate extern ns_ldap_error_t *__ns_ldap_print_config(int); 2887c478bd9Sstevel@tonic-gate extern void __ns_ldap_default_config(); 289cb5caa98Sdjl extern int __ns_ldap_download(const char *, char *, char *, ns_ldap_error_t **); 2907c478bd9Sstevel@tonic-gate 2917c478bd9Sstevel@tonic-gate /* Function prototypes (these could be static) */ 2927c478bd9Sstevel@tonic-gate static void usage(void); 2937c478bd9Sstevel@tonic-gate 2947c478bd9Sstevel@tonic-gate static int credCheck(clientopts_t *arglist); 295dd1104fbSMichen Chang static int adminCredCheck(clientopts_t *arglist); 2967c478bd9Sstevel@tonic-gate static int clientSetParam(clientopts_t *optlist, int paramFlag, char *attrVal); 2977c478bd9Sstevel@tonic-gate static int parseParam(char *param, char **paramVal); 2987c478bd9Sstevel@tonic-gate static void dumpargs(clientopts_t *arglist); 2997c478bd9Sstevel@tonic-gate static int num_args(clientopts_t *arglist); 3007c478bd9Sstevel@tonic-gate 3017c478bd9Sstevel@tonic-gate static int file_backup(void); 3027c478bd9Sstevel@tonic-gate static int recover(int saveState); 3037c478bd9Sstevel@tonic-gate static int mod_backup(void); 3047c478bd9Sstevel@tonic-gate static int mod_recover(void); 3057c478bd9Sstevel@tonic-gate static void mod_cleanup(void); 3067c478bd9Sstevel@tonic-gate 3077c478bd9Sstevel@tonic-gate static int client_list(clientopts_t *arglist); 3087c478bd9Sstevel@tonic-gate static int client_manual(clientopts_t *arglist); 3097c478bd9Sstevel@tonic-gate static int client_mod(clientopts_t *arglist); 3107c478bd9Sstevel@tonic-gate static int client_uninit(clientopts_t *arglist); 3117c478bd9Sstevel@tonic-gate static int client_genProfile(clientopts_t *arglist); 3127c478bd9Sstevel@tonic-gate static int client_init(clientopts_t *arglist); 3137c478bd9Sstevel@tonic-gate static int file_move(const char *from, const char *to); 3147c478bd9Sstevel@tonic-gate 3157c478bd9Sstevel@tonic-gate static int start_services(int flag); 3167c478bd9Sstevel@tonic-gate static int stop_services(int saveState); 3177c478bd9Sstevel@tonic-gate static boolean_t is_service(const char *fmri, const char *state); 3187c478bd9Sstevel@tonic-gate static int wait_till(const char *fmri, const char *state, useconds_t max, 3197c478bd9Sstevel@tonic-gate const char *what, boolean_t check_maint); 3207c478bd9Sstevel@tonic-gate static int do_service(const char *fmri, boolean_t waitflag, int dowhat, 3217c478bd9Sstevel@tonic-gate const char *state); 3227c478bd9Sstevel@tonic-gate static useconds_t get_timeout_value(int dowhat, const char *fmri, 3237c478bd9Sstevel@tonic-gate useconds_t default_val); 3247c478bd9Sstevel@tonic-gate 325a506a34cSth160488 int 326a506a34cSth160488 main(int argc, char **argv) 3277c478bd9Sstevel@tonic-gate { 3287c478bd9Sstevel@tonic-gate char *ret_locale, *ret_textdomain; 3297c478bd9Sstevel@tonic-gate int retcode; 3307c478bd9Sstevel@tonic-gate int paramFlag; 3317c478bd9Sstevel@tonic-gate char *attrVal; 3327c478bd9Sstevel@tonic-gate int sysinfostatus; 3337c478bd9Sstevel@tonic-gate clientopts_t *optlist = NULL; 3347c478bd9Sstevel@tonic-gate int op_manual = 0, op_mod = 0, op_uninit = 0; 3357c478bd9Sstevel@tonic-gate int op_list = 0, op_init = 0, op_genprofile = 0; 3367c478bd9Sstevel@tonic-gate extern char *optarg; 3377c478bd9Sstevel@tonic-gate extern int optind; 3387c478bd9Sstevel@tonic-gate int option; 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate ret_locale = setlocale(LC_ALL, ""); 3417c478bd9Sstevel@tonic-gate if (ret_locale == NULL) { 3427c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Unable to set locale.\n"), stderr); 3437c478bd9Sstevel@tonic-gate } 3447c478bd9Sstevel@tonic-gate ret_textdomain = textdomain(TEXT_DOMAIN); 3457c478bd9Sstevel@tonic-gate if (ret_textdomain == NULL) { 3467c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Unable to set textdomain.\n"), stderr); 3477c478bd9Sstevel@tonic-gate } 3487c478bd9Sstevel@tonic-gate 3497c478bd9Sstevel@tonic-gate openlog("ldapclient", LOG_PID, LOG_USER); 3507c478bd9Sstevel@tonic-gate 3517c478bd9Sstevel@tonic-gate /* get name that invoked us */ 3527c478bd9Sstevel@tonic-gate if (cmd = strrchr(argv[0], '/')) 3537c478bd9Sstevel@tonic-gate ++cmd; 3547c478bd9Sstevel@tonic-gate else 3557c478bd9Sstevel@tonic-gate cmd = argv[0]; 3567c478bd9Sstevel@tonic-gate 3577c478bd9Sstevel@tonic-gate sysinfostatus = sysinfo(SI_SRPC_DOMAIN, dname_buf, BUFSIZ); 3587c478bd9Sstevel@tonic-gate if (0 < sysinfostatus) 3597c478bd9Sstevel@tonic-gate dname = &dname_buf[0]; 3607c478bd9Sstevel@tonic-gate 3617c478bd9Sstevel@tonic-gate optlist = clientopts_new(); 3627c478bd9Sstevel@tonic-gate if (optlist == NULL) { 3637c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 3647c478bd9Sstevel@tonic-gate gettext("Error getting optlist (malloc fail)\n"), 3657c478bd9Sstevel@tonic-gate stderr); 3667c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 3677c478bd9Sstevel@tonic-gate } 3687c478bd9Sstevel@tonic-gate 3697c478bd9Sstevel@tonic-gate optind = 1; 3707c478bd9Sstevel@tonic-gate while (optind < argc) { 371dd1104fbSMichen Chang option = getopt(argc, argv, "vqa:ID:w:j:y:z:"); 3727c478bd9Sstevel@tonic-gate 3737c478bd9Sstevel@tonic-gate switch (option) { 3747c478bd9Sstevel@tonic-gate case 'v': 3757c478bd9Sstevel@tonic-gate mode_verbose = 1; 3767c478bd9Sstevel@tonic-gate break; 3777c478bd9Sstevel@tonic-gate case 'q': 3787c478bd9Sstevel@tonic-gate mode_quiet = 1; 3797c478bd9Sstevel@tonic-gate break; 3807c478bd9Sstevel@tonic-gate case 'a': 3817c478bd9Sstevel@tonic-gate attrVal = NULL; 3827c478bd9Sstevel@tonic-gate paramFlag = parseParam(optarg, &attrVal); 3837c478bd9Sstevel@tonic-gate if (paramFlag == CLIENT_ERR_PARSE) { 3847c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 3857c478bd9Sstevel@tonic-gate gettext("Unrecognized " 3867c478bd9Sstevel@tonic-gate "parameter \"%s\"\n"), 3877c478bd9Sstevel@tonic-gate optarg); 3887c478bd9Sstevel@tonic-gate usage(); 3897c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 3907c478bd9Sstevel@tonic-gate } 391e1dd0a2fSth160488 if (paramFlag == NS_LDAP_BINDPASSWD_P && 392e1dd0a2fSth160488 optlist->proxyPassword != NULL) { 393e1dd0a2fSth160488 (void) fprintf(stderr, 394e1dd0a2fSth160488 gettext("The -a proxyPassword option is " 395e1dd0a2fSth160488 "mutually exclusive of -y. " 396e1dd0a2fSth160488 "-a proxyPassword is ignored.\n")); 397e1dd0a2fSth160488 break; 398e1dd0a2fSth160488 } 399dd1104fbSMichen Chang if (paramFlag == NS_LDAP_ADMIN_BINDPASSWD_P && 400dd1104fbSMichen Chang optlist->adminPassword != NULL) { 401dd1104fbSMichen Chang (void) fprintf(stderr, 402dd1104fbSMichen Chang gettext("The -a adminPassword option is " 403dd1104fbSMichen Chang "mutually exclusive of -z. " 404dd1104fbSMichen Chang "-a adminPassword is ignored.\n")); 405dd1104fbSMichen Chang break; 406dd1104fbSMichen Chang } 4077c478bd9Sstevel@tonic-gate retcode = clientSetParam(optlist, paramFlag, attrVal); 4087c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 4097c478bd9Sstevel@tonic-gate CLIENT_FPRINTF( 4107c478bd9Sstevel@tonic-gate stderr, 4117c478bd9Sstevel@tonic-gate gettext("Error (%d) setting " 4127c478bd9Sstevel@tonic-gate "param \"%s\"\n"), 4137c478bd9Sstevel@tonic-gate retcode, optarg); 4147c478bd9Sstevel@tonic-gate usage(); 4157c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 4167c478bd9Sstevel@tonic-gate } 4177c478bd9Sstevel@tonic-gate break; 418e1dd0a2fSth160488 case 'D': 419e1dd0a2fSth160488 optlist->bindDN = strdup(optarg); 420e1dd0a2fSth160488 break; 421e1dd0a2fSth160488 case 'w': 422e1dd0a2fSth160488 if (optlist->bindPasswd != NULL) { 423e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, 424e1dd0a2fSth160488 gettext("The -w option is mutually " 425e1dd0a2fSth160488 "exclusive of -j. -w is ignored.")); 426e1dd0a2fSth160488 break; 427e1dd0a2fSth160488 } 428e1dd0a2fSth160488 429e1dd0a2fSth160488 if (optarg[0] == '-' && optarg[1] == '\0') { 430e1dd0a2fSth160488 /* Ask for a password later */ 431e1dd0a2fSth160488 break; 432e1dd0a2fSth160488 } 433e1dd0a2fSth160488 434e1dd0a2fSth160488 optlist->bindPasswd = strdup(optarg); 435e1dd0a2fSth160488 break; 436e1dd0a2fSth160488 case 'j': 437e1dd0a2fSth160488 if (optlist->bindPasswd != NULL) { 438e1dd0a2fSth160488 (void) fprintf(stderr, 439e1dd0a2fSth160488 gettext("The -w option is mutually " 440e1dd0a2fSth160488 "exclusive of -j. -w is ignored.\n")); 441e1dd0a2fSth160488 free(optlist->bindPasswd); 442e1dd0a2fSth160488 } 443e1dd0a2fSth160488 optlist->bindPasswd = readPwd(optarg); 444e1dd0a2fSth160488 if (optlist->bindPasswd == NULL) { 445e1dd0a2fSth160488 exit(CLIENT_ERR_FAIL); 446e1dd0a2fSth160488 } 447e1dd0a2fSth160488 break; 448e1dd0a2fSth160488 case 'y': 449e1dd0a2fSth160488 if (optlist->proxyPassword != NULL) { 450e1dd0a2fSth160488 (void) fprintf(stderr, 451e1dd0a2fSth160488 gettext("The -a proxyPassword option is " 452e1dd0a2fSth160488 "mutually exclusive of -y. " 453e1dd0a2fSth160488 "-a proxyPassword is ignored.\n")); 454e1dd0a2fSth160488 } 455e1dd0a2fSth160488 optlist->proxyPassword = readPwd(optarg); 456e1dd0a2fSth160488 if (optlist->proxyPassword == NULL) { 457e1dd0a2fSth160488 exit(CLIENT_ERR_FAIL); 458e1dd0a2fSth160488 } 459e1dd0a2fSth160488 break; 460dd1104fbSMichen Chang case 'z': 461dd1104fbSMichen Chang if (optlist->adminPassword != NULL) { 462dd1104fbSMichen Chang (void) fprintf(stderr, 463dd1104fbSMichen Chang gettext("The -a adminPassword option is " 464dd1104fbSMichen Chang "mutually exclusive of -z. " 465dd1104fbSMichen Chang "-a adminPassword is ignored.\n")); 466dd1104fbSMichen Chang } 467dd1104fbSMichen Chang optlist->adminPassword = readPwd(optarg); 468dd1104fbSMichen Chang if (optlist->adminPassword == NULL) { 469dd1104fbSMichen Chang exit(CLIENT_ERR_FAIL); 470dd1104fbSMichen Chang } 471dd1104fbSMichen Chang break; 4727c478bd9Sstevel@tonic-gate case EOF: 4737c478bd9Sstevel@tonic-gate if (strcmp(argv[optind], "init") == 0) { 4747c478bd9Sstevel@tonic-gate op_init = 1; 4757c478bd9Sstevel@tonic-gate } else if (strcmp(argv[optind], "manual") == 0) { 4767c478bd9Sstevel@tonic-gate op_manual = 1; 4777c478bd9Sstevel@tonic-gate } else if (strcmp(argv[optind], "mod") == 0) { 4787c478bd9Sstevel@tonic-gate op_mod = 1; 4797c478bd9Sstevel@tonic-gate } else if (strcmp(argv[optind], "list") == 0) { 4807c478bd9Sstevel@tonic-gate op_list = 1; 4817c478bd9Sstevel@tonic-gate } else if (strcmp(argv[optind], "uninit") == 0) { 4827c478bd9Sstevel@tonic-gate op_uninit = 1; 4837c478bd9Sstevel@tonic-gate } else if (strcmp(argv[optind], "genprofile") == 0) { 4847c478bd9Sstevel@tonic-gate gen = 1; 4857c478bd9Sstevel@tonic-gate op_genprofile = 1; 4867c478bd9Sstevel@tonic-gate } else if (optind == argc-1) { 4877c478bd9Sstevel@tonic-gate retcode = clientSetParam( 4887c478bd9Sstevel@tonic-gate optlist, 4897c478bd9Sstevel@tonic-gate NS_LDAP_SERVERS_P, 4907c478bd9Sstevel@tonic-gate argv[optind]); /* ipAddr */ 4917c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 4927c478bd9Sstevel@tonic-gate CLIENT_FPRINTF( 4937c478bd9Sstevel@tonic-gate stderr, 4947c478bd9Sstevel@tonic-gate gettext("Error (%d) setting " 4957c478bd9Sstevel@tonic-gate "serverList param.\n"), 4967c478bd9Sstevel@tonic-gate retcode); 4977c478bd9Sstevel@tonic-gate usage(); 4987c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 4997c478bd9Sstevel@tonic-gate } 5007c478bd9Sstevel@tonic-gate } else { 5017c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 5027c478bd9Sstevel@tonic-gate gettext("Error parsing " 5037c478bd9Sstevel@tonic-gate "command line\n"), 5047c478bd9Sstevel@tonic-gate stderr); 5057c478bd9Sstevel@tonic-gate usage(); 5067c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 5077c478bd9Sstevel@tonic-gate } 5087c478bd9Sstevel@tonic-gate optind++; /* get past the verb and keep trying */ 5097c478bd9Sstevel@tonic-gate break; 5107c478bd9Sstevel@tonic-gate /* Backwards compatibility to support system install */ 5117c478bd9Sstevel@tonic-gate case 'I': 5127c478bd9Sstevel@tonic-gate sysid_install = B_TRUE; 5137c478bd9Sstevel@tonic-gate op_init = 1; 5147c478bd9Sstevel@tonic-gate mode_quiet = 1; 5157c478bd9Sstevel@tonic-gate break; 5167c478bd9Sstevel@tonic-gate case '?': 5177c478bd9Sstevel@tonic-gate usage(); 5187c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("\nOr\n\n"), stderr); 5197c478bd9Sstevel@tonic-gate gen = 1; 5207c478bd9Sstevel@tonic-gate usage(); 5217c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 5227c478bd9Sstevel@tonic-gate break; 5237c478bd9Sstevel@tonic-gate } 5247c478bd9Sstevel@tonic-gate 5257c478bd9Sstevel@tonic-gate } 5267c478bd9Sstevel@tonic-gate 5277c478bd9Sstevel@tonic-gate if ((getuid() != 0) && (!op_genprofile)) { 5287c478bd9Sstevel@tonic-gate (void) puts( 5297c478bd9Sstevel@tonic-gate "You must be root (SuperUser) to run this command."); 5307c478bd9Sstevel@tonic-gate usage(); 5317c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 5327c478bd9Sstevel@tonic-gate } 5337c478bd9Sstevel@tonic-gate 5347c478bd9Sstevel@tonic-gate /* 5357c478bd9Sstevel@tonic-gate * All command line arguments are finished being parsed now 5367c478bd9Sstevel@tonic-gate */ 5377c478bd9Sstevel@tonic-gate 5387c478bd9Sstevel@tonic-gate /* *** Do semantic checking here *** */ 5397c478bd9Sstevel@tonic-gate 5407c478bd9Sstevel@tonic-gate /* if gen and no no searchBase then err */ 5417c478bd9Sstevel@tonic-gate if (gen && !optlist->defaultSearchBase) { 5427c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 5437c478bd9Sstevel@tonic-gate gettext("ldapclient: Missing required attrName " 5447c478bd9Sstevel@tonic-gate "defaultSearchBase\n"), 5457c478bd9Sstevel@tonic-gate stderr); 5467c478bd9Sstevel@tonic-gate usage(); 5477c478bd9Sstevel@tonic-gate clientopts_free(optlist); 5487c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 5497c478bd9Sstevel@tonic-gate } 5507c478bd9Sstevel@tonic-gate 551dd1104fbSMichen Chang /* 552dd1104fbSMichen Chang * if init or manual, and if adminDN is specified then enableShadowUpdate 553dd1104fbSMichen Chang * must be set to TRUE. 554dd1104fbSMichen Chang */ 555dd1104fbSMichen Chang if ((op_init || op_manual) && 556dd1104fbSMichen Chang (!optlist->enableShadowUpdate || 557dd1104fbSMichen Chang strcasecmp(optlist->enableShadowUpdate, "TRUE") != 0) && 558dd1104fbSMichen Chang (optlist->adminDN || optlist->adminPassword)) { 559dd1104fbSMichen Chang CLIENT_FPUTS( 560dd1104fbSMichen Chang gettext("ldapclient: adminDN and adminPassword must not " 561dd1104fbSMichen Chang "be specified if enableShadowUpdate is not set to TRUE \n"), 562dd1104fbSMichen Chang stderr); 563dd1104fbSMichen Chang usage(); 564dd1104fbSMichen Chang clientopts_free(optlist); 565dd1104fbSMichen Chang exit(CLIENT_ERR_FAIL); 566dd1104fbSMichen Chang } 567dd1104fbSMichen Chang 5687c478bd9Sstevel@tonic-gate /* Only one verb can be specified */ 5697c478bd9Sstevel@tonic-gate if ((op_init + op_manual + op_mod + op_uninit + 5707c478bd9Sstevel@tonic-gate op_list + op_genprofile) != 1) { 5717c478bd9Sstevel@tonic-gate usage(); 5727c478bd9Sstevel@tonic-gate clientopts_free(optlist); 5737c478bd9Sstevel@tonic-gate exit(CLIENT_ERR_FAIL); 5747c478bd9Sstevel@tonic-gate } 5757c478bd9Sstevel@tonic-gate 5767c478bd9Sstevel@tonic-gate /* *** We passed semantic checking, so now do the operation *** */ 5777c478bd9Sstevel@tonic-gate 5787c478bd9Sstevel@tonic-gate if (mode_verbose) { 5797c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Arguments parsed:\n"), stderr); 5807c478bd9Sstevel@tonic-gate dumpargs(optlist); 5817c478bd9Sstevel@tonic-gate } 5827c478bd9Sstevel@tonic-gate 5837c478bd9Sstevel@tonic-gate 5847c478bd9Sstevel@tonic-gate /* handle "ldapclient list" here. err checking done in func */ 5857c478bd9Sstevel@tonic-gate if (op_list) { 5867c478bd9Sstevel@tonic-gate if (mode_verbose) 5877c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 5887c478bd9Sstevel@tonic-gate gettext("Handling list option\n"), 5897c478bd9Sstevel@tonic-gate stderr); 5907c478bd9Sstevel@tonic-gate retcode = client_list(optlist); 5917c478bd9Sstevel@tonic-gate } 5927c478bd9Sstevel@tonic-gate 5937c478bd9Sstevel@tonic-gate /* handle "ldapclient uninit" here */ 5947c478bd9Sstevel@tonic-gate if (op_uninit) { 5957c478bd9Sstevel@tonic-gate if (mode_verbose) 5967c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 5977c478bd9Sstevel@tonic-gate gettext("Handling uninit option\n"), 5987c478bd9Sstevel@tonic-gate stderr); 5997c478bd9Sstevel@tonic-gate retcode = client_uninit(optlist); 6007c478bd9Sstevel@tonic-gate } 6017c478bd9Sstevel@tonic-gate 6027c478bd9Sstevel@tonic-gate /* handle "ldapclient init" (profile) */ 6037c478bd9Sstevel@tonic-gate if (op_init) { 6047c478bd9Sstevel@tonic-gate if (mode_verbose) 6057c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6067c478bd9Sstevel@tonic-gate gettext("Handling init option\n"), 6077c478bd9Sstevel@tonic-gate stderr); 6087c478bd9Sstevel@tonic-gate retcode = client_init(optlist); 6097c478bd9Sstevel@tonic-gate } 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate /* handle "genprofile" here */ 6127c478bd9Sstevel@tonic-gate if (op_genprofile) { 6137c478bd9Sstevel@tonic-gate if (mode_verbose) 6147c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6157c478bd9Sstevel@tonic-gate gettext("Handling genProfile\n"), 6167c478bd9Sstevel@tonic-gate stderr); 6177c478bd9Sstevel@tonic-gate retcode = client_genProfile(optlist); 6187c478bd9Sstevel@tonic-gate } 6197c478bd9Sstevel@tonic-gate 6207c478bd9Sstevel@tonic-gate /* handle "ldapclient manual" here */ 6217c478bd9Sstevel@tonic-gate if (op_manual) { 6227c478bd9Sstevel@tonic-gate if (mode_verbose) 6237c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6247c478bd9Sstevel@tonic-gate gettext("Handling manual option\n"), 6257c478bd9Sstevel@tonic-gate stderr); 6267c478bd9Sstevel@tonic-gate retcode = client_manual(optlist); 6277c478bd9Sstevel@tonic-gate } 6287c478bd9Sstevel@tonic-gate 6297c478bd9Sstevel@tonic-gate /* handle "ldapclient mod" here */ 6307c478bd9Sstevel@tonic-gate if (op_mod) { 6317c478bd9Sstevel@tonic-gate if (mode_verbose) 6327c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6337c478bd9Sstevel@tonic-gate gettext("Handling mod option\n"), 6347c478bd9Sstevel@tonic-gate stderr); 6357c478bd9Sstevel@tonic-gate retcode = client_mod(optlist); 6367c478bd9Sstevel@tonic-gate } 6377c478bd9Sstevel@tonic-gate 6387c478bd9Sstevel@tonic-gate clientopts_free(optlist); 6397c478bd9Sstevel@tonic-gate if ((retcode == CLIENT_SUCCESS) || 6407c478bd9Sstevel@tonic-gate (retcode == CLIENT_ERR_FAIL) || 6417c478bd9Sstevel@tonic-gate (retcode == CLIENT_ERR_CREDENTIAL)) 642cb5caa98Sdjl return (retcode); 6437c478bd9Sstevel@tonic-gate else 644cb5caa98Sdjl return (CLIENT_ERR_FAIL); 6457c478bd9Sstevel@tonic-gate } 6467c478bd9Sstevel@tonic-gate 6477c478bd9Sstevel@tonic-gate static int 6487c478bd9Sstevel@tonic-gate client_list(clientopts_t *arglist) 6497c478bd9Sstevel@tonic-gate { 6507c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 6517c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 6527c478bd9Sstevel@tonic-gate 6537c478bd9Sstevel@tonic-gate if (num_args(arglist) > 0) { 6547c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6557c478bd9Sstevel@tonic-gate gettext("No args supported with \"list\" option\n"), 6567c478bd9Sstevel@tonic-gate stderr); 6577c478bd9Sstevel@tonic-gate usage(); 6587c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); /* exit code here ? */ 6597c478bd9Sstevel@tonic-gate } 6607c478bd9Sstevel@tonic-gate if ((errorp = __ns_ldap_print_config(mode_verbose)) != NULL) { 6617c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_FAIL; 6627c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6637c478bd9Sstevel@tonic-gate gettext("Cannot get print configuration\n"), 6647c478bd9Sstevel@tonic-gate stderr); 6657c478bd9Sstevel@tonic-gate CLIENT_FPUTS(errorp->message, stderr); 6667c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 6677c478bd9Sstevel@tonic-gate CLIENT_FPUTC('\n', stderr); 6687c478bd9Sstevel@tonic-gate } 6697c478bd9Sstevel@tonic-gate 6707c478bd9Sstevel@tonic-gate return (retcode); 6717c478bd9Sstevel@tonic-gate } 6727c478bd9Sstevel@tonic-gate 6737c478bd9Sstevel@tonic-gate static int 6747c478bd9Sstevel@tonic-gate client_uninit(clientopts_t *arglist) 6757c478bd9Sstevel@tonic-gate { 6767c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 677cb5caa98Sdjl ns_ldap_self_gssapi_config_t config = NS_LDAP_SELF_GSSAPI_CONFIG_NONE; 6787c478bd9Sstevel@tonic-gate 6797c478bd9Sstevel@tonic-gate if (mode_verbose) { 6807c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6817c478bd9Sstevel@tonic-gate gettext("Restoring machine to previous " 6827c478bd9Sstevel@tonic-gate "configuration state\n"), 6837c478bd9Sstevel@tonic-gate stderr); 6847c478bd9Sstevel@tonic-gate } 6857c478bd9Sstevel@tonic-gate 6867c478bd9Sstevel@tonic-gate if (num_args(arglist) > 0) { 6877c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 6887c478bd9Sstevel@tonic-gate gettext("No args supported with \"uninit\" option\n"), 6897c478bd9Sstevel@tonic-gate stderr); 6907c478bd9Sstevel@tonic-gate usage(); 6917c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 6927c478bd9Sstevel@tonic-gate } 6937c478bd9Sstevel@tonic-gate 694cb5caa98Sdjl (void) __ns_ldap_self_gssapi_config(&config); 695cb5caa98Sdjl 6967c478bd9Sstevel@tonic-gate retcode = stop_services(STATE_SAVE); 697cb5caa98Sdjl 698cb5caa98Sdjl if (config != NS_LDAP_SELF_GSSAPI_CONFIG_NONE) 699cb5caa98Sdjl (void) system("/usr/sbin/cryptoadm enable metaslot"); 700cb5caa98Sdjl 7017c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 7027c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7037c478bd9Sstevel@tonic-gate gettext("Errors stopping network services.\n"), stderr); 7047c478bd9Sstevel@tonic-gate /* restart whatever services we can */ 7057c478bd9Sstevel@tonic-gate (void) start_services(START_RESET); 7067c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 7077c478bd9Sstevel@tonic-gate } 7087c478bd9Sstevel@tonic-gate 7097c478bd9Sstevel@tonic-gate retcode = recover(STATE_SAVE); 7107c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 7117c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7127c478bd9Sstevel@tonic-gate gettext("Cannot recover the configuration on " 7137c478bd9Sstevel@tonic-gate "this machine.\n"), 7147c478bd9Sstevel@tonic-gate stderr); 7157c478bd9Sstevel@tonic-gate (void) start_services(START_RESET); 7167c478bd9Sstevel@tonic-gate } else { 7177c478bd9Sstevel@tonic-gate retcode = start_services(START_UNINIT); 7187c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 7197c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7207c478bd9Sstevel@tonic-gate gettext("Config restored but problems " 7217c478bd9Sstevel@tonic-gate "encountered resetting network " 7227c478bd9Sstevel@tonic-gate "services.\n"), 7237c478bd9Sstevel@tonic-gate stderr); 7247c478bd9Sstevel@tonic-gate } 7257c478bd9Sstevel@tonic-gate } 7267c478bd9Sstevel@tonic-gate 7277c478bd9Sstevel@tonic-gate if (retcode == CLIENT_SUCCESS) { 7287c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7297c478bd9Sstevel@tonic-gate gettext("System successfully recovered\n"), 7307c478bd9Sstevel@tonic-gate stderr); 7317c478bd9Sstevel@tonic-gate } 7327c478bd9Sstevel@tonic-gate 7337c478bd9Sstevel@tonic-gate return (retcode); 7347c478bd9Sstevel@tonic-gate } 7357c478bd9Sstevel@tonic-gate 7367c478bd9Sstevel@tonic-gate /* 7377c478bd9Sstevel@tonic-gate * The following macro is used to do a __ns_ldap_setParam(). 7387c478bd9Sstevel@tonic-gate * On every call, the return code is checked, and if there was 7397c478bd9Sstevel@tonic-gate * a problem then the error message is printed, the ldaperr 7407c478bd9Sstevel@tonic-gate * is freed and we return from the function with the offending 7417c478bd9Sstevel@tonic-gate * error return code. This macro keeps us from having to 7427c478bd9Sstevel@tonic-gate * repeat this code for every call to setParam as was done 7437c478bd9Sstevel@tonic-gate * in the previous incarnation of ldapclient. 7447c478bd9Sstevel@tonic-gate * 7457c478bd9Sstevel@tonic-gate * assumes a "retcode" variable is available for status 7467c478bd9Sstevel@tonic-gate */ 7477c478bd9Sstevel@tonic-gate #define LDAP_SET_PARAM(argval, argdef) \ 7487c478bd9Sstevel@tonic-gate retcode = 0; \ 7497c478bd9Sstevel@tonic-gate if (NULL != argval) { \ 7507c478bd9Sstevel@tonic-gate ns_ldap_error_t *ldaperr; \ 7517c478bd9Sstevel@tonic-gate retcode = __ns_ldap_setParam(argdef, (void *)argval, &ldaperr); \ 7527c478bd9Sstevel@tonic-gate if (retcode != NS_LDAP_SUCCESS) { \ 7537c478bd9Sstevel@tonic-gate if (NULL != ldaperr) { \ 7547c478bd9Sstevel@tonic-gate CLIENT_FPUTS(ldaperr->message, stderr); \ 7557c478bd9Sstevel@tonic-gate CLIENT_FPUTC('\n', stderr); \ 7567c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&ldaperr); \ 7577c478bd9Sstevel@tonic-gate } \ 7587c478bd9Sstevel@tonic-gate return (retcode ? CLIENT_ERR_FAIL : CLIENT_SUCCESS); \ 7597c478bd9Sstevel@tonic-gate } \ 7607c478bd9Sstevel@tonic-gate } 7617c478bd9Sstevel@tonic-gate 762e1dd0a2fSth160488 /* 763e1dd0a2fSth160488 * The following macro is used to check if an arg has already been set 764e1dd0a2fSth160488 * and issues an error message, a usage message and then returns an error. 765e1dd0a2fSth160488 * This was made into a macro to avoid the duplication of this code many 766e1dd0a2fSth160488 * times in the function below. 767e1dd0a2fSth160488 */ 768e1dd0a2fSth160488 #define LDAP_CHECK_INVALID(arg, param) \ 769e1dd0a2fSth160488 if (arg) { \ 770e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, gettext("Invalid parameter (%s) " \ 771e1dd0a2fSth160488 "specified\n"), param); \ 772e1dd0a2fSth160488 usage(); \ 773e1dd0a2fSth160488 return (CLIENT_ERR_FAIL); \ 774e1dd0a2fSth160488 } 775e1dd0a2fSth160488 7767c478bd9Sstevel@tonic-gate static int 7777c478bd9Sstevel@tonic-gate client_manual(clientopts_t *arglist) 7787c478bd9Sstevel@tonic-gate { 7797c478bd9Sstevel@tonic-gate int counter; 7807c478bd9Sstevel@tonic-gate int domain_fp; 7817c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 7827c478bd9Sstevel@tonic-gate int ret_copy; 7837c478bd9Sstevel@tonic-gate int reset_ret; 7847c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 7857c478bd9Sstevel@tonic-gate 7867c478bd9Sstevel@tonic-gate if (dname == NULL) { 7877c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7887c478bd9Sstevel@tonic-gate gettext("Manual failed: System domain not set and " 7897c478bd9Sstevel@tonic-gate "no domainName specified.\n"), 7907c478bd9Sstevel@tonic-gate stderr); 7917c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 7927c478bd9Sstevel@tonic-gate } 7937c478bd9Sstevel@tonic-gate 7947c478bd9Sstevel@tonic-gate if (arglist->defaultSearchBase == NULL) { 7957c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 7967c478bd9Sstevel@tonic-gate gettext("Manual failed: Missing required " 7977c478bd9Sstevel@tonic-gate "defaultSearchBase attribute.\n"), 7987c478bd9Sstevel@tonic-gate stderr); 7997c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 8007c478bd9Sstevel@tonic-gate } 8017c478bd9Sstevel@tonic-gate 8027c478bd9Sstevel@tonic-gate if ((arglist->defaultServerList == NULL) && 8037c478bd9Sstevel@tonic-gate (arglist->preferredServerList == NULL)) { 8047c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 8057c478bd9Sstevel@tonic-gate gettext("Manual failed: Missing required " 8067c478bd9Sstevel@tonic-gate "defaultServerList or preferredServerList " 8077c478bd9Sstevel@tonic-gate "attribute.\n"), 8087c478bd9Sstevel@tonic-gate stderr); 8097c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 8107c478bd9Sstevel@tonic-gate } 8117c478bd9Sstevel@tonic-gate 8127c478bd9Sstevel@tonic-gate if (arglist->profileTTL != NULL) { 8137c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 8147c478bd9Sstevel@tonic-gate gettext("Manual aborted: profileTTL is not supported " 8157c478bd9Sstevel@tonic-gate "in manual mode.\n"), 8167c478bd9Sstevel@tonic-gate stderr); 8177c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 8187c478bd9Sstevel@tonic-gate } 8197c478bd9Sstevel@tonic-gate 8207c478bd9Sstevel@tonic-gate if (arglist->profileName != NULL) { 8217c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 8227c478bd9Sstevel@tonic-gate gettext("Manual aborted: profileName is not supported " 8237c478bd9Sstevel@tonic-gate "in manual mode.\n"), 8247c478bd9Sstevel@tonic-gate stderr); 8257c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 8267c478bd9Sstevel@tonic-gate } 8277c478bd9Sstevel@tonic-gate 828e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindDN, "bind DN"); 829e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindPasswd, "bind password"); 8307c478bd9Sstevel@tonic-gate 8317c478bd9Sstevel@tonic-gate __ns_ldap_setServer(TRUE); /* Need this for _ns_setParam() */ 8327c478bd9Sstevel@tonic-gate __ns_ldap_default_config(); 8337c478bd9Sstevel@tonic-gate 8347c478bd9Sstevel@tonic-gate /* Set version to latest (not version 1) */ 8357c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(NS_LDAP_VERSION, NS_LDAP_FILE_VERSION_P); 8367c478bd9Sstevel@tonic-gate 8377c478bd9Sstevel@tonic-gate /* Set profileTTL to 0 since NO profile on manual */ 8387c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(CACHETTL_OFF, NS_LDAP_CACHETTL_P); 8397c478bd9Sstevel@tonic-gate 8407c478bd9Sstevel@tonic-gate /* Set additional valid params from command line */ 8417c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->authenticationMethod, NS_LDAP_AUTH_P); 8427c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchBase, NS_LDAP_SEARCH_BASEDN_P); 8437c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->credentialLevel, NS_LDAP_CREDENTIAL_LEVEL_P); 8447c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->proxyDN, NS_LDAP_BINDDN_P); 845dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->enableShadowUpdate, 846dd1104fbSMichen Chang NS_LDAP_ENABLE_SHADOW_UPDATE_P); 847dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->adminDN, NS_LDAP_ADMIN_BINDDN_P); 8487c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->searchTimeLimit, NS_LDAP_SEARCH_TIME_P); 8497c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->preferredServerList, NS_LDAP_SERVER_PREF_P); 8507c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->profileName, NS_LDAP_PROFILE_P); 8517c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->followReferrals, NS_LDAP_SEARCH_REF_P); 8527c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchScope, NS_LDAP_SEARCH_SCOPE_P); 8537c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->bindTimeLimit, NS_LDAP_BIND_TIME_P); 8547c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->proxyPassword, NS_LDAP_BINDPASSWD_P); 855dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->adminPassword, NS_LDAP_ADMIN_BINDPASSWD_P); 8567c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultServerList, NS_LDAP_SERVERS_P); 8577c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->certificatePath, NS_LDAP_HOST_CERTPATH_P); 8587c478bd9Sstevel@tonic-gate 8597c478bd9Sstevel@tonic-gate for (counter = 0; 8607c478bd9Sstevel@tonic-gate counter < arglist->serviceAuthenticationMethod->count; 8617c478bd9Sstevel@tonic-gate counter++) { 8627c478bd9Sstevel@tonic-gate 8637c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 8647c478bd9Sstevel@tonic-gate arglist->serviceAuthenticationMethod->optlist[counter], 8657c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_AUTH_METHOD_P); 8667c478bd9Sstevel@tonic-gate } 8677c478bd9Sstevel@tonic-gate for (counter = 0; 8687c478bd9Sstevel@tonic-gate counter < arglist->serviceCredentialLevel->count; 8697c478bd9Sstevel@tonic-gate counter++) { 8707c478bd9Sstevel@tonic-gate 8717c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 8727c478bd9Sstevel@tonic-gate arglist->serviceCredentialLevel->optlist[counter], 8737c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_CRED_LEVEL_P); 8747c478bd9Sstevel@tonic-gate } 8757c478bd9Sstevel@tonic-gate for (counter = 0; 8767c478bd9Sstevel@tonic-gate counter < arglist->objectclassMap->count; 8777c478bd9Sstevel@tonic-gate counter++) { 8787c478bd9Sstevel@tonic-gate 8797c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->objectclassMap->optlist[counter], 8807c478bd9Sstevel@tonic-gate NS_LDAP_OBJECTCLASSMAP_P); 8817c478bd9Sstevel@tonic-gate } 8827c478bd9Sstevel@tonic-gate for (counter = 0; counter < arglist->attributeMap->count; counter++) { 8837c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->attributeMap->optlist[counter], 8847c478bd9Sstevel@tonic-gate NS_LDAP_ATTRIBUTEMAP_P); 8857c478bd9Sstevel@tonic-gate } 8867c478bd9Sstevel@tonic-gate for (counter = 0; 8877c478bd9Sstevel@tonic-gate counter < arglist->serviceSearchDescriptor->count; 8887c478bd9Sstevel@tonic-gate counter++) { 8897c478bd9Sstevel@tonic-gate 8907c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 8917c478bd9Sstevel@tonic-gate arglist->serviceSearchDescriptor->optlist[counter], 8927c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_SEARCH_DESC_P); 8937c478bd9Sstevel@tonic-gate } 8947c478bd9Sstevel@tonic-gate 8957c478bd9Sstevel@tonic-gate retcode = credCheck(arglist); 896dd1104fbSMichen Chang if (retcode == CLIENT_SUCCESS) 897dd1104fbSMichen Chang retcode = adminCredCheck(arglist); 8987c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 8997c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9007c478bd9Sstevel@tonic-gate gettext("Error in setting up credentials\n"), 9017c478bd9Sstevel@tonic-gate stderr); 9027c478bd9Sstevel@tonic-gate return (retcode); 9037c478bd9Sstevel@tonic-gate } 9047c478bd9Sstevel@tonic-gate 9057c478bd9Sstevel@tonic-gate if (mode_verbose) 9067c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9077c478bd9Sstevel@tonic-gate gettext("About to modify this machines " 9087c478bd9Sstevel@tonic-gate "configuration by writing the files\n"), 9097c478bd9Sstevel@tonic-gate stderr); 9107c478bd9Sstevel@tonic-gate 9117c478bd9Sstevel@tonic-gate /* get ready to start playing with files */ 9127c478bd9Sstevel@tonic-gate retcode = stop_services(STATE_SAVE); 9137c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 9147c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9157c478bd9Sstevel@tonic-gate gettext("Errors stopping network services.\n"), stderr); 9167c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 9177c478bd9Sstevel@tonic-gate } 9187c478bd9Sstevel@tonic-gate 9197c478bd9Sstevel@tonic-gate /* Save orig versions of files */ 9207c478bd9Sstevel@tonic-gate retcode = file_backup(); 9217c478bd9Sstevel@tonic-gate if (retcode == CLIENT_ERR_RESTORE) { 9227c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9237c478bd9Sstevel@tonic-gate gettext("System not in state to enable ldap client.\n"), 9247c478bd9Sstevel@tonic-gate stderr); 9257c478bd9Sstevel@tonic-gate 9267c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 9277c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 9287c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 9297c478bd9Sstevel@tonic-gate "starting services during reset\n"), 9307c478bd9Sstevel@tonic-gate reset_ret); 9317c478bd9Sstevel@tonic-gate } 9327c478bd9Sstevel@tonic-gate return (retcode); 9337c478bd9Sstevel@tonic-gate } else if (retcode != CLIENT_SUCCESS) { 9347c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9357c478bd9Sstevel@tonic-gate gettext("Save of system configuration failed! " 9367c478bd9Sstevel@tonic-gate "Attempting recovery.\n"), 9377c478bd9Sstevel@tonic-gate stderr); 9387c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 9397c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 9407c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9417c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 9427c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 9437c478bd9Sstevel@tonic-gate "config files is required.\n"), 9447c478bd9Sstevel@tonic-gate stderr); 9457c478bd9Sstevel@tonic-gate return (retcode); 9467c478bd9Sstevel@tonic-gate } 9477c478bd9Sstevel@tonic-gate 9487c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 9497c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 9507c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 9517c478bd9Sstevel@tonic-gate "starting services during reset\n"), 9527c478bd9Sstevel@tonic-gate reset_ret); 9537c478bd9Sstevel@tonic-gate } 9547c478bd9Sstevel@tonic-gate 9557c478bd9Sstevel@tonic-gate return (retcode); 9567c478bd9Sstevel@tonic-gate } 9577c478bd9Sstevel@tonic-gate 9587c478bd9Sstevel@tonic-gate /* Dump new files */ 9597c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCONFIGFILE); 9607c478bd9Sstevel@tonic-gate if (errorp != NULL) { 9617c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 9627c478bd9Sstevel@tonic-gate gettext("%s manual: errorp is not NULL; %s\n"), 9637c478bd9Sstevel@tonic-gate cmd, errorp->message); 9647c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 9657c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 9667c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9677c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 9687c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 9697c478bd9Sstevel@tonic-gate "config files is required.\n"), 9707c478bd9Sstevel@tonic-gate stderr); 9717c478bd9Sstevel@tonic-gate return (retcode); 9727c478bd9Sstevel@tonic-gate } 9737c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 9747c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 9757c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 9767c478bd9Sstevel@tonic-gate "starting services during reset\n"), 9777c478bd9Sstevel@tonic-gate reset_ret); 9787c478bd9Sstevel@tonic-gate } 9797c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 9807c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 9817c478bd9Sstevel@tonic-gate } 9827c478bd9Sstevel@tonic-gate 9837c478bd9Sstevel@tonic-gate /* if (credargs(arglist)) */ 9847c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCREDFILE); 9857c478bd9Sstevel@tonic-gate if (errorp != NULL) { 9867c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 9877c478bd9Sstevel@tonic-gate gettext("%s init: errorp is not NULL; %s\n"), 9887c478bd9Sstevel@tonic-gate cmd, errorp->message); 9897c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 9907c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 9917c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 9927c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 9937c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 9947c478bd9Sstevel@tonic-gate "config files is required.\n"), 9957c478bd9Sstevel@tonic-gate stderr); 9967c478bd9Sstevel@tonic-gate return (retcode); 9977c478bd9Sstevel@tonic-gate } 9987c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 9997c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10007c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10017c478bd9Sstevel@tonic-gate "starting services during reset\n"), 10027c478bd9Sstevel@tonic-gate reset_ret); 10037c478bd9Sstevel@tonic-gate } 10047c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 10057c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 10067c478bd9Sstevel@tonic-gate } 10077c478bd9Sstevel@tonic-gate 10087c478bd9Sstevel@tonic-gate ret_copy = system(CMD_CP " " NSSWITCH_LDAP " " NSSWITCH_CONF); 10097c478bd9Sstevel@tonic-gate if (ret_copy != 0) { 10107c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 10117c478bd9Sstevel@tonic-gate gettext("Error %d copying (%s) -> (%s)\n"), 10127c478bd9Sstevel@tonic-gate ret_copy, NSSWITCH_LDAP, NSSWITCH_CONF); 10137c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 10147c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 10157c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 10167c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 10177c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 10187c478bd9Sstevel@tonic-gate "config files is required.\n"), 10197c478bd9Sstevel@tonic-gate stderr); 10207c478bd9Sstevel@tonic-gate } 10217c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 10227c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10237c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10247c478bd9Sstevel@tonic-gate "starting services during reset\n"), 10257c478bd9Sstevel@tonic-gate reset_ret); 10267c478bd9Sstevel@tonic-gate } 10277c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 10287c478bd9Sstevel@tonic-gate } 10297c478bd9Sstevel@tonic-gate 10307c478bd9Sstevel@tonic-gate if ((domain_fp = open(DOMAINNAME, O_WRONLY|O_CREAT|O_TRUNC, 10317c478bd9Sstevel@tonic-gate S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) { /* 0644 */ 10327c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Cannot open %s\n"), DOMAINNAME); 10337c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 10347c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 10357c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 10367c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 10377c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 10387c478bd9Sstevel@tonic-gate "config files is required.\n"), 10397c478bd9Sstevel@tonic-gate stderr); 10407c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 10417c478bd9Sstevel@tonic-gate } 10427c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 10437c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10447c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10457c478bd9Sstevel@tonic-gate "starting services during reset\n"), 10467c478bd9Sstevel@tonic-gate reset_ret); 10477c478bd9Sstevel@tonic-gate } 10487c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 10497c478bd9Sstevel@tonic-gate } 10507c478bd9Sstevel@tonic-gate (void) write(domain_fp, dname, strlen(dname)); 10517c478bd9Sstevel@tonic-gate (void) write(domain_fp, "\n", 1); 10527c478bd9Sstevel@tonic-gate (void) close(domain_fp); 10537c478bd9Sstevel@tonic-gate 10547c478bd9Sstevel@tonic-gate retcode = start_services(START_INIT); 10557c478bd9Sstevel@tonic-gate 10567c478bd9Sstevel@tonic-gate if (retcode == CLIENT_SUCCESS) { 10577c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("System successfully configured\n"), 10587c478bd9Sstevel@tonic-gate stderr); 10597c478bd9Sstevel@tonic-gate } else { 10607c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error resetting system.\n" 10617c478bd9Sstevel@tonic-gate "Recovering old system settings.\n"), stderr), 10627c478bd9Sstevel@tonic-gate 10637c478bd9Sstevel@tonic-gate /* stop any started services for recover */ 10647c478bd9Sstevel@tonic-gate /* don't stomp on history of saved services state */ 10657c478bd9Sstevel@tonic-gate reset_ret = stop_services(STATE_NOSAVE); 10667c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10677c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10687c478bd9Sstevel@tonic-gate "stopping services during reset\n"), 10697c478bd9Sstevel@tonic-gate reset_ret); 10707c478bd9Sstevel@tonic-gate /* Coninue and try to recover what we can */ 10717c478bd9Sstevel@tonic-gate } 10727c478bd9Sstevel@tonic-gate reset_ret = recover(STATE_NOSAVE); 10737c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10747c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10757c478bd9Sstevel@tonic-gate "recovering service files during " 10767c478bd9Sstevel@tonic-gate "reset\n"), reset_ret); 10777c478bd9Sstevel@tonic-gate /* Continue and start what we can */ 10787c478bd9Sstevel@tonic-gate } 10797c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 10807c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 10817c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 10827c478bd9Sstevel@tonic-gate "starting services during reset\n"), 10837c478bd9Sstevel@tonic-gate reset_ret); 10847c478bd9Sstevel@tonic-gate } 10857c478bd9Sstevel@tonic-gate } 10867c478bd9Sstevel@tonic-gate 10877c478bd9Sstevel@tonic-gate return (retcode); 10887c478bd9Sstevel@tonic-gate } 10897c478bd9Sstevel@tonic-gate 10907c478bd9Sstevel@tonic-gate static int 10917c478bd9Sstevel@tonic-gate client_mod(clientopts_t *arglist) 10927c478bd9Sstevel@tonic-gate { 10937c478bd9Sstevel@tonic-gate int counter; 10947c478bd9Sstevel@tonic-gate int domain_fp; 10957c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 10967c478bd9Sstevel@tonic-gate int reset_ret; 10977c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 10987c478bd9Sstevel@tonic-gate 10997c478bd9Sstevel@tonic-gate __ns_ldap_setServer(TRUE); /* Need this for _ns_setParam() */ 11007c478bd9Sstevel@tonic-gate if ((errorp = __ns_ldap_LoadConfiguration()) != NULL) { 11017c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Cannot get load configuration\n"), 11027c478bd9Sstevel@tonic-gate stderr); 11037c478bd9Sstevel@tonic-gate CLIENT_FPUTS(errorp->message, stderr); 11047c478bd9Sstevel@tonic-gate CLIENT_FPUTC('\n', stderr); 11057c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 11067c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 11077c478bd9Sstevel@tonic-gate } 11087c478bd9Sstevel@tonic-gate 11097c478bd9Sstevel@tonic-gate if (arglist->profileTTL != NULL) { 11107c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 11117c478bd9Sstevel@tonic-gate gettext("Mod aborted: profileTTL modification is " 11127c478bd9Sstevel@tonic-gate "not allowed in mod mode.\n"), 11137c478bd9Sstevel@tonic-gate stderr); 11147c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 11157c478bd9Sstevel@tonic-gate } 11167c478bd9Sstevel@tonic-gate 11177c478bd9Sstevel@tonic-gate if (arglist->profileName != NULL) { 11187c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 11197c478bd9Sstevel@tonic-gate gettext("Mod aborted: profileName modification is " 11207c478bd9Sstevel@tonic-gate "not allowed. If you want to use profiles " 11217c478bd9Sstevel@tonic-gate "generate one with genProfile and load it " 11227c478bd9Sstevel@tonic-gate "on the server with ldapadd.\n"), 11237c478bd9Sstevel@tonic-gate stderr); 11247c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 11257c478bd9Sstevel@tonic-gate } 11267c478bd9Sstevel@tonic-gate 1127e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindDN, "bind DN"); 1128e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindPasswd, "bind password"); 11297c478bd9Sstevel@tonic-gate 11307c478bd9Sstevel@tonic-gate /* Set additional valid params from command line */ 11317c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->authenticationMethod, NS_LDAP_AUTH_P); 11327c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchBase, NS_LDAP_SEARCH_BASEDN_P); 11337c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->credentialLevel, NS_LDAP_CREDENTIAL_LEVEL_P); 11347c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->proxyDN, NS_LDAP_BINDDN_P); 1135dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->adminDN, NS_LDAP_ADMIN_BINDDN_P); 11367c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->profileTTL, NS_LDAP_CACHETTL_P); 11377c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->searchTimeLimit, NS_LDAP_SEARCH_TIME_P); 11387c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->preferredServerList, NS_LDAP_SERVER_PREF_P); 11397c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->profileName, NS_LDAP_PROFILE_P); 11407c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->followReferrals, NS_LDAP_SEARCH_REF_P); 11417c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchScope, NS_LDAP_SEARCH_SCOPE_P); 11427c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->bindTimeLimit, NS_LDAP_BIND_TIME_P); 11437c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->proxyPassword, NS_LDAP_BINDPASSWD_P); 1144dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->adminPassword, NS_LDAP_ADMIN_BINDPASSWD_P); 11457c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultServerList, NS_LDAP_SERVERS_P); 1146dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->enableShadowUpdate, 1147dd1104fbSMichen Chang NS_LDAP_ENABLE_SHADOW_UPDATE_P); 11487c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->certificatePath, NS_LDAP_HOST_CERTPATH_P); 11497c478bd9Sstevel@tonic-gate 11507c478bd9Sstevel@tonic-gate for (counter = 0; 11517c478bd9Sstevel@tonic-gate counter < arglist->serviceAuthenticationMethod->count; 11527c478bd9Sstevel@tonic-gate counter++) { 11537c478bd9Sstevel@tonic-gate 11547c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 11557c478bd9Sstevel@tonic-gate arglist->serviceAuthenticationMethod->optlist[counter], 11567c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_AUTH_METHOD_P); 11577c478bd9Sstevel@tonic-gate } 11587c478bd9Sstevel@tonic-gate for (counter = 0; 11597c478bd9Sstevel@tonic-gate counter < arglist->serviceCredentialLevel->count; 11607c478bd9Sstevel@tonic-gate counter++) { 11617c478bd9Sstevel@tonic-gate 11627c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 11637c478bd9Sstevel@tonic-gate arglist->serviceCredentialLevel->optlist[counter], 11647c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_CRED_LEVEL_P); 11657c478bd9Sstevel@tonic-gate } 11667c478bd9Sstevel@tonic-gate for (counter = 0; 11677c478bd9Sstevel@tonic-gate counter < arglist->objectclassMap->count; 11687c478bd9Sstevel@tonic-gate counter++) { 11697c478bd9Sstevel@tonic-gate 11707c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 11717c478bd9Sstevel@tonic-gate arglist->objectclassMap->optlist[counter], 11727c478bd9Sstevel@tonic-gate NS_LDAP_OBJECTCLASSMAP_P); 11737c478bd9Sstevel@tonic-gate } 11747c478bd9Sstevel@tonic-gate for (counter = 0; 11757c478bd9Sstevel@tonic-gate counter < arglist->attributeMap->count; 11767c478bd9Sstevel@tonic-gate counter++) { 11777c478bd9Sstevel@tonic-gate 11787c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 11797c478bd9Sstevel@tonic-gate arglist->attributeMap->optlist[counter], 11807c478bd9Sstevel@tonic-gate NS_LDAP_ATTRIBUTEMAP_P); 11817c478bd9Sstevel@tonic-gate } 11827c478bd9Sstevel@tonic-gate for (counter = 0; 11837c478bd9Sstevel@tonic-gate counter < arglist->serviceSearchDescriptor->count; 11847c478bd9Sstevel@tonic-gate counter++) { 11857c478bd9Sstevel@tonic-gate 11867c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 11877c478bd9Sstevel@tonic-gate arglist->serviceSearchDescriptor->optlist[counter], 11887c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_SEARCH_DESC_P); 11897c478bd9Sstevel@tonic-gate } 11907c478bd9Sstevel@tonic-gate 11917c478bd9Sstevel@tonic-gate retcode = credCheck(arglist); 1192dd1104fbSMichen Chang if (retcode == CLIENT_SUCCESS) 1193dd1104fbSMichen Chang retcode = adminCredCheck(arglist); 11947c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 11957c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 11967c478bd9Sstevel@tonic-gate gettext("Error in setting up credentials\n"), 11977c478bd9Sstevel@tonic-gate stderr); 11987c478bd9Sstevel@tonic-gate return (retcode); 11997c478bd9Sstevel@tonic-gate } 12007c478bd9Sstevel@tonic-gate 12017c478bd9Sstevel@tonic-gate if (mode_verbose) 12027c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12037c478bd9Sstevel@tonic-gate gettext("About to modify this machines configuration " 12047c478bd9Sstevel@tonic-gate "by writing the files\n"), 12057c478bd9Sstevel@tonic-gate stderr); 12067c478bd9Sstevel@tonic-gate 12077c478bd9Sstevel@tonic-gate /* get ready to start playing with files */ 12087c478bd9Sstevel@tonic-gate retcode = stop_services(STATE_SAVE); 12097c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 12107c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12117c478bd9Sstevel@tonic-gate gettext("Errors stopping network services.\n"), stderr); 12127c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 12137c478bd9Sstevel@tonic-gate } 12147c478bd9Sstevel@tonic-gate 12157c478bd9Sstevel@tonic-gate /* Temporarily save orig versions of files */ 12167c478bd9Sstevel@tonic-gate retcode = mod_backup(); 12177c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 12187c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12197c478bd9Sstevel@tonic-gate gettext("Unable to backup the ldap client files!\n"), 12207c478bd9Sstevel@tonic-gate stderr); 12217c478bd9Sstevel@tonic-gate 12227c478bd9Sstevel@tonic-gate return (retcode); 12237c478bd9Sstevel@tonic-gate 12247c478bd9Sstevel@tonic-gate } 12257c478bd9Sstevel@tonic-gate 12267c478bd9Sstevel@tonic-gate /* Dump new files */ 12277c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCONFIGFILE); 12287c478bd9Sstevel@tonic-gate if (errorp != NULL) { 12297c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 12307c478bd9Sstevel@tonic-gate gettext("%s mod: errorp is not NULL; %s\n"), 12317c478bd9Sstevel@tonic-gate cmd, errorp->message); 12327c478bd9Sstevel@tonic-gate retcode = mod_recover(); 12337c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 12347c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12357c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 12367c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 12377c478bd9Sstevel@tonic-gate "config files is required.\n"), 12387c478bd9Sstevel@tonic-gate stderr); 12397c478bd9Sstevel@tonic-gate } 12407c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 12417c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 12427c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 12437c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 12447c478bd9Sstevel@tonic-gate "starting services during reset\n"), 12457c478bd9Sstevel@tonic-gate reset_ret); 12467c478bd9Sstevel@tonic-gate } 12477c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 12487c478bd9Sstevel@tonic-gate } 12497c478bd9Sstevel@tonic-gate 12507c478bd9Sstevel@tonic-gate /* if (credargs(arglist)) */ 12517c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCREDFILE); 12527c478bd9Sstevel@tonic-gate if (errorp != NULL) { 12537c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 12547c478bd9Sstevel@tonic-gate gettext("%s mod: errorp is not NULL; %s\n"), 12557c478bd9Sstevel@tonic-gate cmd, errorp->message); 12567c478bd9Sstevel@tonic-gate retcode = mod_recover(); 12577c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 12587c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12597c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 12607c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 12617c478bd9Sstevel@tonic-gate "config files is required.\n"), 12627c478bd9Sstevel@tonic-gate stderr); 12637c478bd9Sstevel@tonic-gate } 12647c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 12657c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 12667c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 12677c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 12687c478bd9Sstevel@tonic-gate "starting services during reset\n"), 12697c478bd9Sstevel@tonic-gate reset_ret); 12707c478bd9Sstevel@tonic-gate } 12717c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 12727c478bd9Sstevel@tonic-gate } 12737c478bd9Sstevel@tonic-gate 12747c478bd9Sstevel@tonic-gate if ((domain_fp = open(DOMAINNAME, O_WRONLY|O_CREAT|O_TRUNC, 12757c478bd9Sstevel@tonic-gate S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) { /* 0644 */ 12767c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Cannot open %s\n"), DOMAINNAME); 12777c478bd9Sstevel@tonic-gate retcode = mod_recover(); 12787c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 12797c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 12807c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 12817c478bd9Sstevel@tonic-gate "failed! Machine needs to be " 12827c478bd9Sstevel@tonic-gate "fixed!\n"), 12837c478bd9Sstevel@tonic-gate stderr); 12847c478bd9Sstevel@tonic-gate } 12857c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 12867c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 12877c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 12887c478bd9Sstevel@tonic-gate "starting services during reset\n"), 12897c478bd9Sstevel@tonic-gate reset_ret); 12907c478bd9Sstevel@tonic-gate } 12917c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 12927c478bd9Sstevel@tonic-gate } 12937c478bd9Sstevel@tonic-gate (void) write(domain_fp, dname, strlen(dname)); 12947c478bd9Sstevel@tonic-gate (void) write(domain_fp, "\n", 1); 12957c478bd9Sstevel@tonic-gate (void) close(domain_fp); 12967c478bd9Sstevel@tonic-gate 12977c478bd9Sstevel@tonic-gate retcode = start_services(START_INIT); 12987c478bd9Sstevel@tonic-gate 12997c478bd9Sstevel@tonic-gate if (retcode == CLIENT_SUCCESS) { 13007c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("System successfully configured\n"), 13017c478bd9Sstevel@tonic-gate stderr); 13027c478bd9Sstevel@tonic-gate } else { 13037c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error resetting system.\n" 13047c478bd9Sstevel@tonic-gate "Recovering old system settings.\n"), stderr), 13057c478bd9Sstevel@tonic-gate 13067c478bd9Sstevel@tonic-gate /* stop any started services for recover */ 13077c478bd9Sstevel@tonic-gate /* don't stomp on history of saved services state */ 13087c478bd9Sstevel@tonic-gate reset_ret = stop_services(STATE_NOSAVE); 13097c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 13107c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 13117c478bd9Sstevel@tonic-gate "stopping services during reset\n"), 13127c478bd9Sstevel@tonic-gate reset_ret); 13137c478bd9Sstevel@tonic-gate /* Coninue and try to recover what we can */ 13147c478bd9Sstevel@tonic-gate } 13157c478bd9Sstevel@tonic-gate reset_ret = mod_recover(); 13167c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 13177c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 13187c478bd9Sstevel@tonic-gate "recovering service files during " 13197c478bd9Sstevel@tonic-gate "reset\n"), reset_ret); 13207c478bd9Sstevel@tonic-gate /* Continue and start what we can */ 13217c478bd9Sstevel@tonic-gate } 13227c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 13237c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 13247c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 13257c478bd9Sstevel@tonic-gate "starting services during reset\n"), 13267c478bd9Sstevel@tonic-gate reset_ret); 13277c478bd9Sstevel@tonic-gate } 13287c478bd9Sstevel@tonic-gate } 13297c478bd9Sstevel@tonic-gate 13307c478bd9Sstevel@tonic-gate /* Cleanup temporary files created by mod_backup() */ 13317c478bd9Sstevel@tonic-gate mod_cleanup(); 13327c478bd9Sstevel@tonic-gate 13337c478bd9Sstevel@tonic-gate return (retcode); 13347c478bd9Sstevel@tonic-gate } 13357c478bd9Sstevel@tonic-gate 13367c478bd9Sstevel@tonic-gate 13377c478bd9Sstevel@tonic-gate static int 13387c478bd9Sstevel@tonic-gate client_genProfile(clientopts_t *arglist) 13397c478bd9Sstevel@tonic-gate { 13407c478bd9Sstevel@tonic-gate int counter; 13417c478bd9Sstevel@tonic-gate int retcode; /* required for LDAP_SET_PARAM macro */ 13427c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 13437c478bd9Sstevel@tonic-gate 13447c478bd9Sstevel@tonic-gate if (mode_verbose) 13457c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("About to generate a profile\n"), stderr); 13467c478bd9Sstevel@tonic-gate 13477c478bd9Sstevel@tonic-gate /* *** Check for invalid args *** */ 13487c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->proxyDN, "proxyDN"); 13497c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->proxyPassword, "proxyPassword"); 1350dd1104fbSMichen Chang LDAP_CHECK_INVALID(arglist->enableShadowUpdate, 1351dd1104fbSMichen Chang "enableShadowUpdate"); 1352dd1104fbSMichen Chang LDAP_CHECK_INVALID(arglist->adminDN, "adminDN"); 1353dd1104fbSMichen Chang LDAP_CHECK_INVALID(arglist->adminPassword, "adminPassword"); 13547c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->certificatePath, "certificatePath"); 13557c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->domainName, "domainName"); 1356e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindDN, "bind DN"); 1357e1dd0a2fSth160488 LDAP_CHECK_INVALID(arglist->bindPasswd, "bind password"); 13587c478bd9Sstevel@tonic-gate /* *** End check for invalid args *** */ 13597c478bd9Sstevel@tonic-gate 13607c478bd9Sstevel@tonic-gate if (arglist->profileName == NULL) { 13617c478bd9Sstevel@tonic-gate if (mode_verbose) 13627c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 13637c478bd9Sstevel@tonic-gate gettext("No profile specified. " 13647c478bd9Sstevel@tonic-gate "Using \"default\"\n"), 13657c478bd9Sstevel@tonic-gate stderr); 13667c478bd9Sstevel@tonic-gate arglist->profileName = "default"; 13677c478bd9Sstevel@tonic-gate } 13687c478bd9Sstevel@tonic-gate 13697c478bd9Sstevel@tonic-gate __ns_ldap_setServer(TRUE); 13707c478bd9Sstevel@tonic-gate __ns_ldap_default_config(); 13717c478bd9Sstevel@tonic-gate 13727c478bd9Sstevel@tonic-gate /* Set version to latest (not version 1) */ 13737c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(NS_LDAP_VERSION, NS_LDAP_FILE_VERSION_P); 13747c478bd9Sstevel@tonic-gate 13757c478bd9Sstevel@tonic-gate /* Set additional valid params from command line */ 13767c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->authenticationMethod, NS_LDAP_AUTH_P); 13777c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchBase, NS_LDAP_SEARCH_BASEDN_P); 13787c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->credentialLevel, NS_LDAP_CREDENTIAL_LEVEL_P); 13797c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->profileTTL, NS_LDAP_CACHETTL_P); 13807c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->searchTimeLimit, NS_LDAP_SEARCH_TIME_P); 13817c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->preferredServerList, NS_LDAP_SERVER_PREF_P); 13827c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->profileName, NS_LDAP_PROFILE_P); 13837c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->followReferrals, NS_LDAP_SEARCH_REF_P); 13847c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultSearchScope, NS_LDAP_SEARCH_SCOPE_P); 13857c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->bindTimeLimit, NS_LDAP_BIND_TIME_P); 13867c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->defaultServerList, NS_LDAP_SERVERS_P); 13877c478bd9Sstevel@tonic-gate 13887c478bd9Sstevel@tonic-gate for (counter = 0; 13897c478bd9Sstevel@tonic-gate counter < arglist->serviceAuthenticationMethod->count; 13907c478bd9Sstevel@tonic-gate counter++) { 13917c478bd9Sstevel@tonic-gate 13927c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 13937c478bd9Sstevel@tonic-gate arglist->serviceAuthenticationMethod->optlist[counter], 13947c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_AUTH_METHOD_P); 13957c478bd9Sstevel@tonic-gate } 13967c478bd9Sstevel@tonic-gate for (counter = 0; 13977c478bd9Sstevel@tonic-gate counter < arglist->serviceCredentialLevel->count; 13987c478bd9Sstevel@tonic-gate counter++) { 13997c478bd9Sstevel@tonic-gate 14007c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 14017c478bd9Sstevel@tonic-gate arglist->serviceCredentialLevel->optlist[counter], 14027c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_CRED_LEVEL_P); 14037c478bd9Sstevel@tonic-gate } 14047c478bd9Sstevel@tonic-gate for (counter = 0; 14057c478bd9Sstevel@tonic-gate counter < arglist->objectclassMap->count; 14067c478bd9Sstevel@tonic-gate counter++) { 14077c478bd9Sstevel@tonic-gate 14087c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 14097c478bd9Sstevel@tonic-gate arglist->objectclassMap->optlist[counter], 14107c478bd9Sstevel@tonic-gate NS_LDAP_OBJECTCLASSMAP_P); 14117c478bd9Sstevel@tonic-gate } 14127c478bd9Sstevel@tonic-gate for (counter = 0; 14137c478bd9Sstevel@tonic-gate counter < arglist->attributeMap->count; 14147c478bd9Sstevel@tonic-gate counter++) { 14157c478bd9Sstevel@tonic-gate 14167c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 14177c478bd9Sstevel@tonic-gate arglist->attributeMap->optlist[counter], 14187c478bd9Sstevel@tonic-gate NS_LDAP_ATTRIBUTEMAP_P); 14197c478bd9Sstevel@tonic-gate } 14207c478bd9Sstevel@tonic-gate for (counter = 0; 14217c478bd9Sstevel@tonic-gate counter < arglist->serviceSearchDescriptor->count; 14227c478bd9Sstevel@tonic-gate counter++) { 14237c478bd9Sstevel@tonic-gate 14247c478bd9Sstevel@tonic-gate LDAP_SET_PARAM( 14257c478bd9Sstevel@tonic-gate arglist->serviceSearchDescriptor->optlist[counter], 14267c478bd9Sstevel@tonic-gate NS_LDAP_SERVICE_SEARCH_DESC_P); 14277c478bd9Sstevel@tonic-gate } 14287c478bd9Sstevel@tonic-gate 14297c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpLdif(NULL); 14307c478bd9Sstevel@tonic-gate if (errorp != NULL) { 14317c478bd9Sstevel@tonic-gate CLIENT_FPUTS(errorp->message, stderr); 14327c478bd9Sstevel@tonic-gate CLIENT_FPUTC('\n', stderr); 14337c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 14347c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 14357c478bd9Sstevel@tonic-gate } 14367c478bd9Sstevel@tonic-gate 14377c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 14387c478bd9Sstevel@tonic-gate } 14397c478bd9Sstevel@tonic-gate 1440e1dd0a2fSth160488 /* INET6_ADDRSTRLEN + ":" + <5-digit port> + some round-up */ 1441e1dd0a2fSth160488 #define MAX_HOSTADDR_LEN (INET6_ADDRSTRLEN + 6 + 12) 1442e1dd0a2fSth160488 14437c478bd9Sstevel@tonic-gate static int 14447c478bd9Sstevel@tonic-gate client_init(clientopts_t *arglist) 14457c478bd9Sstevel@tonic-gate { 14467c478bd9Sstevel@tonic-gate int profile_fp; 14477c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 14487c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 14497c478bd9Sstevel@tonic-gate int reset_ret; 14507c478bd9Sstevel@tonic-gate int ret_copy; 1451e1dd0a2fSth160488 ns_standalone_conf_t cfg = standaloneDefaults; 1452e1dd0a2fSth160488 ns_auth_t auth = {NS_LDAP_AUTH_NONE, 1453e1dd0a2fSth160488 NS_LDAP_TLS_NONE, 1454e1dd0a2fSth160488 NS_LDAP_SASL_NONE, 1455e1dd0a2fSth160488 NS_LDAP_SASLOPT_NONE}; 1456e1dd0a2fSth160488 char peer[MAX_HOSTADDR_LEN]; 1457e1dd0a2fSth160488 ns_auth_t **authMethod; 1458e1dd0a2fSth160488 int **credLevel, i; 1459e1dd0a2fSth160488 char *cred; 14607c478bd9Sstevel@tonic-gate 14617c478bd9Sstevel@tonic-gate if (mode_verbose) 14627c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 14637c478bd9Sstevel@tonic-gate gettext("About to configure machine by downloading " 14647c478bd9Sstevel@tonic-gate "a profile\n"), 14657c478bd9Sstevel@tonic-gate stderr); 14667c478bd9Sstevel@tonic-gate 14677c478bd9Sstevel@tonic-gate if (dname == NULL) { 14687c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 14697c478bd9Sstevel@tonic-gate gettext("Init failed: System domain not set and " 14707c478bd9Sstevel@tonic-gate "no domainName specified.\n"), 14717c478bd9Sstevel@tonic-gate stderr); 14727c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 14737c478bd9Sstevel@tonic-gate } 14747c478bd9Sstevel@tonic-gate 14757c478bd9Sstevel@tonic-gate if (!arglist->defaultServerList) { 14767c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Missing LDAP server address\n"), stderr); 14777c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 14787c478bd9Sstevel@tonic-gate } 14797c478bd9Sstevel@tonic-gate 14807c478bd9Sstevel@tonic-gate /* *** Check for invalid args *** */ 14817c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->defaultSearchBase, 14827c478bd9Sstevel@tonic-gate "defaultSearchBase"); 14837c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->profileTTL, 14847c478bd9Sstevel@tonic-gate "profileTTL"); 14857c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->searchTimeLimit, 14867c478bd9Sstevel@tonic-gate "searchTimeLimit"); 14877c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->preferredServerList, 14887c478bd9Sstevel@tonic-gate "preferredServerList"); 14897c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->followReferrals, 14907c478bd9Sstevel@tonic-gate "followReferrals"); 14917c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->defaultSearchScope, 14927c478bd9Sstevel@tonic-gate "defaultSearchScope"); 14937c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->bindTimeLimit, 14947c478bd9Sstevel@tonic-gate "bindTimeLimit"); 14957c478bd9Sstevel@tonic-gate 14967c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->objectclassMap->count, 14977c478bd9Sstevel@tonic-gate "objectclassMap"); 14987c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->attributeMap->count, 14997c478bd9Sstevel@tonic-gate "attributeMap"); 15007c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->serviceAuthenticationMethod->count, 15017c478bd9Sstevel@tonic-gate "serviceAuthenticationMethod"); 15027c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->serviceCredentialLevel->count, 15037c478bd9Sstevel@tonic-gate "serviceCredentialLevel"); 15047c478bd9Sstevel@tonic-gate LDAP_CHECK_INVALID(arglist->serviceSearchDescriptor->count, 15057c478bd9Sstevel@tonic-gate "serviceSearchDescriptor"); 15067c478bd9Sstevel@tonic-gate /* *** End check for invalid args *** */ 15077c478bd9Sstevel@tonic-gate 15087c478bd9Sstevel@tonic-gate if (arglist->profileName == NULL) { 15097c478bd9Sstevel@tonic-gate if (mode_verbose) 15107c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 15117c478bd9Sstevel@tonic-gate gettext("No profile specified. " 15127c478bd9Sstevel@tonic-gate "Using \"default\"\n"), 15137c478bd9Sstevel@tonic-gate stderr); 15147c478bd9Sstevel@tonic-gate arglist->profileName = "default"; 15157c478bd9Sstevel@tonic-gate } 15167c478bd9Sstevel@tonic-gate 1517e1dd0a2fSth160488 (void) strncpy(peer, arglist->defaultServerList, MAX_HOSTADDR_LEN - 1); 1518e1dd0a2fSth160488 if (separatePort(peer, &cfg.SA_SERVER, &cfg.SA_PORT) > 0) { 1519e1dd0a2fSth160488 return (CLIENT_ERR_FAIL); 1520e1dd0a2fSth160488 } 1521e1dd0a2fSth160488 1522e1dd0a2fSth160488 if (arglist->bindDN != NULL) { 1523e1dd0a2fSth160488 cfg.SA_CRED = "proxy"; 1524e1dd0a2fSth160488 /* 1525e1dd0a2fSth160488 * We don't want to force users to always specify authentication 1526dd1104fbSMichen Chang * method when we can infer it. If users want SSL, he/she would 1527e1dd0a2fSth160488 * have to specify appropriate -a though. 1528e1dd0a2fSth160488 */ 1529e1dd0a2fSth160488 auth.type = NS_LDAP_AUTH_SIMPLE; 1530e1dd0a2fSth160488 if (arglist->bindPasswd == NULL) { 1531e1dd0a2fSth160488 arglist->bindPasswd = 1532e1dd0a2fSth160488 getpassphrase("Bind Password:"); 1533e1dd0a2fSth160488 if (arglist->bindPasswd == NULL) { 1534e1dd0a2fSth160488 CLIENT_FPUTS(gettext("Get password failed\n"), 1535e1dd0a2fSth160488 stderr); 15367c478bd9Sstevel@tonic-gate 15377c478bd9Sstevel@tonic-gate if (gStartLdap == START_RESET) 15387c478bd9Sstevel@tonic-gate (void) start_service(LDAP_FMRI, B_TRUE); 15397c478bd9Sstevel@tonic-gate 1540e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 15417c478bd9Sstevel@tonic-gate } 15427c478bd9Sstevel@tonic-gate } 1543e1dd0a2fSth160488 } 1544e1dd0a2fSth160488 cfg.SA_BIND_DN = arglist->bindDN; 1545e1dd0a2fSth160488 cfg.SA_BIND_PWD = arglist->bindPasswd; 15467c478bd9Sstevel@tonic-gate 1547e1dd0a2fSth160488 if (arglist->authenticationMethod != NULL) { 1548e1dd0a2fSth160488 if (__ns_ldap_initAuth(arglist->authenticationMethod, 1549e1dd0a2fSth160488 &auth, &errorp) != NS_LDAP_SUCCESS) { 15507c478bd9Sstevel@tonic-gate if (errorp != NULL) { 1551e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 15527c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 1553e1dd0a2fSth160488 } 1554e1dd0a2fSth160488 1555e1dd0a2fSth160488 if (gStartLdap == START_RESET) 1556e1dd0a2fSth160488 (void) start_service(LDAP_FMRI, B_TRUE); 1557e1dd0a2fSth160488 1558e1dd0a2fSth160488 return (CLIENT_ERR_FAIL); 1559e1dd0a2fSth160488 } 1560e1dd0a2fSth160488 cfg.SA_AUTH = &auth; 1561e1dd0a2fSth160488 } 1562e1dd0a2fSth160488 cfg.SA_CRED = arglist->credentialLevel; 1563e1dd0a2fSth160488 1564e1dd0a2fSth160488 cfg.SA_DOMAIN = arglist->domainName; 1565e1dd0a2fSth160488 cfg.SA_PROFILE_NAME = arglist->profileName; 1566e1dd0a2fSth160488 cfg.SA_CERT_PATH = arglist->certificatePath; 1567e1dd0a2fSth160488 1568e1dd0a2fSth160488 cfg.type = NS_LDAP_SERVER; 1569e1dd0a2fSth160488 1570e1dd0a2fSth160488 if (__ns_ldap_initStandalone(&cfg, &errorp) != NS_LDAP_SUCCESS) { 1571e1dd0a2fSth160488 if (errorp != NULL) { 1572e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 1573e1dd0a2fSth160488 (void) __ns_ldap_freeError(&errorp); 15747c478bd9Sstevel@tonic-gate } 15757c478bd9Sstevel@tonic-gate 15767c478bd9Sstevel@tonic-gate if (gStartLdap == START_RESET) 15777c478bd9Sstevel@tonic-gate (void) start_service(LDAP_FMRI, B_TRUE); 15787c478bd9Sstevel@tonic-gate 15797c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 15807c478bd9Sstevel@tonic-gate } 15817c478bd9Sstevel@tonic-gate 1582e1dd0a2fSth160488 if (arglist->proxyDN != NULL && arglist->proxyPassword == NULL) { 1583e1dd0a2fSth160488 arglist->proxyPassword = getpassphrase("Proxy Bind Password:"); 1584e1dd0a2fSth160488 if (arglist->proxyPassword == NULL) { 1585e1dd0a2fSth160488 CLIENT_FPUTS(gettext("Get password failed\n"), stderr); 1586e1dd0a2fSth160488 1587e1dd0a2fSth160488 if (gStartLdap == START_RESET) 1588e1dd0a2fSth160488 (void) start_service(LDAP_FMRI, B_TRUE); 1589e1dd0a2fSth160488 1590e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 15917c478bd9Sstevel@tonic-gate } 15927c478bd9Sstevel@tonic-gate } 1593e1dd0a2fSth160488 if (arglist->proxyDN != NULL && arglist->proxyPassword != NULL) { 1594e1dd0a2fSth160488 if (__ns_ldap_setParam(NS_LDAP_BINDDN_P, 1595e1dd0a2fSth160488 arglist->proxyDN, &errorp) != NS_LDAP_SUCCESS) { 1596e1dd0a2fSth160488 if (errorp != NULL) { 1597e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 1598e1dd0a2fSth160488 (void) __ns_ldap_freeError(&errorp); 1599e1dd0a2fSth160488 } 1600e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 1601e1dd0a2fSth160488 } 1602e1dd0a2fSth160488 if (__ns_ldap_setParam(NS_LDAP_BINDPASSWD_P, 1603e1dd0a2fSth160488 arglist->proxyPassword, &errorp) != NS_LDAP_SUCCESS) { 1604e1dd0a2fSth160488 if (errorp != NULL) { 1605e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 1606e1dd0a2fSth160488 (void) __ns_ldap_freeError(&errorp); 1607e1dd0a2fSth160488 } 1608e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 1609e1dd0a2fSth160488 } 1610e1dd0a2fSth160488 } 1611e1dd0a2fSth160488 1612dd1104fbSMichen Chang if (arglist->enableShadowUpdate != NULL) { 1613dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->enableShadowUpdate, 1614dd1104fbSMichen Chang NS_LDAP_ENABLE_SHADOW_UPDATE_P); 1615dd1104fbSMichen Chang } 1616dd1104fbSMichen Chang 1617dd1104fbSMichen Chang if (arglist->enableShadowUpdate && 1618dd1104fbSMichen Chang strcasecmp(arglist->enableShadowUpdate, "TRUE") == 0 && 1619dd1104fbSMichen Chang arglist->adminDN != NULL && arglist->adminPassword == NULL) { 1620dd1104fbSMichen Chang arglist->adminPassword = getpassphrase("admin Bind Password:"); 1621dd1104fbSMichen Chang if (arglist->adminPassword == NULL) { 1622dd1104fbSMichen Chang CLIENT_FPUTS(gettext("Get password failed\n"), stderr); 1623dd1104fbSMichen Chang 1624dd1104fbSMichen Chang if (gStartLdap == START_RESET) 1625dd1104fbSMichen Chang (void) start_service(LDAP_FMRI, B_TRUE); 1626dd1104fbSMichen Chang 1627dd1104fbSMichen Chang return (CLIENT_ERR_CREDENTIAL); 1628dd1104fbSMichen Chang } 1629dd1104fbSMichen Chang } 1630dd1104fbSMichen Chang if (arglist->adminDN != NULL && arglist->adminPassword != NULL) { 1631dd1104fbSMichen Chang if (__ns_ldap_setParam(NS_LDAP_ADMIN_BINDDN_P, 1632dd1104fbSMichen Chang arglist->adminDN, &errorp) != NS_LDAP_SUCCESS) { 1633dd1104fbSMichen Chang if (errorp != NULL) { 1634dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, "%s\n", errorp->message); 1635dd1104fbSMichen Chang (void) __ns_ldap_freeError(&errorp); 1636dd1104fbSMichen Chang } 1637dd1104fbSMichen Chang return (CLIENT_ERR_CREDENTIAL); 1638dd1104fbSMichen Chang } 1639dd1104fbSMichen Chang if (__ns_ldap_setParam(NS_LDAP_ADMIN_BINDPASSWD_P, 1640dd1104fbSMichen Chang arglist->adminPassword, &errorp) != NS_LDAP_SUCCESS) { 1641dd1104fbSMichen Chang if (errorp != NULL) { 1642dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, "%s\n", errorp->message); 1643dd1104fbSMichen Chang (void) __ns_ldap_freeError(&errorp); 1644dd1104fbSMichen Chang } 1645dd1104fbSMichen Chang return (CLIENT_ERR_CREDENTIAL); 1646dd1104fbSMichen Chang } 1647dd1104fbSMichen Chang } 1648dd1104fbSMichen Chang 1649e1dd0a2fSth160488 if (arglist->authenticationMethod != NULL) { 1650e1dd0a2fSth160488 if (__ns_ldap_getParam(NS_LDAP_AUTH_P, 1651e1dd0a2fSth160488 (void ***)&authMethod, &errorp) != NS_LDAP_SUCCESS) { 1652e1dd0a2fSth160488 if (errorp != NULL) { 1653e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 1654e1dd0a2fSth160488 (void) __ns_ldap_freeError(&errorp); 1655e1dd0a2fSth160488 } 1656e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 1657e1dd0a2fSth160488 } 1658e1dd0a2fSth160488 1659e1dd0a2fSth160488 if (authMethod != NULL) { 1660e1dd0a2fSth160488 for (i = 0; authMethod[i] != NULL; ++i) { 1661e1dd0a2fSth160488 if (authMethod[i]->type == auth.type) { 1662e1dd0a2fSth160488 break; 1663e1dd0a2fSth160488 } 1664e1dd0a2fSth160488 } 1665e1dd0a2fSth160488 1666e1dd0a2fSth160488 if (authMethod[i] == NULL) { 1667e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, gettext( 1668e1dd0a2fSth160488 "Warning: init authentication method " 1669e1dd0a2fSth160488 "not found in DUAConfigProfile.\n")); 1670e1dd0a2fSth160488 } else { 1671e1dd0a2fSth160488 if (i != 0) { 1672e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, 1673e1dd0a2fSth160488 gettext( 1674e1dd0a2fSth160488 "Warning: init authentication" 1675e1dd0a2fSth160488 "method using secondary " 1676e1dd0a2fSth160488 "authentication method from " 1677e1dd0a2fSth160488 "DUAConfigProfile.\n")); 1678e1dd0a2fSth160488 } 1679e1dd0a2fSth160488 } 1680e1dd0a2fSth160488 (void) __ns_ldap_freeParam((void ***) &authMethod); 1681e1dd0a2fSth160488 } 1682e1dd0a2fSth160488 } 1683e1dd0a2fSth160488 1684e1dd0a2fSth160488 if (arglist->credentialLevel != NULL) { 1685e1dd0a2fSth160488 if (__ns_ldap_getParam(NS_LDAP_CREDENTIAL_LEVEL_P, 1686e1dd0a2fSth160488 (void ***)&credLevel, &errorp) != NS_LDAP_SUCCESS) { 1687e1dd0a2fSth160488 if (errorp != NULL) { 1688e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, "%s", errorp->message); 1689e1dd0a2fSth160488 (void) __ns_ldap_freeError(&errorp); 1690e1dd0a2fSth160488 } 1691e1dd0a2fSth160488 return (CLIENT_ERR_CREDENTIAL); 1692e1dd0a2fSth160488 } 1693e1dd0a2fSth160488 if (credLevel != NULL) { 1694e1dd0a2fSth160488 for (i = 0; credLevel[i] != NULL; ++i) { 1695e1dd0a2fSth160488 switch (*credLevel[i]) { 1696e1dd0a2fSth160488 case NS_LDAP_CRED_ANON : 1697e1dd0a2fSth160488 cred = "none"; 1698e1dd0a2fSth160488 break; 1699e1dd0a2fSth160488 case NS_LDAP_CRED_PROXY : 1700e1dd0a2fSth160488 cred = "proxy"; 1701e1dd0a2fSth160488 break; 1702e1dd0a2fSth160488 case NS_LDAP_CRED_SELF : 1703e1dd0a2fSth160488 cred = "self"; 1704e1dd0a2fSth160488 break; 1705e1dd0a2fSth160488 default: 1706e1dd0a2fSth160488 continue; 1707e1dd0a2fSth160488 } 1708e1dd0a2fSth160488 if (strcmp(cred, 1709e1dd0a2fSth160488 arglist->credentialLevel) == 0) { 1710e1dd0a2fSth160488 break; 1711e1dd0a2fSth160488 } 1712e1dd0a2fSth160488 } 1713e1dd0a2fSth160488 if (credLevel[i] == NULL) { 1714e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, gettext( 1715e1dd0a2fSth160488 "Warning: init credential level not found " 1716e1dd0a2fSth160488 "in DUAConfigProfile.\n")); 1717e1dd0a2fSth160488 } else { 1718e1dd0a2fSth160488 if (i != 0) { 1719e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, 1720e1dd0a2fSth160488 gettext("Warning: " 1721e1dd0a2fSth160488 "init credential level using " 1722e1dd0a2fSth160488 "secondary credential level from " 1723e1dd0a2fSth160488 "DUAConfigProfile.\n")); 1724e1dd0a2fSth160488 } 1725e1dd0a2fSth160488 } 1726e1dd0a2fSth160488 (void) __ns_ldap_freeParam((void ***) &credLevel); 1727e1dd0a2fSth160488 } 1728e1dd0a2fSth160488 } 17297c478bd9Sstevel@tonic-gate 17307c478bd9Sstevel@tonic-gate retcode = credCheck(arglist); 1731dd1104fbSMichen Chang if (retcode == CLIENT_SUCCESS) 1732dd1104fbSMichen Chang retcode = adminCredCheck(arglist); 17337c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 17347c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17357c478bd9Sstevel@tonic-gate gettext("Error in setting up credentials\n"), stderr); 17367c478bd9Sstevel@tonic-gate 17377c478bd9Sstevel@tonic-gate if (gStartLdap == START_RESET) 17387c478bd9Sstevel@tonic-gate (void) start_service(LDAP_FMRI, B_TRUE); 17397c478bd9Sstevel@tonic-gate 17407c478bd9Sstevel@tonic-gate return (retcode); 17417c478bd9Sstevel@tonic-gate } 17427c478bd9Sstevel@tonic-gate 17437c478bd9Sstevel@tonic-gate if (mode_verbose) 17447c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17457c478bd9Sstevel@tonic-gate gettext("About to modify this machines configuration " 17467c478bd9Sstevel@tonic-gate "by writing the files\n"), 17477c478bd9Sstevel@tonic-gate stderr); 17487c478bd9Sstevel@tonic-gate 17497c478bd9Sstevel@tonic-gate /* get ready to start playing with files */ 17507c478bd9Sstevel@tonic-gate retcode = stop_services(STATE_SAVE); 17517c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 17527c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17537c478bd9Sstevel@tonic-gate gettext("Errors stopping network services.\n"), stderr); 17547c478bd9Sstevel@tonic-gate 17557c478bd9Sstevel@tonic-gate if (gStartLdap == START_RESET) 17567c478bd9Sstevel@tonic-gate (void) start_service(LDAP_FMRI, B_TRUE); 17577c478bd9Sstevel@tonic-gate 17587c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 17597c478bd9Sstevel@tonic-gate } 17607c478bd9Sstevel@tonic-gate 17617c478bd9Sstevel@tonic-gate /* Save orig versions of files */ 17627c478bd9Sstevel@tonic-gate retcode = file_backup(); 17637c478bd9Sstevel@tonic-gate if (retcode == CLIENT_ERR_RESTORE) { 17647c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17657c478bd9Sstevel@tonic-gate gettext("System not in state to enable ldap client.\n"), 17667c478bd9Sstevel@tonic-gate stderr); 17677c478bd9Sstevel@tonic-gate 17687c478bd9Sstevel@tonic-gate return (retcode); 17697c478bd9Sstevel@tonic-gate 17707c478bd9Sstevel@tonic-gate } else if (retcode != CLIENT_SUCCESS) { 17717c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17727c478bd9Sstevel@tonic-gate gettext("Save of system configuration failed. " 17737c478bd9Sstevel@tonic-gate "Attempting recovery.\n"), 17747c478bd9Sstevel@tonic-gate stderr); 17757c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 17767c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 17777c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 17787c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 17797c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 17807c478bd9Sstevel@tonic-gate "config files is required.\n"), 17817c478bd9Sstevel@tonic-gate stderr); 17827c478bd9Sstevel@tonic-gate } 17837c478bd9Sstevel@tonic-gate 17847c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 17857c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 17867c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 17877c478bd9Sstevel@tonic-gate "starting services during reset\n"), 17887c478bd9Sstevel@tonic-gate reset_ret); 17897c478bd9Sstevel@tonic-gate } 17907c478bd9Sstevel@tonic-gate 17917c478bd9Sstevel@tonic-gate return (retcode); 17927c478bd9Sstevel@tonic-gate } 17937c478bd9Sstevel@tonic-gate 17947c478bd9Sstevel@tonic-gate /* Dump new files */ 17957c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCONFIGFILE); 17967c478bd9Sstevel@tonic-gate if (NULL != errorp) { 17977c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 17987c478bd9Sstevel@tonic-gate gettext("%s init: errorp is not NULL; %s\n"), 17997c478bd9Sstevel@tonic-gate cmd, errorp->message); 18007c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 18017c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 18027c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 18037c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 18047c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 18057c478bd9Sstevel@tonic-gate "config files is required.\n"), 18067c478bd9Sstevel@tonic-gate stderr); 18077c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18087c478bd9Sstevel@tonic-gate } 18097c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 18107c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 18117c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 18127c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 18137c478bd9Sstevel@tonic-gate "starting services during reset\n"), 18147c478bd9Sstevel@tonic-gate reset_ret); 18157c478bd9Sstevel@tonic-gate } 18167c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18177c478bd9Sstevel@tonic-gate } 18187c478bd9Sstevel@tonic-gate 18197c478bd9Sstevel@tonic-gate /* if (credargs(arglist)) */ 18207c478bd9Sstevel@tonic-gate errorp = __ns_ldap_DumpConfiguration(NSCREDFILE); 18217c478bd9Sstevel@tonic-gate if (NULL != errorp) { 18227c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 18237c478bd9Sstevel@tonic-gate gettext("%s init: errorp is not NULL; %s\n"), 18247c478bd9Sstevel@tonic-gate cmd, errorp->message); 18257c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 18267c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 18277c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 18287c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 18297c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 18307c478bd9Sstevel@tonic-gate "config files is required.\n"), 18317c478bd9Sstevel@tonic-gate stderr); 18327c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18337c478bd9Sstevel@tonic-gate } 18347c478bd9Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp); 18357c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 18367c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 18377c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 18387c478bd9Sstevel@tonic-gate "starting services during reset\n"), 18397c478bd9Sstevel@tonic-gate reset_ret); 18407c478bd9Sstevel@tonic-gate } 18417c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18427c478bd9Sstevel@tonic-gate } 18437c478bd9Sstevel@tonic-gate 18447c478bd9Sstevel@tonic-gate ret_copy = system(CMD_CP " " NSSWITCH_LDAP " " NSSWITCH_CONF); 18457c478bd9Sstevel@tonic-gate if (ret_copy != 0) { 18467c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 18477c478bd9Sstevel@tonic-gate gettext("Error %d copying (%s) -> (%s)\n"), 18487c478bd9Sstevel@tonic-gate ret_copy, NSSWITCH_LDAP, NSSWITCH_CONF); 18497c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 18507c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 18517c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 18527c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 18537c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 18547c478bd9Sstevel@tonic-gate "config files is required.\n"), 18557c478bd9Sstevel@tonic-gate stderr); 18567c478bd9Sstevel@tonic-gate } 18577c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 18587c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 18597c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 18607c478bd9Sstevel@tonic-gate "starting services during reset\n"), 18617c478bd9Sstevel@tonic-gate reset_ret); 18627c478bd9Sstevel@tonic-gate } 18637c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18647c478bd9Sstevel@tonic-gate } 18657c478bd9Sstevel@tonic-gate 18667c478bd9Sstevel@tonic-gate if ((profile_fp = open(DOMAINNAME, O_WRONLY|O_CREAT|O_TRUNC, 18677c478bd9Sstevel@tonic-gate S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) { /* 0644 */ 18687c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Cannot open %s\n"), DOMAINNAME); 18697c478bd9Sstevel@tonic-gate retcode = recover(STATE_NOSAVE); 18707c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 18717c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 18727c478bd9Sstevel@tonic-gate gettext("Recovery of systems configuration " 18737c478bd9Sstevel@tonic-gate "failed. Manual intervention of " 18747c478bd9Sstevel@tonic-gate "config files is required.\n"), 18757c478bd9Sstevel@tonic-gate stderr); 18767c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18777c478bd9Sstevel@tonic-gate } 18787c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 18797c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 18807c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 18817c478bd9Sstevel@tonic-gate "starting services during reset\n"), 18827c478bd9Sstevel@tonic-gate reset_ret); 18837c478bd9Sstevel@tonic-gate } 18847c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 18857c478bd9Sstevel@tonic-gate } 18867c478bd9Sstevel@tonic-gate (void) write(profile_fp, dname, strlen(dname)); 18877c478bd9Sstevel@tonic-gate (void) write(profile_fp, "\n", 1); 18887c478bd9Sstevel@tonic-gate (void) close(profile_fp); 18897c478bd9Sstevel@tonic-gate 18907c478bd9Sstevel@tonic-gate retcode = start_services(START_INIT); 18917c478bd9Sstevel@tonic-gate 18927c478bd9Sstevel@tonic-gate if (retcode == CLIENT_SUCCESS) { 18937c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("System successfully configured\n"), 18947c478bd9Sstevel@tonic-gate stderr); 18957c478bd9Sstevel@tonic-gate } else { 18967c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error resetting system.\n" 18977c478bd9Sstevel@tonic-gate "Recovering old system settings.\n"), stderr), 18987c478bd9Sstevel@tonic-gate 18997c478bd9Sstevel@tonic-gate /* stop any started services for recover */ 19007c478bd9Sstevel@tonic-gate /* don't stomp on history of saved services state */ 19017c478bd9Sstevel@tonic-gate reset_ret = stop_services(STATE_NOSAVE); 19027c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 19037c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 19047c478bd9Sstevel@tonic-gate "stopping services during reset\n"), 19057c478bd9Sstevel@tonic-gate reset_ret); 19067c478bd9Sstevel@tonic-gate /* Coninue and try to recover what we can */ 19077c478bd9Sstevel@tonic-gate } 19087c478bd9Sstevel@tonic-gate reset_ret = recover(STATE_NOSAVE); 19097c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 19107c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 19117c478bd9Sstevel@tonic-gate "recovering service files during " 19127c478bd9Sstevel@tonic-gate "reset\n"), reset_ret); 19137c478bd9Sstevel@tonic-gate /* Continue and start what we can */ 19147c478bd9Sstevel@tonic-gate } 19157c478bd9Sstevel@tonic-gate reset_ret = start_services(START_RESET); 19167c478bd9Sstevel@tonic-gate if (reset_ret != CLIENT_SUCCESS) { 19177c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 19187c478bd9Sstevel@tonic-gate "starting services during reset\n"), 19197c478bd9Sstevel@tonic-gate reset_ret); 19207c478bd9Sstevel@tonic-gate } 19217c478bd9Sstevel@tonic-gate } 19227c478bd9Sstevel@tonic-gate 19237c478bd9Sstevel@tonic-gate return (retcode); 19247c478bd9Sstevel@tonic-gate } 19257c478bd9Sstevel@tonic-gate 19267c478bd9Sstevel@tonic-gate 19277c478bd9Sstevel@tonic-gate static void 19287c478bd9Sstevel@tonic-gate usage(void) 19297c478bd9Sstevel@tonic-gate { 19307c478bd9Sstevel@tonic-gate if (mode_quiet) 19317c478bd9Sstevel@tonic-gate return; 19327c478bd9Sstevel@tonic-gate 19337c478bd9Sstevel@tonic-gate if (gen == 0) { 19347c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 19357c478bd9Sstevel@tonic-gate gettext("Usage: %s [-v | -q] init | manual | mod | " 19367c478bd9Sstevel@tonic-gate "list | uninit [<args>]\n"), 19377c478bd9Sstevel@tonic-gate cmd); 19387c478bd9Sstevel@tonic-gate 1939e1dd0a2fSth160488 CLIENT_FPRINTF(stderr, 1940e1dd0a2fSth160488 gettext("\n %s [-v | -q] [-a authenticationMethod]" 1941e1dd0a2fSth160488 " [-D bindDN]\n\t[-w bindPassword] [-j passswdFile]" 1942dd1104fbSMichen Chang " [-y proxyPasswordFile]\n\t" 1943dd1104fbSMichen Chang "[-z adminPasswordFile] init [<args>]\n"), 1944e1dd0a2fSth160488 cmd); 1945e1dd0a2fSth160488 19467c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 19477c478bd9Sstevel@tonic-gate gettext("\nSet up a server or workstation as a " 19487c478bd9Sstevel@tonic-gate "client of an LDAP namespace.\n"), 19497c478bd9Sstevel@tonic-gate stderr); 19507c478bd9Sstevel@tonic-gate } else { /* genprofile */ 19517c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 19527c478bd9Sstevel@tonic-gate gettext("Usage: %s [-v | -q] genprofile " 19537c478bd9Sstevel@tonic-gate "-a profileName=<name> " 19547c478bd9Sstevel@tonic-gate "-a defaultSearchBase=<base> <args>\n"), 19557c478bd9Sstevel@tonic-gate cmd); 19567c478bd9Sstevel@tonic-gate 19577c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 19587c478bd9Sstevel@tonic-gate gettext("\nGenerate a profile used to set up clients " 19597c478bd9Sstevel@tonic-gate "of an LDAP namespace.\n"), 19607c478bd9Sstevel@tonic-gate stderr); 19617c478bd9Sstevel@tonic-gate } 19627c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 19637c478bd9Sstevel@tonic-gate gettext("<args> take the form of \'-a attrName=attrVal\' as " 19647c478bd9Sstevel@tonic-gate "described in the\n"), 19657c478bd9Sstevel@tonic-gate stderr); 19667c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("man page: ldapclient(1M)\n"), stderr); 19677c478bd9Sstevel@tonic-gate } 19687c478bd9Sstevel@tonic-gate 19697c478bd9Sstevel@tonic-gate 19707c478bd9Sstevel@tonic-gate /* 19717c478bd9Sstevel@tonic-gate * stop_services is called to stop network services prior to their 19727c478bd9Sstevel@tonic-gate * config files being moved/changed. In case a later recovery is needed 19737c478bd9Sstevel@tonic-gate * (an error occurs during config), we detect whether the service is 19747c478bd9Sstevel@tonic-gate * running and store that info so that a reset will only start services 19757c478bd9Sstevel@tonic-gate * that were stopped here. 19767c478bd9Sstevel@tonic-gate * 19777c478bd9Sstevel@tonic-gate * In terms of SMF, this translates to disabling the services. So we 19787c478bd9Sstevel@tonic-gate * try to disable them if they are in any other state 19797c478bd9Sstevel@tonic-gate * 19807c478bd9Sstevel@tonic-gate * Stop order : 19817c478bd9Sstevel@tonic-gate * sendmail, nscd, autofs, ldap.client, nisd (rpc), inetinit(domainname) 19827c478bd9Sstevel@tonic-gate */ 19837c478bd9Sstevel@tonic-gate static int 19847c478bd9Sstevel@tonic-gate stop_services(int saveState) 19857c478bd9Sstevel@tonic-gate { 19867c478bd9Sstevel@tonic-gate int ret; 19877c478bd9Sstevel@tonic-gate 19887c478bd9Sstevel@tonic-gate if (mode_verbose) { 19897c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping network services\n"), stderr); 19907c478bd9Sstevel@tonic-gate } 19917c478bd9Sstevel@tonic-gate 19927c478bd9Sstevel@tonic-gate if (!is_service(SENDMAIL_FMRI, SCF_STATE_STRING_DISABLED)) { 19937c478bd9Sstevel@tonic-gate if (mode_verbose) 19947c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping sendmail\n"), stderr); 19957c478bd9Sstevel@tonic-gate ret = disable_service(SENDMAIL_FMRI, B_TRUE); 19967c478bd9Sstevel@tonic-gate if (ret != CLIENT_SUCCESS) { 19977c478bd9Sstevel@tonic-gate /* Not serious, but tell user what to do */ 19987c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Stopping sendmail " 19997c478bd9Sstevel@tonic-gate "failed with (%d). You may need to restart " 20007c478bd9Sstevel@tonic-gate "it manually for changes to take effect.\n"), 20017c478bd9Sstevel@tonic-gate ret); 20027c478bd9Sstevel@tonic-gate } else enableFlag |= SENDMAIL_ON; 20037c478bd9Sstevel@tonic-gate } else { 20047c478bd9Sstevel@tonic-gate if (mode_verbose) 20057c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("sendmail not running\n"), stderr); 20067c478bd9Sstevel@tonic-gate } 20077c478bd9Sstevel@tonic-gate 20087c478bd9Sstevel@tonic-gate if (!is_service(NSCD_FMRI, SCF_STATE_STRING_DISABLED)) { 20097c478bd9Sstevel@tonic-gate if (mode_verbose) 20107c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping nscd\n"), stderr); 20117c478bd9Sstevel@tonic-gate ret = disable_service(NSCD_FMRI, B_TRUE); 20127c478bd9Sstevel@tonic-gate if (ret != CLIENT_SUCCESS) { 20137c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Stopping nscd " 20147c478bd9Sstevel@tonic-gate "failed with (%d)\n"), ret); 20157c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 20167c478bd9Sstevel@tonic-gate } else enableFlag |= NSCD_ON; 20177c478bd9Sstevel@tonic-gate } else { 20187c478bd9Sstevel@tonic-gate if (mode_verbose) 20197c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("nscd not running\n"), stderr); 20207c478bd9Sstevel@tonic-gate } 20217c478bd9Sstevel@tonic-gate 20227c478bd9Sstevel@tonic-gate if (!is_service(AUTOFS_FMRI, SCF_STATE_STRING_DISABLED)) { 20237c478bd9Sstevel@tonic-gate if (mode_verbose) 20247c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping autofs\n"), stderr); 20257c478bd9Sstevel@tonic-gate ret = disable_service(AUTOFS_FMRI, B_TRUE); 20267c478bd9Sstevel@tonic-gate if (ret != CLIENT_SUCCESS) { 20277c478bd9Sstevel@tonic-gate /* Not serious, but tell user what to do */ 20287c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Stopping autofs " 20297c478bd9Sstevel@tonic-gate "failed with (%d). You may need to restart " 20307c478bd9Sstevel@tonic-gate "it manually for changes to take effect.\n"), 20317c478bd9Sstevel@tonic-gate ret); 20327c478bd9Sstevel@tonic-gate } else enableFlag |= AUTOFS_ON; 20337c478bd9Sstevel@tonic-gate } else { 20347c478bd9Sstevel@tonic-gate if (mode_verbose) 20357c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("autofs not running\n"), stderr); 20367c478bd9Sstevel@tonic-gate } 20377c478bd9Sstevel@tonic-gate 20387c478bd9Sstevel@tonic-gate if (!is_service(LDAP_FMRI, SCF_STATE_STRING_DISABLED)) { 20397c478bd9Sstevel@tonic-gate if (saveState) 20407c478bd9Sstevel@tonic-gate gStartLdap = START_RESET; 20417c478bd9Sstevel@tonic-gate if (mode_verbose) 20427c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping ldap\n"), stderr); 20437c478bd9Sstevel@tonic-gate ret = disable_service(LDAP_FMRI, B_TRUE); 20447c478bd9Sstevel@tonic-gate if (ret != CLIENT_SUCCESS) { 20457c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Stopping ldap " 20467c478bd9Sstevel@tonic-gate "failed with (%d)\n"), ret); 20477c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 20487c478bd9Sstevel@tonic-gate } 20497c478bd9Sstevel@tonic-gate } else { 20507c478bd9Sstevel@tonic-gate if (mode_verbose) 20517c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("ldap not running\n"), 20527c478bd9Sstevel@tonic-gate stderr); 20537c478bd9Sstevel@tonic-gate } 20547c478bd9Sstevel@tonic-gate 20557c478bd9Sstevel@tonic-gate if (!is_service(YP_FMRI, SCF_STATE_STRING_DISABLED)) { 20567c478bd9Sstevel@tonic-gate if (saveState) 20577c478bd9Sstevel@tonic-gate gStartYp = START_RESET; 20587c478bd9Sstevel@tonic-gate if (mode_verbose) 20597c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Stopping nis(yp)\n"), stderr); 20607c478bd9Sstevel@tonic-gate ret = disable_service(YP_FMRI, B_TRUE); 20617c478bd9Sstevel@tonic-gate if (ret != 0) { 20627c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Stopping nis(yp) " 20637c478bd9Sstevel@tonic-gate "failed with (%d)\n"), ret); 20647c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 20657c478bd9Sstevel@tonic-gate } 20667c478bd9Sstevel@tonic-gate } else { 20677c478bd9Sstevel@tonic-gate if (mode_verbose) 20687c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("nis(yp) not running\n"), 20697c478bd9Sstevel@tonic-gate stderr); 20707c478bd9Sstevel@tonic-gate } 20717c478bd9Sstevel@tonic-gate 20727c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 20737c478bd9Sstevel@tonic-gate } 20747c478bd9Sstevel@tonic-gate 20757c478bd9Sstevel@tonic-gate /* 20767c478bd9Sstevel@tonic-gate * start_services is called to start up network services after config 20777c478bd9Sstevel@tonic-gate * files have all been setup or recovered. In the case of an error, the 20787c478bd9Sstevel@tonic-gate * files will be recovered and start_services will be called with the 20797c478bd9Sstevel@tonic-gate * "reset" flag set so that only those services that were earlier stopped 20807c478bd9Sstevel@tonic-gate * will be started. If it is not a reset, then the services associated 20817c478bd9Sstevel@tonic-gate * with files "recovered" will attempt to be started. 20827c478bd9Sstevel@tonic-gate */ 20837c478bd9Sstevel@tonic-gate static int 20847c478bd9Sstevel@tonic-gate start_services(int flag) 20857c478bd9Sstevel@tonic-gate { 2086cb5caa98Sdjl int sysret, retcode = CLIENT_SUCCESS, rc = NS_LDAP_SUCCESS; 20877c478bd9Sstevel@tonic-gate FILE *domain_fp; 20887c478bd9Sstevel@tonic-gate char domainname[BUFSIZ]; 20897c478bd9Sstevel@tonic-gate char cmd_domain_start[BUFSIZ]; 20907c478bd9Sstevel@tonic-gate int domainlen; 2091cb5caa98Sdjl ns_ldap_self_gssapi_config_t config = NS_LDAP_SELF_GSSAPI_CONFIG_NONE; 2092cb5caa98Sdjl ns_ldap_error_t *errorp = NULL; 20937c478bd9Sstevel@tonic-gate 20947c478bd9Sstevel@tonic-gate if (mode_verbose) { 20957c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Starting network services\n"), stderr); 20967c478bd9Sstevel@tonic-gate } 20977c478bd9Sstevel@tonic-gate 20987c478bd9Sstevel@tonic-gate /* Read in current defaultdomain so we can set it */ 20997c478bd9Sstevel@tonic-gate domain_fp = fopen(DOMAINNAME, "r"); 21007c478bd9Sstevel@tonic-gate if (domain_fp == NULL) { 21017c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Error opening defaultdomain " 21027c478bd9Sstevel@tonic-gate "(%d)\n"), errno); 21037c478bd9Sstevel@tonic-gate /* if we did an ldap init, we must have domain */ 21047c478bd9Sstevel@tonic-gate if (flag == START_INIT) 21057c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 21067c478bd9Sstevel@tonic-gate } else { 21077c478bd9Sstevel@tonic-gate if (fgets(domainname, BUFSIZ, domain_fp) == NULL) { 21087c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error reading defaultdomain\n"), 21097c478bd9Sstevel@tonic-gate stderr); 21107c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 21117c478bd9Sstevel@tonic-gate } 21127c478bd9Sstevel@tonic-gate 21137c478bd9Sstevel@tonic-gate if (fclose(domain_fp) != 0) { 21147c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 21157c478bd9Sstevel@tonic-gate gettext("Error closing defaultdomain (%d)\n"), 21167c478bd9Sstevel@tonic-gate errno); 21177c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 21187c478bd9Sstevel@tonic-gate } 21197c478bd9Sstevel@tonic-gate domainlen = strlen(domainname); 21207c478bd9Sstevel@tonic-gate /* sanity check to make sure sprintf will fit */ 21217c478bd9Sstevel@tonic-gate if (domainlen > (BUFSIZE - sizeof (CMD_DOMAIN_START) - 21227c478bd9Sstevel@tonic-gate sizeof (TO_DEV_NULL) - 3)) { 21237c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Specified domainname is " 21247c478bd9Sstevel@tonic-gate "too large\n"), stderr); 21257c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 21267c478bd9Sstevel@tonic-gate } 21277c478bd9Sstevel@tonic-gate if (domainname[domainlen-1] == '\n') 21287c478bd9Sstevel@tonic-gate domainname[domainlen-1] = 0; 21297c478bd9Sstevel@tonic-gate /* buffer size is checked above */ 2130cb5caa98Sdjl (void) snprintf(cmd_domain_start, BUFSIZ, "%s %s %s", 2131cb5caa98Sdjl CMD_DOMAIN_START, domainname, TO_DEV_NULL); 21327c478bd9Sstevel@tonic-gate } 21337c478bd9Sstevel@tonic-gate 21347c478bd9Sstevel@tonic-gate /* 21357c478bd9Sstevel@tonic-gate * We can be starting services after an init in which case 213636e852a1SRaja Andra * we want to start ldap and not start yp. 21377c478bd9Sstevel@tonic-gate */ 21387c478bd9Sstevel@tonic-gate if (flag == START_INIT) { 21397c478bd9Sstevel@tonic-gate sysret = system(cmd_domain_start); 21407c478bd9Sstevel@tonic-gate if (mode_verbose) 21417c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, "start: %s %s... %s\n", 21427c478bd9Sstevel@tonic-gate CMD_DOMAIN_START, domainname, 21437c478bd9Sstevel@tonic-gate (sysret == 0) ? gettext("success") : 21447c478bd9Sstevel@tonic-gate gettext("failed")); 21457c478bd9Sstevel@tonic-gate if (sysret != 0) { 21467c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("\"%s\" returned: %d\n"), 21477c478bd9Sstevel@tonic-gate CMD_DOMAIN_START, sysret); 21487c478bd9Sstevel@tonic-gate 21497c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_FAIL; 21507c478bd9Sstevel@tonic-gate } 21517c478bd9Sstevel@tonic-gate 2152cb5caa98Sdjl if ((rc = __ns_ldap_self_gssapi_config(&config)) != 2153cb5caa98Sdjl NS_LDAP_SUCCESS) { 2154cb5caa98Sdjl CLIENT_FPRINTF(stderr, gettext("Error (%d) while " 2155cb5caa98Sdjl "checking sasl/GSSAPI configuration\n"), 2156cb5caa98Sdjl rc); 2157cb5caa98Sdjl retcode = CLIENT_ERR_FAIL; 2158cb5caa98Sdjl } 2159cb5caa98Sdjl 2160cb5caa98Sdjl if (config != NS_LDAP_SELF_GSSAPI_CONFIG_NONE) { 2161cb5caa98Sdjl 2162cb5caa98Sdjl rc = __ns_ldap_check_dns_preq( 2163cb5caa98Sdjl 1, mode_verbose, mode_quiet, 2164cb5caa98Sdjl NSSWITCH_LDAP, config, &errorp); 2165cb5caa98Sdjl if (errorp) 2166cb5caa98Sdjl (void) __ns_ldap_freeError(&errorp); 2167cb5caa98Sdjl 2168cb5caa98Sdjl if (rc != NS_LDAP_SUCCESS) 2169cb5caa98Sdjl retcode = CLIENT_ERR_FAIL; 2170cb5caa98Sdjl } 2171cb5caa98Sdjl 2172cb5caa98Sdjl if (rc == NS_LDAP_SUCCESS && 2173cb5caa98Sdjl start_service(LDAP_FMRI, B_TRUE) != CLIENT_SUCCESS) 21747c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_FAIL; 21757c478bd9Sstevel@tonic-gate 2176cb5caa98Sdjl if (config != NS_LDAP_SELF_GSSAPI_CONFIG_NONE && 2177cb5caa98Sdjl rc == NS_LDAP_SUCCESS && retcode == CLIENT_SUCCESS) { 2178cb5caa98Sdjl rc = __ns_ldap_check_gssapi_preq( 2179cb5caa98Sdjl 1, mode_verbose, mode_quiet, config, 2180cb5caa98Sdjl &errorp); 2181cb5caa98Sdjl if (errorp) 2182cb5caa98Sdjl (void) __ns_ldap_freeError(&errorp); 2183cb5caa98Sdjl 2184cb5caa98Sdjl if (rc != NS_LDAP_SUCCESS) 2185cb5caa98Sdjl retcode = CLIENT_ERR_FAIL; 2186cb5caa98Sdjl 2187cb5caa98Sdjl } 218836e852a1SRaja Andra /* No YP after init */ 21897c478bd9Sstevel@tonic-gate /* 21907c478bd9Sstevel@tonic-gate * Or we can be starting services after an uninit or error 21917c478bd9Sstevel@tonic-gate * recovery. We want to start whatever services were running 21927c478bd9Sstevel@tonic-gate * before. In the case of error recovery, it is the services 21937c478bd9Sstevel@tonic-gate * that were running before we stopped them (flags set in 21947c478bd9Sstevel@tonic-gate * stop_services). If it is an uninit then we determine 21957c478bd9Sstevel@tonic-gate * which services to start based on the files we recovered 21967c478bd9Sstevel@tonic-gate * (flags set in recover). 21977c478bd9Sstevel@tonic-gate */ 21987c478bd9Sstevel@tonic-gate } else { 21997c478bd9Sstevel@tonic-gate /* uninit and recover should set flags of what to start */ 22007c478bd9Sstevel@tonic-gate if (domain_fp) { 22017c478bd9Sstevel@tonic-gate sysret = system(cmd_domain_start); 22027c478bd9Sstevel@tonic-gate if (mode_verbose) 22037c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, "start: %s %s... %s\n", 22047c478bd9Sstevel@tonic-gate CMD_DOMAIN_START, domainname, 22057c478bd9Sstevel@tonic-gate (sysret == 0) ? gettext("success") : 22067c478bd9Sstevel@tonic-gate gettext("failed")); 22077c478bd9Sstevel@tonic-gate if (sysret != 0) { 22087c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("\"%s\" " 22097c478bd9Sstevel@tonic-gate "returned: %d\n"), 22107c478bd9Sstevel@tonic-gate CMD_DOMAIN_START, sysret); 22117c478bd9Sstevel@tonic-gate 22127c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_FAIL; 22137c478bd9Sstevel@tonic-gate } 22147c478bd9Sstevel@tonic-gate } 22157c478bd9Sstevel@tonic-gate 22167c478bd9Sstevel@tonic-gate if (gStartLdap == flag) { 22177c478bd9Sstevel@tonic-gate if (!(is_service(LDAP_FMRI, SCF_STATE_STRING_ONLINE))) 22187c478bd9Sstevel@tonic-gate if (start_service(LDAP_FMRI, B_TRUE) 22197c478bd9Sstevel@tonic-gate != CLIENT_SUCCESS) 22207c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_FAIL; 22217c478bd9Sstevel@tonic-gate } 22227c478bd9Sstevel@tonic-gate 22237c478bd9Sstevel@tonic-gate if (gStartYp == flag) { 22247c478bd9Sstevel@tonic-gate if (!(is_service(YP_FMRI, SCF_STATE_STRING_ONLINE))) 22257c478bd9Sstevel@tonic-gate (void) start_service(YP_FMRI, B_TRUE); 22267c478bd9Sstevel@tonic-gate } 22277c478bd9Sstevel@tonic-gate } 22287c478bd9Sstevel@tonic-gate if ((enableFlag & AUTOFS_ON) && 22297c478bd9Sstevel@tonic-gate !(is_service(AUTOFS_FMRI, SCF_STATE_STRING_ONLINE))) 22307c478bd9Sstevel@tonic-gate (void) start_service(AUTOFS_FMRI, B_TRUE); 22317c478bd9Sstevel@tonic-gate 22327c478bd9Sstevel@tonic-gate if ((enableFlag & NSCD_ON) && 22337c478bd9Sstevel@tonic-gate !(is_service(NSCD_FMRI, SCF_STATE_STRING_ONLINE))) 22347c478bd9Sstevel@tonic-gate (void) start_service(NSCD_FMRI, B_TRUE); 22357c478bd9Sstevel@tonic-gate 2236cb5caa98Sdjl #if 0 2237cb5caa98Sdjl if (flag == START_INIT && config != NS_LDAP_SELF_GSSAPI_CONFIG_NONE && 2238cb5caa98Sdjl retcode == CLIENT_SUCCESS && 2239cb5caa98Sdjl !(is_service(NSCD_FMRI, SCF_STATE_STRING_ONLINE))) { 2240cb5caa98Sdjl CLIENT_FPRINTF(stderr, "start: %s\n", 2241cb5caa98Sdjl gettext("self/sasl/GSSAPI is configured" 2242cb5caa98Sdjl " but nscd is not online")); 2243cb5caa98Sdjl retcode = CLIENT_ERR_FAIL; 2244cb5caa98Sdjl } 2245cb5caa98Sdjl #endif 2246cb5caa98Sdjl 22477c478bd9Sstevel@tonic-gate if ((enableFlag & SENDMAIL_ON) && 22487c478bd9Sstevel@tonic-gate !(is_service(SENDMAIL_FMRI, SCF_STATE_STRING_ONLINE))) 22497c478bd9Sstevel@tonic-gate (void) start_service(SENDMAIL_FMRI, B_TRUE); 22507c478bd9Sstevel@tonic-gate 22517c478bd9Sstevel@tonic-gate /* 22527c478bd9Sstevel@tonic-gate * Restart name-service milestone so that any consumer 22537c478bd9Sstevel@tonic-gate * which depends on it will be restarted. 22547c478bd9Sstevel@tonic-gate */ 22557c478bd9Sstevel@tonic-gate (void) restart_service(NS_MILESTONE_FMRI, B_TRUE); 22567c478bd9Sstevel@tonic-gate return (retcode); 22577c478bd9Sstevel@tonic-gate } 22587c478bd9Sstevel@tonic-gate 22597c478bd9Sstevel@tonic-gate /* 22607c478bd9Sstevel@tonic-gate * credCheck is called to check if credentials are required for this 22617c478bd9Sstevel@tonic-gate * configuration. Currently, this means that if any credentialLevel is 22627c478bd9Sstevel@tonic-gate * proxy and any authenticationMethod is something other than none, then 22637c478bd9Sstevel@tonic-gate * credential info is required (proxyDN and proxyPassword). 22647c478bd9Sstevel@tonic-gate */ 22657c478bd9Sstevel@tonic-gate static int 22667c478bd9Sstevel@tonic-gate credCheck(clientopts_t *arglist) 22677c478bd9Sstevel@tonic-gate { 22687c478bd9Sstevel@tonic-gate int counter; 22697c478bd9Sstevel@tonic-gate int **credLevel; 22707c478bd9Sstevel@tonic-gate ns_auth_t **authMethod; 22717c478bd9Sstevel@tonic-gate char **proxyDN, **proxyPassword; 22727c478bd9Sstevel@tonic-gate ns_ldap_error_t *errorp; 22737c478bd9Sstevel@tonic-gate int credProxy, authNotNone; 22747c478bd9Sstevel@tonic-gate int retcode; 22757c478bd9Sstevel@tonic-gate 22767c478bd9Sstevel@tonic-gate /* If credentialLevel is proxy, make sure we have proxyDN and proxyPassword */ 22777c478bd9Sstevel@tonic-gate retcode = __ns_ldap_getParam(NS_LDAP_CREDENTIAL_LEVEL_P, 22787c478bd9Sstevel@tonic-gate (void ***)&credLevel, &errorp); 22797c478bd9Sstevel@tonic-gate if (retcode != 0) { 22807c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 22817c478bd9Sstevel@tonic-gate gettext("Error %d while trying to retrieve " 22827c478bd9Sstevel@tonic-gate "credLevel\n"), 22837c478bd9Sstevel@tonic-gate retcode); 22847c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 22857c478bd9Sstevel@tonic-gate } 22867c478bd9Sstevel@tonic-gate retcode = __ns_ldap_getParam(NS_LDAP_AUTH_P, 22877c478bd9Sstevel@tonic-gate (void ***)&authMethod, &errorp); 22887c478bd9Sstevel@tonic-gate if (retcode != 0) { 22897c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 22907c478bd9Sstevel@tonic-gate gettext("Error %d while trying to retrieve " 22917c478bd9Sstevel@tonic-gate "authMethod\n"), retcode); 22927c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 22937c478bd9Sstevel@tonic-gate } 22947c478bd9Sstevel@tonic-gate retcode = __ns_ldap_getParam(NS_LDAP_BINDDN_P, 22957c478bd9Sstevel@tonic-gate (void ***)&proxyDN, &errorp); 22967c478bd9Sstevel@tonic-gate if (retcode != 0) { 22977c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 22987c478bd9Sstevel@tonic-gate gettext("Error %d while trying to retrieve proxyDN\n"), 22997c478bd9Sstevel@tonic-gate retcode); 23007c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 23017c478bd9Sstevel@tonic-gate } 23027c478bd9Sstevel@tonic-gate retcode = __ns_ldap_getParam(NS_LDAP_BINDPASSWD_P, 23037c478bd9Sstevel@tonic-gate (void ***)&proxyPassword, &errorp); 23047c478bd9Sstevel@tonic-gate if (retcode != 0) { 23057c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 23067c478bd9Sstevel@tonic-gate gettext("Error %d while trying to retrieve " 23077c478bd9Sstevel@tonic-gate "proxyPassword\n"), retcode); 23087c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 23097c478bd9Sstevel@tonic-gate } 23107c478bd9Sstevel@tonic-gate 23117c478bd9Sstevel@tonic-gate if (mode_verbose) { 23127c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 23137c478bd9Sstevel@tonic-gate gettext("Proxy DN: %s\n"), 23147c478bd9Sstevel@tonic-gate (proxyDN && proxyDN[0]) ? proxyDN[0] : "NULL"); 23157c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 23167c478bd9Sstevel@tonic-gate gettext("Proxy password: %s\n"), 23177c478bd9Sstevel@tonic-gate (proxyPassword && proxyPassword[0]) ? 23187c478bd9Sstevel@tonic-gate proxyPassword[0] : "NULL"); 23197c478bd9Sstevel@tonic-gate } 23207c478bd9Sstevel@tonic-gate 23217c478bd9Sstevel@tonic-gate credProxy = 0; /* flag to indicate if we have a credLevel of proxy */ 23227c478bd9Sstevel@tonic-gate for (counter = 0; credLevel && credLevel[counter] != NULL; counter++) { 23237c478bd9Sstevel@tonic-gate if (mode_verbose) 23247c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 23257c478bd9Sstevel@tonic-gate gettext("Credential level: %d\n"), 23267c478bd9Sstevel@tonic-gate *credLevel[counter]); 23277c478bd9Sstevel@tonic-gate if (*credLevel[counter] == NS_LDAP_CRED_PROXY) { 23287c478bd9Sstevel@tonic-gate credProxy = 1; 23297c478bd9Sstevel@tonic-gate break; 23307c478bd9Sstevel@tonic-gate } 23317c478bd9Sstevel@tonic-gate } 23327c478bd9Sstevel@tonic-gate 23337c478bd9Sstevel@tonic-gate authNotNone = 0; /* flag for authMethod other than none */ 23347c478bd9Sstevel@tonic-gate for (counter = 0; 23357c478bd9Sstevel@tonic-gate authMethod && authMethod[counter] != NULL; 23367c478bd9Sstevel@tonic-gate counter++) { 23377c478bd9Sstevel@tonic-gate 23387c478bd9Sstevel@tonic-gate if (mode_verbose) 23397c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 23407c478bd9Sstevel@tonic-gate gettext("Authentication method: %d\n"), 23417c478bd9Sstevel@tonic-gate authMethod[counter]->type); 23427c478bd9Sstevel@tonic-gate if (authMethod[counter]->type != NS_LDAP_AUTH_NONE && 23437c478bd9Sstevel@tonic-gate !(authMethod[counter]->type == NS_LDAP_AUTH_TLS && 23447c478bd9Sstevel@tonic-gate authMethod[counter]->tlstype == NS_LDAP_TLS_NONE)) { 23457c478bd9Sstevel@tonic-gate authNotNone = 1; 23467c478bd9Sstevel@tonic-gate break; 23477c478bd9Sstevel@tonic-gate } 23487c478bd9Sstevel@tonic-gate } 23497c478bd9Sstevel@tonic-gate 23507c478bd9Sstevel@tonic-gate /* First, if we don't need proxyDN/Password then just return ok */ 23517c478bd9Sstevel@tonic-gate if (!(credProxy && authNotNone)) { 23527c478bd9Sstevel@tonic-gate if (mode_verbose) 23537c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 23547c478bd9Sstevel@tonic-gate gettext("No proxyDN/proxyPassword required\n"), 23557c478bd9Sstevel@tonic-gate stderr); 23567c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 23577c478bd9Sstevel@tonic-gate } 23587c478bd9Sstevel@tonic-gate 23597c478bd9Sstevel@tonic-gate /* Now let's check if we have the cred stuff we need */ 23607c478bd9Sstevel@tonic-gate if (!proxyDN || !proxyDN[0]) { 23617c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 23627c478bd9Sstevel@tonic-gate gettext("credentialLevel is proxy and no proxyDN " 23637c478bd9Sstevel@tonic-gate "specified\n"), 23647c478bd9Sstevel@tonic-gate stderr); 23657c478bd9Sstevel@tonic-gate return (CLIENT_ERR_CREDENTIAL); 23667c478bd9Sstevel@tonic-gate } 23677c478bd9Sstevel@tonic-gate 23687c478bd9Sstevel@tonic-gate /* If we need proxyPassword (prompt) */ 23697c478bd9Sstevel@tonic-gate if (!proxyPassword || !proxyPassword[0]) { 23707c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 23717c478bd9Sstevel@tonic-gate gettext("credentialLevel requires proxyPassword\n"), 23727c478bd9Sstevel@tonic-gate stderr); 23737c478bd9Sstevel@tonic-gate arglist->proxyPassword = getpassphrase("Proxy Bind Password:"); 23747c478bd9Sstevel@tonic-gate if (arglist->proxyPassword == NULL) { 23757c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Get password failed\n"), stderr); 23767c478bd9Sstevel@tonic-gate return (CLIENT_ERR_CREDENTIAL); 23777c478bd9Sstevel@tonic-gate } 23787c478bd9Sstevel@tonic-gate LDAP_SET_PARAM(arglist->proxyPassword, NS_LDAP_BINDPASSWD_P); 23797c478bd9Sstevel@tonic-gate if (retcode != 0) { 23807c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 23817c478bd9Sstevel@tonic-gate gettext("setParam proxyPassword failed.\n"), 23827c478bd9Sstevel@tonic-gate stderr); 23837c478bd9Sstevel@tonic-gate return (CLIENT_ERR_CREDENTIAL); 23847c478bd9Sstevel@tonic-gate } 23857c478bd9Sstevel@tonic-gate } 23867c478bd9Sstevel@tonic-gate 23877c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 23887c478bd9Sstevel@tonic-gate } 23897c478bd9Sstevel@tonic-gate 23907c478bd9Sstevel@tonic-gate /* 2391dd1104fbSMichen Chang * adminCredCheck is called to check if the admin credential is required 2392dd1104fbSMichen Chang * for this configuration. This means that if enableShadowUpdate is set 2393dd1104fbSMichen Chang * to TRUE then credential info is required (adminDN and adminPassword). 2394dd1104fbSMichen Chang * One exception is that if there is a 'self' credentialLevel and 2395dd1104fbSMichen Chang * 'sasl/GSSAPI' authenticationMethod (i.e., possibly using Kerberos 2396dd1104fbSMichen Chang * host credential) then adminDN and adminPassword are not required. 2397dd1104fbSMichen Chang */ 2398dd1104fbSMichen Chang static int 2399dd1104fbSMichen Chang adminCredCheck(clientopts_t *arglist) 2400dd1104fbSMichen Chang { 2401dd1104fbSMichen Chang int counter; 2402dd1104fbSMichen Chang int **enabled = NULL; 2403dd1104fbSMichen Chang int **credLevel = NULL; 2404dd1104fbSMichen Chang char **adminDN = NULL; 2405dd1104fbSMichen Chang char **adminPassword = NULL; 2406dd1104fbSMichen Chang ns_auth_t **authMethod = NULL; 2407dd1104fbSMichen Chang ns_ldap_error_t *errorp = NULL; 2408dd1104fbSMichen Chang int credSelf, authSASLgss; 2409dd1104fbSMichen Chang int retcode, rc; 2410dd1104fbSMichen Chang 2411dd1104fbSMichen Chang /* If shadow update not enabled, then no need to check */ 2412dd1104fbSMichen Chang retcode = __ns_ldap_getParam(NS_LDAP_ENABLE_SHADOW_UPDATE_P, 2413dd1104fbSMichen Chang (void ***)&enabled, &errorp); 2414dd1104fbSMichen Chang if (retcode != 0) { 2415dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2416dd1104fbSMichen Chang gettext("Error %d while trying to retrieve " 2417dd1104fbSMichen Chang "enableShadowUpdate\n"), retcode); 2418dd1104fbSMichen Chang rc = CLIENT_ERR_FAIL; 2419dd1104fbSMichen Chang goto out; 2420dd1104fbSMichen Chang } 2421dd1104fbSMichen Chang if (enabled == NULL || 2422dd1104fbSMichen Chang *enabled[0] != NS_LDAP_ENABLE_SHADOW_UPDATE_TRUE) { 2423dd1104fbSMichen Chang if (mode_verbose) 2424dd1104fbSMichen Chang CLIENT_FPUTS( 2425dd1104fbSMichen Chang gettext("Shadow Update is not enabled, " 2426dd1104fbSMichen Chang "no adminDN/adminPassword is required.\n"), stderr); 2427dd1104fbSMichen Chang rc = CLIENT_SUCCESS; 2428dd1104fbSMichen Chang goto out; 2429dd1104fbSMichen Chang } 2430dd1104fbSMichen Chang 2431dd1104fbSMichen Chang /* get credentialLevel */ 2432dd1104fbSMichen Chang retcode = __ns_ldap_getParam(NS_LDAP_CREDENTIAL_LEVEL_P, 2433dd1104fbSMichen Chang (void ***)&credLevel, &errorp); 2434dd1104fbSMichen Chang if (retcode != 0) { 2435dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2436dd1104fbSMichen Chang gettext("Error %d while trying to retrieve credLevel\n"), 2437dd1104fbSMichen Chang retcode); 2438dd1104fbSMichen Chang rc = CLIENT_ERR_FAIL; 2439dd1104fbSMichen Chang goto out; 2440dd1104fbSMichen Chang } 2441dd1104fbSMichen Chang 2442dd1104fbSMichen Chang /* get AuthenticationMethod */ 2443dd1104fbSMichen Chang retcode = __ns_ldap_getParam(NS_LDAP_AUTH_P, 2444dd1104fbSMichen Chang (void ***)&authMethod, &errorp); 2445dd1104fbSMichen Chang if (retcode != 0) { 2446dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2447dd1104fbSMichen Chang gettext("Error %d while trying to retrieve authMethod\n"), 2448dd1104fbSMichen Chang retcode); 2449dd1104fbSMichen Chang rc = CLIENT_ERR_FAIL; 2450dd1104fbSMichen Chang goto out; 2451dd1104fbSMichen Chang } 2452dd1104fbSMichen Chang 2453dd1104fbSMichen Chang /* get adminDN */ 2454dd1104fbSMichen Chang retcode = __ns_ldap_getParam(NS_LDAP_ADMIN_BINDDN_P, 2455dd1104fbSMichen Chang (void ***)&adminDN, &errorp); 2456dd1104fbSMichen Chang if (retcode != 0) { 2457dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2458dd1104fbSMichen Chang gettext("Error %d while trying to retrieve adminDN\n"), 2459dd1104fbSMichen Chang retcode); 2460dd1104fbSMichen Chang rc = CLIENT_ERR_FAIL; 2461dd1104fbSMichen Chang goto out; 2462dd1104fbSMichen Chang } 2463dd1104fbSMichen Chang 2464dd1104fbSMichen Chang /* get adminPassword */ 2465dd1104fbSMichen Chang retcode = __ns_ldap_getParam(NS_LDAP_ADMIN_BINDPASSWD_P, 2466dd1104fbSMichen Chang (void ***)&adminPassword, &errorp); 2467dd1104fbSMichen Chang if (retcode != 0) { 2468dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2469dd1104fbSMichen Chang gettext("Error %d while trying to retrieve " 2470dd1104fbSMichen Chang "adminPassword\n"), retcode); 2471dd1104fbSMichen Chang rc = CLIENT_ERR_FAIL; 2472dd1104fbSMichen Chang goto out; 2473dd1104fbSMichen Chang } 2474dd1104fbSMichen Chang 2475dd1104fbSMichen Chang if (mode_verbose) { 2476dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2477dd1104fbSMichen Chang gettext("admin DN: %s\n"), 2478dd1104fbSMichen Chang (adminDN && adminDN[0]) ? adminDN[0] : "NULL"); 2479dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2480dd1104fbSMichen Chang gettext("admin password: %s\n"), 2481dd1104fbSMichen Chang (adminPassword && adminPassword[0]) ? 2482dd1104fbSMichen Chang adminPassword[0] : "NULL"); 2483dd1104fbSMichen Chang } 2484dd1104fbSMichen Chang 2485dd1104fbSMichen Chang credSelf = 0; /* flag to indicate if we have a credLevel of self */ 2486dd1104fbSMichen Chang for (counter = 0; credLevel && credLevel[counter] != NULL; counter++) { 2487dd1104fbSMichen Chang if (mode_verbose) 2488dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2489dd1104fbSMichen Chang gettext("Credential level: %d\n"), 2490dd1104fbSMichen Chang *credLevel[counter]); 2491dd1104fbSMichen Chang if (*credLevel[counter] == NS_LDAP_CRED_SELF) { 2492dd1104fbSMichen Chang credSelf = 1; 2493dd1104fbSMichen Chang break; 2494dd1104fbSMichen Chang } 2495dd1104fbSMichen Chang } 2496dd1104fbSMichen Chang 2497dd1104fbSMichen Chang authSASLgss = 0; /* flag for authMethod of SASL/gssapi */ 2498dd1104fbSMichen Chang for (counter = 0; 2499dd1104fbSMichen Chang authMethod && authMethod[counter] != NULL; 2500dd1104fbSMichen Chang counter++) { 2501dd1104fbSMichen Chang 2502dd1104fbSMichen Chang if (mode_verbose) 2503dd1104fbSMichen Chang CLIENT_FPRINTF(stderr, 2504dd1104fbSMichen Chang gettext("Authentication sasl mechanism: %d\n"), 2505dd1104fbSMichen Chang authMethod[counter]->saslmech); 2506dd1104fbSMichen Chang if (authMethod[counter]->saslmech == NS_LDAP_SASL_GSSAPI) { 2507dd1104fbSMichen Chang authSASLgss = 1; 2508dd1104fbSMichen Chang break; 2509dd1104fbSMichen Chang } 2510dd1104fbSMichen Chang } 2511dd1104fbSMichen Chang 2512dd1104fbSMichen Chang /* First, if we don't need adminDN/adminPassword then just return ok */ 2513dd1104fbSMichen Chang if (credSelf && authSASLgss) { 2514dd1104fbSMichen Chang if (mode_verbose) 2515dd1104fbSMichen Chang CLIENT_FPUTS( 2516dd1104fbSMichen Chang gettext("A credential Level of self and an " 2517dd1104fbSMichen Chang "authentication method of sasl/GSSAPI is " 2518dd1104fbSMichen Chang "configured, no adminDN/adminPassword " 2519dd1104fbSMichen Chang "is required.\n"), stderr); 2520dd1104fbSMichen Chang rc = CLIENT_SUCCESS; 2521dd1104fbSMichen Chang goto out; 2522dd1104fbSMichen Chang } 2523dd1104fbSMichen Chang 2524dd1104fbSMichen Chang /* Now let's check if we have the cred stuff we need */ 2525dd1104fbSMichen Chang if (adminDN == NULL || adminDN[0] == '\0') { 2526dd1104fbSMichen Chang CLIENT_FPUTS( 2527dd1104fbSMichen Chang gettext("Shadow Update is enabled, but " 2528dd1104fbSMichen Chang "no adminDN is configured.\n"), stderr); 2529dd1104fbSMichen Chang rc = CLIENT_ERR_CREDENTIAL; 2530dd1104fbSMichen Chang goto out; 2531dd1104fbSMichen Chang } 2532dd1104fbSMichen Chang 2533dd1104fbSMichen Chang /* If we need adminPassword (prompt) */ 2534dd1104fbSMichen Chang if (adminPassword == NULL || adminPassword[0] == '\0') { 2535dd1104fbSMichen Chang CLIENT_FPUTS( 2536dd1104fbSMichen Chang gettext("Shadow Update requires adminPassword\n"), 2537dd1104fbSMichen Chang stderr); 2538dd1104fbSMichen Chang arglist->adminPassword = getpassphrase("admin Password:"); 2539dd1104fbSMichen Chang if (arglist->adminPassword == NULL) { 2540dd1104fbSMichen Chang CLIENT_FPUTS(gettext("Unable to get admin password\n"), 2541dd1104fbSMichen Chang stderr); 2542dd1104fbSMichen Chang rc = CLIENT_ERR_CREDENTIAL; 2543dd1104fbSMichen Chang goto out; 2544dd1104fbSMichen Chang } 2545dd1104fbSMichen Chang LDAP_SET_PARAM(arglist->adminPassword, 2546dd1104fbSMichen Chang NS_LDAP_ADMIN_BINDPASSWD_P); 2547dd1104fbSMichen Chang if (retcode != 0) { 2548dd1104fbSMichen Chang CLIENT_FPUTS( 2549dd1104fbSMichen Chang gettext("setParam adminPassword failed.\n"), 2550dd1104fbSMichen Chang stderr); 2551dd1104fbSMichen Chang rc = CLIENT_ERR_CREDENTIAL; 2552dd1104fbSMichen Chang goto out; 2553dd1104fbSMichen Chang } 2554dd1104fbSMichen Chang } 2555dd1104fbSMichen Chang 2556dd1104fbSMichen Chang rc = CLIENT_SUCCESS; 2557dd1104fbSMichen Chang 2558dd1104fbSMichen Chang out: 2559dd1104fbSMichen Chang if (enabled != NULL) 2560dd1104fbSMichen Chang (void) __ns_ldap_freeParam((void ***)&enabled); 2561dd1104fbSMichen Chang if (credLevel != NULL) 2562dd1104fbSMichen Chang (void) __ns_ldap_freeParam((void ***)&credLevel); 2563dd1104fbSMichen Chang if (authMethod != NULL) 2564dd1104fbSMichen Chang (void) __ns_ldap_freeParam((void ***)&authMethod); 2565dd1104fbSMichen Chang if (adminDN != NULL) 2566dd1104fbSMichen Chang (void) __ns_ldap_freeParam((void ***)&adminDN); 2567dd1104fbSMichen Chang if (adminPassword != NULL) 2568dd1104fbSMichen Chang (void) __ns_ldap_freeParam((void ***)&adminPassword); 2569dd1104fbSMichen Chang 2570dd1104fbSMichen Chang return (rc); 2571dd1104fbSMichen Chang } 2572dd1104fbSMichen Chang 2573dd1104fbSMichen Chang /* 25747c478bd9Sstevel@tonic-gate * try to restore the previous name space on this machine 25757c478bd9Sstevel@tonic-gate */ 25767c478bd9Sstevel@tonic-gate static int 25777c478bd9Sstevel@tonic-gate recover(int saveState) 25787c478bd9Sstevel@tonic-gate { 25797c478bd9Sstevel@tonic-gate struct stat buf; 25807c478bd9Sstevel@tonic-gate int stat_ret, retcode, fd; 25817c478bd9Sstevel@tonic-gate int domain = 0, domainlen; 25827c478bd9Sstevel@tonic-gate char yp_dir[BUFSIZE], yp_dir_back[BUFSIZE]; 25837c478bd9Sstevel@tonic-gate char name[BUFSIZ]; 25847c478bd9Sstevel@tonic-gate char *ldap_conf_file, *ldap_cred_file; 25857c478bd9Sstevel@tonic-gate char ldap_file_back[BUFSIZE], ldap_cred_back[BUFSIZE]; 25867c478bd9Sstevel@tonic-gate 25877c478bd9Sstevel@tonic-gate /* If running as Sysid Install become a no-op */ 25887c478bd9Sstevel@tonic-gate if (sysid_install == B_TRUE) 25897c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 25907c478bd9Sstevel@tonic-gate 25917c478bd9Sstevel@tonic-gate stat_ret = stat(LDAP_RESTORE_DIR, &buf); 25927c478bd9Sstevel@tonic-gate if (stat_ret != 0) { 25937c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 25947c478bd9Sstevel@tonic-gate gettext("Cannot recover. No backup files " 25957c478bd9Sstevel@tonic-gate "found.\n"), 25967c478bd9Sstevel@tonic-gate stderr); 25977c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 25987c478bd9Sstevel@tonic-gate gettext("\t Either this machine was not initialized\n"), 25997c478bd9Sstevel@tonic-gate stderr); 26007c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 26017c478bd9Sstevel@tonic-gate gettext("\t by ldapclient or the backup files " 26027c478bd9Sstevel@tonic-gate "have been\n"), 26037c478bd9Sstevel@tonic-gate stderr); 26047c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 26057c478bd9Sstevel@tonic-gate gettext("\t removed manually or with an \"uninit\"\n"), 26067c478bd9Sstevel@tonic-gate stderr); 26077c478bd9Sstevel@tonic-gate return (CLIENT_ERR_RESTORE); /* invalid backup */ 26087c478bd9Sstevel@tonic-gate } 26097c478bd9Sstevel@tonic-gate 26107c478bd9Sstevel@tonic-gate /* 26117c478bd9Sstevel@tonic-gate * Get domainname. Allow no domainname for the case where "files" 26127c478bd9Sstevel@tonic-gate * config was backed up. 26137c478bd9Sstevel@tonic-gate */ 26147c478bd9Sstevel@tonic-gate stat_ret = stat(DOMAINNAME_BACK, &buf); 26157c478bd9Sstevel@tonic-gate if (mode_verbose) 26167c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26177c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 26187c478bd9Sstevel@tonic-gate DOMAINNAME_BACK, stat_ret); 26197c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 26207c478bd9Sstevel@tonic-gate if (mode_verbose) 26217c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26227c478bd9Sstevel@tonic-gate gettext("recover: open(%s)\n"), 26237c478bd9Sstevel@tonic-gate DOMAINNAME_BACK); 26247c478bd9Sstevel@tonic-gate fd = open(DOMAINNAME_BACK, O_RDONLY); 26257c478bd9Sstevel@tonic-gate if (mode_verbose) 26267c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26277c478bd9Sstevel@tonic-gate gettext("recover: read(%s)\n"), 26287c478bd9Sstevel@tonic-gate DOMAINNAME_BACK); 26297c478bd9Sstevel@tonic-gate domainlen = read(fd, &(name[0]), BUFSIZ-1); 26307c478bd9Sstevel@tonic-gate (void) close(fd); 26317c478bd9Sstevel@tonic-gate if (domainlen < 0) { 26327c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 26337c478bd9Sstevel@tonic-gate gettext("Cannot recover. Cannot determine " 26347c478bd9Sstevel@tonic-gate "previous domain name.\n"), 26357c478bd9Sstevel@tonic-gate stderr); 26367c478bd9Sstevel@tonic-gate return (CLIENT_ERR_RESTORE); /* invalid backup */ 26377c478bd9Sstevel@tonic-gate } else { 26387c478bd9Sstevel@tonic-gate char *ptr; 26397c478bd9Sstevel@tonic-gate 26407c478bd9Sstevel@tonic-gate ptr = strchr(&(name[0]), '\n'); 26417c478bd9Sstevel@tonic-gate if (ptr != NULL) 26427c478bd9Sstevel@tonic-gate *ptr = '\0'; 26437c478bd9Sstevel@tonic-gate else 26447c478bd9Sstevel@tonic-gate name[domainlen] = '\0'; 26457c478bd9Sstevel@tonic-gate 26467c478bd9Sstevel@tonic-gate if (mode_verbose) 26477c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26487c478bd9Sstevel@tonic-gate gettext("recover: old domainname " 26497c478bd9Sstevel@tonic-gate "\"%s\"\n"), name); 26507c478bd9Sstevel@tonic-gate 26517c478bd9Sstevel@tonic-gate if (strlen(name) == 0) 26527c478bd9Sstevel@tonic-gate domain = 0; 26537c478bd9Sstevel@tonic-gate else 26547c478bd9Sstevel@tonic-gate domain = 1; /* flag that we have domain */ 26557c478bd9Sstevel@tonic-gate 26567c478bd9Sstevel@tonic-gate } 26577c478bd9Sstevel@tonic-gate } 26587c478bd9Sstevel@tonic-gate 26597c478bd9Sstevel@tonic-gate 26607c478bd9Sstevel@tonic-gate /* 26617c478bd9Sstevel@tonic-gate * we can recover at this point 26627c478bd9Sstevel@tonic-gate * remove LDAP config files before restore 26637c478bd9Sstevel@tonic-gate */ 26647c478bd9Sstevel@tonic-gate (void) unlink(NSCONFIGFILE); 26657c478bd9Sstevel@tonic-gate (void) unlink(NSCREDFILE); 26667c478bd9Sstevel@tonic-gate 26677c478bd9Sstevel@tonic-gate ldap_conf_file = strrchr(NSCONFIGFILE, '/') + 1; 26687c478bd9Sstevel@tonic-gate ldap_cred_file = strrchr(NSCREDFILE, '/') + 1; 26697c478bd9Sstevel@tonic-gate 26707c478bd9Sstevel@tonic-gate (void) strlcpy(ldap_file_back, LDAP_RESTORE_DIR "/", BUFSIZE); 26717c478bd9Sstevel@tonic-gate (void) strlcat(ldap_file_back, ldap_conf_file, BUFSIZE); 26727c478bd9Sstevel@tonic-gate 26737c478bd9Sstevel@tonic-gate stat_ret = stat(ldap_file_back, &buf); 26747c478bd9Sstevel@tonic-gate if (mode_verbose) 26757c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26767c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 26777c478bd9Sstevel@tonic-gate ldap_file_back, stat_ret); 26787c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 26797c478bd9Sstevel@tonic-gate if (saveState) 26807c478bd9Sstevel@tonic-gate gStartLdap = START_UNINIT; 26817c478bd9Sstevel@tonic-gate retcode = file_move(ldap_file_back, NSCONFIGFILE); 26827c478bd9Sstevel@tonic-gate if (mode_verbose) 26837c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26847c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s)=%d\n"), 26857c478bd9Sstevel@tonic-gate ldap_file_back, NSCONFIGFILE, retcode); 26867c478bd9Sstevel@tonic-gate if (retcode != 0) 26877c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26887c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s) failed\n"), 26897c478bd9Sstevel@tonic-gate ldap_file_back, NSCONFIGFILE); 26907c478bd9Sstevel@tonic-gate } 26917c478bd9Sstevel@tonic-gate 26927c478bd9Sstevel@tonic-gate (void) strlcpy(ldap_cred_back, LDAP_RESTORE_DIR "/", BUFSIZE); 26937c478bd9Sstevel@tonic-gate (void) strlcat(ldap_cred_back, ldap_cred_file, BUFSIZE); 26947c478bd9Sstevel@tonic-gate 26957c478bd9Sstevel@tonic-gate stat_ret = stat(ldap_cred_back, &buf); 26967c478bd9Sstevel@tonic-gate if (mode_verbose) 26977c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 26987c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 26997c478bd9Sstevel@tonic-gate ldap_cred_back, stat_ret); 27007c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 27017c478bd9Sstevel@tonic-gate retcode = file_move(ldap_cred_back, NSCREDFILE); 27027c478bd9Sstevel@tonic-gate if (mode_verbose) 27037c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27047c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s)=%d\n"), 27057c478bd9Sstevel@tonic-gate ldap_cred_back, NSCREDFILE, retcode); 27067c478bd9Sstevel@tonic-gate if (retcode != 0) 27077c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27087c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s) failed\n"), 27097c478bd9Sstevel@tonic-gate ldap_cred_back, NSCREDFILE); 27107c478bd9Sstevel@tonic-gate } 27117c478bd9Sstevel@tonic-gate 27127c478bd9Sstevel@tonic-gate /* Check for recovery of NIS(YP) if we have a domainname */ 27137c478bd9Sstevel@tonic-gate if (domain) { 27147c478bd9Sstevel@tonic-gate /* "name" would have to be huge for this, but just in case */ 27157c478bd9Sstevel@tonic-gate if (strlen(name) >= (BUFSIZE - strlen(LDAP_RESTORE_DIR))) 27167c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 27177c478bd9Sstevel@tonic-gate if (strlen(name) >= (BUFSIZE - strlen(YP_BIND_DIR))) 27187c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 27197c478bd9Sstevel@tonic-gate 27207c478bd9Sstevel@tonic-gate (void) strlcpy(yp_dir_back, LDAP_RESTORE_DIR "/", BUFSIZE); 27217c478bd9Sstevel@tonic-gate (void) strlcat(yp_dir_back, name, BUFSIZE); 27227c478bd9Sstevel@tonic-gate stat_ret = stat(yp_dir_back, &buf); 27237c478bd9Sstevel@tonic-gate if (mode_verbose) 27247c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27257c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 27267c478bd9Sstevel@tonic-gate yp_dir_back, stat_ret); 27277c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 27287c478bd9Sstevel@tonic-gate (void) strlcpy(yp_dir, YP_BIND_DIR "/", BUFSIZE); 27297c478bd9Sstevel@tonic-gate (void) strlcat(yp_dir, name, BUFSIZE); 27307c478bd9Sstevel@tonic-gate retcode = file_move(yp_dir_back, yp_dir); 27317c478bd9Sstevel@tonic-gate if (mode_verbose) 27327c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27337c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, " 27347c478bd9Sstevel@tonic-gate "%s)=%d\n"), 27357c478bd9Sstevel@tonic-gate yp_dir_back, yp_dir, retcode); 27367c478bd9Sstevel@tonic-gate if (retcode != 0) { 27377c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27387c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, " 27397c478bd9Sstevel@tonic-gate "%s) failed!\n"), 27407c478bd9Sstevel@tonic-gate yp_dir_back, yp_dir); 27417c478bd9Sstevel@tonic-gate } else { 27427c478bd9Sstevel@tonic-gate if (saveState) 27437c478bd9Sstevel@tonic-gate gStartYp = START_UNINIT; 27447c478bd9Sstevel@tonic-gate } 27457c478bd9Sstevel@tonic-gate } 27467c478bd9Sstevel@tonic-gate } 27477c478bd9Sstevel@tonic-gate 27487c478bd9Sstevel@tonic-gate /* restore machine configuration */ 27497c478bd9Sstevel@tonic-gate stat_ret = stat(NSSWITCH_BACK, &buf); 27507c478bd9Sstevel@tonic-gate if (mode_verbose) 27517c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27527c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 27537c478bd9Sstevel@tonic-gate NSSWITCH_BACK, stat_ret); 27547c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 27557c478bd9Sstevel@tonic-gate retcode = file_move(NSSWITCH_BACK, NSSWITCH_CONF); 27567c478bd9Sstevel@tonic-gate if (mode_verbose) 27577c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27587c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s)=%d\n"), 27597c478bd9Sstevel@tonic-gate NSSWITCH_BACK, NSSWITCH_CONF, retcode); 27607c478bd9Sstevel@tonic-gate if (retcode != 0) 27617c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27627c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s) failed\n"), 27637c478bd9Sstevel@tonic-gate NSSWITCH_BACK, NSSWITCH_CONF); 27647c478bd9Sstevel@tonic-gate } 27657c478bd9Sstevel@tonic-gate 27667c478bd9Sstevel@tonic-gate stat_ret = stat(DOMAINNAME_BACK, &buf); 27677c478bd9Sstevel@tonic-gate if (mode_verbose) 27687c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27697c478bd9Sstevel@tonic-gate gettext("recover: stat(%s)=%d\n"), 27707c478bd9Sstevel@tonic-gate DOMAINNAME_BACK, stat_ret); 27717c478bd9Sstevel@tonic-gate if (stat_ret == 0) { 27727c478bd9Sstevel@tonic-gate retcode = file_move(DOMAINNAME_BACK, DOMAINNAME); 27737c478bd9Sstevel@tonic-gate if (mode_verbose) 27747c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27757c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s)=%d\n"), 27767c478bd9Sstevel@tonic-gate DOMAINNAME_BACK, DOMAINNAME, retcode); 27777c478bd9Sstevel@tonic-gate if (retcode != 0) 27787c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27797c478bd9Sstevel@tonic-gate gettext("recover: file_move(%s, %s) failed\n"), 27807c478bd9Sstevel@tonic-gate DOMAINNAME_BACK, DOMAINNAME); 27817c478bd9Sstevel@tonic-gate } 27827c478bd9Sstevel@tonic-gate 27837c478bd9Sstevel@tonic-gate retcode = rmdir(LDAP_RESTORE_DIR); 27847c478bd9Sstevel@tonic-gate if (retcode != 0) { 27857c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 27867c478bd9Sstevel@tonic-gate gettext("Error removing \"%s\" directory.\n"), 27877c478bd9Sstevel@tonic-gate LDAP_RESTORE_DIR); 27887c478bd9Sstevel@tonic-gate } 27897c478bd9Sstevel@tonic-gate 27907c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 27917c478bd9Sstevel@tonic-gate } 27927c478bd9Sstevel@tonic-gate 27937c478bd9Sstevel@tonic-gate /* 27947c478bd9Sstevel@tonic-gate * try to save the current state of this machine. 27957c478bd9Sstevel@tonic-gate * this just overwrites any old saved configration files. 27967c478bd9Sstevel@tonic-gate * 27977c478bd9Sstevel@tonic-gate * This function should only be called after network services have been stopped. 27987c478bd9Sstevel@tonic-gate * 27997c478bd9Sstevel@tonic-gate * Returns 0 on successful save 28007c478bd9Sstevel@tonic-gate * Otherwise returns -1 28017c478bd9Sstevel@tonic-gate */ 28027c478bd9Sstevel@tonic-gate static int 28037c478bd9Sstevel@tonic-gate file_backup(void) 28047c478bd9Sstevel@tonic-gate { 28057c478bd9Sstevel@tonic-gate struct stat buf; 28067c478bd9Sstevel@tonic-gate int domain_stat, conf_stat, ldap_stat; 280736e852a1SRaja Andra int yp_stat, restore_stat; 28087c478bd9Sstevel@tonic-gate int retcode, namelen, ret; 28097c478bd9Sstevel@tonic-gate char yp_dir[BUFSIZ], yp_dir_back[BUFSIZ]; 28107c478bd9Sstevel@tonic-gate char name[BUFSIZ]; 28117c478bd9Sstevel@tonic-gate char *ldap_conf_file, *ldap_cred_file; 28127c478bd9Sstevel@tonic-gate char ldap_file_back[BUFSIZE], ldap_cred_back[BUFSIZE]; 28137c478bd9Sstevel@tonic-gate 28147c478bd9Sstevel@tonic-gate ret = CLIENT_SUCCESS; 28157c478bd9Sstevel@tonic-gate /* If running as Sysid Install become a no-op */ 28167c478bd9Sstevel@tonic-gate if (sysid_install == B_TRUE) 28177c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 28187c478bd9Sstevel@tonic-gate 28197c478bd9Sstevel@tonic-gate /* If existing backup files, clear for this run */ 28207c478bd9Sstevel@tonic-gate restore_stat = stat(LDAP_RESTORE_DIR, &buf); 28217c478bd9Sstevel@tonic-gate if (restore_stat == 0) { 28227c478bd9Sstevel@tonic-gate if (mode_verbose) { 28237c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 28247c478bd9Sstevel@tonic-gate gettext("Removing existing restore " 28257c478bd9Sstevel@tonic-gate "directory\n"), 28267c478bd9Sstevel@tonic-gate stderr); 28277c478bd9Sstevel@tonic-gate } 28287c478bd9Sstevel@tonic-gate (void) system("/bin/rm -fr " LDAP_RESTORE_DIR); 28297c478bd9Sstevel@tonic-gate restore_stat = stat(LDAP_RESTORE_DIR, &buf); 28307c478bd9Sstevel@tonic-gate if (restore_stat == 0) { 28317c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28327c478bd9Sstevel@tonic-gate gettext("Unable to remove backup " 28337c478bd9Sstevel@tonic-gate "directory (%s)\n"), 28347c478bd9Sstevel@tonic-gate LDAP_RESTORE_DIR); 28357c478bd9Sstevel@tonic-gate return (CLIENT_ERR_RESTORE); 28367c478bd9Sstevel@tonic-gate } 28377c478bd9Sstevel@tonic-gate } 28387c478bd9Sstevel@tonic-gate 28397c478bd9Sstevel@tonic-gate retcode = mkdir(LDAP_RESTORE_DIR, 0755); 28407c478bd9Sstevel@tonic-gate if (retcode != 0) { 28417c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28427c478bd9Sstevel@tonic-gate gettext("file_backup: Failed to make %s backup " 28437c478bd9Sstevel@tonic-gate "directory. mkdir=%d\n"), 28447c478bd9Sstevel@tonic-gate LDAP_RESTORE_DIR, retcode); 28457c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 28467c478bd9Sstevel@tonic-gate } 28477c478bd9Sstevel@tonic-gate 28487c478bd9Sstevel@tonic-gate conf_stat = stat(NSSWITCH_CONF, &buf); 28497c478bd9Sstevel@tonic-gate if (mode_verbose) 28507c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28517c478bd9Sstevel@tonic-gate gettext("file_backup: stat(%s)=%d\n"), 28527c478bd9Sstevel@tonic-gate NSSWITCH_CONF, conf_stat); 28537c478bd9Sstevel@tonic-gate if (conf_stat == 0) { 28547c478bd9Sstevel@tonic-gate if (mode_verbose) 28557c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28567c478bd9Sstevel@tonic-gate gettext("file_backup: (%s -> %s)\n"), 28577c478bd9Sstevel@tonic-gate NSSWITCH_CONF, NSSWITCH_BACK); 28587c478bd9Sstevel@tonic-gate retcode = file_move(NSSWITCH_CONF, NSSWITCH_BACK); 28597c478bd9Sstevel@tonic-gate if (retcode != 0) { 28607c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28617c478bd9Sstevel@tonic-gate gettext("file_backup: file_move(%s, %s) failed " 28627c478bd9Sstevel@tonic-gate "with %d\n"), 28637c478bd9Sstevel@tonic-gate NSSWITCH_CONF, NSSWITCH_BACK, retcode); 28647c478bd9Sstevel@tonic-gate ret = CLIENT_ERR_RENAME; 28657c478bd9Sstevel@tonic-gate } 28667c478bd9Sstevel@tonic-gate } else { 28677c478bd9Sstevel@tonic-gate if (mode_verbose) 28687c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28697c478bd9Sstevel@tonic-gate gettext("file_backup: No %s file.\n"), 28707c478bd9Sstevel@tonic-gate NSSWITCH_CONF); 28717c478bd9Sstevel@tonic-gate } 28727c478bd9Sstevel@tonic-gate 28737c478bd9Sstevel@tonic-gate domain_stat = stat(DOMAINNAME, &buf); 28747c478bd9Sstevel@tonic-gate if (mode_verbose) 28757c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28767c478bd9Sstevel@tonic-gate gettext("file_backup: stat(%s)=%d\n"), 28777c478bd9Sstevel@tonic-gate DOMAINNAME, domain_stat); 28787c478bd9Sstevel@tonic-gate if ((domain_stat == 0) && (buf.st_size > 0)) { 28797c478bd9Sstevel@tonic-gate if (mode_verbose) 28807c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28817c478bd9Sstevel@tonic-gate gettext("file_backup: (%s -> %s)\n"), 28827c478bd9Sstevel@tonic-gate DOMAINNAME, DOMAINNAME_BACK); 28837c478bd9Sstevel@tonic-gate retcode = file_move(DOMAINNAME, DOMAINNAME_BACK); 28847c478bd9Sstevel@tonic-gate if (retcode != 0) { 28857c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28867c478bd9Sstevel@tonic-gate gettext("file_backup: file_move(%s, %s) failed " 28877c478bd9Sstevel@tonic-gate "with %d\n"), 28887c478bd9Sstevel@tonic-gate DOMAINNAME, DOMAINNAME_BACK, retcode); 28897c478bd9Sstevel@tonic-gate ret = CLIENT_ERR_RENAME; 28907c478bd9Sstevel@tonic-gate } 28917c478bd9Sstevel@tonic-gate } else { 28927c478bd9Sstevel@tonic-gate if (mode_verbose) 28937c478bd9Sstevel@tonic-gate if (domain_stat != 0) { 28947c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28957c478bd9Sstevel@tonic-gate gettext("file_backup: No %s file.\n"), 28967c478bd9Sstevel@tonic-gate DOMAINNAME); 28977c478bd9Sstevel@tonic-gate } else { 28987c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 28997c478bd9Sstevel@tonic-gate gettext("file_backup: Empty %s " 29007c478bd9Sstevel@tonic-gate "file.\n"), 29017c478bd9Sstevel@tonic-gate DOMAINNAME); 29027c478bd9Sstevel@tonic-gate } 29037c478bd9Sstevel@tonic-gate } 29047c478bd9Sstevel@tonic-gate 29057c478bd9Sstevel@tonic-gate namelen = BUFSIZ; 29067c478bd9Sstevel@tonic-gate (void) sysinfo(SI_SRPC_DOMAIN, &(name[0]), namelen); 29077c478bd9Sstevel@tonic-gate namelen = strlen(name); 29087c478bd9Sstevel@tonic-gate 29097c478bd9Sstevel@tonic-gate if (mode_verbose) 29107c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29117c478bd9Sstevel@tonic-gate gettext("file_backup: nis domain is \"%s\"\n"), 29127c478bd9Sstevel@tonic-gate (namelen > 0) ? name : "EMPTY"); 29137c478bd9Sstevel@tonic-gate /* check for domain name if not set cannot save NIS(YP) state */ 29147c478bd9Sstevel@tonic-gate if (namelen > 0) { 29157c478bd9Sstevel@tonic-gate /* moving /var/yp/binding will cause ypbind to core dump */ 29167c478bd9Sstevel@tonic-gate (void) strlcpy(yp_dir, YP_BIND_DIR "/", BUFSIZE); 29177c478bd9Sstevel@tonic-gate (void) strlcat(yp_dir, name, BUFSIZE); 29187c478bd9Sstevel@tonic-gate yp_stat = stat(yp_dir, &buf); 29197c478bd9Sstevel@tonic-gate if (mode_verbose) 29207c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29217c478bd9Sstevel@tonic-gate gettext("file_backup: stat(%s)=%d\n"), 29227c478bd9Sstevel@tonic-gate yp_dir, yp_stat); 29237c478bd9Sstevel@tonic-gate if (yp_stat == 0) { 29247c478bd9Sstevel@tonic-gate (void) strlcpy(yp_dir_back, LDAP_RESTORE_DIR "/", 29257c478bd9Sstevel@tonic-gate BUFSIZE); 29267c478bd9Sstevel@tonic-gate (void) strlcat(yp_dir_back, name, BUFSIZE); 29277c478bd9Sstevel@tonic-gate if (mode_verbose) 29287c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29297c478bd9Sstevel@tonic-gate gettext("file_backup: (%s -> %s)\n"), 29307c478bd9Sstevel@tonic-gate yp_dir, yp_dir_back); 29317c478bd9Sstevel@tonic-gate retcode = file_move(yp_dir, yp_dir_back); 29327c478bd9Sstevel@tonic-gate if (retcode != 0) { 29337c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29347c478bd9Sstevel@tonic-gate gettext("file_backup: file_move(%s, %s)" 29357c478bd9Sstevel@tonic-gate " failed with %d\n"), 29367c478bd9Sstevel@tonic-gate yp_dir, yp_dir_back, retcode); 29377c478bd9Sstevel@tonic-gate ret = CLIENT_ERR_RENAME; 29387c478bd9Sstevel@tonic-gate } 29397c478bd9Sstevel@tonic-gate } else { 29407c478bd9Sstevel@tonic-gate if (mode_verbose) 29417c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29427c478bd9Sstevel@tonic-gate gettext("file_backup: No %s " 29437c478bd9Sstevel@tonic-gate "directory.\n"), yp_dir); 29447c478bd9Sstevel@tonic-gate } 29457c478bd9Sstevel@tonic-gate } 29467c478bd9Sstevel@tonic-gate 29477c478bd9Sstevel@tonic-gate 29487c478bd9Sstevel@tonic-gate /* point to file name, not path delim (/) */ 29497c478bd9Sstevel@tonic-gate ldap_conf_file = strrchr(NSCONFIGFILE, '/') + 1; 29507c478bd9Sstevel@tonic-gate ldap_cred_file = strrchr(NSCREDFILE, '/') + 1; 29517c478bd9Sstevel@tonic-gate 29527c478bd9Sstevel@tonic-gate ldap_stat = stat(NSCONFIGFILE, &buf); 29537c478bd9Sstevel@tonic-gate if (mode_verbose) 29547c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29557c478bd9Sstevel@tonic-gate gettext("file_backup: stat(%s)=%d\n"), 29567c478bd9Sstevel@tonic-gate NSCONFIGFILE, ldap_stat); 29577c478bd9Sstevel@tonic-gate if (ldap_stat == 0) { 29587c478bd9Sstevel@tonic-gate (void) strlcpy(ldap_file_back, LDAP_RESTORE_DIR "/", BUFSIZE); 29597c478bd9Sstevel@tonic-gate (void) strlcat(ldap_file_back, ldap_conf_file, BUFSIZE); 29607c478bd9Sstevel@tonic-gate if (mode_verbose) 29617c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29627c478bd9Sstevel@tonic-gate gettext("file_backup: (%s -> %s)\n"), 29637c478bd9Sstevel@tonic-gate NSCONFIGFILE, ldap_file_back); 29647c478bd9Sstevel@tonic-gate retcode = file_move(NSCONFIGFILE, ldap_file_back); 29657c478bd9Sstevel@tonic-gate if (retcode != 0) { 29667c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29677c478bd9Sstevel@tonic-gate gettext("file_backup: file_move(%s, %s) failed " 29687c478bd9Sstevel@tonic-gate "with %d\n"), 29697c478bd9Sstevel@tonic-gate NSCONFIGFILE, ldap_file_back, retcode); 29707c478bd9Sstevel@tonic-gate ret = CLIENT_ERR_RENAME; 29717c478bd9Sstevel@tonic-gate } 29727c478bd9Sstevel@tonic-gate 29737c478bd9Sstevel@tonic-gate (void) strlcpy(ldap_cred_back, LDAP_RESTORE_DIR "/", BUFSIZE); 29747c478bd9Sstevel@tonic-gate (void) strlcat(ldap_cred_back, ldap_cred_file, BUFSIZE); 29757c478bd9Sstevel@tonic-gate if (mode_verbose) 29767c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29777c478bd9Sstevel@tonic-gate gettext("file_backup: (%s -> %s)\n"), 29787c478bd9Sstevel@tonic-gate NSCREDFILE, ldap_cred_back); 29797c478bd9Sstevel@tonic-gate retcode = file_move(NSCREDFILE, ldap_cred_back); 29807c478bd9Sstevel@tonic-gate if (retcode != 0) { 29817c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29827c478bd9Sstevel@tonic-gate gettext("file_backup: file_move(%s, %s) failed " 29837c478bd9Sstevel@tonic-gate "with %d\n"), 29847c478bd9Sstevel@tonic-gate NSCREDFILE, ldap_cred_back, retcode); 29857c478bd9Sstevel@tonic-gate ret = CLIENT_ERR_RENAME; 29867c478bd9Sstevel@tonic-gate } 29877c478bd9Sstevel@tonic-gate } else { 29887c478bd9Sstevel@tonic-gate if (mode_verbose) 29897c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 29907c478bd9Sstevel@tonic-gate gettext("file_backup: No %s file.\n"), 29917c478bd9Sstevel@tonic-gate NSCONFIGFILE); 29927c478bd9Sstevel@tonic-gate } 29937c478bd9Sstevel@tonic-gate 29947c478bd9Sstevel@tonic-gate return (ret); 29957c478bd9Sstevel@tonic-gate } 29967c478bd9Sstevel@tonic-gate 29977c478bd9Sstevel@tonic-gate /* 29987c478bd9Sstevel@tonic-gate * mod_backup() 29997c478bd9Sstevel@tonic-gate * 30007c478bd9Sstevel@tonic-gate * This function is used to temporily backup the LDAP client files in /var/ldap 30017c478bd9Sstevel@tonic-gate * that the "mod" operation needs to update. If an error occurs then the 30027c478bd9Sstevel@tonic-gate * function mod_recover() can be invoke to recover the unmodified files. 30037c478bd9Sstevel@tonic-gate */ 30047c478bd9Sstevel@tonic-gate static int 30057c478bd9Sstevel@tonic-gate mod_backup(void) 30067c478bd9Sstevel@tonic-gate { 30077c478bd9Sstevel@tonic-gate int rc; 30087c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 30097c478bd9Sstevel@tonic-gate 30107c478bd9Sstevel@tonic-gate rc = system(CMD_CP " " NSCONFIGFILE " " NSCONFIGFILE ".mod"); 30117c478bd9Sstevel@tonic-gate retcode += rc; 30127c478bd9Sstevel@tonic-gate if (mode_verbose) 30137c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30147c478bd9Sstevel@tonic-gate gettext("mod_backup: backup %s for %s\n"), 30157c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", NSCONFIGFILE); 30167c478bd9Sstevel@tonic-gate 30177c478bd9Sstevel@tonic-gate rc = system(CMD_CP " " NSCREDFILE " " NSCREDFILE ".mod"); 30187c478bd9Sstevel@tonic-gate retcode += rc; 30197c478bd9Sstevel@tonic-gate if (mode_verbose) 30207c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30217c478bd9Sstevel@tonic-gate gettext("mod_backup: backup %s for %s\n"), 30227c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", NSCREDFILE); 30237c478bd9Sstevel@tonic-gate 30247c478bd9Sstevel@tonic-gate rc = system(CMD_CP " " DOMAINNAME " " DOMAINNAME ".mod"); 30257c478bd9Sstevel@tonic-gate retcode += rc; 30267c478bd9Sstevel@tonic-gate if (mode_verbose) 30277c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30287c478bd9Sstevel@tonic-gate gettext("mod_backup: backup %s for %s\n"), 30297c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", DOMAINNAME); 30307c478bd9Sstevel@tonic-gate 30317c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) 30327c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_RENAME; 30337c478bd9Sstevel@tonic-gate return (retcode); 30347c478bd9Sstevel@tonic-gate } 30357c478bd9Sstevel@tonic-gate 30367c478bd9Sstevel@tonic-gate /* 30377c478bd9Sstevel@tonic-gate * mod_recover() 30387c478bd9Sstevel@tonic-gate * 30397c478bd9Sstevel@tonic-gate * This function is used to recover the temporily backed up files by 30407c478bd9Sstevel@tonic-gate * the mod_backup() function if an error occurs during the "mod" 30417c478bd9Sstevel@tonic-gate * operation. 30427c478bd9Sstevel@tonic-gate */ 30437c478bd9Sstevel@tonic-gate static int 30447c478bd9Sstevel@tonic-gate mod_recover(void) 30457c478bd9Sstevel@tonic-gate { 30467c478bd9Sstevel@tonic-gate int rc; 30477c478bd9Sstevel@tonic-gate int retcode = CLIENT_SUCCESS; 30487c478bd9Sstevel@tonic-gate 30497c478bd9Sstevel@tonic-gate rc = system(CMD_MV " " NSCONFIGFILE ".mod " NSCONFIGFILE); 30507c478bd9Sstevel@tonic-gate retcode += rc; 30517c478bd9Sstevel@tonic-gate if (mode_verbose) 30527c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30537c478bd9Sstevel@tonic-gate gettext("mod_recover: recovery %s for %s\n"), 30547c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", NSCONFIGFILE); 30557c478bd9Sstevel@tonic-gate 30567c478bd9Sstevel@tonic-gate rc = system(CMD_MV " " NSCREDFILE ".mod " NSCREDFILE); 30577c478bd9Sstevel@tonic-gate retcode += rc; 30587c478bd9Sstevel@tonic-gate if (mode_verbose) 30597c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30607c478bd9Sstevel@tonic-gate gettext("mod_recover: recovery %s for %s\n"), 30617c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", NSCREDFILE); 30627c478bd9Sstevel@tonic-gate 30637c478bd9Sstevel@tonic-gate rc = system(CMD_MV " " DOMAINNAME ".mod " DOMAINNAME); 30647c478bd9Sstevel@tonic-gate retcode += rc; 30657c478bd9Sstevel@tonic-gate if (mode_verbose) 30667c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 30677c478bd9Sstevel@tonic-gate gettext("mod_recover: recovery %s for %s\n"), 30687c478bd9Sstevel@tonic-gate rc ? "failed" : "successful", DOMAINNAME); 30697c478bd9Sstevel@tonic-gate 30707c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) 30717c478bd9Sstevel@tonic-gate retcode = CLIENT_ERR_RENAME; 30727c478bd9Sstevel@tonic-gate return (retcode); 30737c478bd9Sstevel@tonic-gate } 30747c478bd9Sstevel@tonic-gate 30757c478bd9Sstevel@tonic-gate /* 30767c478bd9Sstevel@tonic-gate * mod_cleanup() 30777c478bd9Sstevel@tonic-gate * 30787c478bd9Sstevel@tonic-gate * This function removes the .mod files in /var/ldap. 30797c478bd9Sstevel@tonic-gate */ 30807c478bd9Sstevel@tonic-gate static void 30817c478bd9Sstevel@tonic-gate mod_cleanup(void) 30827c478bd9Sstevel@tonic-gate { 30837c478bd9Sstevel@tonic-gate (void) system(CMD_RM " " NSCONFIGFILE ".mod " TO_DEV_NULL); 30847c478bd9Sstevel@tonic-gate (void) system(CMD_RM " " NSCREDFILE ".mod " TO_DEV_NULL); 30857c478bd9Sstevel@tonic-gate (void) system(CMD_RM " " DOMAINNAME ".mod " TO_DEV_NULL); 30867c478bd9Sstevel@tonic-gate } 30877c478bd9Sstevel@tonic-gate 30887c478bd9Sstevel@tonic-gate #define MAX_DN_ARRAY 100 30897c478bd9Sstevel@tonic-gate #define LDAP_NAMINGCONTEXTS "namingcontexts" 30907c478bd9Sstevel@tonic-gate 30917c478bd9Sstevel@tonic-gate static multival_t * 30927c478bd9Sstevel@tonic-gate multival_new() 30937c478bd9Sstevel@tonic-gate { 30947c478bd9Sstevel@tonic-gate multival_t *hold; 30957c478bd9Sstevel@tonic-gate 30967c478bd9Sstevel@tonic-gate hold = calloc(1, sizeof (multival_t)); 30977c478bd9Sstevel@tonic-gate if (hold == NULL) { 30987c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 30997c478bd9Sstevel@tonic-gate gettext("multival_new: Memory allocation error\n"), 31007c478bd9Sstevel@tonic-gate stderr); 31017c478bd9Sstevel@tonic-gate } 31027c478bd9Sstevel@tonic-gate return (hold); /* NULL -> error */ 31037c478bd9Sstevel@tonic-gate } 31047c478bd9Sstevel@tonic-gate 31057c478bd9Sstevel@tonic-gate static int 31067c478bd9Sstevel@tonic-gate multival_add(multival_t *list, char *opt) 31077c478bd9Sstevel@tonic-gate { 31087c478bd9Sstevel@tonic-gate if (opt == NULL) { 31097c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 31107c478bd9Sstevel@tonic-gate gettext("Empty value passed to multival_add\n"), 31117c478bd9Sstevel@tonic-gate stderr); 31127c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 31137c478bd9Sstevel@tonic-gate } 31147c478bd9Sstevel@tonic-gate 31157c478bd9Sstevel@tonic-gate if (list->count == 0) { 31167c478bd9Sstevel@tonic-gate list->optlist = (char **)malloc(sizeof (char **)); 31177c478bd9Sstevel@tonic-gate } else { 31187c478bd9Sstevel@tonic-gate list->optlist = (char **)realloc(list->optlist, 31197c478bd9Sstevel@tonic-gate (list->count + 1) * sizeof (char **)); 31207c478bd9Sstevel@tonic-gate } 31217c478bd9Sstevel@tonic-gate 31227c478bd9Sstevel@tonic-gate if (list->optlist == NULL) { 31237c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory\n"), stderr); 31247c478bd9Sstevel@tonic-gate return (CLIENT_ERR_MEMORY); /* 0 is success */ 31257c478bd9Sstevel@tonic-gate } 31267c478bd9Sstevel@tonic-gate 31277c478bd9Sstevel@tonic-gate list->optlist[list->count] = opt; 31287c478bd9Sstevel@tonic-gate list->count++; 31297c478bd9Sstevel@tonic-gate 31307c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 31317c478bd9Sstevel@tonic-gate } 31327c478bd9Sstevel@tonic-gate 31337c478bd9Sstevel@tonic-gate static void 31347c478bd9Sstevel@tonic-gate multival_free(multival_t *list) 31357c478bd9Sstevel@tonic-gate { 31367c478bd9Sstevel@tonic-gate if (list == NULL) 31377c478bd9Sstevel@tonic-gate return; 31387c478bd9Sstevel@tonic-gate 31397c478bd9Sstevel@tonic-gate if (list->optlist != NULL) 31407c478bd9Sstevel@tonic-gate free(list->optlist); 31417c478bd9Sstevel@tonic-gate free(list); 31427c478bd9Sstevel@tonic-gate } 31437c478bd9Sstevel@tonic-gate 31447c478bd9Sstevel@tonic-gate static clientopts_t * 31457c478bd9Sstevel@tonic-gate clientopts_new() 31467c478bd9Sstevel@tonic-gate { 31477c478bd9Sstevel@tonic-gate clientopts_t *hold; 31487c478bd9Sstevel@tonic-gate 31497c478bd9Sstevel@tonic-gate hold = calloc(1, sizeof (clientopts_t)); 31507c478bd9Sstevel@tonic-gate if (NULL == hold) { 31517c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31527c478bd9Sstevel@tonic-gate "clientopts structure\n"), stderr); 31537c478bd9Sstevel@tonic-gate return (hold); /* NULL -> error */ 31547c478bd9Sstevel@tonic-gate } 31557c478bd9Sstevel@tonic-gate 31567c478bd9Sstevel@tonic-gate hold->serviceAuthenticationMethod = multival_new(); 31577c478bd9Sstevel@tonic-gate if (NULL == hold->serviceAuthenticationMethod) { 31587c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31597c478bd9Sstevel@tonic-gate "serviceAuthenticationMethod\n"), stderr); 31607c478bd9Sstevel@tonic-gate free(hold); 31617c478bd9Sstevel@tonic-gate return (NULL); /* NULL -> error */ 31627c478bd9Sstevel@tonic-gate } 31637c478bd9Sstevel@tonic-gate 31647c478bd9Sstevel@tonic-gate hold->serviceCredentialLevel = multival_new(); 31657c478bd9Sstevel@tonic-gate if (NULL == hold->serviceCredentialLevel) { 31667c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31677c478bd9Sstevel@tonic-gate "serviceCredentialLevel\n"), stderr); 31687c478bd9Sstevel@tonic-gate multival_free(hold->serviceAuthenticationMethod); 31697c478bd9Sstevel@tonic-gate free(hold); 31707c478bd9Sstevel@tonic-gate return (NULL); /* NULL -> error */ 31717c478bd9Sstevel@tonic-gate } 31727c478bd9Sstevel@tonic-gate 31737c478bd9Sstevel@tonic-gate hold->objectclassMap = multival_new(); 31747c478bd9Sstevel@tonic-gate if (NULL == hold->objectclassMap) { 31757c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31767c478bd9Sstevel@tonic-gate "objectclassMap\n"), stderr); 31777c478bd9Sstevel@tonic-gate multival_free(hold->serviceAuthenticationMethod); 31787c478bd9Sstevel@tonic-gate multival_free(hold->serviceCredentialLevel); 31797c478bd9Sstevel@tonic-gate free(hold); 31807c478bd9Sstevel@tonic-gate return (NULL); /* NULL -> error */ 31817c478bd9Sstevel@tonic-gate } 31827c478bd9Sstevel@tonic-gate 31837c478bd9Sstevel@tonic-gate hold->attributeMap = multival_new(); 31847c478bd9Sstevel@tonic-gate if (NULL == hold->attributeMap) { 31857c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31867c478bd9Sstevel@tonic-gate "attributeMap\n"), stderr); 31877c478bd9Sstevel@tonic-gate multival_free(hold->serviceAuthenticationMethod); 31887c478bd9Sstevel@tonic-gate multival_free(hold->serviceCredentialLevel); 31897c478bd9Sstevel@tonic-gate multival_free(hold->objectclassMap); 31907c478bd9Sstevel@tonic-gate free(hold); 31917c478bd9Sstevel@tonic-gate return (NULL); /* NULL -> error */ 31927c478bd9Sstevel@tonic-gate } 31937c478bd9Sstevel@tonic-gate 31947c478bd9Sstevel@tonic-gate hold->serviceSearchDescriptor = multival_new(); 31957c478bd9Sstevel@tonic-gate if (NULL == hold->serviceSearchDescriptor) { 31967c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Error allocating memory for " 31977c478bd9Sstevel@tonic-gate "serviceSearchDescriptor\n"), stderr); 31987c478bd9Sstevel@tonic-gate multival_free(hold->serviceAuthenticationMethod); 31997c478bd9Sstevel@tonic-gate multival_free(hold->serviceCredentialLevel); 32007c478bd9Sstevel@tonic-gate multival_free(hold->objectclassMap); 32017c478bd9Sstevel@tonic-gate multival_free(hold->attributeMap); 32027c478bd9Sstevel@tonic-gate free(hold); 32037c478bd9Sstevel@tonic-gate return (NULL); /* NULL -> error */ 32047c478bd9Sstevel@tonic-gate } 32057c478bd9Sstevel@tonic-gate 32067c478bd9Sstevel@tonic-gate return (hold); 32077c478bd9Sstevel@tonic-gate } 32087c478bd9Sstevel@tonic-gate 32097c478bd9Sstevel@tonic-gate static void 32107c478bd9Sstevel@tonic-gate clientopts_free(clientopts_t *list) 32117c478bd9Sstevel@tonic-gate { 32127c478bd9Sstevel@tonic-gate if (NULL == list) 32137c478bd9Sstevel@tonic-gate return; 32147c478bd9Sstevel@tonic-gate 32157c478bd9Sstevel@tonic-gate multival_free(list->serviceAuthenticationMethod); 32167c478bd9Sstevel@tonic-gate multival_free(list->serviceCredentialLevel); 32177c478bd9Sstevel@tonic-gate multival_free(list->objectclassMap); 32187c478bd9Sstevel@tonic-gate multival_free(list->attributeMap); 32197c478bd9Sstevel@tonic-gate multival_free(list->serviceSearchDescriptor); 32207c478bd9Sstevel@tonic-gate 32217c478bd9Sstevel@tonic-gate free(list); 32227c478bd9Sstevel@tonic-gate 32237c478bd9Sstevel@tonic-gate } 32247c478bd9Sstevel@tonic-gate 32257c478bd9Sstevel@tonic-gate static void 32267c478bd9Sstevel@tonic-gate multival_list(char *opt, multival_t *list) 32277c478bd9Sstevel@tonic-gate { 32287c478bd9Sstevel@tonic-gate int i; 32297c478bd9Sstevel@tonic-gate 32307c478bd9Sstevel@tonic-gate if (list->count == 0) 32317c478bd9Sstevel@tonic-gate return; 32327c478bd9Sstevel@tonic-gate 32337c478bd9Sstevel@tonic-gate (void) puts(opt); 32347c478bd9Sstevel@tonic-gate for (i = 0; i < list->count; i++) { 32357c478bd9Sstevel@tonic-gate (void) printf("\t\targ[%d]: %s\n", i, list->optlist[i]); 32367c478bd9Sstevel@tonic-gate } 32377c478bd9Sstevel@tonic-gate } 32387c478bd9Sstevel@tonic-gate 32397c478bd9Sstevel@tonic-gate /* return the number of arguments specified in the command line */ 32407c478bd9Sstevel@tonic-gate static int 32417c478bd9Sstevel@tonic-gate num_args(clientopts_t *list) 32427c478bd9Sstevel@tonic-gate { 32437c478bd9Sstevel@tonic-gate int arg_count = 0; 32447c478bd9Sstevel@tonic-gate 32457c478bd9Sstevel@tonic-gate arg_count += list->authenticationMethod ? 1 : 0; 32467c478bd9Sstevel@tonic-gate arg_count += list->serviceAuthenticationMethod->count; 32477c478bd9Sstevel@tonic-gate arg_count += list->defaultSearchBase ? 1 : 0; 32487c478bd9Sstevel@tonic-gate arg_count += list->credentialLevel ? 1 : 0; 32497c478bd9Sstevel@tonic-gate arg_count += list->serviceCredentialLevel->count; 32507c478bd9Sstevel@tonic-gate arg_count += list->domainName ? 1 : 0; 32517c478bd9Sstevel@tonic-gate arg_count += list->proxyDN ? 1 : 0; 3252dd1104fbSMichen Chang arg_count += list->enableShadowUpdate ? 1 : 0; 3253dd1104fbSMichen Chang arg_count += list->adminDN ? 1 : 0; 32547c478bd9Sstevel@tonic-gate arg_count += list->profileTTL ? 1 : 0; 32557c478bd9Sstevel@tonic-gate arg_count += list->objectclassMap->count; 32567c478bd9Sstevel@tonic-gate arg_count += list->searchTimeLimit ? 1 : 0; 32577c478bd9Sstevel@tonic-gate arg_count += list->preferredServerList ? 1 : 0; 32587c478bd9Sstevel@tonic-gate arg_count += list->profileName ? 1 : 0; 32597c478bd9Sstevel@tonic-gate arg_count += list->followReferrals ? 1 : 0; 32607c478bd9Sstevel@tonic-gate arg_count += list->attributeMap->count; 32617c478bd9Sstevel@tonic-gate arg_count += list->defaultSearchScope ? 1 : 0; 32627c478bd9Sstevel@tonic-gate arg_count += list->serviceSearchDescriptor->count; 32637c478bd9Sstevel@tonic-gate arg_count += list->bindTimeLimit ? 1 : 0; 32647c478bd9Sstevel@tonic-gate arg_count += list->proxyPassword ? 1 : 0; 3265dd1104fbSMichen Chang arg_count += list->adminPassword ? 1 : 0; 32667c478bd9Sstevel@tonic-gate arg_count += list->defaultServerList ? 1 : 0; 32677c478bd9Sstevel@tonic-gate arg_count += list->certificatePath ? 1 : 0; 32687c478bd9Sstevel@tonic-gate 32697c478bd9Sstevel@tonic-gate return (arg_count); 32707c478bd9Sstevel@tonic-gate } 32717c478bd9Sstevel@tonic-gate 32727c478bd9Sstevel@tonic-gate #define CLIENT_PRINT(opt, str) if (str) \ 32737c478bd9Sstevel@tonic-gate (void) printf("%s%s\n", (opt), (str)) 32747c478bd9Sstevel@tonic-gate 32757c478bd9Sstevel@tonic-gate static void 32767c478bd9Sstevel@tonic-gate dumpargs(clientopts_t *list) 32777c478bd9Sstevel@tonic-gate { 32787c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tauthenticationMethod: ", list->authenticationMethod); 32797c478bd9Sstevel@tonic-gate multival_list("\tserviceAuthenticationMethod: ", 32807c478bd9Sstevel@tonic-gate list->serviceAuthenticationMethod); 32817c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tdefaultSearchBase: ", list->defaultSearchBase); 32827c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tcredentialLevel: ", list->credentialLevel); 32837c478bd9Sstevel@tonic-gate multival_list("\tserviceCredentialLevel: ", 32847c478bd9Sstevel@tonic-gate list->serviceCredentialLevel); 32857c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tdomainName: ", list->domainName); 32867c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tproxyDN: ", list->proxyDN); 3287dd1104fbSMichen Chang CLIENT_PRINT("\tadminDN: ", list->adminDN); 3288dd1104fbSMichen Chang CLIENT_PRINT("\tenableShadowUpdate: ", list->enableShadowUpdate); 32897c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tprofileTTL: ", list->profileTTL); 32907c478bd9Sstevel@tonic-gate multival_list("\tobjectclassMap: ", list->objectclassMap); 32917c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tsearchTimeLimit: ", list->searchTimeLimit); 32927c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tpreferredServerList: ", list->preferredServerList); 32937c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tprofileName: ", list->profileName); 32947c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tfollowReferrals: ", list->followReferrals); 32957c478bd9Sstevel@tonic-gate multival_list("\tattributeMap: ", list->attributeMap); 32967c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tdefaultSearchScope: ", list->defaultSearchScope); 32977c478bd9Sstevel@tonic-gate multival_list("\tserviceSearchDescriptor: ", 32987c478bd9Sstevel@tonic-gate list->serviceSearchDescriptor); 32997c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tbindTimeLimit: ", list->bindTimeLimit); 33007c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tproxyPassword: ", list->proxyPassword); 3301dd1104fbSMichen Chang CLIENT_PRINT("\tadminPassword: ", list->adminPassword); 33027c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tdefaultServerList: ", list->defaultServerList); 33037c478bd9Sstevel@tonic-gate CLIENT_PRINT("\tcertificatePath: ", list->certificatePath); 33047c478bd9Sstevel@tonic-gate } 33057c478bd9Sstevel@tonic-gate 33067c478bd9Sstevel@tonic-gate 33077c478bd9Sstevel@tonic-gate /* These definitions are only used in parseParam() below. */ 33087c478bd9Sstevel@tonic-gate struct param { 33097c478bd9Sstevel@tonic-gate char *name; 33107c478bd9Sstevel@tonic-gate int index; 33117c478bd9Sstevel@tonic-gate }; 33127c478bd9Sstevel@tonic-gate 33137c478bd9Sstevel@tonic-gate static struct param paramArray[] = { 33147c478bd9Sstevel@tonic-gate {"proxyDN", NS_LDAP_BINDDN_P}, 33157c478bd9Sstevel@tonic-gate {"proxyPassword", NS_LDAP_BINDPASSWD_P}, 33167c478bd9Sstevel@tonic-gate {"defaultServerList", NS_LDAP_SERVERS_P}, 33177c478bd9Sstevel@tonic-gate {"defaultSearchBase", NS_LDAP_SEARCH_BASEDN_P}, 33187c478bd9Sstevel@tonic-gate {"authenticationMethod", NS_LDAP_AUTH_P}, 33197c478bd9Sstevel@tonic-gate {"followReferrals", NS_LDAP_SEARCH_REF_P}, 33207c478bd9Sstevel@tonic-gate {"profileTTL", NS_LDAP_CACHETTL_P}, 33217c478bd9Sstevel@tonic-gate {"certificatePath", NS_LDAP_HOST_CERTPATH_P}, 33227c478bd9Sstevel@tonic-gate {"defaultSearchScope", NS_LDAP_SEARCH_SCOPE_P}, 33237c478bd9Sstevel@tonic-gate {"bindTimeLimit", NS_LDAP_BIND_TIME_P}, 33247c478bd9Sstevel@tonic-gate {"searchTimeLimit", NS_LDAP_SEARCH_TIME_P}, 33257c478bd9Sstevel@tonic-gate {"preferredServerList", NS_LDAP_SERVER_PREF_P}, 33267c478bd9Sstevel@tonic-gate {"profileName", NS_LDAP_PROFILE_P}, 33277c478bd9Sstevel@tonic-gate {"credentialLevel", NS_LDAP_CREDENTIAL_LEVEL_P}, 33287c478bd9Sstevel@tonic-gate {"serviceSearchDescriptor", NS_LDAP_SERVICE_SEARCH_DESC_P}, 33297c478bd9Sstevel@tonic-gate {"attributeMap", NS_LDAP_ATTRIBUTEMAP_P}, 33307c478bd9Sstevel@tonic-gate {"objectclassMap", NS_LDAP_OBJECTCLASSMAP_P}, 33317c478bd9Sstevel@tonic-gate {"serviceAuthenticationMethod", NS_LDAP_SERVICE_AUTH_METHOD_P}, 33327c478bd9Sstevel@tonic-gate {"serviceCredentialLevel", NS_LDAP_SERVICE_CRED_LEVEL_P}, 33337c478bd9Sstevel@tonic-gate {"domainName", LOCAL_DOMAIN_P}, 3334dd1104fbSMichen Chang {"enableShadowUpdate", NS_LDAP_ENABLE_SHADOW_UPDATE_P}, 3335dd1104fbSMichen Chang {"adminDN", NS_LDAP_ADMIN_BINDDN_P}, 3336dd1104fbSMichen Chang {"adminPassword", NS_LDAP_ADMIN_BINDPASSWD_P}, 33377c478bd9Sstevel@tonic-gate {NULL, 0} 33387c478bd9Sstevel@tonic-gate }; 33397c478bd9Sstevel@tonic-gate 33407c478bd9Sstevel@tonic-gate static int 33417c478bd9Sstevel@tonic-gate parseParam(char *param, char **paramVal) 33427c478bd9Sstevel@tonic-gate { 33437c478bd9Sstevel@tonic-gate char *val = NULL; 33447c478bd9Sstevel@tonic-gate int counter; 33457c478bd9Sstevel@tonic-gate 33467c478bd9Sstevel@tonic-gate if (mode_verbose) { 33477c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, gettext("Parsing %s\n"), param); 33487c478bd9Sstevel@tonic-gate } 33497c478bd9Sstevel@tonic-gate 33507c478bd9Sstevel@tonic-gate val = strchr(param, '='); 33517c478bd9Sstevel@tonic-gate if (val == NULL) { 33527c478bd9Sstevel@tonic-gate CLIENT_FPUTS( 33537c478bd9Sstevel@tonic-gate gettext("Didn\'t find \'=\' character in string\n"), 33547c478bd9Sstevel@tonic-gate stderr); 33557c478bd9Sstevel@tonic-gate paramVal = NULL; 33567c478bd9Sstevel@tonic-gate return (CLIENT_ERR_PARSE); 33577c478bd9Sstevel@tonic-gate } 33587c478bd9Sstevel@tonic-gate 33597c478bd9Sstevel@tonic-gate *val = '\0'; 33607c478bd9Sstevel@tonic-gate 33617c478bd9Sstevel@tonic-gate for (counter = 0; paramArray[counter].name != NULL; counter++) { 33627c478bd9Sstevel@tonic-gate if (strcasecmp(paramArray[counter].name, param) == 0) { 33637c478bd9Sstevel@tonic-gate *paramVal = val+1; 33647c478bd9Sstevel@tonic-gate *val = '='; /* restore original param */ 33657c478bd9Sstevel@tonic-gate return (paramArray[counter].index); 33667c478bd9Sstevel@tonic-gate } 33677c478bd9Sstevel@tonic-gate } 33687c478bd9Sstevel@tonic-gate 33697c478bd9Sstevel@tonic-gate /* Not found */ 33707c478bd9Sstevel@tonic-gate *val = '='; /* restore original param */ 33717c478bd9Sstevel@tonic-gate *paramVal = NULL; 33727c478bd9Sstevel@tonic-gate return (CLIENT_ERR_PARSE); 33737c478bd9Sstevel@tonic-gate } 33747c478bd9Sstevel@tonic-gate 33757c478bd9Sstevel@tonic-gate /* 33767c478bd9Sstevel@tonic-gate * The following macro checks if an option has already been specified 33777c478bd9Sstevel@tonic-gate * and errs out with usage if so 33787c478bd9Sstevel@tonic-gate */ 33797c478bd9Sstevel@tonic-gate #define CLIENT_OPT_CHECK(opt, optarg) \ 33807c478bd9Sstevel@tonic-gate if (optarg) { \ 33817c478bd9Sstevel@tonic-gate CLIENT_FPUTS(gettext("Invalid use of option\n"), stderr); \ 33827c478bd9Sstevel@tonic-gate usage(); \ 33837c478bd9Sstevel@tonic-gate clientopts_free(optlist); \ 33847c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); \ 33857c478bd9Sstevel@tonic-gate } 33867c478bd9Sstevel@tonic-gate 33877c478bd9Sstevel@tonic-gate static int 33887c478bd9Sstevel@tonic-gate clientSetParam(clientopts_t *optlist, int paramFlag, char *attrVal) 33897c478bd9Sstevel@tonic-gate { 33907c478bd9Sstevel@tonic-gate int retcode = 0; 33917c478bd9Sstevel@tonic-gate int counter; 33927c478bd9Sstevel@tonic-gate 33937c478bd9Sstevel@tonic-gate 33947c478bd9Sstevel@tonic-gate switch (paramFlag) { 33957c478bd9Sstevel@tonic-gate case NS_LDAP_AUTH_P: 33967c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->authenticationMethod); 33977c478bd9Sstevel@tonic-gate optlist->authenticationMethod = attrVal; 33987c478bd9Sstevel@tonic-gate break; 33997c478bd9Sstevel@tonic-gate 34007c478bd9Sstevel@tonic-gate case NS_LDAP_SERVICE_AUTH_METHOD_P: /* multiple allowed */ 34017c478bd9Sstevel@tonic-gate retcode = multival_add(optlist->serviceAuthenticationMethod, 34027c478bd9Sstevel@tonic-gate attrVal); 34037c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 34047c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 34057c478bd9Sstevel@tonic-gate gettext("Error processing attrVal %s\n"), 34067c478bd9Sstevel@tonic-gate attrVal?attrVal:"NULL"); 34077c478bd9Sstevel@tonic-gate usage(); 34087c478bd9Sstevel@tonic-gate clientopts_free(optlist); 34097c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 34107c478bd9Sstevel@tonic-gate } 34117c478bd9Sstevel@tonic-gate break; 34127c478bd9Sstevel@tonic-gate 34137c478bd9Sstevel@tonic-gate case NS_LDAP_SEARCH_BASEDN_P: 34147c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->defaultSearchBase); 34157c478bd9Sstevel@tonic-gate optlist->defaultSearchBase = attrVal; 34167c478bd9Sstevel@tonic-gate break; 34177c478bd9Sstevel@tonic-gate 34187c478bd9Sstevel@tonic-gate case NS_LDAP_CREDENTIAL_LEVEL_P: 34197c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->credentialLevel); 34207c478bd9Sstevel@tonic-gate optlist->credentialLevel = attrVal; 34217c478bd9Sstevel@tonic-gate break; 34227c478bd9Sstevel@tonic-gate 34237c478bd9Sstevel@tonic-gate case NS_LDAP_SERVICE_CRED_LEVEL_P: /* multiple allowed */ 34247c478bd9Sstevel@tonic-gate retcode = multival_add(optlist->serviceCredentialLevel, 34257c478bd9Sstevel@tonic-gate attrVal); 34267c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 34277c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 34287c478bd9Sstevel@tonic-gate gettext("Error processing attrVal %s\n"), 34297c478bd9Sstevel@tonic-gate attrVal?attrVal:"NULL"); 34307c478bd9Sstevel@tonic-gate usage(); 34317c478bd9Sstevel@tonic-gate clientopts_free(optlist); 34327c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 34337c478bd9Sstevel@tonic-gate } 34347c478bd9Sstevel@tonic-gate break; 34357c478bd9Sstevel@tonic-gate 34367c478bd9Sstevel@tonic-gate case LOCAL_DOMAIN_P: 34377c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->domainName); 34387c478bd9Sstevel@tonic-gate optlist->domainName = attrVal; 34397c478bd9Sstevel@tonic-gate dname = optlist->domainName; 34407c478bd9Sstevel@tonic-gate break; 34417c478bd9Sstevel@tonic-gate 34427c478bd9Sstevel@tonic-gate case NS_LDAP_BINDDN_P: 34437c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->proxyDN); 34447c478bd9Sstevel@tonic-gate optlist->proxyDN = attrVal; 34457c478bd9Sstevel@tonic-gate break; 34467c478bd9Sstevel@tonic-gate 3447dd1104fbSMichen Chang case NS_LDAP_ENABLE_SHADOW_UPDATE_P: 3448dd1104fbSMichen Chang CLIENT_OPT_CHECK(paramFlag, optlist->enableShadowUpdate); 3449dd1104fbSMichen Chang optlist->enableShadowUpdate = attrVal; 3450dd1104fbSMichen Chang break; 3451dd1104fbSMichen Chang 3452dd1104fbSMichen Chang case NS_LDAP_ADMIN_BINDDN_P: 3453dd1104fbSMichen Chang CLIENT_OPT_CHECK(paramFlag, optlist->adminDN); 3454dd1104fbSMichen Chang optlist->adminDN = attrVal; 3455dd1104fbSMichen Chang break; 3456dd1104fbSMichen Chang 34577c478bd9Sstevel@tonic-gate case NS_LDAP_CACHETTL_P: 34587c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->profileTTL); 34597c478bd9Sstevel@tonic-gate optlist->profileTTL = attrVal; 34607c478bd9Sstevel@tonic-gate break; 34617c478bd9Sstevel@tonic-gate 34627c478bd9Sstevel@tonic-gate case NS_LDAP_OBJECTCLASSMAP_P: /* multiple allowed */ 34637c478bd9Sstevel@tonic-gate retcode = multival_add(optlist->objectclassMap, attrVal); 34647c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 34657c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 34667c478bd9Sstevel@tonic-gate gettext("Error processing attrVal %s\n"), 34677c478bd9Sstevel@tonic-gate attrVal?attrVal:"NULL"); 34687c478bd9Sstevel@tonic-gate usage(); 34697c478bd9Sstevel@tonic-gate clientopts_free(optlist); 34707c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 34717c478bd9Sstevel@tonic-gate } 34727c478bd9Sstevel@tonic-gate break; 34737c478bd9Sstevel@tonic-gate 34747c478bd9Sstevel@tonic-gate case NS_LDAP_SEARCH_TIME_P: 34757c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->searchTimeLimit); 34767c478bd9Sstevel@tonic-gate optlist->searchTimeLimit = attrVal; 34777c478bd9Sstevel@tonic-gate break; 34787c478bd9Sstevel@tonic-gate 34797c478bd9Sstevel@tonic-gate case NS_LDAP_SERVER_PREF_P: 34807c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->preferredServerList); 34817c478bd9Sstevel@tonic-gate optlist->preferredServerList = attrVal; 34827c478bd9Sstevel@tonic-gate /* replace ',' chars with ' ' for proper syntax */ 34837c478bd9Sstevel@tonic-gate for (counter = 0; 34847c478bd9Sstevel@tonic-gate counter < strlen(optlist->preferredServerList); 34857c478bd9Sstevel@tonic-gate counter++) { 34867c478bd9Sstevel@tonic-gate 34877c478bd9Sstevel@tonic-gate if (optlist->preferredServerList[counter] == ',') 34887c478bd9Sstevel@tonic-gate optlist->preferredServerList[counter] = ' '; 34897c478bd9Sstevel@tonic-gate } 34907c478bd9Sstevel@tonic-gate break; 34917c478bd9Sstevel@tonic-gate 34927c478bd9Sstevel@tonic-gate case NS_LDAP_PROFILE_P: 34937c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->profileName); 34947c478bd9Sstevel@tonic-gate optlist->profileName = attrVal; 34957c478bd9Sstevel@tonic-gate break; 34967c478bd9Sstevel@tonic-gate 34977c478bd9Sstevel@tonic-gate case NS_LDAP_SEARCH_REF_P: 34987c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->followReferrals); 34997c478bd9Sstevel@tonic-gate if (0 == strcasecmp(attrVal, "followref")) 35007c478bd9Sstevel@tonic-gate optlist->followReferrals = "TRUE"; 35017c478bd9Sstevel@tonic-gate else if (0 == strcasecmp(attrVal, "noref")) 35027c478bd9Sstevel@tonic-gate optlist->followReferrals = "FALSE"; 35037c478bd9Sstevel@tonic-gate else 35047c478bd9Sstevel@tonic-gate optlist->followReferrals = attrVal; 35057c478bd9Sstevel@tonic-gate break; 35067c478bd9Sstevel@tonic-gate 35077c478bd9Sstevel@tonic-gate case NS_LDAP_ATTRIBUTEMAP_P: /* multiple allowed */ 35087c478bd9Sstevel@tonic-gate retcode = multival_add(optlist->attributeMap, attrVal); 35097c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 35107c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 35117c478bd9Sstevel@tonic-gate gettext("Error processing attrVal %s\n"), 35127c478bd9Sstevel@tonic-gate attrVal?attrVal:"NULL"); 35137c478bd9Sstevel@tonic-gate usage(); 35147c478bd9Sstevel@tonic-gate clientopts_free(optlist); 35157c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 35167c478bd9Sstevel@tonic-gate } 35177c478bd9Sstevel@tonic-gate break; 35187c478bd9Sstevel@tonic-gate 35197c478bd9Sstevel@tonic-gate case NS_LDAP_SEARCH_SCOPE_P: 35207c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->defaultSearchScope); 35217c478bd9Sstevel@tonic-gate optlist->defaultSearchScope = attrVal; 35227c478bd9Sstevel@tonic-gate break; 35237c478bd9Sstevel@tonic-gate 35247c478bd9Sstevel@tonic-gate case NS_LDAP_SERVICE_SEARCH_DESC_P: /* multiple allowed */ 35257c478bd9Sstevel@tonic-gate retcode = multival_add(optlist->serviceSearchDescriptor, 35267c478bd9Sstevel@tonic-gate attrVal); 35277c478bd9Sstevel@tonic-gate if (retcode != CLIENT_SUCCESS) { 35287c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 35297c478bd9Sstevel@tonic-gate gettext("Error processing attrVal %s\n"), 35307c478bd9Sstevel@tonic-gate attrVal?attrVal:"NULL"); 35317c478bd9Sstevel@tonic-gate usage(); 35327c478bd9Sstevel@tonic-gate clientopts_free(optlist); 35337c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 35347c478bd9Sstevel@tonic-gate } 35357c478bd9Sstevel@tonic-gate break; 35367c478bd9Sstevel@tonic-gate 35377c478bd9Sstevel@tonic-gate case NS_LDAP_BIND_TIME_P: 35387c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->bindTimeLimit); 35397c478bd9Sstevel@tonic-gate optlist->bindTimeLimit = attrVal; 35407c478bd9Sstevel@tonic-gate break; 35417c478bd9Sstevel@tonic-gate 35427c478bd9Sstevel@tonic-gate case NS_LDAP_BINDPASSWD_P: 35437c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->proxyPassword); 35447c478bd9Sstevel@tonic-gate optlist->proxyPassword = attrVal; 35457c478bd9Sstevel@tonic-gate break; 35467c478bd9Sstevel@tonic-gate 3547dd1104fbSMichen Chang case NS_LDAP_ADMIN_BINDPASSWD_P: 3548dd1104fbSMichen Chang CLIENT_OPT_CHECK(paramFlag, optlist->adminPassword); 3549dd1104fbSMichen Chang optlist->adminPassword = attrVal; 3550dd1104fbSMichen Chang break; 3551dd1104fbSMichen Chang 35527c478bd9Sstevel@tonic-gate case NS_LDAP_HOST_CERTPATH_P: 35537c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->certificatePath); 35547c478bd9Sstevel@tonic-gate optlist->certificatePath = attrVal; 35557c478bd9Sstevel@tonic-gate break; 35567c478bd9Sstevel@tonic-gate 35577c478bd9Sstevel@tonic-gate case NS_LDAP_SERVERS_P: 35587c478bd9Sstevel@tonic-gate CLIENT_OPT_CHECK(paramFlag, optlist->defaultServerList); 35597c478bd9Sstevel@tonic-gate optlist->defaultServerList = attrVal; 35607c478bd9Sstevel@tonic-gate break; 35617c478bd9Sstevel@tonic-gate 35627c478bd9Sstevel@tonic-gate default: 35637c478bd9Sstevel@tonic-gate usage(); 35647c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 35657c478bd9Sstevel@tonic-gate /* break; lint doesn't like break before end of switch */ 35667c478bd9Sstevel@tonic-gate } 35677c478bd9Sstevel@tonic-gate 35687c478bd9Sstevel@tonic-gate return (retcode); 35697c478bd9Sstevel@tonic-gate } 35707c478bd9Sstevel@tonic-gate 35717c478bd9Sstevel@tonic-gate /* 35727c478bd9Sstevel@tonic-gate * file_move() - Used to move a config file (backup/restore). 35737c478bd9Sstevel@tonic-gate * 35747c478bd9Sstevel@tonic-gate * This function uses a system() call with /bin/mv to handle the 35757c478bd9Sstevel@tonic-gate * case where the backup directory (/var) is on a different file 35767c478bd9Sstevel@tonic-gate * system than the config file (typically /etc). 35777c478bd9Sstevel@tonic-gate */ 35787c478bd9Sstevel@tonic-gate static int 35797c478bd9Sstevel@tonic-gate file_move(const char *from, const char *to) 35807c478bd9Sstevel@tonic-gate { 35817c478bd9Sstevel@tonic-gate int retcode; 35827c478bd9Sstevel@tonic-gate char mvCommand[] = CMD_MV; 35837c478bd9Sstevel@tonic-gate char cmd_buffer[(2 * MAXPATHLEN) + sizeof (mvCommand) + 3]; 35847c478bd9Sstevel@tonic-gate 35857c478bd9Sstevel@tonic-gate (void) snprintf(cmd_buffer, sizeof (cmd_buffer), "%s %s %s", 35867c478bd9Sstevel@tonic-gate mvCommand, from, to); 35877c478bd9Sstevel@tonic-gate 35887c478bd9Sstevel@tonic-gate /* 35897c478bd9Sstevel@tonic-gate * This function should only be used internally to move 35907c478bd9Sstevel@tonic-gate * system files to/from the backup directory. For security 35917c478bd9Sstevel@tonic-gate * reasons (this is run as root), don't use this function 35927c478bd9Sstevel@tonic-gate * with arguments passed into the program. 35937c478bd9Sstevel@tonic-gate */ 35947c478bd9Sstevel@tonic-gate retcode = system(cmd_buffer); 35957c478bd9Sstevel@tonic-gate 35967c478bd9Sstevel@tonic-gate return (retcode); 35977c478bd9Sstevel@tonic-gate } 35987c478bd9Sstevel@tonic-gate 35997c478bd9Sstevel@tonic-gate 36007c478bd9Sstevel@tonic-gate /* 36017c478bd9Sstevel@tonic-gate * Manipulate the service as instructed by "dowhat" 36027c478bd9Sstevel@tonic-gate */ 36037c478bd9Sstevel@tonic-gate static int 36047c478bd9Sstevel@tonic-gate do_service(const char *fmri, boolean_t waitflag, int dowhat, 36057c478bd9Sstevel@tonic-gate const char *state) { 36067c478bd9Sstevel@tonic-gate 36077c478bd9Sstevel@tonic-gate int status; 36087c478bd9Sstevel@tonic-gate boolean_t is_maint; 36097c478bd9Sstevel@tonic-gate const char *what = gettext("not set"); 36107c478bd9Sstevel@tonic-gate useconds_t max; 36117c478bd9Sstevel@tonic-gate 36127c478bd9Sstevel@tonic-gate /* Check if we are in maintenance */ 36137c478bd9Sstevel@tonic-gate is_maint = is_service(fmri, SCF_STATE_STRING_MAINT); 36147c478bd9Sstevel@tonic-gate 36157c478bd9Sstevel@tonic-gate switch (dowhat) { 36167c478bd9Sstevel@tonic-gate case START_SERVICE: 36177c478bd9Sstevel@tonic-gate what = gettext("start"); 36187c478bd9Sstevel@tonic-gate status = smf_enable_instance(fmri, 36197c478bd9Sstevel@tonic-gate (sysid_install == B_TRUE)?SMF_TEMPORARY:0); 36207c478bd9Sstevel@tonic-gate break; 36217c478bd9Sstevel@tonic-gate case STOP_SERVICE: 36227c478bd9Sstevel@tonic-gate what = gettext("stop"); 36237c478bd9Sstevel@tonic-gate status = smf_disable_instance(fmri, 36247c478bd9Sstevel@tonic-gate (sysid_install == B_TRUE)?SMF_TEMPORARY:0); 36257c478bd9Sstevel@tonic-gate break; 36267c478bd9Sstevel@tonic-gate case RESTART_SERVICE: 36277c478bd9Sstevel@tonic-gate what = gettext("restart"); 36287c478bd9Sstevel@tonic-gate status = smf_restart_instance(fmri); 36297c478bd9Sstevel@tonic-gate break; 36307c478bd9Sstevel@tonic-gate default: 36317c478bd9Sstevel@tonic-gate /* coding error; will not happen */ 36327c478bd9Sstevel@tonic-gate assert(0); 36337c478bd9Sstevel@tonic-gate } 36347c478bd9Sstevel@tonic-gate 36357c478bd9Sstevel@tonic-gate /* 36367c478bd9Sstevel@tonic-gate * If the service was previously in maintenance then we need to 36377c478bd9Sstevel@tonic-gate * clear it immediately. The "dowhat" action will set the 36387c478bd9Sstevel@tonic-gate * enabled property of the service as intended by the caller while 36397c478bd9Sstevel@tonic-gate * clear will actually cause it to be enabled/disabled. 36407c478bd9Sstevel@tonic-gate * We assume that the caller has called us after taking some 36417c478bd9Sstevel@tonic-gate * recovery action. Even if it's not the case, we don't lose 36427c478bd9Sstevel@tonic-gate * anything. 36437c478bd9Sstevel@tonic-gate */ 36447c478bd9Sstevel@tonic-gate if (status == 0 && is_maint == B_TRUE) { 36457c478bd9Sstevel@tonic-gate if (mode_verbose) 36467c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 36477c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 36487c478bd9Sstevel@tonic-gate what, 36497c478bd9Sstevel@tonic-gate fmri, 36507c478bd9Sstevel@tonic-gate gettext("restoring from maintenance state")); 36517c478bd9Sstevel@tonic-gate status = smf_restore_instance(fmri); 36527c478bd9Sstevel@tonic-gate } 36537c478bd9Sstevel@tonic-gate 36547c478bd9Sstevel@tonic-gate if (status == 0) { 36557c478bd9Sstevel@tonic-gate /* Check if we need to wait ? */ 36567c478bd9Sstevel@tonic-gate if (waitflag == B_FALSE) { 36577c478bd9Sstevel@tonic-gate if (mode_verbose) 36587c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 36597c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 36607c478bd9Sstevel@tonic-gate what, 36617c478bd9Sstevel@tonic-gate fmri, 36627c478bd9Sstevel@tonic-gate gettext("success")); 36637c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 36647c478bd9Sstevel@tonic-gate } 36657c478bd9Sstevel@tonic-gate 36667c478bd9Sstevel@tonic-gate /* Otherwise wait for max seconds (from the manifest) */ 36677c478bd9Sstevel@tonic-gate max = get_timeout_value(dowhat, fmri, DEFAULT_TIMEOUT); 36687c478bd9Sstevel@tonic-gate status = wait_till(fmri, state, max, what, !is_maint); 36697c478bd9Sstevel@tonic-gate if (status == CLIENT_SUCCESS) 36707c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 36717c478bd9Sstevel@tonic-gate /* For error fall through for corrective action */ 36727c478bd9Sstevel@tonic-gate } else { 36737c478bd9Sstevel@tonic-gate /* Well, service failed ... */ 36747c478bd9Sstevel@tonic-gate if (mode_verbose) 36757c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, "%s: %s... %s: %s\n", 36767c478bd9Sstevel@tonic-gate what, 36777c478bd9Sstevel@tonic-gate fmri, 36787c478bd9Sstevel@tonic-gate gettext("failed"), 36797c478bd9Sstevel@tonic-gate scf_strerror(scf_error())); 36807c478bd9Sstevel@tonic-gate status = CLIENT_ERR_FAIL; 36817c478bd9Sstevel@tonic-gate /* For error fall through for corrective action */ 36827c478bd9Sstevel@tonic-gate } 36837c478bd9Sstevel@tonic-gate 36847c478bd9Sstevel@tonic-gate /* 36857c478bd9Sstevel@tonic-gate * If service is still offline after start/restart, then transitioning 36867c478bd9Sstevel@tonic-gate * failed and guess is restarter failed to apply the timeout as well. 36877c478bd9Sstevel@tonic-gate * So instead of leaving it offline, let's just disable it until we have 36887c478bd9Sstevel@tonic-gate * some other mechanism available from smf to handle such situation. 36897c478bd9Sstevel@tonic-gate */ 36907c478bd9Sstevel@tonic-gate if (dowhat != STOP_SERVICE) 36917c478bd9Sstevel@tonic-gate if (is_service(fmri, SCF_STATE_STRING_OFFLINE)) { 36927c478bd9Sstevel@tonic-gate if (mode_verbose) 36937c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 36947c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 36957c478bd9Sstevel@tonic-gate what, 36967c478bd9Sstevel@tonic-gate fmri, 36977c478bd9Sstevel@tonic-gate gettext("offline to disable")); 36987c478bd9Sstevel@tonic-gate (void) disable_service(fmri, waitflag); 36997c478bd9Sstevel@tonic-gate } 37007c478bd9Sstevel@tonic-gate 37017c478bd9Sstevel@tonic-gate return (status); 37027c478bd9Sstevel@tonic-gate } 37037c478bd9Sstevel@tonic-gate 37047c478bd9Sstevel@tonic-gate 37057c478bd9Sstevel@tonic-gate /* 37067c478bd9Sstevel@tonic-gate * Wait for "max" usecs for the service described by "fmri" to change 37077c478bd9Sstevel@tonic-gate * to "state". If check_maint is true then return immediately if 37087c478bd9Sstevel@tonic-gate * service goes into maintenance 37097c478bd9Sstevel@tonic-gate */ 37107c478bd9Sstevel@tonic-gate static int 37117c478bd9Sstevel@tonic-gate wait_till(const char *fmri, const char *state, useconds_t max, 37127c478bd9Sstevel@tonic-gate const char *what, boolean_t check_maint) { 37137c478bd9Sstevel@tonic-gate char *st; 37147c478bd9Sstevel@tonic-gate useconds_t usecs = INIT_WAIT_USECS; 37157c478bd9Sstevel@tonic-gate 37167c478bd9Sstevel@tonic-gate for (; max > 0; max -= usecs) { 37177c478bd9Sstevel@tonic-gate /* incremental wait */ 37187c478bd9Sstevel@tonic-gate usecs *= 2; 37197c478bd9Sstevel@tonic-gate usecs = (usecs > max)?max:usecs; 37207c478bd9Sstevel@tonic-gate if (mode_verbose) 37217c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 37227c478bd9Sstevel@tonic-gate "%s: %s %u %s\n", 37237c478bd9Sstevel@tonic-gate what, gettext("sleep"), usecs, 37247c478bd9Sstevel@tonic-gate gettext("microseconds")); 37257c478bd9Sstevel@tonic-gate (void) usleep(usecs); 37267c478bd9Sstevel@tonic-gate 37277c478bd9Sstevel@tonic-gate /* Check state after the wait */ 37287c478bd9Sstevel@tonic-gate if ((st = smf_get_state(fmri)) != NULL) { 37297c478bd9Sstevel@tonic-gate if (strcmp(st, state) == 0) { 37307c478bd9Sstevel@tonic-gate if (mode_verbose) 37317c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 37327c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 37337c478bd9Sstevel@tonic-gate what, 37347c478bd9Sstevel@tonic-gate fmri, 37357c478bd9Sstevel@tonic-gate gettext("success")); 37367c478bd9Sstevel@tonic-gate free(st); 37377c478bd9Sstevel@tonic-gate return (CLIENT_SUCCESS); 37387c478bd9Sstevel@tonic-gate } 37397c478bd9Sstevel@tonic-gate 37407c478bd9Sstevel@tonic-gate /* 37417c478bd9Sstevel@tonic-gate * If service has gone into maintenance then 37427c478bd9Sstevel@tonic-gate * we will time out anyway, so we are better 37437c478bd9Sstevel@tonic-gate * off returning now 37447c478bd9Sstevel@tonic-gate */ 37457c478bd9Sstevel@tonic-gate if (check_maint && 37467c478bd9Sstevel@tonic-gate strcmp(st, SCF_STATE_STRING_MAINT) == 0) { 37477c478bd9Sstevel@tonic-gate if (mode_verbose) 37487c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 37497c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 37507c478bd9Sstevel@tonic-gate what, 37517c478bd9Sstevel@tonic-gate fmri, 37527c478bd9Sstevel@tonic-gate gettext("maintenance")); 37537c478bd9Sstevel@tonic-gate free(st); 37547c478bd9Sstevel@tonic-gate return (CLIENT_ERR_MAINTENANCE); 37557c478bd9Sstevel@tonic-gate } 37567c478bd9Sstevel@tonic-gate free(st); 37577c478bd9Sstevel@tonic-gate } else { 37587c478bd9Sstevel@tonic-gate if (mode_verbose) 37597c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 37607c478bd9Sstevel@tonic-gate "%s: %s... %s: %s\n", 37617c478bd9Sstevel@tonic-gate what, 37627c478bd9Sstevel@tonic-gate fmri, 37637c478bd9Sstevel@tonic-gate gettext("failed"), 37647c478bd9Sstevel@tonic-gate scf_strerror(scf_error())); 37657c478bd9Sstevel@tonic-gate return (CLIENT_ERR_FAIL); 37667c478bd9Sstevel@tonic-gate } 37677c478bd9Sstevel@tonic-gate } 37687c478bd9Sstevel@tonic-gate 37697c478bd9Sstevel@tonic-gate /* Timed out waiting */ 37707c478bd9Sstevel@tonic-gate if (mode_verbose) 37717c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, 37727c478bd9Sstevel@tonic-gate "%s: %s... %s\n", 37737c478bd9Sstevel@tonic-gate what, 37747c478bd9Sstevel@tonic-gate fmri, 37757c478bd9Sstevel@tonic-gate gettext("timed out")); 37767c478bd9Sstevel@tonic-gate return (CLIENT_ERR_TIMEDOUT); 37777c478bd9Sstevel@tonic-gate } 37787c478bd9Sstevel@tonic-gate 37797c478bd9Sstevel@tonic-gate 37807c478bd9Sstevel@tonic-gate static boolean_t 37817c478bd9Sstevel@tonic-gate is_service(const char *fmri, const char *state) { 37827c478bd9Sstevel@tonic-gate char *st; 37837c478bd9Sstevel@tonic-gate boolean_t result = B_FALSE; 37847c478bd9Sstevel@tonic-gate 37857c478bd9Sstevel@tonic-gate if ((st = smf_get_state(fmri)) != NULL) { 37867c478bd9Sstevel@tonic-gate if (strcmp(st, state) == 0) 37877c478bd9Sstevel@tonic-gate result = B_TRUE; 37887c478bd9Sstevel@tonic-gate free(st); 37897c478bd9Sstevel@tonic-gate } 37907c478bd9Sstevel@tonic-gate return (result); 37917c478bd9Sstevel@tonic-gate } 37927c478bd9Sstevel@tonic-gate 37937c478bd9Sstevel@tonic-gate 37947c478bd9Sstevel@tonic-gate /* 37957c478bd9Sstevel@tonic-gate * 37967c478bd9Sstevel@tonic-gate * get_timeout_val : returns the timeout value set in fmri manifest 37977c478bd9Sstevel@tonic-gate * inputs : action(start/stop) 37987c478bd9Sstevel@tonic-gate * fmri(defined fmri string) 37997c478bd9Sstevel@tonic-gate * Returns default if error, the timeout val otherwise 38007c478bd9Sstevel@tonic-gate * 38017c478bd9Sstevel@tonic-gate */ 38027c478bd9Sstevel@tonic-gate 38037c478bd9Sstevel@tonic-gate static useconds_t 38047c478bd9Sstevel@tonic-gate get_timeout_value(int dowhat, const char *fmri, useconds_t default_val) 38057c478bd9Sstevel@tonic-gate { 38067c478bd9Sstevel@tonic-gate scf_simple_prop_t *sp = NULL; 38077c478bd9Sstevel@tonic-gate uint64_t *cp = NULL; 38087c478bd9Sstevel@tonic-gate int timeout = default_val/1000000; 38097c478bd9Sstevel@tonic-gate char *action = NULL; 38107c478bd9Sstevel@tonic-gate const char *actionstr = NULL; 38117c478bd9Sstevel@tonic-gate 38127c478bd9Sstevel@tonic-gate switch (dowhat) { 38137c478bd9Sstevel@tonic-gate case START_SERVICE: 38147c478bd9Sstevel@tonic-gate case RESTART_SERVICE: 38157c478bd9Sstevel@tonic-gate action = "start"; 38167c478bd9Sstevel@tonic-gate actionstr = gettext("start"); 38177c478bd9Sstevel@tonic-gate break; 38187c478bd9Sstevel@tonic-gate case STOP_SERVICE: 38197c478bd9Sstevel@tonic-gate action = "stop"; 38207c478bd9Sstevel@tonic-gate actionstr = gettext("stop"); 38217c478bd9Sstevel@tonic-gate break; 38227c478bd9Sstevel@tonic-gate default: 38237c478bd9Sstevel@tonic-gate assert(0); 38247c478bd9Sstevel@tonic-gate } 38257c478bd9Sstevel@tonic-gate 38267c478bd9Sstevel@tonic-gate 38277c478bd9Sstevel@tonic-gate sp = scf_simple_prop_get(NULL, fmri, action, SCF_PROPERTY_TIMEOUT); 38287c478bd9Sstevel@tonic-gate if (sp == NULL) { 38297c478bd9Sstevel@tonic-gate if (mode_verbose) 38307c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, "%s: %s... %s: %s\n", 38317c478bd9Sstevel@tonic-gate actionstr, 38327c478bd9Sstevel@tonic-gate fmri, 38337c478bd9Sstevel@tonic-gate gettext("failed to retrieve timeout property"), 38347c478bd9Sstevel@tonic-gate scf_strerror(scf_error())); 38357c478bd9Sstevel@tonic-gate return (default_val); 38367c478bd9Sstevel@tonic-gate } 38377c478bd9Sstevel@tonic-gate 38387c478bd9Sstevel@tonic-gate cp = scf_simple_prop_next_count(sp); 38397c478bd9Sstevel@tonic-gate if (cp == NULL) { 38407c478bd9Sstevel@tonic-gate if (mode_verbose) 38417c478bd9Sstevel@tonic-gate CLIENT_FPRINTF(stderr, "%s: %s... %s: %s\n", 38427c478bd9Sstevel@tonic-gate actionstr, 38437c478bd9Sstevel@tonic-gate fmri, 38447c478bd9Sstevel@tonic-gate gettext("failed to retrieve timeout value"), 38457c478bd9Sstevel@tonic-gate scf_strerror(scf_error())); 38467c478bd9Sstevel@tonic-gate scf_simple_prop_free(sp); 38477c478bd9Sstevel@tonic-gate return (default_val); 38487c478bd9Sstevel@tonic-gate } 38497c478bd9Sstevel@tonic-gate 38507c478bd9Sstevel@tonic-gate if (*cp != 0) 38517c478bd9Sstevel@tonic-gate timeout = *cp; 38527c478bd9Sstevel@tonic-gate scf_simple_prop_free(sp); 38537c478bd9Sstevel@tonic-gate return (timeout * 1000000); 38547c478bd9Sstevel@tonic-gate } 3855