spoolss openprinterex / closeprinter client-code.
authorLuke Leighton <lkcl@samba.org>
Sat, 6 Nov 1999 18:11:19 +0000 (18:11 +0000)
committerLuke Leighton <lkcl@samba.org>
Sat, 6 Nov 1999 18:11:19 +0000 (18:11 +0000)
experimental spoolopen <printer name> command added.

jean-francois, f.y.i. i changed the #define for SPOOLSS_OPENPRINTEREX from
op code 0x44 to 0x45.

source/Makefile.in
source/include/proto.h
source/include/rpc_spoolss.h
source/rpc_client/cli_spoolss.c [new file with mode: 0644]
source/rpc_parse/parse_spoolss.c
source/rpc_server/srv_spoolss.c
source/rpcclient/cmd_spoolss.c [new file with mode: 0644]
source/rpcclient/rpcclient.c

index 96e28e8eb2a47a8bd6d73382a9b55dea3283e020..cc254dd97f066ff8944bf076b3856f20abdc5e57 100644 (file)
@@ -156,9 +156,9 @@ RPC_CLIENT_OBJ = \
                rpc_client/cli_netlogon_sync.o \
                rpc_client/cli_reg.o \
                rpc_client/cli_pipe.o     \
+               rpc_client/cli_spoolss.o   \
                rpc_client/cli_lsarpc.o   \
                rpc_client/cli_wkssvc.o   \
-               rpc_client/cli_spoolss.o   \
                rpc_client/cli_srvsvc.o   \
                rpc_client/cli_svcctl.o \
                rpc_client/cli_samr.o   \
@@ -248,19 +248,19 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
                 $(UBIQX_OBJ) $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) $(LIB_OBJ)
 
 RPCCLIENT_OBJ = rpcclient/rpcclient.o \
-             rpcclient/display.o \
-             rpcclient/cmd_lsarpc.o \
-             rpcclient/cmd_spoolss.o \
-             rpcclient/cmd_wkssvc.o \
-             rpcclient/cmd_samr.o \
-             rpcclient/cmd_reg.o \
-             rpcclient/cmd_srvsvc.o \
-             rpcclient/cmd_svcctl.o \
-             rpcclient/cmd_netlogon.o \
-             rpcclient/cmd_atsvc.o \
-             rpcclient/cmd_eventlog.o \
-             $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
-             $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ)
+               rpcclient/display.o \
+               rpcclient/cmd_lsarpc.o \
+               rpcclient/cmd_wkssvc.o \
+               rpcclient/cmd_samr.o \
+               rpcclient/cmd_reg.o \
+               rpcclient/cmd_srvsvc.o \
+               rpcclient/cmd_svcctl.o \
+               rpcclient/cmd_netlogon.o \
+               rpcclient/cmd_atsvc.o \
+               rpcclient/cmd_spoolss.o \
+               rpcclient/cmd_eventlog.o \
+               $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
+               $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ)
 
 SMBWRAPPER_OBJ = smbwrapper/smbw.o smbwrapper/wrapped.o \
                smbwrapper/smbw_dir.o smbwrapper/smbw_stat.o \
index e9880b55c3f02e372b4f50a748e32d6a994121ed..c382d2d6ed25ac684345e74fe65a74b55d67cbc6 100644 (file)
@@ -2037,12 +2037,13 @@ BOOL samr_query_dispinfo(struct cli_state *cli, uint16 fnum,
 
 /*The following definitions come from  rpc_client/cli_spoolss.c  */
 
-BOOL spoolss_get_printer_data(struct cli_state *cli, uint16 fnum, 
-                       PRINTER_HND *hnd,
-                       char *value_name, uint32 size);
-BOOL spoolss_get_printer(struct cli_state *cli, uint16 fnum, 
-                       PRINTER_HND *hnd, uint32 level,
-                       uint32 buf_size);
+BOOL spoolss_open_printer_ex(struct cli_state *cli, uint16 fnum,
+                       char *printername,
+                       uint32 cbbuf, uint32 devmod, uint32 des_access,
+                       char *station,
+                       char *username,
+                       PRINTER_HND *hnd);
+BOOL spoolss_closeprinter(struct cli_state *cli, uint16 fnum, PRINTER_HND *hnd);
 
 /*The following definitions come from  rpc_client/cli_srvsvc.c  */
 
@@ -2926,20 +2927,20 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF *sec, prs_struct *ps, int depth);
 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime);
 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
                                      prs_struct *ps, int depth);
-BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth);
-BOOL make_spoolss_io_q_open_printer(SPOOL_Q_OPEN_PRINTER *q_u, 
-               uint32 unk_0,
+BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth);
+BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, 
                char *printername,
-               uint32 unk_1, uint32 cbbuf, uint32 devmod, uint32 des_access,
+               uint32 cbbuf, uint32 devmod, uint32 des_access,
                char *station,
                char *username);
-BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth);
+BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth);
 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
                                PRINTER_HND *handle,
                                char *valuename,
                                uint32 size);
 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth);
+BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, PRINTER_HND *hnd);
 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth);
@@ -3414,8 +3415,7 @@ void cmd_sam_enum_groups(struct client_info *info);
 
 /*The following definitions come from  rpcclient/cmd_spoolss.c  */
 
-void cmd_spoolss_getprinterdata(struct client_info *info);
-void cmd_spoolss_getprinter(struct client_info *info);
+void cmd_spoolss_open_printer_ex(struct client_info *info);
 
 /*The following definitions come from  rpcclient/cmd_srvsvc.c  */
 
index e48d114dd1a16d78c35d37d696b354a80f563f4f..0afc8d2b5d3bd419b7c9dc1bef936223ad45e3cc 100755 (executable)
@@ -506,37 +506,40 @@ typedef struct s_buffer
 typedef struct printer_policy_info
 {
   uint8 data[PRINTER_HND_SIZE]; /* printer handle */
+
 } PRINTER_HND;
 
-/* SPOOL_Q_OPEN_PRINTER request to open a printer */
-typedef struct spool_q_open_printer
+/* SPOOL_Q_OPEN_PRINTER_EX request to open a printer */
+typedef struct spool_q_open_printer_ex
 {
-       uint32  unknown0;
+       uint32  ptr;
        UNISTR2 printername;
-       uint32  unknown1;
+       uint32  unknown0;
        uint32  cbbuf;
        uint32  devmod;
        uint32  access_required;
+       uint32  unknown1;       /* 0x0000 0001 */
        uint32  unknown2;       /* 0x0000 0001 */
-       uint32  unknown3;       /* 0x0000 0001 */
-       uint32  unknown4;       /* ??? */
-       uint32  unknown5;       /* 0x0000 001c */
-       uint32  unknown6;       /* ??? */
-       uint32  unknown7;       /* ??? */
-       uint32  unknown8;       /* 0x0000 0565 */
-       uint32  unknown9;       /* 0x0000 0002 */
+       uint32  unknown3;       /* ??? pointer? */
+       uint32  unknown4;       /* 0x0000 001c */
+       uint32  unknown5;       /* ??? e.g 0xb94dd0 */
+       uint32  unknown6;       /* ??? pointer? */
+       uint32  unknown7;       /* 0x0000 0565 */
+       uint32  unknown8;       /* 0x0000 0002 */
+       uint32  unknown9;       /* 0x0000 0000 */
        uint32  unknown10;      /* 0x0000 0000 */
-       uint32  unknown11;      /* ??? */
        UNISTR2 station;
        UNISTR2 username;
-} SPOOL_Q_OPEN_PRINTER;
 
