Coverage Report

Created: 2026-02-14 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/source4/lib/messaging/messaging_send.c
Line
Count
Source
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
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
0
{
46
0
  int ret;
47
48
0
  ret = server_id_db_lookup(msg_ctx->names, name, mem_ctx,
49
0
          num_servers, servers);
50
0
  if (ret != 0) {
51
0
    return map_nt_error_from_unix_common(ret);
52
0
  }
53
0
  return NT_STATUS_OK;
54
0
}
55
56
/*
57
  Send a message to a particular server
58
*/
59
NTSTATUS imessaging_send(struct imessaging_context *msg, struct server_id server,
60
      uint32_t msg_type, const DATA_BLOB *data)
61
0
{
62
0
  uint8_t hdr[MESSAGE_HDR_LENGTH];
63
0
  struct iovec iov[2];
64
0
  int num_iov, ret;
65
0
  pid_t pid;
66
0
  void *priv;
67
68
0
  if (!cluster_node_equal(&msg->server_id, &server)) {
69
    /* No cluster in source4... */
70
0
    return NT_STATUS_OK;
71
0
  }
72
73
0
  message_hdr_put(hdr, msg_type, msg->server_id, server);
74
75
0
  iov[0] = (struct iovec) { .iov_base = &hdr, .iov_len = sizeof(hdr) };
76
0
  num_iov = 1;
77
78
0
  if (data != NULL) {
79
0
    iov[1] = (struct iovec) { .iov_base = data->data,
80
0
            .iov_len = data->length };
81
0
    num_iov += 1;
82
0
  }
83
84
0
  pid = server.pid;
85
0
  if (pid == 0) {
86
0
    pid = getpid();
87
0
  }
88
89
0
  ret = messaging_dgm_send(pid, iov, num_iov, NULL, 0);
90
91
0
  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
0
  }
96
97
0
  if (ret != 0) {
98
0
    return map_nt_error_from_unix_common(ret);
99
0
  }
100
0
  return NT_STATUS_OK;
101
0
}
102
103
/*
104
  Send a message to a particular server, with the message containing a single pointer
105
*/
106
NTSTATUS imessaging_send_ptr(struct imessaging_context *msg, struct server_id server,
107
          uint32_t msg_type, void *ptr)
108
0
{
109
0
  DATA_BLOB blob;
110
111
0
  blob.data = (uint8_t *)&ptr;
112
0
  blob.length = sizeof(void *);
113
114
0
  return imessaging_send(msg, server, msg_type, &blob);
115
0
}