1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-01 04:58:35 +03:00

Fixed some more client SPOOLSS functions. The following

functions work now:

  - spoolenum
  - spoolopen
  - spoolgetprinter
  - spoolgetprinterdriver

Items todo:

  - track down memory bug with spoolenumdata
  - fix spoolgetprinterdriverdir
  - fix spoolgetdata
  - fix display_job_info_ctr in spooljobs

All part of the rpcclient work.

Jeremy, this check includes emthods for associating
POLICY_HNDs and client states.  See the RpcHndList_...()
function calls (implemented in lib/util_list.c)



--jerry
(This used to be commit 84349394a988213724ca138e9692b3bc44fa0cb8)
This commit is contained in:
Gerald Carter 2000-07-18 05:07:28 +00:00
parent 2089176e34
commit 17dba7ef05
3 changed files with 78 additions and 74 deletions

View File

@ -26,19 +26,6 @@
#include "rpc_parse.h"
#include "rpc_client.h"
struct cli_connection
{
uint32 num_connections;
char *srv_name;
char *pipe_name;
struct user_creds usr_creds;
struct cli_state *pCli_state;
cli_auth_fns *auth;
void *auth_info;
void *auth_creds;
};
static struct cli_connection **con_list = NULL;
static uint32 num_cons = 0;
@ -48,6 +35,31 @@ vuser_key *user_key = NULL;
extern int DEBUGLEVEL;
extern pstring global_myname;
/*
* needed for the struct cli_connection
* none of these functions are implemented in HEAD currently
* rpc_client/cli_connect.c for details
*
* the 'typedef struct _cli_auth_fns cli_auth_fns;' is in
* rpc_misc.h
*/
struct _cli_auth_fns {
/* these three will do for now. they *should* match with server-side */
BOOL (*create_bind_req) (struct cli_connection *, prs_struct *,
uint32, RPC_IFACE *, RPC_IFACE *);
BOOL (*decode_bind_resp) (struct cli_connection *, prs_struct *);
BOOL (*create_bind_cont) (struct cli_connection *, prs_struct *, uint32);
/* creates an authenticated PDU */
BOOL (*cli_create_pdu) (struct cli_connection *, uint8, prs_struct *,
int, int *, prs_struct *, uint8 *);
/* decodes an authenticated PDU */
BOOL (*cli_decode_pdu) (struct cli_connection *, prs_struct *, int, int);
};
cli_auth_fns cli_noauth_fns =
{
NULL,
@ -139,6 +151,9 @@ static struct cli_connection *cli_con_get(const char *srv_name,
pNcacn = ncacn_np_use_add(pipe_name, user_key, srv_name,
ntc, reuse,
&is_new_connection);
if (pNcacn == NULL)
return NULL;
con->pCli_state = pNcacn->smb;
if (con->pCli_state == NULL)
@ -310,7 +325,7 @@ BOOL cli_connection_init_auth(const char *srv_name, const char *pipe_name,
/****************************************************************************
get auth functions associated with an msrpc session.
****************************************************************************/
struct cli_auth_fns *cli_conn_get_authfns(struct cli_connection *con)
struct _cli_auth_fns *cli_conn_get_authfns(struct cli_connection *con)
{
return con != NULL ? con->auth : NULL;
}
@ -333,17 +348,11 @@ BOOL rpc_hnd_pipe_req(const POLICY_HND * hnd, uint8 op_num,
{
struct cli_connection *con = NULL;
#if 0 /* temporary disable by JERRY */
/* we need this to locate the cli_connection associated
with the POLICY_HND */
if (!cli_connection_get(hnd, &con))
{
if ((con=RpcHndList_get_connection(hnd)) == NULL)
return False;
}
#endif /* temporary disable by JERRY */
/* always will return False until I fix cli_connection_get()
--jerry */
if (!rpc_con_ok(con)) return False;
return rpc_con_pipe_req(con, op_num, data, rdata);

View File

@ -48,8 +48,8 @@ uint32 spoolss_enum_printerdrivers(const char * srv_name,
if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
return False;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
@ -176,8 +176,8 @@ uint32 spoolss_enum_jobs(const POLICY_HND *hnd, uint32 firstjob, uint32 numofjob
if (hnd == NULL)
return NT_STATUS_INVALID_PARAMETER;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
@ -231,8 +231,8 @@ uint32 spoolss_enum_printerdata(const POLICY_HND *hnd, uint32 idx,
if (hnd == NULL)
return NT_STATUS_INVALID_PARAMETER;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
@ -288,8 +288,8 @@ uint32 spoolss_getprinter(const POLICY_HND *hnd, uint32 level,
if (hnd == NULL)
return NT_STATUS_INVALID_PARAMETER;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
@ -343,8 +343,8 @@ uint32 spoolss_getprinterdriver(const POLICY_HND *hnd,
if (hnd == NULL)
return NT_STATUS_INVALID_PARAMETER;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
@ -397,7 +397,7 @@ BOOL spoolss_open_printer_ex( const char *printername,
SPOOL_Q_OPEN_PRINTER_EX q_o;
BOOL valid_pol = False;
fstring srv_name;
char *s;
char *s = NULL;
struct cli_connection *con = NULL;
@ -405,9 +405,8 @@ BOOL spoolss_open_printer_ex( const char *printername,
fstrcpy(srv_name, printername);
s = strchr(&srv_name[2], '\\');
if (s != NULL)
*s = 0;
if (s != NULL)
*s = '\0';
if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
return False;
@ -444,21 +443,15 @@ BOOL spoolss_open_printer_ex( const char *printername,
{
/* ok, at last: we're happy. return the policy handle */
*hnd = r_o.handle;
valid_pol = True;
#if 0 /* JERRY */
/* *hnd should be valid at this point */
valid_pol = register_policy_hnd(get_global_hnd_cache(),
cli_con_sec_ctx(con),
hnd, access_required) &&
set_policy_con(get_global_hnd_cache(),
hnd, con,
cli_connection_unlink);
#endif /* JERRY */
/* associate the handle returned with the current
state of the clienjt connection */
valid_pol = RpcHndList_set_connection(hnd, con);
}
}
prs_mem_free(&rbuf);
prs_mem_free(&rbuf);
prs_mem_free(&buf );
return valid_pol;
@ -474,7 +467,8 @@ BOOL spoolss_closeprinter(POLICY_HND *hnd)
SPOOL_Q_CLOSEPRINTER q_c;
BOOL valid_close = False;
if (hnd == NULL) return False;
if (hnd == NULL)
return False;
/* create and send a MSRPC command with api SPOOLSS_CLOSEPRINTER */
@ -499,19 +493,15 @@ BOOL spoolss_closeprinter(POLICY_HND *hnd)
/* report error code */
DEBUG(0,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c.status)));
}
else
valid_close = True;
}
prs_mem_free(&rbuf);
prs_mem_free(&buf );
if ( hnd != NULL )
{
free (hnd);
hnd = NULL;
}
/* commented out by JERRY - merge from TNG */
/* close_policy_hnd(get_global_hnd_cache(), hnd); */
/* disassociate with the cli_connection */
RpcHndList_del_connection(hnd);
return valid_close;
}
@ -534,8 +524,8 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
if (hnd == NULL)
return NT_STATUS_INVALID_PARAMETER;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_GETPRINTERDATA */
@ -549,7 +539,7 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
prs_mem_free(&buf );
}
if(!rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDATA, &buf, &rbuf)) {
if (!rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDATA, &buf, &rbuf)) {
prs_mem_free(&rbuf);
prs_mem_free(&buf );
}
@ -590,8 +580,8 @@ uint32 spoolss_getprinterdriverdir(fstring srv_name, fstring env_name, uint32 le
if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
return False;
prs_init(&buf , 0, 4, False);
prs_init(&rbuf, 0, 4, True );
prs_init(&buf , MAX_PDU_FRAG_LEN, 4, MARSHALL);
prs_init(&rbuf, 0, 4, UNMARSHALL);
/* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */

View File

@ -209,21 +209,26 @@ BOOL msrpc_spoolss_enum_printers(char* srv_name, uint32 flags,
if (status!=NT_STATUS_NO_PROBLEMO)
return False;
switch (level) {
case 1:
decode_printer_info_1(&buffer, returned, &(ctr.printers_1));
break;
case 2:
decode_printer_info_2(&buffer, returned, &(ctr.printers_2));
break;
case 3:
decode_printer_info_3(&buffer, returned, &(ctr.printers_3));
break;
}
/* is there anything to process? */
if (returned != 0)
{
switch (level) {
case 1:
decode_printer_info_1(&buffer, returned, &(ctr.printers_1));
break;
case 2:
decode_printer_info_2(&buffer, returned, &(ctr.printers_2));
break;
case 3:
decode_printer_info_3(&buffer, returned, &(ctr.printers_3));
break;
}
display_printer_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
}
display_printer_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
return True;
}