summaryrefslogtreecommitdiff
path: root/source3/utils/smbpasswd.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/utils/smbpasswd.c')
-rw-r--r--source3/utils/smbpasswd.c92
1 files changed, 58 insertions, 34 deletions
diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c
index f733f99be2..b03385769c 100644
--- a/source3/utils/smbpasswd.c
+++ b/source3/utils/smbpasswd.c
@@ -38,6 +38,39 @@ struct
};
/******************************************************
+ Return an error message for a remote password change.
+*******************************************************/
+
+char *get_error_message(struct cli_state *cli)
+{
+ static fstring error_message;
+ int errclass;
+ int errnum;
+ int i;
+
+ /*
+ * Errors are of two kinds - smb errors,
+ * dealt with by cli_errstr, and rap
+ * errors, whose error code is in cli.error.
+ */
+
+ cli_error(cli, &errclass, &errnum);
+ if(errclass != 0)
+ return cli_errstr(cli);
+
+ sprintf(error_message, "code %d", cli->error);
+
+ for(i = 0; pw_change_errmap[i].message != NULL; i++) {
+ if (pw_change_errmap[i].err == cli->error) {
+ fstrcpy( error_message, pw_change_errmap[i].message);
+ break;
+ }
+ }
+
+ return error_message;
+}
+
+/******************************************************
Convert a hex password.
*******************************************************/
@@ -387,10 +420,10 @@ int get_new_machine_uid(void)
static void usage(char *name, BOOL is_root)
{
if(is_root)
- fprintf(stderr, "Usage is : %s [-a] [-d] [-m] [-w] [-n] [username] [password]\n\
-%s: [-R <name resolve order>] [-r machine] [username] [password]\n%s: [-h]\n", name, name, name);
+ fprintf(stderr, "Usage is : %s [-D DEBUGLEVEL] [-a] [-d] [-m] [-n] [username] [password]\n\
+%s: [-R <name resolve order>] [-D DEBUGLEVEL] [-r machine] [username] [password]\n%s: [-h]\n", name, name, name);
else
- fprintf(stderr, "Usage is : %s [-h] [-r machine] [password]\n", name);
+ fprintf(stderr, "Usage is : %s [-h] [-D DEBUGLEVEL] [-r machine] [password]\n", name);
exit(1);
}
@@ -402,6 +435,7 @@ int main(int argc, char **argv)
{
extern char *optarg;
extern int optind;
+ extern int DEBUGLEVEL;
char *prog_name;
int real_uid;
struct passwd *pwd;
@@ -431,7 +465,6 @@ int main(int argc, char **argv)
BOOL add_user = False;
BOOL got_new_pass = False;
BOOL machine_account = False;
- BOOL server_machine_account = False;
BOOL disable_user = False;
BOOL set_no_password = False;
pstring servicesf = CONFIGFILE;
@@ -467,7 +500,7 @@ int main(int argc, char **argv)
is_root = (real_uid == 0);
- while ((ch = getopt(argc, argv, "adhmnr:R:w")) != EOF) {
+ while ((ch = getopt(argc, argv, "adhmnr:R:D:")) != EOF) {
switch(ch) {
case 'a':
if(is_root)
@@ -483,6 +516,9 @@ int main(int argc, char **argv)
} else
usage(prog_name, is_root);
break;
+ case 'D':
+ DEBUGLEVEL = atoi(optarg);
+ break;
case 'n':
if(is_root) {
set_no_password = True;
@@ -500,10 +536,8 @@ int main(int argc, char **argv)
} else
usage(prog_name, is_root);
case 'm':
- case 'w':
if(is_root) {
machine_account = True;
- server_machine_account = (ch == 'm');
} else
usage(prog_name, is_root);
break;
@@ -651,16 +685,18 @@ int main(int argc, char **argv)
prog_name, remote_machine );
exit(1);
}
-
+
+ cli.error = 0;
+
if (!cli_initialise(&cli) || !cli_connect(&cli, remote_machine, &ip)) {
- fprintf(stderr, "%s: unable to connect to SMB server on machine %s.\n",
- prog_name, remote_machine );
+ fprintf(stderr, "%s: unable to connect to SMB server on machine %s. Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
exit(1);
}
if (!cli_session_request(&cli, remote_machine, 0x20, myname)) {
- fprintf(stderr, "%s: machine %s rejected the session setup.\n",
- prog_name, remote_machine );
+ fprintf(stderr, "%s: machine %s rejected the session setup. Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
cli_shutdown(&cli);
exit(1);
}
@@ -668,40 +704,30 @@ int main(int argc, char **argv)
cli.protocol = PROTOCOL_NT1;
if (!cli_negprot(&cli)) {
- fprintf(stderr, "%s: machine %s rejected the negotiate protocol.\n",
- prog_name, remote_machine );
+ fprintf(stderr, "%s: machine %s rejected the negotiate protocol. Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
cli_shutdown(&cli);
exit(1);
}
if (!cli_session_setup(&cli, user_name, old_passwd, strlen(old_passwd),
"", 0, "")) {
- fprintf(stderr, "%s: machine %s rejected the session setup.\n",
- prog_name, remote_machine );
+ fprintf(stderr, "%s: machine %s rejected the session setup. Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
cli_shutdown(&cli);
exit(1);
}
if (!cli_send_tconX(&cli, "IPC$", "IPC", "", 1)) {
- fprintf(stderr, "%s: machine %s rejected the tconX on the IPC$ share.\n",
- prog_name, remote_machine );
+ fprintf(stderr, "%s: machine %s rejected the tconX on the IPC$ share. Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
cli_shutdown(&cli);
exit(1);
}
if(!cli_oem_change_password(&cli, user_name, new_passwd, old_passwd)) {
- fstring error_message;
-
- sprintf(error_message, " with code %d", cli.error);
-
- for(i = 0; pw_change_errmap[i].message != NULL; i++) {
- if (pw_change_errmap[i].err == cli.error) {
- fstrcpy( error_message, pw_change_errmap[i].message);
- break;
- }
- }
- fprintf(stderr, "%s: machine %s rejected the password change: %s.\n",
- prog_name, remote_machine, error_message );
+ fprintf(stderr, "%s: machine %s rejected the password change: Error was : %s.\n",
+ prog_name, remote_machine, get_error_message(&cli) );
cli_shutdown(&cli);
exit(1);
}
@@ -735,8 +761,7 @@ int main(int argc, char **argv)
pwd = &machine_account_pwd;
pwd->pw_name = user_name;
- sprintf(machine_dir_name, "%s machine account for %s",
- server_machine_account ? "Server" : "Workstation", user_name);
+ sprintf(machine_dir_name, "Workstation machine account for %s", user_name);
pwd->pw_gecos = "";
pwd->pw_dir = machine_dir_name;
pwd->pw_shell = "";
@@ -817,8 +842,7 @@ int main(int argc, char **argv)
int new_entry_length;
char *new_entry;
long offpos;
- uint16 acct_ctrl = (machine_account ?
- ( server_machine_account ? ACB_SVRTRUST : ACB_WSTRUST) : ACB_NORMAL);
+ uint16 acct_ctrl = (machine_account ? ACB_WSTRUST : ACB_NORMAL);
/* The add user write needs to be atomic - so get the fd from
the fp and do a raw write() call.