diff options
author | Gerald Carter <jerry@samba.org> | 2001-03-14 20:22:57 +0000 |
---|---|---|
committer | Gerald Carter <jerry@samba.org> | 2001-03-14 20:22:57 +0000 |
commit | fb3d8452e5250973eae682dd4a13bf530ccfc56a (patch) | |
tree | 1efd72d8a26b7485e8df6cf9bc93cb617fa50f6c /source3/libsmb | |
parent | 762c6e3f84141a1c7ef697f1b0a3339d655c86ad (diff) | |
download | samba-fb3d8452e5250973eae682dd4a13bf530ccfc56a.tar.gz samba-fb3d8452e5250973eae682dd4a13bf530ccfc56a.tar.bz2 samba-fb3d8452e5250973eae682dd4a13bf530ccfc56a.zip |
set of changes in the beginning of bringing rpcclient changes
back to working order. The main change is that the cli_*() RPC
functions from libsmb/*.c now should accept a struct cli_state*.
The reason for this is that rpcclient should establish the
connection to the server at startup so that it is not necessary
to keep the clear test or password hash in memory for each command.
enumports and enumprinters now works as well. lsa* functions
have been tested. SAMR calls may or may not work (one of the core
dumps I know), but it compiles :-)
jerry
(This used to be commit d98ac8852ae6b39b6fcff92c346ba56d9e63c518)
Diffstat (limited to 'source3/libsmb')
-rw-r--r-- | source3/libsmb/cli_spoolss.c | 56 | ||||
-rw-r--r-- | source3/libsmb/cliconnect.c | 2 | ||||
-rw-r--r-- | source3/libsmb/pwd_cache.c | 10 |
3 files changed, 35 insertions, 33 deletions
diff --git a/source3/libsmb/cli_spoolss.c b/source3/libsmb/cli_spoolss.c index d8e7b0cce6..af12f102d7 100644 --- a/source3/libsmb/cli_spoolss.c +++ b/source3/libsmb/cli_spoolss.c @@ -25,7 +25,6 @@ #include "includes.h" /* Opens a SMB connection to the SPOOLSS pipe */ - struct cli_state *cli_spoolss_initialise(struct cli_state *cli, char *system_name, struct ntuser_creds *creds) @@ -321,10 +320,14 @@ uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, NEW_BUFFER buffer; uint32 needed = 100; uint32 result; + fstring server; ZERO_STRUCT(q); ZERO_STRUCT(r); + fstrcpy (server, cli->desthost); + strupper (server); + do { /* Initialise input parameters */ @@ -333,46 +336,39 @@ uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); - make_spoolss_q_enumprinters(&q, flags, "", level, &buffer, + make_spoolss_q_enumprinters(&q, flags, server, level, &buffer, needed); /* Marshall data and send request */ if (!spoolss_io_q_enumprinters("", &q, &qbuf, 0) || - !rpc_api_pipe_req(cli, SPOOLSS_ENUMPRINTERS, &qbuf, - &rbuf)) { + !rpc_api_pipe_req(cli, SPOOLSS_ENUMPRINTERS, &qbuf, &rbuf)) { result = NT_STATUS_UNSUCCESSFUL; goto done; } /* Unmarshall response */ - - prs_switch_type(&buffer.prs, UNMARSHALL); - prs_set_offset(&buffer.prs, 0); - r.buffer = &buffer; - if (new_spoolss_io_r_enumprinters("", &r, &rbuf, 0)) { needed = r.needed; } /* Return output parameters */ - if ((result = r.status) == NT_STATUS_NOPROBLEMO && - r.returned > 0) { + if ((result = r.status) == NT_STATUS_NOPROBLEMO && r.returned > 0) { *returned = r.returned; switch (level) { case 1: - decode_printer_info_1(&buffer, r.returned, + decode_printer_info_1(r.buffer, r.returned, &ctr->printers_1); break; case 2: - decode_printer_info_2(&buffer, r.returned, + decode_printer_info_2(r.buffer, r.returned, &ctr->printers_2); break; case 3: - decode_printer_info_3(&buffer, r.returned, + decode_printer_info_3(r.buffer, r.returned, &ctr->printers_3); break; } @@ -398,10 +394,14 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, NEW_BUFFER buffer; uint32 needed = 100; uint32 result; + fstring server; ZERO_STRUCT(q); ZERO_STRUCT(r); + fstrcpy (server, cli->desthost); + strupper (server); + do { /* Initialise input parameters */ @@ -410,23 +410,20 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + /* NT4 will return NT_STATUS_CTL_FILE_NOT_SUPPORTED is we + set the servername here in the query. Not sure why \ + --jerry */ make_spoolss_q_enumports(&q, "", level, &buffer, needed); /* Marshall data and send request */ if (!spoolss_io_q_enumports("", &q, &qbuf, 0) || - !rpc_api_pipe_req(cli, SPOOLSS_ENUMPORTS, &qbuf, - &rbuf)) { + !rpc_api_pipe_req(cli, SPOOLSS_ENUMPORTS, &qbuf, &rbuf)) { result = NT_STATUS_UNSUCCESSFUL; goto done; } /* Unmarshall response */ - - prs_switch_type(&buffer.prs, UNMARSHALL); - prs_set_offset(&buffer.prs, 0); - r.buffer = &buffer; - if (new_spoolss_io_r_enumports("", &r, &rbuf, 0)) { needed = r.needed; } @@ -440,11 +437,11 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, switch (level) { case 1: - decode_port_info_1(&buffer, r.returned, + decode_port_info_1(r.buffer, r.returned, &ctr->port.info_1); break; case 2: - decode_port_info_2(&buffer, r.returned, + decode_port_info_2(r.buffer, r.returned, &ctr->port.info_2); break; } @@ -495,11 +492,6 @@ uint32 cli_spoolss_getprinter(struct cli_state *cli, POLICY_HND *pol, } /* Unmarshall response */ - - prs_switch_type(&buffer.prs, UNMARSHALL); - prs_set_offset(&buffer.prs, 0); - r.buffer = &buffer; - if (spoolss_io_r_getprinter("", &r, &rbuf, 0)) { needed = r.needed; } @@ -510,19 +502,19 @@ uint32 cli_spoolss_getprinter(struct cli_state *cli, POLICY_HND *pol, switch (level) { case 0: - decode_printer_info_0(&buffer, 1, + decode_printer_info_0(r.buffer, 1, &ctr->printers_0); break; case 1: - decode_printer_info_1(&buffer, 1, + decode_printer_info_1(r.buffer, 1, &ctr->printers_1); break; case 2: - decode_printer_info_2(&buffer, 1, + decode_printer_info_2(r.buffer, 1, &ctr->printers_2); break; case 3: - decode_printer_info_3(&buffer, 1, + decode_printer_info_3(r.buffer, 1, &ctr->printers_3); break; } diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index 46a63dc5f1..06f283c321 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -669,7 +669,7 @@ BOOL cli_establish_connection(struct cli_state *cli, { DEBUG(1,("failed session request\n")); if (do_shutdown) - cli_shutdown(cli); + cli_shutdown(cli); return False; } diff --git a/source3/libsmb/pwd_cache.c b/source3/libsmb/pwd_cache.c index 26b1d192f0..420b49ed2e 100644 --- a/source3/libsmb/pwd_cache.c +++ b/source3/libsmb/pwd_cache.c @@ -103,11 +103,21 @@ void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt) user_pass = (char*)getpass(passwd_report); + /* + * Do not assume that an empty string is a NULL password. + * If you do this will break the session key generation for + * and account with an emtpy password. If you wish to use + * a NULL password, use the -N option to smbclient and rpcclient + * --jerry + */ +#if 0 if (user_pass == NULL || user_pass[0] == 0) { pwd_set_nullpwd(pwd); } else if (do_encrypt) +#endif + if (do_encrypt) { pwd_make_lm_nt_16(pwd, user_pass); } |