⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcerpc_sock.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	talloc_steal(s->sock, s->socket_ctx);	conn_req = socket_connect_send(s->socket_ctx, NULL, s->server, 0, 				       resolve_context, 				       c->event_ctx);	composite_continue(c, conn_req, continue_socket_connect, c);	return c;}static NTSTATUS dcerpc_pipe_open_socket_recv(struct composite_context *c){	NTSTATUS status = composite_wait(c);	talloc_free(c);	return status;}struct pipe_tcp_state {	const char *server;	const char *target_hostname;	const char *address;	uint32_t port;	struct socket_address *srvaddr;	struct resolve_context *resolve_ctx;	struct dcerpc_connection *conn;};#if 0 /* disabled till we can resolve names to ipv6 addresses */static void continue_ipv6_open_socket(struct composite_context *ctx);#endifstatic void continue_ipv4_open_socket(struct composite_context *ctx);static void continue_ip_resolve_name(struct composite_context *ctx);static void continue_ip_resolve_name(struct composite_context *ctx){	struct composite_context *c = talloc_get_type(ctx->async.private_data,						      struct composite_context);	struct pipe_tcp_state *s = talloc_get_type(c->private_data,						   struct pipe_tcp_state);	struct composite_context *sock_ipv4_req;	c->status = resolve_name_recv(ctx, s, &s->address);	if (!composite_is_ok(c)) return;	/* prepare server address using host ip:port and transport name */	s->srvaddr = socket_address_from_strings(s->conn, "ipv4", s->address, s->port);	if (composite_nomem(s->srvaddr, c)) return;	/* resolve_nbt_name gives only ipv4 ... - send socket open request */	sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn,						     s->resolve_ctx,						     s->srvaddr, s->target_hostname,						     NCACN_IP_TCP);	composite_continue(c, sock_ipv4_req, continue_ipv4_open_socket, c);}/*  Stage 2 of dcerpc_pipe_open_tcp_send: receive result of pipe open request  on IPv6 and send the request on IPv4 unless IPv6 transport succeeded.*/#if 0 /* disabled till we can resolve names to ipv6 addresses */static void continue_ipv6_open_socket(struct composite_context *ctx){	struct composite_context *c = talloc_get_type(ctx->async.private_data,						      struct composite_context);	struct pipe_tcp_state *s = talloc_get_type(c->private_data,						   struct pipe_tcp_state);	struct composite_context *sock_ipv4_req;	/* receive result of socket open request */	c->status = dcerpc_pipe_open_socket_recv(ctx);	if (NT_STATUS_IS_OK(c->status)) {		composite_done(c);		return;	}	talloc_free(s->srvaddr);	/* prepare server address using host:ip and transport name */	s->srvaddr = socket_address_from_strings(s->conn, "ipv4", s->address, s->port);	if (composite_nomem(s->srvaddr, c)) return;	/* try IPv4 if IPv6 fails */	sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn, 						     s->srvaddr, s->target_hostname, 						     NCACN_IP_TCP);	composite_continue(c, sock_ipv4_req, continue_ipv4_open_socket, c);}#endif/*  Stage 2 of dcerpc_pipe_open_tcp_send: receive result of pipe open request  on IPv4 transport.*/static void continue_ipv4_open_socket(struct composite_context *ctx){	struct composite_context *c = talloc_get_type(ctx->async.private_data,						      struct composite_context);	struct pipe_tcp_state *s = talloc_get_type(c->private_data,						   struct pipe_tcp_state);		/* receive result socket open request */	c->status = dcerpc_pipe_open_socket_recv(ctx);	if (!NT_STATUS_IS_OK(c->status)) {		/* something went wrong... */		DEBUG(0, ("Failed to connect host %s (%s) on port %d - %s.\n",			  s->address, s->target_hostname, 			  s->port, nt_errstr(c->status)));		composite_error(c, c->status);		return;	}	composite_done(c);}/*  Send rpc pipe open request to given host:port using  tcp/ip transport*/struct composite_context* dcerpc_pipe_open_tcp_send(struct dcerpc_connection *conn,						    const char *server,						    const char *target_hostname,						    uint32_t port,						    struct resolve_context *resolve_ctx){	struct composite_context *c;	struct pipe_tcp_state *s;	struct composite_context *resolve_req;	struct nbt_name name;	/* composite context allocation and setup */	c = composite_create(conn, conn->event_ctx);	if (c == NULL) return NULL;	s = talloc_zero(c, struct pipe_tcp_state);	if (composite_nomem(s, c)) return c;	c->private_data = s;	/* store input parameters in state structure */	s->server          = talloc_strdup(c, server);	if (composite_nomem(s->server, c)) return c;	if (target_hostname) {		s->target_hostname = talloc_strdup(c, target_hostname);		if (composite_nomem(s->target_hostname, c)) return c;	}	s->port            = port;	s->conn            = conn;	s->resolve_ctx     = resolve_ctx;	make_nbt_name_server(&name, server);	resolve_req = resolve_name_send(resolve_ctx, &name, c->event_ctx);	composite_continue(c, resolve_req, continue_ip_resolve_name, c);	return c;}/*  Receive result of pipe open request on tcp/ip*/NTSTATUS dcerpc_pipe_open_tcp_recv(struct composite_context *c){	NTSTATUS status;	status = composite_wait(c);	talloc_free(c);	return status;}struct pipe_unix_state {	const char *path;	struct socket_address *srvaddr;	struct dcerpc_connection *conn;};/*  Stage 2 of dcerpc_pipe_open_unix_stream_send: receive result of pipe open  request on unix socket.*/static void continue_unix_open_socket(struct composite_context *ctx){	struct composite_context *c = talloc_get_type(ctx->async.private_data,						      struct composite_context);	c->status = dcerpc_pipe_open_socket_recv(ctx);	if (NT_STATUS_IS_OK(c->status)) {		composite_done(c);		return;	}	composite_error(c, c->status);}/*  Send pipe open request on unix socket*/struct composite_context *dcerpc_pipe_open_unix_stream_send(struct dcerpc_connection *conn,							    const char *path){	struct composite_context *c;	struct composite_context *sock_unix_req;	struct pipe_unix_state *s;	/* composite context allocation and setup */	c = composite_create(conn, conn->event_ctx);	if (c == NULL) return NULL;	s = talloc_zero(c, struct pipe_unix_state);	if (composite_nomem(s, c)) return c;	c->private_data = s;	/* store parameters in state structure */	s->path = talloc_strdup(c, path);	if (composite_nomem(s->path, c)) return c;	s->conn = conn;	/* prepare server address using socket path and transport name */	s->srvaddr = socket_address_from_strings(conn, "unix", s->path, 0);	if (composite_nomem(s->srvaddr, c)) return c;	/* send socket open request */	sock_unix_req = dcerpc_pipe_open_socket_send(c, s->conn, 						     NULL,						     s->srvaddr, NULL,						     NCALRPC);	composite_continue(c, sock_unix_req, continue_unix_open_socket, c);	return c;}/*  Receive result of pipe open request on unix socket*/NTSTATUS dcerpc_pipe_open_unix_stream_recv(struct composite_context *c){	NTSTATUS status = composite_wait(c);	talloc_free(c);	return status;}struct pipe_np_state {	char *full_path;	struct socket_address *srvaddr;	struct dcerpc_connection *conn;};/*  Stage 2 of dcerpc_pipe_open_pipe_send: receive socket open request*/static void continue_np_open_socket(struct composite_context *ctx){	struct composite_context *c = talloc_get_type(ctx->async.private_data,						      struct composite_context);	c->status = dcerpc_pipe_open_socket_recv(ctx);	if (!composite_is_ok(c)) return;	composite_done(c);}/*  Send pipe open request on ncalrpc*/struct composite_context* dcerpc_pipe_open_pipe_send(struct dcerpc_connection *conn,						     const char *ncalrpc_dir,						     const char *identifier){	char *canon = NULL;	struct composite_context *c;	struct composite_context *sock_np_req;	struct pipe_np_state *s;	/* composite context allocation and setup */	c = composite_create(conn, conn->event_ctx);	if (c == NULL) return NULL;	s = talloc_zero(c, struct pipe_np_state);	if (composite_nomem(s, c)) return c;	c->private_data = s;	/* store parameters in state structure */	canon = talloc_strdup(s, identifier);	if (composite_nomem(canon, c)) return c;	s->conn = conn;	string_replace(canon, '/', '\\');	s->full_path = talloc_asprintf(canon, "%s/%s", ncalrpc_dir, canon);	if (composite_nomem(s->full_path, c)) return c;	/* prepare server address using path and transport name */	s->srvaddr = socket_address_from_strings(conn, "unix", s->full_path, 0);	if (composite_nomem(s->srvaddr, c)) return c;	/* send socket open request */	sock_np_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL, s->srvaddr, NULL, NCALRPC);	composite_continue(c, sock_np_req, continue_np_open_socket, c);	return c;}/*  Receive result of pipe open request on ncalrpc*/NTSTATUS dcerpc_pipe_open_pipe_recv(struct composite_context *c){	NTSTATUS status = composite_wait(c);		talloc_free(c);	return status;}/*  Open a rpc pipe on a named pipe - sync version*/NTSTATUS dcerpc_pipe_open_pipe(struct dcerpc_connection *conn, const char *ncalrpc_dir, const char *identifier){	struct composite_context *c = dcerpc_pipe_open_pipe_send(conn, ncalrpc_dir, identifier);	return dcerpc_pipe_open_pipe_recv(c);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -