NamedPipe DCE/RPC struct split

Luke Kenneth Casson Leighton lkcl at samba-tng.org
Sun Jan 13 07:54:02 GMT 2002


okay.

i'm happy with this one.

where it looks awkward, e.g. InternalPipes had to be added,
is due to poor design and data separation on samba's part.

the InternalPipes had to be added and a whole boat-load
of variables such that the pipe handles structures could
be searched, in order to emulate not having a threading
model in samba.

further awkwardness is associated with accessing p->vuid
and p->conn, which i have moved into pipe_internal_get_vuid()
and pipe_internal_get_conn().

as the proposed .so model will have these functions in it as support
routines, and all samba-service-.so's will need and only will
need to access these routines, this i would gather to be
acceptable.


basically, as you can see, all DCE/RPC related material
has been split off from all NamedPipe related material.

to avoid having a _massive_ patch with structure names
changing left, right and centre, i chose to call the
DCE/RPC related material "pipes_struct" and the NamedPipes
material "smb_np_struct".

you may wish, in a separate patch, to global/search/replace
"pipes_struct" with "internal_samba_implementation_of_rpc_services_struct"

or something significantly shorter, such as "internal_rpc_struct".

now, the "pipes_struct" is typecast to a void*, stored in
smb_np_struct->np_state.

any function beginning with "pipe_internal_" is what needs
to be moved into the NamedPipe API.  it _is_ the NamedPipe
API.  [is there a close?  yes, there is].

this lot can be "dso"d [volunteers welcomed].

at that point, you could replace that lot with
the second attached file, srv_namedpipe_proxy.c.
it's very very clear from this file exactly how
minimalist a NamedPipe implementation needs to
be, and also very very clear that NamedPipes
have absolutely nothing to do with DCE/RPC.

the namedpipe proxy API returns only a file
descriptor, which is typecast to a void* and
stored in smb_np_struct->np_state.



side-benefits of this patch:

the smbd/pipes.c and smbd/ipc.c code are now in a
much stronger position to have unrelated dce/rpc
code split out into separate modules, making it
_abundantly_ clear as to which bits are NamedPipe
related, and which bits are DCE/RPC.

with the data structure split of the attached patch,
it's already pretty clear, but the messy code hides
that separation very well.

in particular, it's not clear from the smbd ipc.c and
pipes.c code where exactly the proposed namedpipe_transact()
function should be used, although from previous experience
at having created and used this function, it's clear
that it is needed in api_fd_reply, in the switch 0x26
statement.  ... ah ha!  yes, there you go: write_to_pipe
is followed up by api_rpc_trans_reply() which contains
the read_from_pipe, so there already is an implementation
of namedpipe_transact(), it's just hard-coded into
smbd's ipc.c.
-------------- next part --------------
Index: include/ntdomain.h
===================================================================
RCS file: /cvsroot/samba/source/include/ntdomain.h,v
retrieving revision 1.73
diff -u -u -w -b -B -r1.73 ntdomain.h
--- include/ntdomain.h	14 Sep 2001 04:31:15 -0000	1.73
+++ include/ntdomain.h	13 Jan 2002 13:49:59 -0000
@@ -159,18 +159,21 @@
 	fstring mach_acct;  /* Machine name we've authenticated. */
 };
 
+/*
+ * DCE/RPC-specific samba-internal-specific handling of data on
+ * NamedPipes.
+ *
+ */
+
 typedef struct pipes_struct
 {
 	struct pipes_struct *next, *prev;
-	int pnum;
-	connection_struct *conn;
-	uint16 vuid; /* points to the unauthenticated user that opened this pipe. */
-	BOOL open; /* open connection */
-	uint16 device_state;
-	uint16 priority;
+
 	fstring name;
 	fstring pipe_srv_name;
 
+	struct smb_np_struct *p; /* back-link to originating smb connection */
+
 	RPC_HDR hdr; /* Incoming RPC header. */
 	RPC_HDR_REQ hdr_req; /* Incoming request header. */
 
@@ -226,10 +229,6 @@
 
 	output_data out_data;
 
-	/* When replying to an SMBtrans, this is the maximum amount of
-           data that can be sent in the initial reply. */
-	int max_trans_reply;
-
 	/* talloc context to use when allocating memory on this pipe. */
 	TALLOC_CTX *mem_ctx;
 
@@ -237,6 +236,30 @@
 	struct handle_list *pipe_handles;
 
 } pipes_struct;
