diff options
-rw-r--r-- | libcli/named_pipe_auth/npa_tstream.c | 57 | ||||
-rw-r--r-- | libcli/named_pipe_auth/npa_tstream.h | 10 |
2 files changed, 67 insertions, 0 deletions
diff --git a/libcli/named_pipe_auth/npa_tstream.c b/libcli/named_pipe_auth/npa_tstream.c index c2eb7bf714..2728e0478a 100644 --- a/libcli/named_pipe_auth/npa_tstream.c +++ b/libcli/named_pipe_auth/npa_tstream.c @@ -1442,3 +1442,60 @@ int _tstream_npa_accept_existing_recv(struct tevent_req *req, tevent_req_received(req); return 0; } + + +/* SOCKETPAIR for internal rpc communication */ + +/* file_type is FILE_TYPE_BYTE_MODE_PIPE or FILE_TYPE_MESSAGE_MODE_PIPE */ +int _tstream_npa_socketpair(uint16_t file_type, + TALLOC_CTX *mem_ctx1, + struct tstream_context **pstream1, + TALLOC_CTX *mem_ctx2, + struct tstream_context **pstream2, + const char *location) +{ + struct tstream_context *stream1 = NULL; + struct tstream_context *stream2 = NULL; + int fds[2]; + int fd1; + int fd2; + int rc; + + rc = socketpair(AF_UNIX, SOCK_STREAM, 0, fds); + if (rc == -1) { + return -1; + } + fd1 = fds[0]; + fd2 = fds[1]; + + rc = _tstream_npa_existing_socket(mem_ctx1, + fd1, + file_type, + &stream1, + location); + if (rc == -1) { + int sys_errno = errno; + close(fd1); + close(fd2); + errno = sys_errno; + return -1; + } + + rc = _tstream_npa_existing_socket(mem_ctx2, + fd2, + file_type, + &stream2, + location); + if (rc == -1) { + int sys_errno = errno; + talloc_free(stream1); + close(fd2); + errno = sys_errno; + return -1; + } + + *pstream1 = stream1; + *pstream2 = stream2; + + return 0; +} diff --git a/libcli/named_pipe_auth/npa_tstream.h b/libcli/named_pipe_auth/npa_tstream.h index 1d85de7d91..e7a1ac76d4 100644 --- a/libcli/named_pipe_auth/npa_tstream.h +++ b/libcli/named_pipe_auth/npa_tstream.h @@ -117,4 +117,14 @@ int _tstream_npa_accept_existing_recv(struct tevent_req *req, session_info, \ __location__) +int _tstream_npa_socketpair(uint16_t file_type, + TALLOC_CTX *mem_ctx1, + struct tstream_context **pstream1, + TALLOC_CTX *mem_ctx2, + struct tstream_context **pstream2, + const char *location); +#define tstream_npa_socketpair(ft, mem1, stream1, mem2, stream2) \ + _tstream_npa_socketpair(ft, mem1, stream1, mem2, stream2, \ + __location__) + #endif /* NPA_TSTREAM_H */ |