Correct PPTP server firewall rules chain.
[tomato/davidwu.git] / release / src / router / samba / source / rpc_server / srv_pipe_hnd.c
blobeef5e46a773c4313a59c6079eda7ce23d40945db
1 /*
2 * Unix SMB/Netbios implementation.
3 * Version 1.9.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1998,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
7 * Copyright (C) Jeremy Allison 1999.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "includes.h"
28 #define PIPE "\\PIPE\\"
29 #define PIPELEN strlen(PIPE)
31 extern int DEBUGLEVEL;
32 static pipes_struct *chain_p;
33 static int pipes_open;
35 #ifndef MAX_OPEN_PIPES
36 #define MAX_OPEN_PIPES 64
37 #endif
39 static pipes_struct *Pipes;
40 static struct bitmap *bmap;
42 /* this must be larger than the sum of the open files and directories */
43 static int pipe_handle_offset;
45 /****************************************************************************
46 Set the pipe_handle_offset. Called from smbd/files.c
47 ****************************************************************************/
49 void set_pipe_handle_offset(int max_open_files)
51 if(max_open_files < 0x7000)
52 pipe_handle_offset = 0x7000;
53 else
54 pipe_handle_offset = max_open_files + 10; /* For safety. :-) */
57 /****************************************************************************
58 Reset pipe chain handle number.
59 ****************************************************************************/
60 void reset_chain_p(void)
62 chain_p = NULL;
65 /****************************************************************************
66 Initialise pipe handle states.
67 ****************************************************************************/
69 void init_rpc_pipe_hnd(void)
71 bmap = bitmap_allocate(MAX_OPEN_PIPES);
72 if (!bmap)
73 exit_server("out of memory in init_rpc_pipe_hnd\n");
76 /****************************************************************************
77 Initialise an outgoing packet.
78 ****************************************************************************/
80 static BOOL pipe_init_outgoing_data(output_data *o_data)
82 /* Reset the offset counters. */
83 o_data->data_sent_length = 0;
84 o_data->current_pdu_len = 0;
85 o_data->current_pdu_sent = 0;
87 memset(o_data->current_pdu, '\0', sizeof(o_data->current_pdu));
89 /* Free any memory in the current return data buffer. */
90 prs_mem_free(&o_data->rdata);
93 * Initialize the outgoing RPC data buffer.
94 * we will use this as the raw data area for replying to rpc requests.
95 */
96 if(!prs_init(&o_data->rdata, MAX_PDU_FRAG_LEN, 4, MARSHALL)) {
97 DEBUG(0,("pipe_init_outgoing_data: malloc fail.\n"));
98 return False;
101 return True;
104 /****************************************************************************
105 Find first available pipe slot.
106 ****************************************************************************/
108 pipes_struct *open_rpc_pipe_p(char *pipe_name,
109 connection_struct *conn, uint16 vuid)
111 int i;
112 pipes_struct *p;
113 static int next_pipe;
115 DEBUG(4,("Open pipe requested %s (pipes_open=%d)\n",
116 pipe_name, pipes_open));
118 /* not repeating pipe numbers makes it easier to track things in
119 log files and prevents client bugs where pipe numbers are reused
120 over connection restarts */
121 if (next_pipe == 0)
122 next_pipe = (getpid() ^ time(NULL)) % MAX_OPEN_PIPES;
124 i = bitmap_find(bmap, next_pipe);
126 if (i == -1) {
127 DEBUG(0,("ERROR! Out of pipe structures\n"));
128 return NULL;
131 next_pipe = (i+1) % MAX_OPEN_PIPES;
133 for (p = Pipes; p; p = p->next)
134 DEBUG(5,("open pipes: name %s pnum=%x\n", p->name, p->pnum));
136 p = (pipes_struct *)malloc(sizeof(*p));
138 if (!p)
139 return NULL;
141 ZERO_STRUCTP(p);
143 DLIST_ADD(Pipes, p);
146 * Initialize the incoming RPC data buffer with one PDU worth of memory.
147 * We cheat here and say we're marshalling, as we intend to add incoming
148 * data directly into the prs_struct and we want it to auto grow. We will
149 * change the type to UNMARSALLING before processing the stream.
152 if(!prs_init(&p->in_data.data, MAX_PDU_FRAG_LEN, 4, MARSHALL)) {
153 DEBUG(0,("open_rpc_pipe_p: malloc fail for in_data struct.\n"));
154 return NULL;
157 bitmap_set(bmap, i);
158 i += pipe_handle_offset;
160 pipes_open++;
162 p->pnum = i;
164 p->open = True;
165 p->device_state = 0;
166 p->priority = 0;
167 p->conn = conn;
168 p->vuid = vuid;
170 p->max_trans_reply = 0;
172 p->ntlmssp_chal_flags = 0;
173 p->ntlmssp_auth_validated = False;
174 p->ntlmssp_auth_requested = False;
176 p->pipe_bound = False;
177 p->fault_state = False;
180 * Initialize the incoming RPC struct.
183 p->in_data.pdu_needed_len = 0;
184 p->in_data.pdu_received_len = 0;
187 * Initialize the outgoing RPC struct.
190 p->out_data.current_pdu_len = 0;
191 p->out_data.current_pdu_sent = 0;
192 p->out_data.data_sent_length = 0;
195 * Initialize the outgoing RPC data buffer with no memory.
197 prs_init(&p->out_data.rdata, 0, 4, MARSHALL);
199 p->uid = (uid_t)-1;
200 p->gid = (gid_t)-1;
202 fstrcpy(p->name, pipe_name);
204 DEBUG(4,("Opened pipe %s with handle %x (pipes_open=%d)\n",
205 pipe_name, i, pipes_open));
207 chain_p = p;
209 /* OVERWRITE p as a temp variable, to display all open pipes */
210 for (p = Pipes; p; p = p->next)
211 DEBUG(5,("open pipes: name %s pnum=%x\n", p->name, p->pnum));
213 return chain_p;
216 /****************************************************************************
217 Sets the fault state on incoming packets.
218 ****************************************************************************/
220 static void set_incoming_fault(pipes_struct *p)
222 prs_mem_free(&p->in_data.data);
223 p->in_data.pdu_needed_len = 0;
224 p->in_data.pdu_received_len = 0;
225 p->fault_state = True;
226 DEBUG(10,("set_incoming_fault: Setting fault state on pipe %s : pnum = 0x%x\n",
227 p->name, p->pnum ));
230 /****************************************************************************
231 Ensures we have at least RPC_HEADER_LEN amount of data in the incoming buffer.
232 ****************************************************************************/
234 static ssize_t fill_rpc_header(pipes_struct *p, char *data, size_t data_to_copy)
236 size_t len_needed_to_complete_hdr = MIN(data_to_copy, RPC_HEADER_LEN - p->in_data.pdu_received_len);
238 DEBUG(10,("fill_rpc_header: data_to_copy = %u, len_needed_to_complete_hdr = %u, receive_len = %u\n",
239 (unsigned int)data_to_copy, (unsigned int)len_needed_to_complete_hdr,
240 (unsigned int)p->in_data.pdu_received_len ));
242 memcpy((char *)&p->in_data.current_in_pdu[p->in_data.pdu_received_len], data, len_needed_to_complete_hdr);
243 p->in_data.pdu_received_len += len_needed_to_complete_hdr;
245 return (ssize_t)len_needed_to_complete_hdr;
248 /****************************************************************************
249 Unmarshalls a new PDU header. Assumes the raw header data is in current_in_pdu.
250 ****************************************************************************/
252 static ssize_t unmarshall_rpc_header(pipes_struct *p)
255 * Unmarshall the header to determine the needed length.
258 prs_struct rpc_in;
260 if(p->in_data.pdu_received_len != RPC_HEADER_LEN) {
261 DEBUG(0,("unmarshall_rpc_header: assert on rpc header length failed.\n"));
262 set_incoming_fault(p);
263 return -1;
266 prs_init( &rpc_in, 0, 4, UNMARSHALL);
267 prs_give_memory( &rpc_in, (char *)&p->in_data.current_in_pdu[0],
268 p->in_data.pdu_received_len, False);
271 * Unmarshall the header as this will tell us how much
272 * data we need to read to get the complete pdu.
275 if(!smb_io_rpc_hdr("", &p->hdr, &rpc_in, 0)) {
276 DEBUG(0,("unmarshall_rpc_header: failed to unmarshall RPC_HDR.\n"));
277 set_incoming_fault(p);
278 return -1;
282 * Validate the RPC header.
285 if(p->hdr.major != 5 && p->hdr.minor != 0) {
286 DEBUG(0,("unmarshall_rpc_header: invalid major/minor numbers in RPC_HDR.\n"));
287 set_incoming_fault(p);
288 return -1;
292 * If there is no data in the incoming buffer and it's a requst pdu then
293 * ensure that the FIRST flag is set. If not then we have
294 * a stream missmatch.
297 if((p->hdr.pkt_type == RPC_REQUEST) && (prs_offset(&p->in_data.data) == 0) && !(p->hdr.flags & RPC_FLG_FIRST)) {
298 DEBUG(0,("unmarshall_rpc_header: FIRST flag not set in first PDU !\n"));
299 set_incoming_fault(p);
300 return -1;
304 * Ensure that the pdu length is sane.
307 if((p->hdr.frag_len < RPC_HEADER_LEN) || (p->hdr.frag_len > MAX_PDU_FRAG_LEN)) {
308 DEBUG(0,("unmarshall_rpc_header: assert on frag length failed.\n"));
309 set_incoming_fault(p);
310 return -1;
313 DEBUG(10,("unmarshall_rpc_header: type = %u, flags = %u\n", (unsigned int)p->hdr.pkt_type,
314 (unsigned int)p->hdr.flags ));
317 * Adjust for the header we just ate.
319 p->in_data.pdu_received_len = 0;
320 p->in_data.pdu_needed_len = (uint32)p->hdr.frag_len - RPC_HEADER_LEN;
323 * Null the data we just ate.
326 memset((char *)&p->in_data.current_in_pdu[0], '\0', RPC_HEADER_LEN);
328 return 0; /* No extra data processed. */
331 /****************************************************************************
332 Processes a request pdu. This will do auth processing if needed, and
333 appends the data into the complete stream if the LAST flag is not set.
334 ****************************************************************************/
336 static BOOL process_request_pdu(pipes_struct *p, prs_struct *rpc_in_p)
338 BOOL auth_verify = IS_BITS_SET_ALL(p->ntlmssp_chal_flags, NTLMSSP_NEGOTIATE_SIGN);
339 size_t data_len = p->hdr.frag_len - RPC_HEADER_LEN - RPC_HDR_REQ_LEN -
340 (auth_verify ? RPC_HDR_AUTH_LEN : 0) - p->hdr.auth_len;
342 if(!p->pipe_bound) {
343 DEBUG(0,("process_request_pdu: rpc request with no bind.\n"));
344 set_incoming_fault(p);
345 return False;
349 * Check if we need to do authentication processing.
350 * This is only done on requests, not binds.
354 * Read the RPC request header.
357 if(!smb_io_rpc_hdr_req("req", &p->hdr_req, rpc_in_p, 0)) {
358 DEBUG(0,("process_request_pdu: failed to unmarshall RPC_HDR_REQ.\n"));
359 set_incoming_fault(p);
360 return False;
363 if(p->ntlmssp_auth_validated && !api_pipe_auth_process(p, rpc_in_p)) {
364 DEBUG(0,("process_request_pdu: failed to do auth processing.\n"));
365 set_incoming_fault(p);
366 return False;
369 if (p->ntlmssp_auth_requested && !p->ntlmssp_auth_validated) {
372 * Authentication _was_ requested and it already failed.
375 DEBUG(0,("process_request_pdu: RPC request received on pipe %s where \
376 authentication failed. Denying the request.\n", p->name));
377 set_incoming_fault(p);
378 return False;
382 * Check the data length doesn't go over the 1Mb limit.
385 if(prs_data_size(&p->in_data.data) + data_len > 1024*1024) {
386 DEBUG(0,("process_request_pdu: rpc data buffer too large (%u) + (%u)\n",
387 (unsigned int)prs_data_size(&p->in_data.data), (unsigned int)data_len ));
388 set_incoming_fault(p);
389 return False;
393 * Append the data portion into the buffer and return.
397 char *data_from = prs_data_p(rpc_in_p) + prs_offset(rpc_in_p);
399 if(!prs_append_data(&p->in_data.data, data_from, data_len)) {
400 DEBUG(0,("process_request_pdu: Unable to append data size %u to parse buffer of size %u.\n",
401 (unsigned int)data_len, (unsigned int)prs_data_size(&p->in_data.data) ));
402 set_incoming_fault(p);
403 return False;
408 if(p->hdr.flags & RPC_FLG_LAST) {
409 BOOL ret = False;
411 * Ok - we finally have a complete RPC stream.
412 * Call the rpc command to process it.
416 * Set the parse offset to the start of the data and set the
417 * prs_struct to UNMARSHALL.
420 prs_set_offset(&p->in_data.data, 0);
421 prs_switch_type(&p->in_data.data, UNMARSHALL);
424 * Process the complete data stream here.
427 if(pipe_init_outgoing_data(&p->out_data))
428 ret = api_pipe_request(p);
431 * We have consumed the whole data stream. Set back to
432 * marshalling and set the offset back to the start of
433 * the buffer to re-use it (we could also do a prs_mem_free()
434 * and then re_init on the next start of PDU. Not sure which
435 * is best here.... JRA.
438 prs_switch_type(&p->in_data.data, MARSHALL);
439 prs_set_offset(&p->in_data.data, 0);
440 return ret;
443 return True;
446 /****************************************************************************
447 Processes a finished PDU stored in current_in_pdu. The RPC_HEADER has
448 already been parsed and stored in p->hdr.
449 ****************************************************************************/
451 static ssize_t process_complete_pdu(pipes_struct *p)
453 prs_struct rpc_in;
454 size_t data_len = p->in_data.pdu_received_len;
455 char *data_p = (char *)&p->in_data.current_in_pdu[0];
456 BOOL reply = False;
458 if(p->fault_state) {
459 DEBUG(10,("process_complete_pdu: pipe %s in fault state.\n",
460 p->name ));
461 set_incoming_fault(p);
462 setup_fault_pdu(p);
463 return (ssize_t)data_len;
466 prs_init( &rpc_in, 0, 4, UNMARSHALL);
467 prs_give_memory( &rpc_in, data_p, (uint32)data_len, False);
469 DEBUG(10,("process_complete_pdu: processing packet type %u\n",
470 (unsigned int)p->hdr.pkt_type ));
472 switch (p->hdr.pkt_type) {
473 case RPC_BIND:
474 case RPC_ALTCONT:
476 * We assume that a pipe bind is only in one pdu.
478 if(pipe_init_outgoing_data(&p->out_data))
479 reply = api_pipe_bind_req(p, &rpc_in);
480 break;
481 case RPC_BINDRESP:
483 * We assume that a pipe bind_resp is only in one pdu.
485 if(pipe_init_outgoing_data(&p->out_data))
486 reply = api_pipe_bind_auth_resp(p, &rpc_in);
487 break;
488 case RPC_REQUEST:
489 reply = process_request_pdu(p, &rpc_in);
490 break;
491 default:
492 DEBUG(0,("process_complete_pdu: Unknown rpc type = %u received.\n", (unsigned int)p->hdr.pkt_type ));
493 break;
496 if (!reply) {
497 DEBUG(3,("process_complete_pdu: DCE/RPC fault sent on pipe %s\n", p->pipe_srv_name));
498 set_incoming_fault(p);
499 setup_fault_pdu(p);
500 } else {
502 * Reset the lengths. We're ready for a new pdu.
504 p->in_data.pdu_needed_len = 0;
505 p->in_data.pdu_received_len = 0;
508 return (ssize_t)data_len;
511 /****************************************************************************
512 Accepts incoming data on an rpc pipe. Processes the data in pdu sized units.
513 ****************************************************************************/
515 static ssize_t process_incoming_data(pipes_struct *p, char *data, size_t n)
517 size_t data_to_copy = MIN(n, MAX_PDU_FRAG_LEN - p->in_data.pdu_received_len);
519 DEBUG(10,("process_incoming_data: Start: pdu_received_len = %u, pdu_needed_len = %u, incoming data = %u\n",
520 (unsigned int)p->in_data.pdu_received_len, (unsigned int)p->in_data.pdu_needed_len,
521 (unsigned int)n ));
523 if(data_to_copy == 0) {
525 * This is an error - data is being received and there is no
526 * space in the PDU. Free the received data and go into the fault state.
528 DEBUG(0,("process_incoming_data: No space in incoming pdu buffer. Current size = %u \
529 incoming data size = %u\n", (unsigned int)p->in_data.pdu_received_len, (unsigned int)n ));
530 set_incoming_fault(p);
531 return -1;
535 * If we have no data already, wait until we get at least a RPC_HEADER_LEN
536 * number of bytes before we can do anything.
539 if((p->in_data.pdu_needed_len == 0) && (p->in_data.pdu_received_len < RPC_HEADER_LEN)) {
541 * Always return here. If we have more data then the RPC_HEADER
542 * will be processed the next time around the loop.
544 return fill_rpc_header(p, data, data_to_copy);
548 * At this point we know we have at least an RPC_HEADER_LEN amount of data
549 * stored in current_in_pdu.
553 * If pdu_needed_len is zero this is a new pdu.
554 * Unmarshall the header so we know how much more
555 * data we need, then loop again.
558 if(p->in_data.pdu_needed_len == 0)
559 return unmarshall_rpc_header(p);
562 * Ok - at this point we have a valid RPC_HEADER in p->hdr.
563 * Keep reading until we have a full pdu.
566 data_to_copy = MIN(data_to_copy, p->in_data.pdu_needed_len);
569 * Copy as much of the data as we need into the current_in_pdu buffer.
572 memcpy( (char *)&p->in_data.current_in_pdu[p->in_data.pdu_received_len], data, data_to_copy);
573 p->in_data.pdu_received_len += data_to_copy;
576 * Do we have a complete PDU ?
579 if(p->in_data.pdu_received_len == p->in_data.pdu_needed_len)
580 return process_complete_pdu(p);
582 DEBUG(10,("process_incoming_data: not a complete PDU yet. pdu_received_len = %u, pdu_needed_len = %u\n",
583 (unsigned int)p->in_data.pdu_received_len, (unsigned int)p->in_data.pdu_needed_len ));
585 return (ssize_t)data_to_copy;
589 /****************************************************************************
590 Accepts incoming data on an rpc pipe.
591 ****************************************************************************/
593 ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n)
595 size_t data_left = n;
597 DEBUG(6,("write_to_pipe: %x", p->pnum));
599 DEBUG(6,(" name: %s open: %s len: %d\n",
600 p->name, BOOLSTR(p->open), (int)n));
602 dump_data(50, data, n);
604 while(data_left) {
605 ssize_t data_used;
607 DEBUG(10,("write_to_pipe: data_left = %u\n", (unsigned int)data_left ));
609 data_used = process_incoming_data(p, data, data_left);
611 DEBUG(10,("write_to_pipe: data_used = %d\n", (int)data_used ));
613 if(data_used < 0)
614 return -1;
616 data_left -= data_used;
617 data += data_used;
620 return n;
624 /****************************************************************************
625 Replyies to a request to read data from a pipe.
627 Headers are interspersed with the data at PDU intervals. By the time
628 this function is called, the start of the data could possibly have been
629 read by an SMBtrans (file_offset != 0).
631 Calling create_rpc_reply() here is a hack. The data should already
632 have been prepared into arrays of headers + data stream sections.
634 ****************************************************************************/
636 ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n)
638 uint32 pdu_remaining = 0;
639 ssize_t data_returned = 0;
641 if (!p || !p->open) {
642 DEBUG(0,("read_from_pipe: pipe not open\n"));
643 return -1;
646 DEBUG(6,("read_from_pipe: %x", p->pnum));
648 DEBUG(6,(" name: %s len: %u\n", p->name, (unsigned int)n));
651 * We cannot return more than one PDU length per
652 * read request.
655 if(n > MAX_PDU_FRAG_LEN) {
656 DEBUG(0,("read_from_pipe: loo large read (%u) requested on pipe %s. We can \
657 only service %d sized reads.\n", (unsigned int)n, p->name, MAX_PDU_FRAG_LEN ));
658 return -1;
662 * Determine if there is still data to send in the
663 * pipe PDU buffer. Always send this first. Never
664 * send more than is left in the current PDU. The
665 * client should send a new read request for a new
666 * PDU.
669 if((pdu_remaining = p->out_data.current_pdu_len - p->out_data.current_pdu_sent) > 0) {
670 data_returned = (ssize_t)MIN(n, pdu_remaining);
672 DEBUG(10,("read_from_pipe: %s: current_pdu_len = %u, current_pdu_sent = %u \
673 returning %d bytes.\n", p->name, (unsigned int)p->out_data.current_pdu_len,
674 (unsigned int)p->out_data.current_pdu_sent, (int)data_returned));
676 memcpy( data, &p->out_data.current_pdu[p->out_data.current_pdu_sent], (size_t)data_returned);
677 p->out_data.current_pdu_sent += (uint32)data_returned;
678 return data_returned;
682 * At this point p->current_pdu_len == p->current_pdu_sent (which
683 * may of course be zero if this is the first return fragment.
686 DEBUG(10,("read_from_pipe: %s: fault_state = %d : data_sent_length \
687 = %u, prs_offset(&p->out_data.rdata) = %u.\n",
688 p->name, (int)p->fault_state, (unsigned int)p->out_data.data_sent_length, (unsigned int)prs_offset(&p->out_data.rdata) ));
690 if(p->out_data.data_sent_length >= prs_offset(&p->out_data.rdata)) {
692 * We have sent all possible data. Return 0.
694 return 0;
698 * We need to create a new PDU from the data left in p->rdata.
699 * Create the header/data/footers. This also sets up the fields
700 * p->current_pdu_len, p->current_pdu_sent, p->data_sent_length
701 * and stores the outgoing PDU in p->current_pdu.
704 if(!create_next_pdu(p)) {
705 DEBUG(0,("read_from_pipe: %s: create_next_pdu failed.\n",
706 p->name));
707 return -1;
710 data_returned = MIN(n, p->out_data.current_pdu_len);
712 memcpy( data, p->out_data.current_pdu, (size_t)data_returned);
713 p->out_data.current_pdu_sent += (uint32)data_returned;
714 return data_returned;
717 /****************************************************************************
718 Wait device state on a pipe. Exactly what this is for is unknown...
719 ****************************************************************************/
721 BOOL wait_rpc_pipe_hnd_state(pipes_struct *p, uint16 priority)
723 if (p == NULL)
724 return False;
726 if (p->open) {
727 DEBUG(3,("wait_rpc_pipe_hnd_state: Setting pipe wait state priority=%x on pipe (name=%s)\n",
728 priority, p->name));
730 p->priority = priority;
732 return True;
735 DEBUG(3,("wait_rpc_pipe_hnd_state: Error setting pipe wait state priority=%x (name=%s)\n",
736 priority, p->name));
737 return False;
741 /****************************************************************************
742 Set device state on a pipe. Exactly what this is for is unknown...
743 ****************************************************************************/
745 BOOL set_rpc_pipe_hnd_state(pipes_struct *p, uint16 device_state)
747 if (p == NULL)
748 return False;
750 if (p->open) {
751 DEBUG(3,("set_rpc_pipe_hnd_state: Setting pipe device state=%x on pipe (name=%s)\n",
752 device_state, p->name));
754 p->device_state = device_state;
756 return True;
759 DEBUG(3,("set_rpc_pipe_hnd_state: Error setting pipe device state=%x (name=%s)\n",
760 device_state, p->name));
761 return False;
765 /****************************************************************************
766 Close an rpc pipe.
767 ****************************************************************************/
769 BOOL close_rpc_pipe_hnd(pipes_struct *p, connection_struct *conn)
771 if (!p) {
772 DEBUG(0,("Invalid pipe in close_rpc_pipe_hnd\n"));
773 return False;
776 prs_mem_free(&p->out_data.rdata);
777 prs_mem_free(&p->in_data.data);
779 bitmap_clear(bmap, p->pnum - pipe_handle_offset);
781 pipes_open--;
783 DEBUG(4,("closed pipe name %s pnum=%x (pipes_open=%d)\n",
784 p->name, p->pnum, pipes_open));
786 DLIST_REMOVE(Pipes, p);
788 ZERO_STRUCTP(p);
790 free(p);
792 return True;
795 /****************************************************************************
796 Find an rpc pipe given a pipe handle in a buffer and an offset.
797 ****************************************************************************/
799 pipes_struct *get_rpc_pipe_p(char *buf, int where)
801 int pnum = SVAL(buf,where);
803 if (chain_p)
804 return chain_p;
806 return get_rpc_pipe(pnum);
809 /****************************************************************************
810 Find an rpc pipe given a pipe handle.
811 ****************************************************************************/
813 pipes_struct *get_rpc_pipe(int pnum)
815 pipes_struct *p;
817 DEBUG(4,("search for pipe pnum=%x\n", pnum));
819 for (p=Pipes;p;p=p->next)
820 DEBUG(5,("pipe name %s pnum=%x (pipes_open=%d)\n",
821 p->name, p->pnum, pipes_open));
823 for (p=Pipes;p;p=p->next) {
824 if (p->pnum == pnum) {
825 chain_p = p;
826 return p;
830 return NULL;