+
+typedef struct smb_np_struct
+{
+	struct smb_np_struct *next, *prev;
+	int pnum;
+	connection_struct *conn;
+	uint16 vuid; /* points to the unauthenticated user that opened this pipe. */
+	BOOL open; /* open connection */
+	uint16 device_state;
+	uint16 priority;
+	fstring name;
+
+	/* When replying to an SMBtrans, this is the maximum amount of
+           data that can be sent in the initial reply. */
+	int max_trans_reply;
+
+	/*
+	 * NamedPipe state information.
+	 *
+	 * (e.g. typecast a np_struct, above).
+	 */
+	void *np_state;
+
+} smb_np_struct;
 
 struct api_struct
 {  
Index: rpc_server/srv_lsa_hnd.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_lsa_hnd.c,v
retrieving revision 1.31
diff -u -u -w -b -B -r1.31 srv_lsa_hnd.c
--- rpc_server/srv_lsa_hnd.c	2 Oct 2001 04:29:40 -0000	1.31
+++ rpc_server/srv_lsa_hnd.c	13 Jan 2002 13:50:04 -0000
@@ -35,10 +35,10 @@
 
 BOOL init_pipe_handle_list(pipes_struct *p, char *pipe_name)
 {
-	pipes_struct *plist = get_first_pipe();
+	pipes_struct *plist = get_first_internal_pipe();
 	struct handle_list *hl = NULL;
 
-	for (plist = get_first_pipe(); plist; plist = get_next_pipe(plist)) {
+	for (plist = get_first_internal_pipe(); plist; plist = get_next_internal_pipe(plist)) {
 		if (strequal( plist->name, pipe_name)) {
 			if (!plist->pipe_handles) {
 				pstring msg;
Index: rpc_server/srv_lsa_nt.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_lsa_nt.c,v
retrieving revision 1.46
diff -u -u -w -b -B -r1.46 srv_lsa_nt.c
--- rpc_server/srv_lsa_nt.c	31 Dec 2001 13:46:25 -0000	1.46
+++ rpc_server/srv_lsa_nt.c	13 Jan 2002 13:50:06 -0000
@@ -801,7 +801,7 @@
 {
 	fstring username, domname;
 	int ulen, dlen;
-	user_struct *vuser = get_valid_user_struct(p->vuid);
+	user_struct *vuser = get_valid_user_struct(pipe_internal_get_vuid(p));
   
 	if (vuser == NULL)
 		return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
Index: rpc_server/srv_netlog_nt.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_netlog_nt.c,v
retrieving revision 1.46
diff -u -u -w -b -B -r1.46 srv_netlog_nt.c
--- rpc_server/srv_netlog_nt.c	9 Jan 2002 07:52:51 -0000	1.46
+++ rpc_server/srv_netlog_nt.c	13 Jan 2002 13:50:07 -0000
@@ -225,7 +225,7 @@
 	NTSTATUS status = NT_STATUS_OK;
 	fstring mach_acct;
 
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
 
 	rpcstr_pull(mach_acct,q_u->uni_logon_clnt.buffer,sizeof(fstring),q_u->uni_logon_clnt.uni_str_len*2,0);
@@ -284,7 +284,7 @@
 	DOM_CHAL srv_cred;
 	UTIME srv_time;
 
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
 
 	srv_time.time = 0;
@@ -331,7 +331,7 @@
 	UTIME srv_time;
 	NEG_FLAGS srv_flgs;
 
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
 
 	srv_time.time = 0;
@@ -371,7 +371,7 @@
 	unsigned char pwd[16];
 	int i;
 
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
 
 	/* checks and updates credentials.  creates reply credentials */
@@ -463,7 +463,7 @@
 {
 	DOM_CRED srv_cred;
 
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
 
 	/* checks and updates credentials.  creates reply credentials */
@@ -507,7 +507,7 @@
 
 	ZERO_STRUCTP(usr_info);
  
-	if (!get_valid_user_struct(p->vuid))
+	if (!get_valid_user_struct(pipe_internal_get_vuid(p)))
 		return NT_STATUS_NO_SUCH_USER;
     
 	/* checks and updates credentials.  creates reply credentials */
Index: rpc_server/srv_pipe_hnd.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_pipe_hnd.c,v
retrieving revision 1.72
diff -u -u -w -b -B -r1.72 srv_pipe_hnd.c
--- rpc_server/srv_pipe_hnd.c	5 Nov 2001 07:42:55 -0000	1.72
+++ rpc_server/srv_pipe_hnd.c	13 Jan 2002 13:50:11 -0000
@@ -26,26 +26,41 @@
 #define	PIPE		"\\PIPE\\"
 #define	PIPELEN		strlen(PIPE)
 
-static pipes_struct *chain_p;
+static smb_np_struct *chain_p;
 static int pipes_open;
 
 #ifndef MAX_OPEN_PIPES
 #define MAX_OPEN_PIPES 2048
 #endif
 
-static pipes_struct *Pipes;
+static smb_np_struct *Pipes;
+static pipes_struct *InternalPipes;
 static struct bitmap *bmap;
 
 /****************************************************************************
  Pipe iterator functions.
 ****************************************************************************/
 
-pipes_struct *get_first_pipe(void)
+smb_np_struct *get_first_pipe(void)
 {
 	return Pipes;
 }
 
-pipes_struct *get_next_pipe(pipes_struct *p)
+smb_np_struct *get_next_pipe(smb_np_struct *p)
+{
+	return p->next;
+}
+
+/****************************************************************************
+ Internal Pipe iterator functions.
+****************************************************************************/
+
+pipes_struct *get_first_internal_pipe(void)
+{
+	return InternalPipes;
+}
+
+pipes_struct *get_next_internal_pipe(pipes_struct *p)
 {
 	return p->next;
 }
@@ -118,11 +133,11 @@
  Find first available pipe slot.
 ****************************************************************************/
 
-pipes_struct *open_rpc_pipe_p(char *pipe_name, 
+smb_np_struct *open_rpc_pipe_p(char *pipe_name, 
 			      connection_struct *conn, uint16 vuid)
 {
 	int i;
-	pipes_struct *p;
+	smb_np_struct *p;
 	static int next_pipe;
 
 	DEBUG(4,("Open pipe requested %s (pipes_open=%d)\n",
@@ -147,22 +162,17 @@
 	for (p = Pipes; p; p = p->next)
 		DEBUG(5,("open_rpc_pipe_p: name %s pnum=%x\n", p->name, p->pnum));  
 
-	p = (pipes_struct *)malloc(sizeof(*p));
+	p = (smb_np_struct *)malloc(sizeof(*p));
 
 	if (!p)
 		return NULL;
 
 	ZERO_STRUCTP(p);
 
-	if ((p->mem_ctx = talloc_init()) == NULL) {
-		DEBUG(0,("open_rpc_pipe_p: talloc_init failed.\n"));
-		SAFE_FREE(p);
-		return NULL;
-	}
+	p->np_state = (void*)make_internal_rpc_pipe_p(pipe_name, conn, vuid);
+	if (p->np_state == NULL) {
 
-	if (!init_pipe_handle_list(p, pipe_name)) {
-		DEBUG(0,("open_rpc_pipe_p: init_pipe_handles failed.\n"));
-		talloc_destroy(p->mem_ctx);
+		DEBUG(0,("open_rpc_pipe_p: make_internal_rpc_pipe_p failed.\n"));
 		SAFE_FREE(p);
 		return NULL;
 	}
@@ -177,11 +187,6 @@
 	 * change the type to UNMARSALLING before processing the stream.
 	 */
 
-	if(!prs_init(&p->in_data.data, MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) {
-		DEBUG(0,("open_rpc_pipe_p: malloc fail for in_data struct.\n"));
-		return NULL;
-	}
-
 	bitmap_set(bmap, i);
 	i += pipe_handle_offset;
 
@@ -197,6 +202,65 @@
 
 	p->max_trans_reply = 0;
 	
+	fstrcpy(p->name, pipe_name);
+	
+	DEBUG(4,("Opened pipe %s with handle %x (pipes_open=%d)\n",
+		 pipe_name, i, pipes_open));
+	
+	chain_p = p;
+	
+	/* OVERWRITE p as a temp variable, to display all open pipes */ 
+	for (p = Pipes; p; p = p->next)
+		DEBUG(5,("open pipes: name %s pnum=%x\n", p->name, p->pnum));  
+
+	return chain_p;
+}
+
+/****************************************************************************
+ * make an internal namedpipes structure
+****************************************************************************/
+
+pipes_struct *make_internal_rpc_pipe_p(char *pipe_name, 
+			      connection_struct *conn, uint16 vuid)
+{
+	pipes_struct *p;
+
+	DEBUG(4,("Create pipe requested %s\n", pipe_name));
+
+	p = (pipes_struct *)malloc(sizeof(*p));
+
+	if (!p)
+		return NULL;
+
+	ZERO_STRUCTP(p);
+
+	if ((p->mem_ctx = talloc_init()) == NULL) {
+		DEBUG(0,("open_rpc_pipe_p: talloc_init failed.\n"));
+		SAFE_FREE(p);
+		return NULL;
+	}
+
+	if (!init_pipe_handle_list(p, pipe_name)) {
+		DEBUG(0,("open_rpc_pipe_p: init_pipe_handles failed.\n"));
+		talloc_destroy(p->mem_ctx);
+		SAFE_FREE(p);
+		return NULL;
+	}
+
+	/*
+	 * Initialize the incoming RPC data buffer with one PDU worth of memory.
+	 * We cheat here and say we're marshalling, as we intend to add incoming
+	 * data directly into the prs_struct and we want it to auto grow. We will
+	 * change the type to UNMARSALLING before processing the stream.
+	 */
+
+	if(!prs_init(&p->in_data.data, MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) {
+		DEBUG(0,("open_rpc_pipe_p: malloc fail for in_data struct.\n"));
+		return NULL;
+	}
+
+	DLIST_ADD(InternalPipes, p);
+
 	p->ntlmssp_chal_flags = 0;
 	p->ntlmssp_auth_validated = False;
 	p->ntlmssp_auth_requested = False;
@@ -205,6 +269,11 @@
 	p->fault_state = False;
 	p->endian = RPC_LITTLE_ENDIAN;
 
+	ZERO_STRUCT(p->pipe_user);
+
+	p->pipe_user.uid = (uid_t)-1;
+	p->pipe_user.gid = (gid_t)-1;
+	
 	/*
 	 * Initialize the incoming RPC struct.
 	 */
@@ -225,23 +294,12 @@
 	 */	
 	prs_init(&p->out_data.rdata, 0, p->mem_ctx, MARSHALL);
 	
-	ZERO_STRUCT(p->pipe_user);
-
-	p->pipe_user.uid = (uid_t)-1;
-	p->pipe_user.gid = (gid_t)-1;
-	
 	fstrcpy(p->name, pipe_name);
 	
-	DEBUG(4,("Opened pipe %s with handle %x (pipes_open=%d)\n",
-		 pipe_name, i, pipes_open));
-	
-	chain_p = p;
-	
-	/* OVERWRITE p as a temp variable, to display all open pipes */ 
-	for (p = Pipes; p; p = p->next)
-		DEBUG(5,("open pipes: name %s pnum=%x\n", p->name, p->pnum));  
+	DEBUG(4,("Created internal pipe %s (pipes_open=%d)\n",
+		 pipe_name, pipes_open));
 
-	return chain_p;
+	return p;
 }
 
 /****************************************************************************
@@ -255,7 +313,7 @@
 	p->in_data.pdu_received_len = 0;
 	p->fault_state = True;
 	DEBUG(10,("set_incoming_fault: Setting fault state on pipe %s : pnum = 0x%x\n",
-		p->name, p->pnum ));
+		p->name, p->p->pnum ));
 }
 
 /****************************************************************************
@@ -614,7 +672,7 @@
 	prs_set_endian_data( &p->in_data.data, RPC_LITTLE_ENDIAN);
 
 	if (!reply) {
-		DEBUG(3,("process_complete_pdu: DCE/RPC fault sent on pipe %s\n", p->pipe_srv_name));
+		DEBUG(3,("process_complete_pdu: DCE/RPC fault sent on pipe %s\n", p->name));
 		set_incoming_fault(p);
 		setup_fault_pdu(p, NT_STATUS(0x1c010002));
 		prs_mem_free(&rpc_in);
@@ -712,10 +770,8 @@
  Accepts incoming data on an rpc pipe.
 ****************************************************************************/
 
-ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n)
+ssize_t write_to_pipe(smb_np_struct *p, char *data, size_t n)
 {
-	size_t data_left = n;
-
 	DEBUG(6,("write_to_pipe: %x", p->pnum));
 
 	DEBUG(6,(" name: %s open: %s len: %d\n",
@@ -723,6 +779,18 @@
 
 	dump_data(50, data, n);
 
+	return write_to_internal_pipe((pipes_struct*)(p->np_state),
+					data, n);
+}
+
+/****************************************************************************
+ Accepts incoming data on an internal rpc pipe.
+****************************************************************************/
+
+ssize_t write_to_internal_pipe(pipes_struct *p, char *data, size_t n)
+{
+	size_t data_left = n;
+
 	while(data_left) {
 		ssize_t data_used;
 
@@ -753,11 +821,9 @@
  have been prepared into arrays of headers + data stream sections.
 ****************************************************************************/
 
-ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n)
+ssize_t read_from_pipe(smb_np_struct *p, char *data, size_t n,
+		BOOL *is_data_outstanding)
 {
-	uint32 pdu_remaining = 0;
-	ssize_t data_returned = 0;
-
 	if (!p || !p->open) {
 		DEBUG(0,("read_from_pipe: pipe not open\n"));
 		return -1;		
@@ -765,6 +831,32 @@
 
 	DEBUG(6,("read_from_pipe: %x", p->pnum));
 
+	return read_from_internal_pipe((pipes_struct*)(p->np_state),
+					data, n, is_data_outstanding);
+}
+
+/****************************************************************************
+ Replies to a request to read data from a pipe.
+
+ Headers are interspersed with the data at PDU intervals. By the time
+ this function is called, the start of the data could possibly have been
+ read by an SMBtrans (file_offset != 0).
+
+ Calling create_rpc_reply() here is a hack. The data should already
+ have been prepared into arrays of headers + data stream sections.
+****************************************************************************/
+
+ssize_t read_from_internal_pipe(pipes_struct *p, char *data, size_t n,
+		BOOL *is_data_outstanding)
+{
+	uint32 pdu_remaining = 0;
+	ssize_t data_returned = 0;
+
+	if (!p) {
+		DEBUG(0,("read_from_pipe: pipe not open\n"));
+		return -1;		
+	}
+
 	DEBUG(6,(" name: %s len: %u\n", p->name, (unsigned int)n));
 
 	/*
@@ -839,6 +931,7 @@
 
   out:
 
+	(*is_data_outstanding) = p->out_data.current_pdu_len > n;
 	return data_returned;
 }
 
@@ -846,7 +939,7 @@
  Wait device state on a pipe. Exactly what this is for is unknown...
 ****************************************************************************/
 
-BOOL wait_rpc_pipe_hnd_state(pipes_struct *p, uint16 priority)
+BOOL wait_rpc_pipe_hnd_state(smb_np_struct *p, uint16 priority)
 {
 	if (p == NULL)
 		return False;
@@ -870,7 +963,7 @@
  Set device state on a pipe. Exactly what this is for is unknown...
 ****************************************************************************/
 
-BOOL set_rpc_pipe_hnd_state(pipes_struct *p, uint16 device_state)
+BOOL set_rpc_pipe_hnd_state(smb_np_struct *p, uint16 device_state)
 {
 	if (p == NULL)
 		return False;
@@ -894,21 +987,14 @@
  Close an rpc pipe.
 ****************************************************************************/
 
-BOOL close_rpc_pipe_hnd(pipes_struct *p, connection_struct *conn)
+BOOL close_rpc_pipe_hnd(smb_np_struct *p, connection_struct *conn)
 {
 	if (!p) {
 		DEBUG(0,("Invalid pipe in close_rpc_pipe_hnd\n"));
 		return False;
 	}
 
-	prs_mem_free(&p->out_data.rdata);
-	prs_mem_free(&p->in_data.data);
-
-	if (p->mem_ctx)
-		talloc_destroy(p->mem_ctx);
-
-	/* Free the handles database. */
-	close_policy_by_pipe(p);
+	close_internal_rpc_pipe_hnd((pipes_struct *)(p->np_state));
 
 	bitmap_clear(bmap, p->pnum - pipe_handle_offset);
 
@@ -919,9 +1005,38 @@
 
 	DLIST_REMOVE(Pipes, p);
 
+	ZERO_STRUCTP(p);
+
+	SAFE_FREE(p);
+	
+	return True;
+}
+
+/****************************************************************************
+ Close an rpc pipe.
+****************************************************************************/
+
+BOOL close_internal_rpc_pipe_hnd(pipes_struct *p)
+{
+	if (!p) {
+		DEBUG(0,("Invalid pipe in close_internal_rpc_pipe_hnd\n"));
+		return False;
+	}
+
+	prs_mem_free(&p->out_data.rdata);
+	prs_mem_free(&p->in_data.data);
+
+	if (p->mem_ctx)
+		talloc_destroy(p->mem_ctx);
+
+	/* Free the handles database. */
+	close_policy_by_pipe(p);
+
 	delete_nt_token(&p->pipe_user.nt_user_token);
 	SAFE_FREE(p->pipe_user.groups);
 
+	DLIST_REMOVE(InternalPipes, p);
+
 	ZERO_STRUCTP(p);
 
 	SAFE_FREE(p);
@@ -933,7 +1048,7 @@
  Find an rpc pipe given a pipe handle in a buffer and an offset.
 ****************************************************************************/
 
-pipes_struct *get_rpc_pipe_p(char *buf, int where)
+smb_np_struct *get_rpc_pipe_p(char *buf, int where)
 {
 	int pnum = SVAL(buf,where);
 
@@ -947,9 +1062,9 @@
  Find an rpc pipe given a pipe handle.
 ****************************************************************************/
 
-pipes_struct *get_rpc_pipe(int pnum)
+smb_np_struct *get_rpc_pipe(int pnum)
 {
-	pipes_struct *p;
+	smb_np_struct *p;
 
 	DEBUG(4,("search for pipe pnum=%x\n", pnum));
 
@@ -966,3 +1081,14 @@
 
 	return NULL;
 }
+
+uint16 pipe_internal_get_vuid(pipes_struct *p)
+{
+	return p->p->vuid;
+}
+
+struct connection_struct *pipe_internal_get_conn(pipes_struct *p)
+{
+	return p->p->conn;
+}
+
Index: rpc_server/srv_spoolss_nt.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_spoolss_nt.c,v
retrieving revision 1.237
diff -u -u -w -b -B -r1.237 srv_spoolss_nt.c
--- rpc_server/srv_spoolss_nt.c	12 Jan 2002 02:37:54 -0000	1.237
+++ rpc_server/srv_spoolss_nt.c	13 Jan 2002 13:50:30 -0000
@@ -633,7 +633,7 @@
 	 */
 
 	hl = NULL;	
-	for ( p = get_first_pipe(); p; get_next_pipe(p)) {
+	for ( p = get_first_internal_pipe(); p; get_next_internal_pipe(p)) {
 		if (strequal(p->name, "spoolss")) {
 			hl = p->pipe_handles;
 			break;
Index: rpc_server/srv_srvsvc_nt.c
===================================================================
RCS file: /cvsroot/samba/source/rpc_server/srv_srvsvc_nt.c,v
retrieving revision 1.63
diff -u -u -w -b -B -r1.63 srv_srvsvc_nt.c
--- rpc_server/srv_srvsvc_nt.c	9 Jan 2002 05:24:07 -0000	1.63
+++ rpc_server/srv_srvsvc_nt.c	13 Jan 2002 13:50:33 -0000
@@ -41,7 +41,7 @@
 
 	pstrcpy(net_name, lp_servicename(snum));
 	pstrcpy(remark, lp_comment(snum));
-	standard_sub_conn(p->conn, remark);
+	standard_sub_conn(pipe_internal_get_conn(p), remark);
 	len_net_name = strlen(net_name);
 
 	/* work out the share type */
@@ -73,7 +73,7 @@
 
 	pstrcpy(net_name, lp_servicename(snum));
 	pstrcpy(remark, lp_comment(snum));
-	standard_sub_conn(p->conn, remark);
+	standard_sub_conn(pipe_internal_get_conn(p), remark);
 	pstrcpy(path, "C:");
 	pstrcat(path, lp_pathname(snum));
 
@@ -367,7 +367,7 @@
 
 	pstrcpy(net_name, lp_servicename(snum));
 	pstrcpy(remark, lp_comment(snum));
-	standard_sub_conn(p->conn, remark);
+	standard_sub_conn(pipe_internal_get_conn(p), remark);
 	pstrcpy(path, "C:");
 	pstrcat(path, lp_pathname(snum));
 
Index: script/mkproto.awk
===================================================================
RCS file: /cvsroot/samba/source/script/mkproto.awk,v
retrieving revision 1.58
diff -u -u -w -b -B -r1.58 mkproto.awk
--- script/mkproto.awk	19 Dec 2001 12:21:10 -0000	1.58
+++ script/mkproto.awk	13 Jan 2002 13:50:33 -0000
@@ -114,7 +114,7 @@
 
 {
   gotstart = 0;
-  if( $0 ~ /^const|^connection_struct|^pipes_struct|^file_fd_struct|^files_struct|^connection_struct|^uid_t|^gid_t|^unsigned|^mode_t|^DIR|^user|^int|^pid_t|^ino_t|^off_t/ ) {
+  if( $0 ~ /^const|^connection_struct|^pipes_struct|^smb_np_struct|^file_fd_struct|^files_struct|^connection_struct|^uid_t|^gid_t|^unsigned|^mode_t|^DIR|^user|^int|^pid_t|^ino_t|^off_t/ ) {
     gotstart = 1;
   }
 
Index: smbd/ipc.c
===================================================================
RCS file: /cvsroot/samba/source/smbd/ipc.c,v
retrieving revision 1.178
diff -u -u -w -b -B -r1.178 ipc.c
--- smbd/ipc.c	5 Nov 2001 00:02:37 -0000	1.178
+++ smbd/ipc.c	13 Jan 2002 13:50:35 -0000
@@ -163,8 +163,9 @@
  Start the first part of an RPC reply which began with an SMBtrans request.
 ****************************************************************************/
 
-static BOOL api_rpc_trans_reply(char *outbuf, pipes_struct *p)
+static BOOL api_rpc_trans_reply(char *outbuf, smb_np_struct *p)
 {
+	BOOL is_data_outstanding;
 	char *rdata = malloc(p->max_trans_reply);
 	int data_len;
 
@@ -173,12 +174,13 @@
 		return False;
 	}
 
-	if((data_len = read_from_pipe( p, rdata, p->max_trans_reply)) < 0) {
+	if((data_len = read_from_pipe( p, rdata, p->max_trans_reply,
+					&is_data_outstanding)) < 0) {
 		SAFE_FREE(rdata);
 		return False;
 	}
 
-	send_trans_reply(outbuf, NULL, 0, rdata, data_len, p->out_data.current_pdu_len > data_len);
+	send_trans_reply(outbuf, NULL, 0, rdata, data_len, is_data_outstanding);
 
 	SAFE_FREE(rdata);
 	return True;
@@ -188,7 +190,7 @@
  WaitNamedPipeHandleState 
 ****************************************************************************/
 
-static BOOL api_WNPHS(char *outbuf, pipes_struct *p, char *param, int param_len)
+static BOOL api_WNPHS(char *outbuf, smb_np_struct *p, char *param, int param_len)
 {
 	uint16 priority;
 
@@ -211,7 +213,7 @@
  SetNamedPipeHandleState 
 ****************************************************************************/
 
-static BOOL api_SNPHS(char *outbuf, pipes_struct *p, char *param, int param_len)
+static BOOL api_SNPHS(char *outbuf, smb_np_struct *p, char *param, int param_len)
 {
 	uint16 id;
 
@@ -259,7 +261,7 @@
 		 	int suwcnt,int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
 {
 	BOOL reply = False;
-	pipes_struct *p = NULL;
+	smb_np_struct *p = NULL;
 	int pnum;
 	int subcommand;
 
Index: smbd/nttrans.c
===================================================================
RCS file: /cvsroot/samba/source/smbd/nttrans.c,v
retrieving revision 1.143
diff -u -u -w -b -B -r1.143 nttrans.c
--- smbd/nttrans.c	4 Jan 2002 21:11:35 -0000	1.143
+++ smbd/nttrans.c	13 Jan 2002 13:50:38 -0000
@@ -466,7 +466,7 @@
 static int nt_open_pipe(char *fname, connection_struct *conn,
 			char *inbuf, char *outbuf, int *ppnum)
 {
-	pipes_struct *p = NULL;
+	smb_np_struct *p = NULL;
 
 	uint16 vuid = SVAL(inbuf, smb_uid);
 	int i;
Index: smbd/pipes.c
===================================================================
RCS file: /cvsroot/samba/source/smbd/pipes.c,v
retrieving revision 1.74
diff -u -u -w -b -B -r1.74 pipes.c
--- smbd/pipes.c	18 Dec 2001 02:09:57 -0000	1.74
+++ smbd/pipes.c	13 Jan 2002 13:50:39 -0000
@@ -45,7 +45,7 @@
 	pstring fname;
 	pstring pipe_name;
 	uint16 vuid = SVAL(inbuf, smb_uid);
-	pipes_struct *p;
+	smb_np_struct *p;
 	int smb_ofun = SVAL(inbuf,smb_vwv8);
 	int size=0,fmode=0,mtime=0,rmode=0;
 	int i;
@@ -116,7 +116,7 @@
 ****************************************************************************/
 int reply_pipe_write(char *inbuf,char *outbuf,int length,int dum_bufsize)
 {
-	pipes_struct *p = get_rpc_pipe_p(inbuf,smb_vwv0);
+	smb_np_struct *p = get_rpc_pipe_p(inbuf,smb_vwv0);
 	size_t numtowrite = SVAL(inbuf,smb_vwv1);
 	int nwritten;
 	int outsize;
@@ -154,7 +154,7 @@
 
 int reply_pipe_write_and_X(char *inbuf,char *outbuf,int length,int bufsize)
 {
-	pipes_struct *p = get_rpc_pipe_p(inbuf,smb_vwv2);
+	smb_np_struct *p = get_rpc_pipe_p(inbuf,smb_vwv2);
 	size_t numtowrite = SVAL(inbuf,smb_vwv10);
 	int nwritten = -1;
 	int smb_doff = SVAL(inbuf, smb_vwv11);
@@ -210,7 +210,7 @@
 ****************************************************************************/
 int reply_pipe_read_and_X(char *inbuf,char *outbuf,int length,int bufsize)
 {
-	pipes_struct *p = get_rpc_pipe_p(inbuf,smb_vwv2);
+	smb_np_struct *p = get_rpc_pipe_p(inbuf,smb_vwv2);
 	int smb_maxcnt = SVAL(inbuf,smb_vwv5);
 	int smb_mincnt = SVAL(inbuf,smb_vwv6);
 	int nread = -1;
@@ -248,7 +248,7 @@
 ****************************************************************************/
 int reply_pipe_close(connection_struct *conn, char *inbuf,char *outbuf)
 {
-	pipes_struct *p = get_rpc_pipe_p(inbuf,smb_vwv0);
+	smb_np_struct *p = get_rpc_pipe_p(inbuf,smb_vwv0);
 	int outsize = set_message(outbuf,0,0,True);
 
 	if (!p)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: srv_namedpipe_proxy.c
Type: text/x-csrc
Size: 4000 bytes
Desc: not available
Url : http://lists.samba.org/archive/samba-technical/attachments/20020113/321dd649/srv_namedpipe_proxy.bin


More information about the samba-technical mailing list