static int process_options(int argc, char **argv, int local_flags) { int ch; pstring configfile; pstrcpy(configfile, dyn_CONFIGFILE); local_flags |= LOCAL_SET_PASSWORD; ZERO_STRUCT(user_name); user_name[0] = '\0'; while ((ch = getopt(argc, argv, "c:axdehminjr:sw:R:D:U:LW")) != EOF) { switch(ch) { case 'L': #if !defined(DEVELOPER) if (getuid() != 0) { fprintf(stderr, "smbpasswd -L can only be used by root.\n"); exit(1); } #endif local_flags |= LOCAL_AM_ROOT; break; case 'c': pstrcpy(configfile,optarg); break; case 'a': local_flags |= LOCAL_ADD_USER; break; case 'x': local_flags |= LOCAL_DELETE_USER; local_flags &= ~LOCAL_SET_PASSWORD; break; case 'd': local_flags |= LOCAL_DISABLE_USER; local_flags &= ~LOCAL_SET_PASSWORD; break; case 'e': local_flags |= LOCAL_ENABLE_USER; local_flags &= ~LOCAL_SET_PASSWORD; break; case 'm': local_flags |= LOCAL_TRUST_ACCOUNT; break; case 'i': local_flags |= LOCAL_INTERDOM_ACCOUNT; break; case 'j': d_printf("See 'net join' for this functionality\n"); exit(1); break; case 'n': local_flags |= LOCAL_SET_NO_PASSWORD; local_flags &= ~LOCAL_SET_PASSWORD; new_passwd = smb_xstrdup("NO PASSWORD"); break; case 'r': remote_machine = optarg; break; case 's': set_line_buffering(stdin); set_line_buffering(stdout); set_line_buffering(stderr); stdin_passwd_get = True; break; case 'w': local_flags |= LOCAL_SET_LDAP_ADMIN_PW; fstrcpy(ldap_secret, optarg); break; case 'R': lp_set_name_resolve_order(optarg); break; case 'D': DEBUGLEVEL = atoi(optarg); break; case 'U': { got_username = True; fstrcpy(user_name, optarg); break; case 'W': local_flags |= LOCAL_SET_LDAP_ADMIN_PW; *ldap_secret = '\0'; break; } case 'h': default: usage(); } } argc -= optind; argv += optind; switch(argc) { case 0: if (!got_username) fstrcpy(user_name, ""); break; case 1: if (!(local_flags & LOCAL_AM_ROOT)) { usage(); } else { if (got_username) { usage(); } else { fstrcpy(user_name, argv[0]); } } break; default: usage(); } if (!lp_load(configfile,True,False,False,True)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", configfile); exit(1); } return local_flags; }
/***************************************************** initialise structures *******************************************************/ void smbw_init(void) { extern BOOL in_client; static int initialised; static pstring servicesf = CONFIGFILE; extern FILE *dbf; char *p; int eno; pstring line; if (initialised) return; initialised = 1; eno = errno; smbw_busy++; DEBUGLEVEL = 0; AllowDebugChange = False; setup_logging("smbsh",True); dbf = stderr; if ((p=smbw_getshared("LOGFILE"))) { dbf = sys_fopen(p, "a"); } smbw_file_bmap = bitmap_allocate(SMBW_MAX_OPEN); if (!smbw_file_bmap) { exit(1); } charset_initialise(); in_client = True; load_interfaces(); if ((p=smbw_getshared("SERVICESF"))) { pstrcpy(servicesf, p); } lp_load(servicesf,True,False,False); codepage_initialise(lp_client_code_page()); get_myname(global_myname); if ((p=smbw_getshared("DEBUG"))) { DEBUGLEVEL = atoi(p); } if ((p=smbw_getshared("RESOLVE_ORDER"))) { lp_set_name_resolve_order(p); } if ((p=smbw_getshared("PREFIX"))) { slprintf(smbw_prefix,sizeof(fstring)-1, "/%s/", p); all_string_sub(smbw_prefix,"//", "/", 0); DEBUG(2,("SMBW_PREFIX is %s\n", smbw_prefix)); } slprintf(line,sizeof(line)-1,"PWD_%d", (int)getpid()); p = smbw_getshared(line); if (!p) { sys_getwd(smbw_cwd); } pstrcpy(smbw_cwd, p); DEBUG(4,("Initial cwd is %s\n", smbw_cwd)); smbw_busy--; set_maxfiles(SMBW_MAX_OPEN); BlockSignals(True,SIGPIPE); errno = eno; }
/******************************************************************* Process command line options ******************************************************************/ static void process_options(int argc, char **argv, BOOL amroot) { int ch; DOM_SID dom_sid; fstring sid_str; user_name[0] = '\0'; while ((ch = getopt(argc, argv, "c:axdehmnj:t:r:sw:R:D:U:LSW:X:")) != EOF) { switch(ch) { case 'L': local_mode = amroot = True; break; case 'c': pstrcpy(servicesf,optarg); break; case 'a': if (!amroot) goto bad_args; local_flags |= LOCAL_ADD_USER; break; case 'x': if (!amroot) goto bad_args; local_flags |= LOCAL_DELETE_USER; new_passwd = strdup_x("XXXXXX"); break; case 'd': if (!amroot) goto bad_args; local_flags |= LOCAL_DISABLE_USER; new_passwd = strdup_x("XXXXXX"); break; case 'e': if (!amroot) goto bad_args; local_flags |= LOCAL_ENABLE_USER; break; case 'm': if (!amroot) goto bad_args; local_flags |= LOCAL_TRUST_ACCOUNT; break; case 'n': if (!amroot) goto bad_args; local_flags |= LOCAL_SET_NO_PASSWORD; new_passwd = strdup_x("NO PASSWORD"); break; case 'j': if (!amroot) goto bad_args; new_domain = optarg; strupper(new_domain); joining_domain = True; break; case 't': if (!amroot) goto bad_args; new_domain = optarg; strupper(new_domain); changing_trust_pw = True; break; case 'r': remote_machine = optarg; break; case 'S': if (!amroot) goto bad_args; local_flags |= LOCAL_GET_DOM_SID; break; case 's': set_line_buffering(stdin); set_line_buffering(stdout); set_line_buffering(stderr); stdin_passwd_get = True; break; case 'w': if (!amroot) goto bad_args; #ifdef WITH_LDAP_SAM local_flags |= LOCAL_SET_LDAP_ADMIN_PW; fstrcpy(ldap_secret, optarg); break; #else printf("-w not available unless configured --with-ldapsam\n"); goto bad_args; #endif case 'R': if (!amroot) goto bad_args; lp_set_name_resolve_order(optarg); break; case 'D': DEBUGLEVEL = atoi(optarg); break; case 'U': { char *lp; got_username = True; fstrcpy(user_name, optarg); if ((lp = strchr(user_name, '%'))) { *lp = 0; fstrcpy(user_password, lp + 1); got_pass = True; memset(strchr(optarg, '%') + 1, 'X', strlen(user_password)); } } break; case 'W': /* Take the SID on the command line and make it ours */ if (!lp_load(servicesf,True,False,False)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf); exit(1); } if (!string_to_sid(&dom_sid, optarg)) { fprintf(stderr, "Invalid SID: %s\n", optarg); exit(1); } if (!secrets_init()) { fprintf(stderr, "Unable to open secrets database!\n"); exit(1); } if (!secrets_store_domain_sid(global_myname, &dom_sid)) { fprintf(stderr, "Unable to write the new SID %s as the server SID for %s\n", optarg, global_myname); exit(1); } /* * Now, write it to the workgroup as well, to make * things consistent. This is a risk however. */ if (!secrets_store_domain_sid(lp_workgroup(), &dom_sid)) { fprintf(stderr, "Unable to write the new SID %s as the domain SID for %s\n", optarg, lp_workgroup()); exit(1); } exit(0); break; case 'X': /* Extract the SID for a domain from secrets */ if (!lp_load(servicesf,True,False,False)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf); exit(1); } if (!secrets_init()) { fprintf(stderr, "Unable to open secrets database!\n"); exit(1); } if (secrets_fetch_domain_sid(optarg, &dom_sid)) { sid_to_string(sid_str, &dom_sid); printf("SID for domain %s is: %s\n", optarg, sid_str); exit(0); } else { fprintf(stderr, "Could not retrieve SID for domain: %s\n", optarg); exit(1); } break; case 'h': default: bad_args: usage(); } } argc -= optind; argv += optind; if (joining_domain && (argc != 0)) usage(); switch(argc) { case 0: if (!got_username) fstrcpy(user_name, ""); break; case 1: if (!amroot == 1) { new_passwd = argv[0]; break; } if (got_username) usage(); fstrcpy(user_name, argv[0]); break; case 2: if (!amroot || got_username || got_pass) usage(); fstrcpy(user_name, argv[0]); new_passwd = strdup_x(argv[1]); break; default: usage(); } }