diff options
author | Simo Sorce <idra@samba.org> | 2010-07-15 16:54:14 -0400 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2010-07-16 01:51:18 +0200 |
commit | 53945a2e990df92cdee8b54b3d1c3ade0305e99c (patch) | |
tree | 783c75d64b933cdf504b6350efdad7e053f53cd7 /source3/rpc_server | |
parent | 67b6fe3dc39aaf88787471b1ce10f47db74c5b1e (diff) | |
download | samba-53945a2e990df92cdee8b54b3d1c3ade0305e99c.tar.gz samba-53945a2e990df92cdee8b54b3d1c3ade0305e99c.tar.bz2 samba-53945a2e990df92cdee8b54b3d1c3ade0305e99c.zip |
s3-dcerpc: Use a local function to dump pdu regions
Signed-off-by: Günther Deschner <gd@samba.org>
Diffstat (limited to 'source3/rpc_server')
-rw-r--r-- | source3/rpc_server/srv_pipe.c | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index eae8a7dbf2..6d37ec2bc2 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -37,6 +37,51 @@ #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV +/** + * Dump everything from the start of the end up of the provided data + * into a file, but only at debug level >= 50 + **/ +static void dump_pdu_region(const char *name, int v, + DATA_BLOB *data, size_t start, size_t end) +{ + int fd, i; + char *fname = NULL; + ssize_t sz; + + if (DEBUGLEVEL < 50) return; + + if (start > data->length || end > data->length || start > end) return; + + for (i = 1; i < 100; i++) { + if (v != -1) { + fname = talloc_asprintf(talloc_tos(), + "/tmp/%s_%d.%d.prs", + name, v, i); + } else { + fname = talloc_asprintf(talloc_tos(), + "/tmp/%s_%d.prs", + name, i); + } + if (!fname) { + return; + } + fd = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0644); + if (fd != -1 || errno != EEXIST) break; + } + if (fd != -1) { + sz = write(fd, data->data + start, end - start); + i = close(fd); + if ((sz != end - start) || (i != 0) ) { + DEBUG(0, ("Error writing/closing %s: %ld!=%ld %d\n", + fname, (unsigned long)sz, + (unsigned long)end - start, i)); + } else { + DEBUG(0,("created %s\n", fname)); + } + } + TALLOC_FREE(fname); +} + static void free_pipe_ntlmssp_auth_data(struct pipe_auth_data *auth) { struct auth_ntlmssp_state *a = auth->a_u.auth_ntlmssp_state; @@ -1719,8 +1764,8 @@ static bool api_rpcTNP(pipes_struct *p, struct ncacn_packet *pkt, fstring name; slprintf(name, sizeof(name)-1, "in_%s", get_pipe_name_from_syntax(talloc_tos(), &p->syntax)); - prs_dump_region(name, pkt->u.request.opnum, - p->in_data.data.data, 0, + dump_pdu_region(name, pkt->u.request.opnum, + &p->in_data.data, 0, p->in_data.data.length); } @@ -1775,9 +1820,8 @@ static bool api_rpcTNP(pipes_struct *p, struct ncacn_packet *pkt, fstring name; slprintf(name, sizeof(name)-1, "out_%s", get_pipe_name_from_syntax(talloc_tos(), &p->syntax)); - prs_dump_region(name, pkt->u.request.opnum, - p->out_data.rdata.data, - offset1, + dump_pdu_region(name, pkt->u.request.opnum, + &p->out_data.rdata, offset1, p->out_data.rdata.length); } |