[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha6-966-g1cd3456
Günther Deschner
gd at samba.org
Wed Feb 18 15:24:06 GMT 2009
The branch, master has been updated
via 1cd34565d0ae07dfba773bc9e5679668137b724f (commit)
via 73123420623b5d6bfb5d39f9a937c71976bdc450 (commit)
via e9bfc0ab512338c43030f70b4aaa94598157deaf (commit)
via 6c91a83e941ff4ef4b1d8e18118f8fa3860c6134 (commit)
from 6a53ff1ea8ca6eee81652a68fb49b2871c327b72 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 1cd34565d0ae07dfba773bc9e5679668137b724f
Author: Günther Deschner <gd at samba.org>
Date: Tue Feb 17 14:26:56 2009 +0100
s3-spoolss: remove old spoolss_XcvData.
Guenther
commit 73123420623b5d6bfb5d39f9a937c71976bdc450
Author: Günther Deschner <gd at samba.org>
Date: Tue Feb 17 14:23:56 2009 +0100
s3-spoolss: use pidl for _spoolss_XcvData.
Guenther
commit e9bfc0ab512338c43030f70b4aaa94598157deaf
Author: Günther Deschner <gd at samba.org>
Date: Wed Feb 18 16:10:40 2009 +0100
s3: re-run make samba3-idl.
Guenther
commit 6c91a83e941ff4ef4b1d8e18118f8fa3860c6134
Author: Günther Deschner <gd at samba.org>
Date: Wed Feb 18 16:09:02 2009 +0100
spoolss: fix spoolss_MonitorUi struct.
Guenther
-----------------------------------------------------------------------
Summary of changes:
librpc/gen_ndr/ndr_spoolss.c | 25 +++---
librpc/gen_ndr/spoolss.h | 2 +-
librpc/idl/spoolss.idl | 2 +-
source3/include/nt_printing.h | 22 -----
source3/include/proto.h | 5 -
source3/include/rpc_spoolss.h | 38 --------
source3/rpc_parse/parse_spoolss.c | 170 ----------------------------------
source3/rpc_server/srv_spoolss.c | 22 +----
source3/rpc_server/srv_spoolss_nt.c | 174 ++++++++++++++++++++++------------
9 files changed, 128 insertions(+), 332 deletions(-)
Changeset truncated at 500 lines:
diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 1230343..8ab2290 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -12545,11 +12545,13 @@ _PUBLIC_ void ndr_print_spoolss_PortData1(struct ndr_print *ndr, const char *nam
_PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorUi(struct ndr_push *ndr, int ndr_flags, const struct spoolss_MonitorUi *r)
{
if (ndr_flags & NDR_SCALARS) {
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->dll_name, CH_UTF16)));
- NDR_CHECK(ndr_push_align(ndr, 2));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->dll_name, CH_UTF16)));
- NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->dll_name, ndr_charset_length(r->dll_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+ NDR_CHECK(ndr_push_align(ndr, 4));
+ {
+ uint32_t _flags_save_string = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_push_string(ndr, NDR_SCALARS, r->dll_name));
+ ndr->flags = _flags_save_string;
+ }
}
if (ndr_flags & NDR_BUFFERS) {
}
@@ -12559,14 +12561,13 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_MonitorUi(struct ndr_push *ndr, int
_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_MonitorUi(struct ndr_pull *ndr, int ndr_flags, struct spoolss_MonitorUi *r)
{
if (ndr_flags & NDR_SCALARS) {
- NDR_CHECK(ndr_pull_array_size(ndr, &r->dll_name));
- NDR_CHECK(ndr_pull_align(ndr, 2));
- NDR_CHECK(ndr_pull_array_length(ndr, &r->dll_name));
- if (ndr_get_array_length(ndr, &r->dll_name) > ndr_get_array_size(ndr, &r->dll_name)) {
- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->dll_name), ndr_get_array_length(ndr, &r->dll_name));
+ NDR_CHECK(ndr_pull_align(ndr, 4));
+ {
+ uint32_t _flags_save_string = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_pull_string(ndr, NDR_SCALARS, &r->dll_name));
+ ndr->flags = _flags_save_string;
}
- NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->dll_name), sizeof(uint16_t)));
- NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->dll_name, ndr_get_array_length(ndr, &r->dll_name), sizeof(uint16_t), CH_UTF16));
}
if (ndr_flags & NDR_BUFFERS) {
}
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 0e6cf0b..9c74969 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -1170,7 +1170,7 @@ struct spoolss_PortData1 {
}/* [public] */;
struct spoolss_MonitorUi {
- const char *dll_name;/* [charset(UTF16)] */
+ const char * dll_name;/* [flag(LIBNDR_FLAG_STR_NULLTERM)] */
}/* [public] */;
/* bitmap spoolss_AddPrinterDriverExFlags */
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 8847247..4c428f8 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1963,7 +1963,7 @@ import "misc.idl", "security.idl", "winreg.idl";
} spoolss_PortData1;
typedef [public] struct {
- [string,charset(UTF16)] uint16 dll_name[];
+ nstring dll_name;
} spoolss_MonitorUi;
WERROR spoolss_XcvData(
diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
index f515a40..3bf51f2 100644
--- a/source3/include/nt_printing.h
+++ b/source3/include/nt_printing.h
@@ -347,28 +347,6 @@ typedef struct
#define SAMBA_PRINTER_PORT_NAME "Samba Printer Port"
#endif
-
-/*
- * Structures for the XcvDataPort() calls
- */
-
-#define PORT_PROTOCOL_DIRECT 1
-#define PORT_PROTOCOL_LPR 2
-
-typedef struct {
- fstring name;
- uint32 version;
- uint32 protocol;
- fstring hostaddr;
- fstring snmpcommunity;
- fstring queue;
- uint32 dblspool;
- fstring ipaddr;
- uint32 port;
- bool enable_snmp;
- uint32 snmp_index;
-} NT_PORT_DATA_1;
-
/* DOS header format */
#define DOS_HEADER_SIZE 64
#define DOS_HEADER_MAGIC_OFFSET 0
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8542fbb..3da5b98 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6042,10 +6042,6 @@ bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
uint32 flags, uint32 options, const char *localmachine,
uint32 printerlocal, SPOOL_NOTIFY_OPTION *option);
-bool spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth);
-bool spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth);
-bool make_monitorui_buf( RPC_BUFFER *buf, const char *dllname );
-bool convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf ) ;
/* The following definitions come from rpc_server/srv_eventlog_lib.c */
@@ -6262,7 +6258,6 @@ WERROR _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_
WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPOOL_R_ENUMPRINTERKEY *r_u);
WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_u, SPOOL_R_ENUMPRINTERDATAEX *r_u);
WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u);
-WERROR _spoolss_xcvdataport(pipes_struct *p, SPOOL_Q_XCVDATAPORT *q_u, SPOOL_R_XCVDATAPORT *r_u);
/* The following definitions come from rpc_server/srv_srvsvc_nt.c */
diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h
index ba66e42..8eb8785 100644
--- a/source3/include/rpc_spoolss.h
+++ b/source3/include/rpc_spoolss.h
@@ -1497,44 +1497,6 @@ SPOOL_R_GETPRINTPROCESSORDIRECTORY;
/**************************************/
-#define MAX_PORTNAME 64
-#define MAX_NETWORK_NAME 49
-#define MAX_SNMP_COMM_NAME 33
-#define MAX_QUEUE_NAME 33
-#define MAX_IPADDR_STRING 17
-
-typedef struct {
- uint16 portname[MAX_PORTNAME];
- uint32 version;
- uint32 protocol;
- uint32 size;
- uint32 reserved;
- uint16 hostaddress[MAX_NETWORK_NAME];
- uint16 snmpcommunity[MAX_SNMP_COMM_NAME];
- uint32 dblspool;
- uint16 queue[MAX_QUEUE_NAME];
- uint16 ipaddress[MAX_IPADDR_STRING];
- uint32 port;
- uint32 snmpenabled;
- uint32 snmpdevindex;
-} SPOOL_PORT_DATA_1;
-
-typedef struct {
- POLICY_HND handle;
- UNISTR2 dataname;
- RPC_BUFFER indata;
- uint32 indata_len;
- uint32 offered;
- uint32 unknown;
-} SPOOL_Q_XCVDATAPORT;
-
-typedef struct {
- RPC_BUFFER outdata;
- uint32 needed;
- uint32 unknown;
- WERROR status;
-} SPOOL_R_XCVDATAPORT;
-
#define PRINTER_DRIVER_VERSION 2
#define PRINTER_DRIVER_ARCHITECTURE "Windows NT x86"
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index 08613bb..2862b55 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -5543,173 +5543,3 @@ bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
return True;
}
-
-
-/*******************************************************************
- ********************************************************************/
-
-bool spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth)
-{
- prs_debug(ps, depth, desc, "spoolss_io_q_xcvdataport");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
- return False;
-
- if(!smb_io_unistr2("", &q_u->dataname, True, ps, depth))
- return False;
-
- if (!prs_align(ps))
- return False;
-
- if(!prs_rpcbuffer("", ps, depth, &q_u->indata))
- return False;
-
- if (!prs_align(ps))
- return False;
-
- if (!prs_uint32("indata_len", ps, depth, &q_u->indata_len))
- return False;
- if (!prs_uint32("offered", ps, depth, &q_u->offered))
- return False;
- if (!prs_uint32("unknown", ps, depth, &q_u->unknown))
- return False;
-
- return True;
-}
-
-/*******************************************************************
- ********************************************************************/
-
-bool spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth)
-{
- prs_debug(ps, depth, desc, "spoolss_io_r_xcvdataport");
- depth++;
-
- if(!prs_align(ps))
- return False;
- if(!prs_rpcbuffer("", ps, depth, &r_u->outdata))
- return False;
-
- if (!prs_align(ps))
- return False;
-
- if (!prs_uint32("needed", ps, depth, &r_u->needed))
- return False;
- if (!prs_uint32("unknown", ps, depth, &r_u->unknown))
- return False;
-
- if(!prs_werror("status", ps, depth, &r_u->status))
- return False;
-
- return True;
-}
-
-/*******************************************************************
- ********************************************************************/
-
-bool make_monitorui_buf( RPC_BUFFER *buf, const char *dllname )
-{
- UNISTR string;
-
- if ( !buf )
- return False;
-
- init_unistr( &string, dllname );
-
- if ( !prs_unistr( "ui_dll", &buf->prs, 0, &string ) )
- return False;
-
- return True;
-}
-
-/*******************************************************************
- ********************************************************************/
-
-#define PORT_DATA_1_PAD 540
-
-static bool smb_io_port_data_1( const char *desc, RPC_BUFFER *buf, int depth, SPOOL_PORT_DATA_1 *p1 )
-{
- prs_struct *ps = &buf->prs;
- uint8 padding[PORT_DATA_1_PAD];
-
- prs_debug(ps, depth, desc, "smb_io_port_data_1");
- depth++;
-
- if(!prs_align(ps))
- return False;
-
- if( !prs_uint16s(True, "portname", ps, depth, p1->portname, MAX_PORTNAME))
- return False;
-
- if (!prs_uint32("version", ps, depth, &p1->version))
- return False;
- if (!prs_uint32("protocol", ps, depth, &p1->protocol))
- return False;
- if (!prs_uint32("size", ps, depth, &p1->size))
- return False;
- if (!prs_uint32("reserved", ps, depth, &p1->reserved))
- return False;
-
- if( !prs_uint16s(True, "hostaddress", ps, depth, p1->hostaddress, MAX_NETWORK_NAME))
- return False;
- if( !prs_uint16s(True, "snmpcommunity", ps, depth, p1->snmpcommunity, MAX_SNMP_COMM_NAME))
- return False;
-
- if (!prs_uint32("dblspool", ps, depth, &p1->dblspool))
- return False;
-
- if( !prs_uint16s(True, "queue", ps, depth, p1->queue, MAX_QUEUE_NAME))
- return False;
- if( !prs_uint16s(True, "ipaddress", ps, depth, p1->ipaddress, MAX_IPADDR_STRING))
- return False;
-
- if( !prs_uint8s(False, "", ps, depth, padding, PORT_DATA_1_PAD))
- return False;
-
- if (!prs_uint32("port", ps, depth, &p1->port))
- return False;
- if (!prs_uint32("snmpenabled", ps, depth, &p1->snmpenabled))
- return False;
- if (!prs_uint32("snmpdevindex", ps, depth, &p1->snmpdevindex))
- return False;
-
- return True;
-}
-
-/*******************************************************************
- ********************************************************************/
-
-bool convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf )
-{
- SPOOL_PORT_DATA_1 spdata_1;
-
- ZERO_STRUCT( spdata_1 );
-
- if ( !smb_io_port_data_1( "port_data_1", buf, 0, &spdata_1 ) )
- return False;
-
- rpcstr_pull(port1->name, spdata_1.portname, sizeof(port1->name), -1, 0);
- rpcstr_pull(port1->queue, spdata_1.queue, sizeof(port1->queue), -1, 0);
- rpcstr_pull(port1->hostaddr, spdata_1.hostaddress, sizeof(port1->hostaddr), -1, 0);
-
- port1->port = spdata_1.port;
-
- switch ( spdata_1.protocol ) {
- case 1:
- port1->protocol = PORT_PROTOCOL_DIRECT;
- break;
- case 2:
- port1->protocol = PORT_PROTOCOL_LPR;
- break;
- default:
- DEBUG(3,("convert_port_data_1: unknown protocol [%d]!\n",
- spdata_1.protocol));
- return False;
- }
-
- return True;
-}
diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c
index c5d20e0..10e983e 100644
--- a/source3/rpc_server/srv_spoolss.c
+++ b/source3/rpc_server/srv_spoolss.c
@@ -974,27 +974,7 @@ static bool api_spoolss_deleteprinterdriverex(pipes_struct *p)
static bool api_spoolss_xcvdataport(pipes_struct *p)
{
- SPOOL_Q_XCVDATAPORT q_u;
- SPOOL_R_XCVDATAPORT r_u;
- prs_struct *data = &p->in_data.data;
- prs_struct *rdata = &p->out_data.rdata;
-
- ZERO_STRUCT(q_u);
- ZERO_STRUCT(r_u);
-
- if(!spoolss_io_q_xcvdataport("", &q_u, data, 0)) {
- DEBUG(0,("spoolss_io_q_replyopenprinter: unable to unmarshall SPOOL_Q_XCVDATAPORT.\n"));
- return False;
- }
-
- r_u.status = _spoolss_xcvdataport(p, &q_u, &r_u);
-
- if(!spoolss_io_r_xcvdataport("", &r_u, rdata, 0)) {
- DEBUG(0,("spoolss_io_r_replyopenprinter: unable to marshall SPOOL_R_XCVDATAPORT.\n"));
- return False;
- }
-
- return True;
+ return proxy_spoolss_call(p, NDR_SPOOLSS_XCVDATA);
}
/*******************************************************************
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 8faa1f5..6019d18 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -69,7 +69,7 @@ extern struct standard_mapping printer_std_mapping, printserver_std_mapping;
struct xcv_api_table {
const char *name;
- WERROR(*fn) (NT_USER_TOKEN *token, RPC_BUFFER *in, RPC_BUFFER *out, uint32 *needed);
+ WERROR(*fn) (TALLOC_CTX *mem_ctx, NT_USER_TOKEN *token, DATA_BLOB *in, DATA_BLOB *out, uint32_t *needed);
};
/********************************************************************
@@ -9826,21 +9826,41 @@ WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROC
}
/*******************************************************************
+ ********************************************************************/
+
+static bool push_monitorui_buf(TALLOC_CTX *mem_ctx, DATA_BLOB *buf,
+ const char *dllname)
+{
+ enum ndr_err_code ndr_err;
+ struct spoolss_MonitorUi ui;
+
+ ui.dll_name = dllname;
+
+ ndr_err = ndr_push_struct_blob(buf, mem_ctx, NULL, &ui,
+ (ndr_push_flags_fn_t)ndr_push_spoolss_MonitorUi);
+ if (NDR_ERR_CODE_IS_SUCCESS(ndr_err) && (DEBUGLEVEL >= 10)) {
+ NDR_PRINT_DEBUG(spoolss_MonitorUi, &ui);
+ }
+ return NDR_ERR_CODE_IS_SUCCESS(ndr_err);
+}
+
+/*******************************************************************
Streams the monitor UI DLL name in UNICODE
*******************************************************************/
-static WERROR xcvtcp_monitorui( NT_USER_TOKEN *token, RPC_BUFFER *in,
- RPC_BUFFER *out, uint32 *needed )
+static WERROR xcvtcp_monitorui(TALLOC_CTX *mem_ctx,
+ NT_USER_TOKEN *token, DATA_BLOB *in,
+ DATA_BLOB *out, uint32_t *needed)
{
const char *dllname = "tcpmonui.dll";
*needed = (strlen(dllname)+1) * 2;
- if ( rpcbuf_get_size(out) < *needed ) {
+ if (out->length < *needed) {
return WERR_INSUFFICIENT_BUFFER;
}
- if ( !make_monitorui_buf( out, dllname ) ) {
+ if (!push_monitorui_buf(mem_ctx, out, dllname)) {
return WERR_NOMEM;
}
@@ -9848,35 +9868,52 @@ static WERROR xcvtcp_monitorui( NT_USER_TOKEN *token, RPC_BUFFER *in,
}
/*******************************************************************
+ ********************************************************************/
+
+static bool pull_port_data_1(TALLOC_CTX *mem_ctx,
+ struct spoolss_PortData1 *port1,
+ const DATA_BLOB *buf)
+{
+ enum ndr_err_code ndr_err;
+ ndr_err = ndr_pull_struct_blob(buf, mem_ctx, NULL, port1,
+ (ndr_pull_flags_fn_t)ndr_pull_spoolss_PortData1);
+ if (NDR_ERR_CODE_IS_SUCCESS(ndr_err) && (DEBUGLEVEL >= 10)) {
+ NDR_PRINT_DEBUG(spoolss_PortData1, port1);
+ }
+ return NDR_ERR_CODE_IS_SUCCESS(ndr_err);
+}
+
+/*******************************************************************
Create a new TCP/IP port
*******************************************************************/
-static WERROR xcvtcp_addport( NT_USER_TOKEN *token, RPC_BUFFER *in,
- RPC_BUFFER *out, uint32 *needed )
+static WERROR xcvtcp_addport(TALLOC_CTX *mem_ctx,
+ NT_USER_TOKEN *token, DATA_BLOB *in,
+ DATA_BLOB *out, uint32_t *needed)
{
- NT_PORT_DATA_1 port1;
- TALLOC_CTX *ctx = talloc_tos();
+ struct spoolss_PortData1 port1;
char *device_uri = NULL;
- ZERO_STRUCT( port1 );
+ ZERO_STRUCT(port1);
/* convert to our internal port data structure */
- if ( !convert_port_data_1( &port1, in ) ) {
+ if (!pull_port_data_1(mem_ctx, &port1, in)) {
return WERR_NOMEM;
}
/* create the device URI and call the add_port_hook() */
switch ( port1.protocol ) {
- case PORT_PROTOCOL_DIRECT:
- device_uri = talloc_asprintf(ctx,
- "socket://%s:%d/", port1.hostaddr, port1.port );
+ case PROTOCOL_RAWTCP_TYPE:
+ device_uri = talloc_asprintf(mem_ctx,
+ "socket://%s:%d/", port1.hostaddress,
+ port1.port_number);
break;
--
Samba Shared Repository
More information about the samba-cvs
mailing list