Commit 3d5e517e authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

rpcrt4: Add support for the ncacn_ip_tcp transport layer.

parent 5bfb579f
...@@ -22,11 +22,29 @@ ...@@ -22,11 +22,29 @@
* *
*/ */
#include "config.h"
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#ifdef HAVE_SYS_TYPES
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
#include "winnls.h" #include "winnls.h"
...@@ -45,6 +63,8 @@ ...@@ -45,6 +63,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(rpc); WINE_DEFAULT_DEBUG_CHANNEL(rpc);
/**** ncacn_np support ****/
typedef struct _RpcConnection_np typedef struct _RpcConnection_np
{ {
RpcConnection common; RpcConnection common;
...@@ -180,7 +200,7 @@ static RPC_STATUS rpcrt4_conn_np_handoff(RpcConnection *old_conn, RpcConnection ...@@ -180,7 +200,7 @@ static RPC_STATUS rpcrt4_conn_np_handoff(RpcConnection *old_conn, RpcConnection
RpcConnection_np *new_npc = (RpcConnection_np *) new_conn; RpcConnection_np *new_npc = (RpcConnection_np *) new_conn;
/* because of the way named pipes work, we'll transfer the connected pipe /* because of the way named pipes work, we'll transfer the connected pipe
* to the child, then reopen the server binding to continue listening */ * to the child, then reopen the server binding to continue listening */
new_npc->pipe = old_npc->pipe; new_npc->pipe = old_npc->pipe;
new_npc->ovl = old_npc->ovl; new_npc->ovl = old_npc->ovl;
old_npc->pipe = 0; old_npc->pipe = 0;
...@@ -224,9 +244,12 @@ static int rpcrt4_conn_np_close(RpcConnection *Connection) ...@@ -224,9 +244,12 @@ static int rpcrt4_conn_np_close(RpcConnection *Connection)
return 0; return 0;
} }
/**** ncacn_ip_tcp support ****/
typedef struct _RpcConnection_tcp typedef struct _RpcConnection_tcp
{ {
RpcConnection common; RpcConnection common;
int sock;
} RpcConnection_tcp; } RpcConnection_tcp;
static RpcConnection *rpcrt4_conn_tcp_alloc(void) static RpcConnection *rpcrt4_conn_tcp_alloc(void)
...@@ -236,35 +259,86 @@ static RpcConnection *rpcrt4_conn_tcp_alloc(void) ...@@ -236,35 +259,86 @@ static RpcConnection *rpcrt4_conn_tcp_alloc(void)
static RPC_STATUS rpcrt4_ncacn_ip_tcp_open(RpcConnection* Connection) static RPC_STATUS rpcrt4_ncacn_ip_tcp_open(RpcConnection* Connection)
{ {
FIXME("(%s, %s) unimplemented\n", Connection->NetworkAddr, Connection->Endpoint); RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
struct sockaddr_in sa;
int sock;
TRACE("(%s, %s)\n", Connection->NetworkAddr, Connection->Endpoint);
if (Connection->server)
{
ERR("ncacn_ip_tcp servers not supported yet\n");
return RPC_S_SERVER_UNAVAILABLE;
}
if (tcpc->sock)
return RPC_S_OK;
sa.sin_family = AF_INET;
inet_pton(AF_INET, Connection->NetworkAddr, &sa.sin_addr);
sa.sin_port = htons(atoi(Connection->Endpoint));
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0)
{
ERR("socket() failed\n");
goto error;
}
if (0>connect(sock, (struct sockaddr*) &sa, sizeof (sa)))
{
ERR("connect() failed\n");
goto error;
}
tcpc->sock = sock;
return RPC_S_OK;
error:
close(sock);
return RPC_S_SERVER_UNAVAILABLE; return RPC_S_SERVER_UNAVAILABLE;
} }
static HANDLE rpcrt4_conn_tcp_get_wait_handle(RpcConnection *Connection) static HANDLE rpcrt4_conn_tcp_get_wait_handle(RpcConnection *Connection)
{ {
return NULL; assert(0);
return 0;
} }
static RPC_STATUS rpcrt4_conn_tcp_handoff(RpcConnection *old_conn, RpcConnection *new_conn) static RPC_STATUS rpcrt4_conn_tcp_handoff(RpcConnection *old_conn, RpcConnection *new_conn)
{ {
assert(0);
return RPC_S_SERVER_UNAVAILABLE; return RPC_S_SERVER_UNAVAILABLE;
} }
static int rpcrt4_conn_tcp_read(RpcConnection *Connection, static int rpcrt4_conn_tcp_read(RpcConnection *Connection,
void *buffer, unsigned int count) void *buffer, unsigned int count)
{ {
return -1; RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
int r = read(tcpc->sock, buffer, count);
TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, r);
return r;
} }
static int rpcrt4_conn_tcp_write(RpcConnection *Connection, static int rpcrt4_conn_tcp_write(RpcConnection *Connection,
const void *buffer, unsigned int count) const void *buffer, unsigned int count)
{ {
return -1; RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
int r = write(tcpc->sock, buffer, count);
TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, r);
return r;
} }
static int rpcrt4_conn_tcp_close(RpcConnection *Connection) static int rpcrt4_conn_tcp_close(RpcConnection *Connection)
{ {
return -1; RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
TRACE("%d\n", tcpc->sock);
if (tcpc->sock)
close(tcpc->sock);
tcpc->sock = 0;
return 0;
} }
struct protseq_ops protseq_list[] = { struct protseq_ops protseq_list[] = {
...@@ -308,6 +382,8 @@ static struct protseq_ops *rpcrt4_get_protseq_ops(const char *protseq) ...@@ -308,6 +382,8 @@ static struct protseq_ops *rpcrt4_get_protseq_ops(const char *protseq)
return NULL; return NULL;
} }
/**** interface to rest of code ****/
RPC_STATUS RPCRT4_OpenConnection(RpcConnection* Connection) RPC_STATUS RPCRT4_OpenConnection(RpcConnection* Connection)
{ {
TRACE("(Connection == ^%p)\n", Connection); TRACE("(Connection == ^%p)\n", Connection);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment