2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Jean Francois Micouleau 1998-2000,
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "rpc_parse.h"
27 extern int DEBUGLEVEL
;
28 extern pstring global_myname
;
30 /*********************************************************
31 Disconnect from the client machine.
32 **********************************************************/
33 BOOL
spoolss_disconnect_from_client( struct cli_state
*cli
)
35 cli_nt_session_close(cli
);
43 /*********************************************************
44 Connect to the client machine.
45 **********************************************************/
47 BOOL
spoolss_connect_to_client( struct cli_state
*cli
, char *remote_machine
)
50 if(cli_initialise(cli
) == NULL
) {
51 DEBUG(0,("connect_to_client: unable to initialize client connection.\n"));
55 if(!resolve_name( remote_machine
, &cli
->dest_ip
, 0x20)) {
56 DEBUG(0,("connect_to_client: Can't resolve address for %s\n", remote_machine
));
61 if (ismyip(cli
->dest_ip
)) {
62 DEBUG(0,("connect_to_client: Machine %s is one of our addresses. Cannot add to ourselves.\n", remote_machine
));
67 if (!cli_connect(cli
, remote_machine
, &cli
->dest_ip
)) {
68 DEBUG(0,("connect_to_client: unable to connect to SMB server on machine %s. Error was : %s.\n", remote_machine
, cli_errstr(cli
) ));
73 if (!attempt_netbios_session_request(cli
, global_myname
, remote_machine
, &cli
->dest_ip
)) {
74 DEBUG(0,("connect_to_client: machine %s rejected the NetBIOS session request. Error was %s\n", remote_machine
, cli_errstr(cli
) ));
79 cli
->protocol
= PROTOCOL_NT1
;
81 if (!cli_negprot(cli
)) {
82 DEBUG(0,("connect_to_client: machine %s rejected the negotiate protocol. Error was : %s.\n", remote_machine
, cli_errstr(cli
) ));
87 if (cli
->protocol
!= PROTOCOL_NT1
) {
88 DEBUG(0,("connect_to_client: machine %s didn't negotiate NT protocol.\n", remote_machine
));
94 * Do an anonymous session setup.
97 if (!cli_session_setup(cli
, "", "", 0, "", 0, "")) {
98 DEBUG(0,("connect_to_client: machine %s rejected the session setup. Error was : %s.\n", remote_machine
, cli_errstr(cli
) ));
103 if (!(cli
->sec_mode
& 1)) {
104 DEBUG(0,("connect_to_client: machine %s isn't in user level security mode\n", remote_machine
));
109 if (!cli_send_tconX(cli
, "IPC$", "IPC", "", 1)) {
110 DEBUG(0,("connect_to_client: machine %s rejected the tconX on the IPC$ share. Error was : %s.\n", remote_machine
, cli_errstr(cli
) ));
116 * Ok - we have an anonymous connection to the IPC$ share.
117 * Now start the NT Domain stuff :-).
120 if(cli_nt_session_open(cli
, PIPE_SPOOLSS
) == False
) {
121 DEBUG(0,("connect_to_client: unable to open the domain client session to machine %s. Error was : %s.\n", remote_machine
, cli_errstr(cli
)));
122 cli_nt_session_close(cli
);
131 /***************************************************************************
132 do a reply open printer
133 ****************************************************************************/
135 BOOL
cli_spoolss_reply_open_printer(struct cli_state
*cli
, char *printer
, uint32 localprinter
, uint32 type
, uint32
*status
, POLICY_HND
*handle
)
140 SPOOL_Q_REPLYOPENPRINTER q_s
;
141 SPOOL_R_REPLYOPENPRINTER r_s
;
143 prs_init(&buf
, 1024, cli
->mem_ctx
, MARSHALL
);
144 prs_init(&rbuf
, 0, cli
->mem_ctx
, UNMARSHALL
);
146 /* create and send a MSRPC command with api SPOOLSS_REPLYOPENPRINTER */
148 DEBUG(4,("cli_spoolss_reply_open_printer: srv:%s acct:%s sc: %d mc: %s clnt %s %x\n",
149 cli->srv_name_slash, cli->mach_acct, sec_chan_type, global_myname,
150 credstr(new_clnt_cred.challenge.data), new_clnt_cred.timestamp.time));
152 /* store the parameters */
153 make_spoolss_q_replyopenprinter(&q_s
, printer
, localprinter
, type
);
155 /* turn parameters into data stream */
156 if(!spoolss_io_q_replyopenprinter("", &q_s
, &buf
, 0)) {
157 DEBUG(0,("cli_spoolss_reply_open_printer: Error : failed to marshall NET_Q_SRV_PWSET struct.\n"));
163 /* send the data on \PIPE\ */
164 if (!rpc_api_pipe_req(cli
, SPOOLSS_REPLYOPENPRINTER
, &buf
, &rbuf
)) {
172 /* turn data stream into parameters*/
173 if(!spoolss_io_r_replyopenprinter("", &r_s
, &rbuf
, 0)) {
180 memcpy(handle
, &r_s
.handle
, sizeof(r_s
.handle
));
186 /***************************************************************************
187 do a reply open printer
188 ****************************************************************************/
190 BOOL
cli_spoolss_reply_rrpcn(struct cli_state
*cli
, POLICY_HND
*handle
,
191 uint32 change_low
, uint32 change_high
, uint32
*status
)
196 SPOOL_Q_REPLY_RRPCN q_s
;
197 SPOOL_R_REPLY_RRPCN r_s
;
199 prs_init(&buf
, 1024, cli
->mem_ctx
, MARSHALL
);
200 prs_init(&rbuf
, 0, cli
->mem_ctx
, UNMARSHALL
);
202 /* create and send a MSRPC command with api */
204 DEBUG(4,("cli_spoolss_reply_open_printer: srv:%s acct:%s sc: %d mc: %s clnt %s %x\n",
205 cli->srv_name_slash, cli->mach_acct, sec_chan_type, global_myname,
206 credstr(new_clnt_cred.challenge.data), new_clnt_cred.timestamp.time));
208 /* store the parameters */
209 make_spoolss_q_reply_rrpcn(&q_s
, handle
, change_low
, change_high
);
211 /* turn parameters into data stream */
212 if(!spoolss_io_q_reply_rrpcn("", &q_s
, &buf
, 0)) {
213 DEBUG(0,("cli_spoolss_reply_rrpcn: Error : failed to marshall SPOOL_Q_REPLY_RRPCN struct.\n"));
219 /* send the data on \PIPE\ */
220 if (!rpc_api_pipe_req(cli
, SPOOLSS_RRPCN
, &buf
, &rbuf
)) {
228 /* turn data stream into parameters*/
229 if(!spoolss_io_r_reply_rrpcn("", &r_s
, &rbuf
, 0)) {
241 /***************************************************************************
242 do a reply open printer
243 ****************************************************************************/
245 BOOL
cli_spoolss_reply_close_printer(struct cli_state
*cli
, POLICY_HND
*handle
, uint32
*status
)
250 SPOOL_Q_REPLYCLOSEPRINTER q_s
;
251 SPOOL_R_REPLYCLOSEPRINTER r_s
;
253 prs_init(&buf
, 1024, cli
->mem_ctx
, MARSHALL
);
254 prs_init(&rbuf
, 0, cli
->mem_ctx
, UNMARSHALL
);
256 /* create and send a MSRPC command with api */
258 DEBUG(4,("cli_spoolss_reply_open_printer: srv:%s acct:%s sc: %d mc: %s clnt %s %x\n",
259 cli->srv_name_slash, cli->mach_acct, sec_chan_type, global_myname,
260 credstr(new_clnt_cred.challenge.data), new_clnt_cred.timestamp.time));
262 /* store the parameters */
263 make_spoolss_q_reply_closeprinter(&q_s
, handle
);
265 /* turn parameters into data stream */
266 if(!spoolss_io_q_replycloseprinter("", &q_s
, &buf
, 0)) {
267 DEBUG(0,("cli_spoolss_reply_close_printer: Error : failed to marshall SPOOL_Q_REPLY_CLOSEPRINTER struct.\n"));
273 /* send the data on \PIPE\ */
274 if (!rpc_api_pipe_req(cli
, SPOOLSS_REPLYCLOSEPRINTER
, &buf
, &rbuf
)) {
282 /* turn data stream into parameters*/
283 if(!spoolss_io_r_replycloseprinter("", &r_s
, &rbuf
, 0)) {