Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : Samba internal messaging functions (send).
5 :
6 : Copyright (C) Andrew Tridgell 2004
7 :
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.
12 :
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.
17 :
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/>.
20 : */
21 :
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"
32 :
33 : /*
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.
36 : */
37 :
38 : /*
39 : return a list of server ids for a server name
40 : */
41 735077 : 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)
45 : {
46 18257 : int ret;
47 :
48 735077 : ret = server_id_db_lookup(msg_ctx->names, name, mem_ctx,
49 : num_servers, servers);
50 735077 : if (ret != 0) {
51 723319 : return map_nt_error_from_unix_common(ret);
52 : }
53 11758 : return NT_STATUS_OK;
54 : }
55 :
56 : /*
57 : Send a message to a particular server
58 : */
59 90269 : NTSTATUS imessaging_send(struct imessaging_context *msg, struct server_id server,
60 : uint32_t msg_type, const DATA_BLOB *data)
61 : {
62 67346 : uint8_t hdr[MESSAGE_HDR_LENGTH];
63 67346 : struct iovec iov[2];
64 67346 : int num_iov, ret;
65 67346 : pid_t pid;
66 67346 : void *priv;
67 :
68 90269 : if (!cluster_node_equal(&msg->server_id, &server)) {
69 : /* No cluster in source4... */
70 0 : return NT_STATUS_OK;
71 : }
72 :
73 90269 : message_hdr_put(hdr, msg_type, msg->server_id, server);
74 :
75 90269 : iov[0] = (struct iovec) { .iov_base = &hdr, .iov_len = sizeof(hdr) };
76 90269 : num_iov = 1;
77 :
78 90269 : if (data != NULL) {
79 80943 : iov[1] = (struct iovec) { .iov_base = data->data,
80 80943 : .iov_len = data->length };
81 80943 : num_iov += 1;
82 : }
83 :
84 90269 : pid = server.pid;
85 90269 : if (pid == 0) {
86 65326 : pid = getpid();
87 : }
88 :
89 90269 : ret = messaging_dgm_send(pid, iov, num_iov, NULL, 0);
90 :
91 90269 : if (ret == EACCES) {
92 0 : priv = root_privileges();
93 0 : ret = messaging_dgm_send(pid, iov, num_iov, NULL, 0);
94 0 : TALLOC_FREE(priv);
95 : }
96 :
97 90269 : if (ret != 0) {
98 22 : return map_nt_error_from_unix_common(ret);
99 : }
100 90247 : return NT_STATUS_OK;
101 : }
102 :
103 : /*
104 : Send a message to a particular server, with the message containing a single pointer
105 : */
106 144 : NTSTATUS imessaging_send_ptr(struct imessaging_context *msg, struct server_id server,
107 : uint32_t msg_type, void *ptr)
108 : {
109 0 : DATA_BLOB blob;
110 :
111 144 : blob.data = (uint8_t *)&ptr;
112 144 : blob.length = sizeof(void *);
113 :
114 144 : return imessaging_send(msg, server, msg_type, &blob);
115 : }
|