-/* SPOOL_Q_OPEN_PRINTER reply to an open printer */ 
-typedef struct spool_r_open_printer
+} SPOOL_Q_OPEN_PRINTER_EX;
+
+/* SPOOL_Q_OPEN_PRINTER_EX reply to an open printer */ 
+typedef struct spool_r_open_printer_ex
 {      
        PRINTER_HND handle; /* handle used along all transactions (20*uint8) */
        uint32 status;
-} SPOOL_R_OPEN_PRINTER;
+
+} SPOOL_R_OPEN_PRINTER_EX;
 
 typedef struct spool_q_getprinterdata
 {
diff --git a/source/rpc_client/cli_spoolss.c b/source/rpc_client/cli_spoolss.c
new file mode 100644 (file)
index 0000000..adb8506
--- /dev/null
@@ -0,0 +1,163 @@
+
+/* 
+ *  Unix SMB/Netbios implementation.
+ *  Version 1.9.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1997,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
+ *  Copyright (C) Paul Ashton                       1997.
+ *  
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifdef SYSLOG
+#undef SYSLOG
+#endif
+
+#include "includes.h"
+
+extern int DEBUGLEVEL;
+
+
+/****************************************************************************
+do a SPOOLSS Open Printer Ex
+****************************************************************************/
+BOOL spoolss_open_printer_ex(struct cli_state *cli, uint16 fnum,
+                       char *printername,
+                       uint32 cbbuf, uint32 devmod, uint32 des_access,
+                       char *station,
+                       char *username,
+                       PRINTER_HND *hnd)
+{
+       prs_struct rbuf;
+       prs_struct buf; 
+       SPOOL_Q_OPEN_PRINTER_EX q_o;
+       BOOL valid_pol = False;
+
+       if (hnd == NULL) return False;
+
+       prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
+       prs_init(&rbuf, 0   , 4, SAFETY_MARGIN, True );
+
+       /* create and send a MSRPC command with api SPOOLSS_OPENPRINTEREX */
+
+       DEBUG(5,("SPOOLSS Open Printer Ex\n"));
+
+       make_spoolss_q_open_printer_ex(&q_o, printername,
+                                      cbbuf, devmod, des_access,
+                                      station, username);
+
+       /* turn parameters into data stream */
+       spoolss_io_q_open_printer_ex("", &q_o, &buf, 0);
+
+       /* send the data on \PIPE\ */
+       if (rpc_api_pipe_req(cli, fnum, SPOOLSS_OPENPRINTEREX, &buf, &rbuf))
+       {
+               SPOOL_R_OPEN_PRINTER_EX r_o;
+               BOOL p;
+
+               spoolss_io_r_open_printer_ex("", &r_o, &rbuf, 0);
+               p = rbuf.offset != 0;
+
+               if (p && r_o.status != 0)
+               {
+                       /* report error code */
+                       DEBUG(5,("SPOOLSS_OPENPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
+                       p = False;
+               }
+
+               if (p)
+               {
+                       /* ok, at last: we're happy. return the policy handle */
+                       memcpy(hnd, r_o.handle.data, sizeof(hnd->data));
+                       valid_pol = True;
+               }
+       }
+
+       prs_mem_free(&rbuf);
+       prs_mem_free(&buf );
+
+       return valid_pol;
+}
+
+/****************************************************************************
+do a SPOOL Close
+****************************************************************************/
+BOOL spoolss_closeprinter(struct cli_state *cli, uint16 fnum, PRINTER_HND *hnd)
+{
+       prs_struct rbuf;
+       prs_struct buf; 
+       SPOOL_Q_CLOSEPRINTER q_c;
+       BOOL valid_close = False;
+
+       if (hnd == NULL) return False;
+
+       /* create and send a MSRPC command with api SPOOLSS_CLOSEPRINTER */
+
+       prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
+       prs_init(&rbuf, 0   , 4, SAFETY_MARGIN, True );
+
+       DEBUG(4,("SPOOL Close Printer\n"));
+
+       /* store the parameters */
+       make_spoolss_q_closeprinter(&q_c, hnd);
+
+       /* turn parameters into data stream */
+       spoolss_io_q_closeprinter("", &q_c, &buf, 0);
+
+       /* send the data on \PIPE\ */
+       if (rpc_api_pipe_req(cli, fnum, SPOOLSS_CLOSEPRINTER, &buf, &rbuf))
+       {
+               SPOOL_R_CLOSEPRINTER r_c;
+               BOOL p;
+
+               spoolss_io_r_closeprinter("", &r_c, &rbuf, 0);
+               p = rbuf.offset != 0;
+
+               if (p && r_c.status != 0)
+               {
+                       /* report error code */
+                       DEBUG(0,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c.status)));
+                       p = False;
+               }
+
+               if (p)
+               {
+                       /* check that the returned policy handle is all zeros */
+                       uint32 i;
+                       valid_close = True;
+
+                       for (i = 0; i < sizeof(r_c.handle.data); i++)
+                       {
+                               if (r_c.handle.data[i] != 0)
+                               {
+                                       valid_close = False;
+                                       break;
+                               }
+                       }       
+                       if (!valid_close)
+                       {
+                               DEBUG(0,("SPOOL_CLOSEPRINTER: non-zero handle returned\n"));
+                       }
+               }
+       }
+
+       prs_mem_free(&rbuf);
+       prs_mem_free(&buf );
+
+       return valid_close;
+}
+
index c1d8e54afbacb9aacc8d5b0a3a92bc11052ceb36..d58a4868e679a6f29a3720e4d8ee2023d81624d8 100644 (file)
@@ -393,13 +393,14 @@ static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info,
 
 /*******************************************************************
  * write a structure.
- * called from spoolss_r_open_printer (srv_spoolss.c)
+ * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
+ * called from spoolss_open_printer_ex (cli_spoolss.c)
  ********************************************************************/
-BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
+BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
 {
        if (r_u == NULL) return False;
 
-       prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
+       prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
        depth++;
        prs_align(ps);
 
@@ -413,73 +414,67 @@ BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct
        return True;
 }
 
-#if 0
 /*******************************************************************
  * make a structure.
  ********************************************************************/
-BOOL make_spoolss_io_q_open_printer(SPOOL_Q_OPEN_PRINTER *q_u, 
-               uint32 unk_0,
+BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, 
                char *printername,
-               uint32 unk_1, uint32 cbbuf, uint32 devmod, uint32 des_access,
+               uint32 cbbuf, uint32 devmod, uint32 des_access,
                char *station,
                char *username)
 {
        int len_name = printername != NULL ? strlen(printername) : 0;
+       int len_sta  = station     != NULL ? strlen(station    ) : 0;
+       int len_user = username    != NULL ? strlen(username   ) : 0;
 
        if (q_u == NULL) return False;
 
-       DEBUG(5,("make_spoolss_io_q_open_printer\n"));
+       DEBUG(5,("make_spoolss_io_q_open_printer_ex\n"));
 
-       q_u->unknown0 = unk_0;
-       make_unistr2(&(q_u->uni_domain), dom_name, len_name);
+       q_u->ptr = 1;
+       make_unistr2(&(q_u->printername), printername, len_name);
 
+       q_u->unknown0 = 0x0; /* 0x0000 0000 */
+       q_u->cbbuf = cbbuf; /* 0x0000 0000 */
+       q_u->devmod = devmod; /* 0x0000 0000 */
+       q_u->access_required = des_access;
 
-       prs_uint32("unknown1", ps, depth, &(q_u->unknown1));
-       prs_uint32("cbbuf", ps, depth, &(q_u->cbbuf));
-       prs_uint32("devmod", ps, depth, &(q_u->devmod));
-       prs_uint32("access required", ps, depth, &(q_u->access_required));
-
-       /* don't care to decode end of packet by now */
-       /* but when acl will be implemented, it will be useful */
-
-       prs_uint32("unknown2", ps, depth, &(q_u->unknown2));
-       prs_uint32("unknown3", ps, depth, &(q_u->unknown3));
-       prs_uint32("unknown4", ps, depth, &(q_u->unknown4));
-       prs_uint32("unknown5", ps, depth, &(q_u->unknown5));
-       prs_uint32("unknown6", ps, depth, &(q_u->unknown6));
-       prs_uint32("unknown7", ps, depth, &(q_u->unknown7));
-       prs_uint32("unknown8", ps, depth, &(q_u->unknown8));
-       prs_uint32("unknown9", ps, depth, &(q_u->unknown9));
-       prs_uint32("unknown10", ps, depth, &(q_u->unknown10));
-       prs_uint32("unknown11", ps, depth, &(q_u->unknown11));
+       q_u->unknown1 = 0x1;
+       q_u->unknown2 = 0x1;
+       q_u->unknown3 = 0x149f7d8; /* looks like a pointer */
+       q_u->unknown4 = 0x1c;
+       q_u->unknown5 = 0x00b94dd0;
+       q_u->unknown6 = 0x0149f5cc; /* looks like _another_ pointer */
+       q_u->unknown7 = 0x00000565;
+       q_u->unknown8  = 0x2;
+       q_u->unknown9 = 0x0;
+       q_u->unknown10 = 0x0;
 
-       smb_io_unistr2("", &(q_u->station),True,ps,depth);
-       prs_align(ps);
-       smb_io_unistr2("", &(q_u->username),True,ps,depth);
+       make_unistr2(&(q_u->station), station, len_sta);
+       make_unistr2(&(q_u->username), username, len_user);
 
        return True;
 }
-#endif
 
 /*******************************************************************
  * read a structure.
- * called from spoolss_q_open_printer (srv_spoolss.c)
+ * called from spoolss_q_open_printer_ex (srv_spoolss.c)
  ********************************************************************/
-BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
+BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
 {
        if (q_u == NULL) return False;
 
-       prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
+       prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
        depth++;
 
        prs_align(ps);
 
-       prs_uint32("unknown0", ps, depth, &(q_u->unknown0));
+       prs_uint32("ptr", ps, depth, &(q_u->ptr));
        smb_io_unistr2("", &(q_u->printername),True,ps,depth);
        
        prs_align(ps);
 
-       prs_uint32("unknown1", ps, depth, &(q_u->unknown1));
+       prs_uint32("unknown0", ps, depth, &(q_u->unknown0));
        prs_uint32("cbbuf", ps, depth, &(q_u->cbbuf));
        prs_uint32("devmod", ps, depth, &(q_u->devmod));
        prs_uint32("access required", ps, depth, &(q_u->access_required));
@@ -487,6 +482,7 @@ BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct
        /* don't care to decode end of packet by now */
        /* but when acl will be implemented, it will be useful */
 
+       prs_uint32("unknown1", ps, depth, &(q_u->unknown1));
        prs_uint32("unknown2", ps, depth, &(q_u->unknown2));
        prs_uint32("unknown3", ps, depth, &(q_u->unknown3));
        prs_uint32("unknown4", ps, depth, &(q_u->unknown4));
@@ -496,11 +492,11 @@ BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct
        prs_uint32("unknown8", ps, depth, &(q_u->unknown8));
        prs_uint32("unknown9", ps, depth, &(q_u->unknown9));
        prs_uint32("unknown10", ps, depth, &(q_u->unknown10));
-       prs_uint32("unknown11", ps, depth, &(q_u->unknown11));
 
        smb_io_unistr2("", &(q_u->station),True,ps,depth);
        prs_align(ps);
        smb_io_unistr2("", &(q_u->username),True,ps,depth);
+       prs_align(ps);
 
        return True;
 }
@@ -575,9 +571,24 @@ BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_st
        return True;
 }
 
+/*******************************************************************
+ * make a structure.
+ ********************************************************************/
+BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, PRINTER_HND *hnd)
+{
+       if (q_u == NULL) return False;
+
+       DEBUG(5,("make_spoolss_q_closeprinter\n"));
+
+       memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
+
+       return True;
+}
+
 /*******************************************************************
  * read a structure.
- * called from spoolss_q_closeprinter (srv_spoolss.c)
+ * called from static spoolss_q_closeprinter (srv_spoolss.c)
+ * called from spoolss_closeprinter (cli_spoolss.c)
  ********************************************************************/
 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
 {
@@ -595,7 +606,8 @@ BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct
 
 /*******************************************************************
  * write a structure.
- * called from spoolss_r_closeprinter (srv_spoolss.c)
+ * called from static spoolss_r_closeprinter (srv_spoolss.c)
+ * called from spoolss_closeprinter (cli_spoolss.c)
  ********************************************************************/
 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
 {
index 166ac5a452bbde46a055df85e24d0452d74b3ece..5883c9baac30900be97b00046b62e74aca981575 100755 (executable)
@@ -28,8 +28,8 @@
 extern int DEBUGLEVEL;
 extern pstring global_myname;
 
-#ifndef MAX_OPEN_PRINTERS
-#define MAX_OPEN_PRINTERS 50
+#ifndef MAX_OPEN_PRINTER_EXS
+#define MAX_OPEN_PRINTER_EXS 50
 #endif
 
 #define PRINTER_HANDLE_IS_PRINTER      0
@@ -61,9 +61,9 @@ static struct
   uint32 access;
   uint32 number_of_notify;
   SPOOL_NOTIFY_OPTION_TYPE notify_info[MAX_PRINTER_NOTIFY+MAX_JOB_NOTIFY];
-} Printer[MAX_OPEN_PRINTERS];
+} Printer[MAX_OPEN_PRINTER_EXS];
 
-#define VALID_HANDLE(pnum)   (((pnum) >= 0) && ((pnum) < MAX_OPEN_PRINTERS))
+#define VALID_HANDLE(pnum)   (((pnum) >= 0) && ((pnum) < MAX_OPEN_PRINTER_EXS))
 #define OPEN_HANDLE(pnum)    (VALID_HANDLE(pnum) && Printer[pnum].open)
 
 /****************************************************************************
@@ -72,7 +72,7 @@ static struct
 void init_printer_hnd(void)
 {
        int i;
-       for (i = 0; i < MAX_OPEN_PRINTERS; i++)
+       for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++)
        {
                Printer[i].open = False;
        }
@@ -115,7 +115,7 @@ static BOOL open_printer_hnd(PRINTER_HND *hnd)
 {
        int i;
 
-       for (i = 0; i < MAX_OPEN_PRINTERS; i++)
+       for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++)
        {
                if (!Printer[i].open)
                {
@@ -139,7 +139,7 @@ static int find_printer_index_by_hnd(PRINTER_HND *hnd)
 {
        int i;
 
-       for (i = 0; i < MAX_OPEN_PRINTERS; i++)
+       for (i = 0; i < MAX_OPEN_PRINTER_EXS; i++)
        {
                if (memcmp(&(Printer[i].printer_hnd), hnd, sizeof(*hnd)) == 0)
                {
@@ -383,9 +383,9 @@ static BOOL handle_is_printer(PRINTER_HND *handle)
  *
  * called from the spoolss dispatcher
  ********************************************************************/
