ctdb-scripts: Move connection tracking to 10.interface
[samba4-gss.git] / source4 / lib / messaging / messaging_send.c
blob24cdce3c90a40922efc342b427e71ccc60c41451
1 /*
2 Unix SMB/CIFS implementation.
4 Samba internal messaging functions (send).
6 Copyright (C) Andrew Tridgell 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "includes.h"
23 #include "messaging/messaging.h"
24 #include "messaging/irpc.h"
25 #include "lib/messaging/messages_dgm.h"
26 #include "lib/messaging/messages_dgm_ref.h"
27 #include "../source3/lib/messages_util.h"
28 #include "messaging/messaging_internal.h"
29 #include "lib/util/server_id_db.h"
30 #include "cluster/cluster.h"
31 #include "../lib/util/unix_privs.h"
34 * This file is for functions that can be called from auth_log without
35 * depending on all of dcerpc and so cause dep loops.
39 return a list of server ids for a server name
41 NTSTATUS irpc_servers_byname(struct imessaging_context *msg_ctx,
42 TALLOC_CTX *mem_ctx, const char *name,
43 unsigned *num_servers,
44 struct server_id **servers)
46 int ret;
48 ret = server_id_db_lookup(msg_ctx->names, name, mem_ctx,
49 num_servers, servers);
50 if (ret != 0) {
51 return map_nt_error_from_unix_common(ret);
53 return NT_STATUS_OK;
57 Send a message to a particular server
59 NTSTATUS imessaging_send(struct imessaging_context *msg, struct server_id server,
60 uint32_t msg_type, const DATA_BLOB *data)
62 uint8_t hdr[MESSAGE_HDR_LENGTH];
63 struct iovec iov[2];
64 int num_iov, ret;
65 pid_t pid;
66 void *priv;
68 if (!cluster_node_equal(&msg->server_id, &server)) {
69 /* No cluster in source4... */
70 return NT_STATUS_OK;
73 message_hdr_put(hdr, msg_type, msg->server_id, server);
75 iov[0] = (struct iovec) { .iov_base = &hdr, .iov_len = sizeof(hdr) };
76 num_iov = 1;
78 if (data != NULL) {
79 iov[1] = (struct iovec) { .iov_base = data->data,
80 .iov_len = data->length };
81 num_iov += 1;
84 pid = server.pid;
85 if (pid == 0) {
86 pid = getpid();
89 ret = messaging_dgm_send(pid, iov, num_iov, NULL, 0);
91 if (ret == EACCES) {
92 priv = root_privileges();
93 ret = messaging_dgm_send(pid, iov, num_iov, NULL, 0);
94 TALLOC_FREE(priv);
97 if (ret != 0) {
98 return map_nt_error_from_unix_common(ret);
100 return NT_STATUS_OK;
104 Send a message to a particular server, with the message containing a single pointer
106 NTSTATUS imessaging_send_ptr(struct imessaging_context *msg, struct server_id server,
107 uint32_t msg_type, void *ptr)
109 DATA_BLOB blob;
111 blob.data = (uint8_t *)&ptr;
112 blob.length = sizeof(void *);
114 return imessaging_send(msg, server, msg_type, &blob);