-static void spoolss_reply_open_printer(SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *rdata)                                
+static void spoolss_reply_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *rdata)                                
 {
-       SPOOL_R_OPEN_PRINTER r_u;
+       SPOOL_R_OPEN_PRINTER_EX r_u;
        BOOL printer_open = False;
        fstring name;
        
@@ -420,7 +420,7 @@ static void spoolss_reply_open_printer(SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *rd
                clear_handle(&(r_u.handle));
        }       
 
-       spoolss_io_r_open_printer("",&r_u,rdata,0);
+       spoolss_io_r_open_printer_ex("",&r_u,rdata,0);
 }
 
 /********************************************************************
@@ -428,15 +428,15 @@ static void spoolss_reply_open_printer(SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *rd
  *
  * called from the spoolss dispatcher
  ********************************************************************/
-static void api_spoolss_open_printer(pipes_struct *p, prs_struct *data, prs_struct *rdata)
+static void api_spoolss_open_printer_ex(pipes_struct *p, prs_struct *data, prs_struct *rdata)
 {
-       SPOOL_Q_OPEN_PRINTER q_u;
+       SPOOL_Q_OPEN_PRINTER_EX q_u;
 
        /* grab the spoolss open policy */
-       spoolss_io_q_open_printer("", &q_u, data, 0);
+       spoolss_io_q_open_printer_ex("", &q_u, data, 0);
 
        /* construct reply.  always indicate success */
-       spoolss_reply_open_printer(&q_u, rdata);
+       spoolss_reply_open_printer_ex(&q_u, rdata);
 }
 
 /********************************************************************
@@ -3818,7 +3818,7 @@ static void api_spoolss_getjob(pipes_struct *p, prs_struct *data,
 ********************************************************************/
 struct api_struct api_spoolss_cmds[] =
 {
- {"SPOOLSS_OPENPRINTEREX",             SPOOLSS_OPENPRINTEREX,             api_spoolss_open_printer              },
+ {"SPOOLSS_OPENPRINTEREX",             SPOOLSS_OPENPRINTEREX,             api_spoolss_open_printer_ex           },
  {"SPOOLSS_GETPRINTERDATA",            SPOOLSS_GETPRINTERDATA,            api_spoolss_getprinterdata            },
  {"SPOOLSS_CLOSEPRINTER",              SPOOLSS_CLOSEPRINTER,              api_spoolss_closeprinter              },
  {"SPOOLSS_RFFPCNEX",                  SPOOLSS_RFFPCNEX,                  api_spoolss_rffpcnex                  },
diff --git a/source/rpcclient/cmd_spoolss.c b/source/rpcclient/cmd_spoolss.c
new file mode 100644 (file)
index 0000000..0e931d4
--- /dev/null
@@ -0,0 +1,91 @@
+/* 
+   Unix SMB/Netbios implementation.
+   Version 1.9.
+   NT Domain Authentication SMB / MSRPC client
+   Copyright (C) Andrew Tridgell 1994-1999
+   Copyright (C) Luke Kenneth Casson Leighton 1996-1999
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+#ifdef SYSLOG
+#undef SYSLOG
+#endif
+
+#include "includes.h"
+#include "nterr.h"
+
+extern int DEBUGLEVEL;
+
+#define DEBUG_TESTING
+
+extern FILE* out_hnd;
+
+extern struct cli_state *smb_cli;
+extern int smb_tidx;
+
+/****************************************************************************
+nt spoolss query
+****************************************************************************/
+void cmd_spoolss_open_printer_ex(struct client_info *info)
+{
+       uint16 nt_pipe_fnum;
+       fstring srv_name;
+       fstring printer_name;
+       PRINTER_HND hnd;
+
+       BOOL res = True;
+
+       if (!next_token(NULL, printer_name, NULL, sizeof(printer_name)))
+       {
+               report(out_hnd, "spoolopen <printer name>\n");
+               return;
+       }
+
+       fstrcpy(srv_name, "\\\\");
+       fstrcat(srv_name, info->myhostname);
+       strupper(srv_name);
+
+       DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
+               printer_name, srv_name, smb_cli->user_name));
+
+       DEBUG(5, ("cmd_spoolss_open_printer_ex: smb_cli->fd:%d\n", smb_cli->fd));
+
+       /* open SPOOLSS session. */
+       res = res ? cli_nt_session_open(smb_cli, PIPE_SPOOLSS, &nt_pipe_fnum) : False;
+
+       res = res ? spoolss_open_printer_ex(smb_cli, nt_pipe_fnum, 
+                               printer_name,
+                               0, 0, 0,
+                               srv_name, smb_cli->user_name,
+                               &hnd) : False;
+
+       res = res ? spoolss_closeprinter(smb_cli, nt_pipe_fnum, &hnd) : False;
+
+       /* close the session */
+       cli_nt_session_close(smb_cli, nt_pipe_fnum);
+
+       if (res)
+       {
+               DEBUG(5,("cmd_spoolss_open_printer_ex: query succeeded\n"));
+               report(out_hnd, "OK\n");
+       }
+       else
+       {
+               DEBUG(5,("cmd_spoolss_open_printer_ex: query failed\n"));
+       }
+}
+
index cb6ea0529db240725713a063bbc304c7404ebf38..681ebb42fae89a57207b8ffab46799750f315751 100644 (file)
@@ -236,18 +236,11 @@ commands[] =
         */
 
        {
-               "spoolgetprinterdata",
-               cmd_spoolss_getprinterdata,
-               "Spool Printer Data Test",
+               "spoolopen",
+               cmd_spoolss_open_printer_ex,
+               "Spool Printer Open Test",
                {COMPL_NONE, COMPL_NONE}
        },
-       {
-               "spoolgetprinter",
-               cmd_spoolss_getprinter,
-               "Spool Printer Test",
-               {COMPL_NONE, COMPL_NONE}
-       },
-
        /*
         * server
         */