mechanism.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "precompiled.hpp"
4 #include <string.h>
5 #include <limits.h>
6 
7 #include "mechanism.hpp"
8 #include "options.hpp"
9 #include "msg.hpp"
10 #include "err.hpp"
11 #include "wire.hpp"
12 #include "session_base.hpp"
13 
15 {
16 }
17 
19 {
20 }
21 
22 void zmq::mechanism_t::set_peer_routing_id (const void *id_ptr_,
23  size_t id_size_)
24 {
25  _routing_id.set (static_cast<const unsigned char *> (id_ptr_), id_size_);
26 }
27 
29 {
30  const int rc = msg_->init_size (_routing_id.size ());
31  errno_assert (rc == 0);
32  memcpy (msg_->data (), _routing_id.data (), _routing_id.size ());
34 }
35 
36 void zmq::mechanism_t::set_user_id (const void *user_id_, size_t size_)
37 {
38  _user_id.set (static_cast<const unsigned char *> (user_id_), size_);
39  _zap_properties.ZMQ_MAP_INSERT_OR_EMPLACE (
41  std::string (reinterpret_cast<const char *> (user_id_), size_));
42 }
43 
45 {
46  return _user_id;
47 }
48 
49 const char socket_type_pair[] = "PAIR";
50 const char socket_type_pub[] = "PUB";
51 const char socket_type_sub[] = "SUB";
52 const char socket_type_req[] = "REQ";
53 const char socket_type_rep[] = "REP";
54 const char socket_type_dealer[] = "DEALER";
55 const char socket_type_router[] = "ROUTER";
56 const char socket_type_pull[] = "PULL";
57 const char socket_type_push[] = "PUSH";
58 const char socket_type_xpub[] = "XPUB";
59 const char socket_type_xsub[] = "XSUB";
60 const char socket_type_stream[] = "STREAM";
61 #ifdef ZMQ_BUILD_DRAFT_API
62 const char socket_type_server[] = "SERVER";
63 const char socket_type_client[] = "CLIENT";
64 const char socket_type_radio[] = "RADIO";
65 const char socket_type_dish[] = "DISH";
66 const char socket_type_gather[] = "GATHER";
67 const char socket_type_scatter[] = "SCATTER";
68 const char socket_type_dgram[] = "DGRAM";
69 const char socket_type_peer[] = "PEER";
70 const char socket_type_channel[] = "CHANNEL";
71 #endif
72 
73 const char *zmq::mechanism_t::socket_type_string (int socket_type_)
74 {
75  // TODO the order must of the names must correspond to the values resp. order of ZMQ_* socket type definitions in zmq.h!
76  static const char *names[] = {socket_type_pair, socket_type_pub,
82 #ifdef ZMQ_BUILD_DRAFT_API
83  socket_type_server, socket_type_client,
84  socket_type_radio, socket_type_dish,
85  socket_type_gather, socket_type_scatter,
86  socket_type_dgram, socket_type_peer,
87  socket_type_channel
88 #endif
89  };
90  static const size_t names_count = sizeof (names) / sizeof (names[0]);
91  zmq_assert (socket_type_ >= 0
92  && socket_type_ < static_cast<int> (names_count));
93  return names[socket_type_];
94 }
95 
96 const size_t name_len_size = sizeof (unsigned char);
97 const size_t value_len_size = sizeof (uint32_t);
98 
99 static size_t property_len (size_t name_len_, size_t value_len_)
100 {
101  return name_len_size + name_len_ + value_len_size + value_len_;
102 }
103 
104 static size_t name_len (const char *name_)
105 {
106  const size_t name_len = strlen (name_);
107  zmq_assert (name_len <= UCHAR_MAX);
108  return name_len;
109 }
110 
111 size_t zmq::mechanism_t::add_property (unsigned char *ptr_,
112  size_t ptr_capacity_,
113  const char *name_,
114  const void *value_,
115  size_t value_len_)
116 {
117  const size_t name_len = ::name_len (name_);
118  const size_t total_len = ::property_len (name_len, value_len_);
119  zmq_assert (total_len <= ptr_capacity_);
120 
121  *ptr_ = static_cast<unsigned char> (name_len);
122  ptr_ += name_len_size;
123  memcpy (ptr_, name_, name_len);
124  ptr_ += name_len;
125  zmq_assert (value_len_ <= 0x7FFFFFFF);
126  put_uint32 (ptr_, static_cast<uint32_t> (value_len_));
127  ptr_ += value_len_size;
128  memcpy (ptr_, value_, value_len_);
129 
130  return total_len;
131 }
132 
133 size_t zmq::mechanism_t::property_len (const char *name_, size_t value_len_)
134 {
135  return ::property_len (name_len (name_), value_len_);
136 }
137 
138 #define ZMTP_PROPERTY_SOCKET_TYPE "Socket-Type"
139 #define ZMTP_PROPERTY_IDENTITY "Identity"
140 
141 size_t zmq::mechanism_t::add_basic_properties (unsigned char *ptr_,
142  size_t ptr_capacity_) const
143 {
144  unsigned char *ptr = ptr_;
145 
146  // Add socket type property
147  const char *socket_type = socket_type_string (options.type);
148  ptr += add_property (ptr, ptr_capacity_, ZMTP_PROPERTY_SOCKET_TYPE,
149  socket_type, strlen (socket_type));
150 
151  // Add identity (aka routing id) property
152  if (options.type == ZMQ_REQ || options.type == ZMQ_DEALER
153  || options.type == ZMQ_ROUTER) {
154  ptr += add_property (ptr, ptr_capacity_ - (ptr - ptr_),
155  ZMTP_PROPERTY_IDENTITY, options.routing_id,
156  options.routing_id_size);
157  }
158 
159 
160  for (std::map<std::string, std::string>::const_iterator
161  it = options.app_metadata.begin (),
162  end = options.app_metadata.end ();
163  it != end; ++it) {
164  ptr +=
165  add_property (ptr, ptr_capacity_ - (ptr - ptr_), it->first.c_str (),
166  it->second.c_str (), strlen (it->second.c_str ()));
167  }
168 
169  return ptr - ptr_;
170 }
171 
173 {
174  const char *socket_type = socket_type_string (options.type);
175  size_t meta_len = 0;
176 
177  for (std::map<std::string, std::string>::const_iterator
178  it = options.app_metadata.begin (),
179  end = options.app_metadata.end ();
180  it != end; ++it) {
181  meta_len +=
182  property_len (it->first.c_str (), strlen (it->second.c_str ()));
183  }
184 
186  + meta_len
187  + ((options.type == ZMQ_REQ || options.type == ZMQ_DEALER
188  || options.type == ZMQ_ROUTER)
189  ? property_len (ZMTP_PROPERTY_IDENTITY, options.routing_id_size)
190  : 0);
191 }
192 
194  msg_t *msg_, const char *prefix_, size_t prefix_len_) const
195 {
196  const size_t command_size = prefix_len_ + basic_properties_len ();
197  const int rc = msg_->init_size (command_size);
198  errno_assert (rc == 0);
199 
200  unsigned char *ptr = static_cast<unsigned char *> (msg_->data ());
201 
202  // Add prefix
203  memcpy (ptr, prefix_, prefix_len_);
204  ptr += prefix_len_;
205 
206  add_basic_properties (
207  ptr, command_size - (ptr - static_cast<unsigned char *> (msg_->data ())));
208 }
209 
210 int zmq::mechanism_t::parse_metadata (const unsigned char *ptr_,
211  size_t length_,
212  bool zap_flag_)
213 {
214  size_t bytes_left = length_;
215 
216  while (bytes_left > 1) {
217  const size_t name_length = static_cast<size_t> (*ptr_);
218  ptr_ += name_len_size;
219  bytes_left -= name_len_size;
220  if (bytes_left < name_length)
221  break;
222 
223  const std::string name =
224  std::string (reinterpret_cast<const char *> (ptr_), name_length);
225  ptr_ += name_length;
226  bytes_left -= name_length;
227  if (bytes_left < value_len_size)
228  break;
229 
230  const size_t value_length = static_cast<size_t> (get_uint32 (ptr_));
231  ptr_ += value_len_size;
232  bytes_left -= value_len_size;
233  if (bytes_left < value_length)
234  break;
235 
236  const uint8_t *value = ptr_;
237  ptr_ += value_length;
238  bytes_left -= value_length;
239 
240  if (name == ZMTP_PROPERTY_IDENTITY && options.recv_routing_id)
241  set_peer_routing_id (value, value_length);
242  else if (name == ZMTP_PROPERTY_SOCKET_TYPE) {
243  if (!check_socket_type (reinterpret_cast<const char *> (value),
244  value_length)) {
245  errno = EINVAL;
246  return -1;
247  }
248  } else {
249  const int rc = property (name, value, value_length);
250  if (rc == -1)
251  return -1;
252  }
253  (zap_flag_ ? _zap_properties : _zmtp_properties)
255  name,
256  std::string (reinterpret_cast<const char *> (value), value_length));
257  }
258  if (bytes_left > 0) {
259  errno = EPROTO;
260  return -1;
261  }
262  return 0;
263 }
264 
265 int zmq::mechanism_t::property (const std::string & /* name_ */,
266  const void * /* value_ */,
267  size_t /* length_ */)
268 {
269  // Default implementation does not check
270  // property values and returns 0 to signal success.
271  return 0;
272 }
273 
274 template <size_t N>
275 static bool strequals (const char *actual_type_,
276  const size_t actual_len_,
277  const char (&expected_type_)[N])
278 {
279  return actual_len_ == N - 1
280  && memcmp (actual_type_, expected_type_, N - 1) == 0;
281 }
282 
283 bool zmq::mechanism_t::check_socket_type (const char *type_,
284  const size_t len_) const
285 {
286  switch (options.type) {
287  case ZMQ_REQ:
288  return strequals (type_, len_, socket_type_rep)
289  || strequals (type_, len_, socket_type_router);
290  case ZMQ_REP:
291  return strequals (type_, len_, socket_type_req)
292  || strequals (type_, len_, socket_type_dealer);
293  case ZMQ_DEALER:
294  return strequals (type_, len_, socket_type_rep)
295  || strequals (type_, len_, socket_type_dealer)
296  || strequals (type_, len_, socket_type_router);
297  case ZMQ_ROUTER:
298  return strequals (type_, len_, socket_type_req)
299  || strequals (type_, len_, socket_type_dealer)
300  || strequals (type_, len_, socket_type_router);
301  case ZMQ_PUSH:
302  return strequals (type_, len_, socket_type_pull);
303  case ZMQ_PULL:
304  return strequals (type_, len_, socket_type_push);
305  case ZMQ_PUB:
306  return strequals (type_, len_, socket_type_sub)
307  || strequals (type_, len_, socket_type_xsub);
308  case ZMQ_SUB:
309  return strequals (type_, len_, socket_type_pub)
310  || strequals (type_, len_, socket_type_xpub);
311  case ZMQ_XPUB:
312  return strequals (type_, len_, socket_type_sub)
313  || strequals (type_, len_, socket_type_xsub);
314  case ZMQ_XSUB:
315  return strequals (type_, len_, socket_type_pub)
316  || strequals (type_, len_, socket_type_xpub);
317  case ZMQ_PAIR:
318  return strequals (type_, len_, socket_type_pair);
319 #ifdef ZMQ_BUILD_DRAFT_API
320  case ZMQ_SERVER:
321  return strequals (type_, len_, socket_type_client);
322  case ZMQ_CLIENT:
323  return strequals (type_, len_, socket_type_server);
324  case ZMQ_RADIO:
325  return strequals (type_, len_, socket_type_dish);
326  case ZMQ_DISH:
327  return strequals (type_, len_, socket_type_radio);
328  case ZMQ_GATHER:
329  return strequals (type_, len_, socket_type_scatter);
330  case ZMQ_SCATTER:
331  return strequals (type_, len_, socket_type_gather);
332  case ZMQ_DGRAM:
333  return strequals (type_, len_, socket_type_dgram);
334  case ZMQ_PEER:
335  return strequals (type_, len_, socket_type_peer);
336  case ZMQ_CHANNEL:
337  return strequals (type_, len_, socket_type_channel);
338 #endif
339  default:
340  break;
341  }
342  return false;
343 }
zmq::mechanism_t::mechanism_t
mechanism_t(const options_t &options_)
Definition: mechanism.cpp:14
mechanism.hpp
name
GLuint const GLchar * name
Definition: glcorearb.h:3055
zmq::mechanism_t::make_command_with_basic_properties
void make_command_with_basic_properties(msg_t *msg_, const char *prefix_, size_t prefix_len_) const
Definition: mechanism.cpp:193
ZMQ_SERVER
#define ZMQ_SERVER
Definition: zmq_draft.h:14
zmq::mechanism_t::set_peer_routing_id
void set_peer_routing_id(const void *id_ptr_, size_t id_size_)
Definition: mechanism.cpp:22
end
GLuint GLuint end
Definition: glcorearb.h:2858
ZMQ_GATHER
#define ZMQ_GATHER
Definition: zmq_draft.h:18
zmq::options_t
Definition: options.hpp:34
ZMQ_XPUB
#define ZMQ_XPUB
Definition: zmq.h:267
zmq::put_uint32
void put_uint32(unsigned char *buffer_, uint32_t value_)
Definition: wire.hpp:35
ZMQ_PUB
#define ZMQ_PUB
Definition: zmq.h:259
options
Message * options
Definition: src/google/protobuf/descriptor.cc:3119
EINVAL
#define EINVAL
Definition: errno.hpp:25
property_len
static size_t property_len(size_t name_len_, size_t value_len_)
Definition: mechanism.cpp:99
ZMQ_CLIENT
#define ZMQ_CLIENT
Definition: zmq_draft.h:15
ZMQ_RADIO
#define ZMQ_RADIO
Definition: zmq_draft.h:16
zmq::mechanism_t::property_len
static size_t property_len(const char *name_, size_t value_len_)
Definition: mechanism.cpp:133
precompiled.hpp
zmq_assert
#define zmq_assert(x)
Definition: err.hpp:102
socket_type_xpub
const char socket_type_xpub[]
Definition: mechanism.cpp:58
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
errno
int errno
strequals
static bool strequals(const char *actual_type_, const size_t actual_len_, const char(&expected_type_)[N])
Definition: mechanism.cpp:275
ZMQ_XSUB
#define ZMQ_XSUB
Definition: zmq.h:268
socket_type_push
const char socket_type_push[]
Definition: mechanism.cpp:57
ZMQ_SUB
#define ZMQ_SUB
Definition: zmq.h:260
socket_type_pull
const char socket_type_pull[]
Definition: mechanism.cpp:56
ZMQ_REQ
#define ZMQ_REQ
Definition: zmq.h:261
ZMQ_MSG_PROPERTY_USER_ID
#define ZMQ_MSG_PROPERTY_USER_ID
Definition: zmq_draft.h:97
zmq::msg_t::init_size
int init_size(size_t size_)
Definition: msg.cpp:62
wire.hpp
zmq::mechanism_t::parse_metadata
int parse_metadata(const unsigned char *ptr_, size_t length_, bool zap_flag_=false)
Definition: mechanism.cpp:210
zmq::mechanism_t::get_user_id
const blob_t & get_user_id() const
Definition: mechanism.cpp:44
EPROTO
#define EPROTO
Definition: err.hpp:26
ZMQ_DEALER
#define ZMQ_DEALER
Definition: zmq.h:263
errno_assert
#define errno_assert(x)
Definition: err.hpp:113
ZMQ_MAP_INSERT_OR_EMPLACE
#define ZMQ_MAP_INSERT_OR_EMPLACE(k, v)
Definition: blob.hpp:29
socket_type_rep
const char socket_type_rep[]
Definition: mechanism.cpp:53
ZMQ_CHANNEL
#define ZMQ_CHANNEL
Definition: zmq_draft.h:22
socket_type_req
const char socket_type_req[]
Definition: mechanism.cpp:52
ZMQ_PUSH
#define ZMQ_PUSH
Definition: zmq.h:266
ZMQ_ROUTER
#define ZMQ_ROUTER
Definition: zmq.h:264
socket_type_sub
const char socket_type_sub[]
Definition: mechanism.cpp:51
zmq::mechanism_t::check_socket_type
bool check_socket_type(const char *type_, size_t len_) const
Definition: mechanism.cpp:283
ZMQ_REP
#define ZMQ_REP
Definition: zmq.h:262
zmq::mechanism_t::add_property
static size_t add_property(unsigned char *ptr_, size_t ptr_capacity_, const char *name_, const void *value_, size_t value_len_)
Definition: mechanism.cpp:111
zmq::mechanism_t::add_basic_properties
size_t add_basic_properties(unsigned char *ptr_, size_t ptr_capacity_) const
Definition: mechanism.cpp:141
socket_type_xsub
const char socket_type_xsub[]
Definition: mechanism.cpp:59
zmq::mechanism_t::basic_properties_len
size_t basic_properties_len() const
Definition: mechanism.cpp:172
name_
string name_
Definition: googletest.cc:182
ZMQ_PEER
#define ZMQ_PEER
Definition: zmq_draft.h:21
socket_type_router
const char socket_type_router[]
Definition: mechanism.cpp:55
zmq::blob_t
Definition: blob.hpp:46
msg.hpp
value_
int value_
Definition: gmock-matchers_test.cc:571
socket_type
int socket_type
zmq::msg_t::routing_id
uint32_t routing_id
Definition: msg.hpp:233
zmq::mechanism_t::~mechanism_t
virtual ~mechanism_t()
Definition: mechanism.cpp:18
ZMQ_DGRAM
#define ZMQ_DGRAM
Definition: zmq_draft.h:20
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
value_len_size
const size_t value_len_size
Definition: mechanism.cpp:97
ZMQ_SCATTER
#define ZMQ_SCATTER
Definition: zmq_draft.h:19
ZMQ_DISH
#define ZMQ_DISH
Definition: zmq_draft.h:17
options.hpp
socket_type_pub
const char socket_type_pub[]
Definition: mechanism.cpp:50
name_len
static size_t name_len(const char *name_)
Definition: mechanism.cpp:104
err.hpp
socket_type_stream
const char socket_type_stream[]
Definition: mechanism.cpp:60
zmq::mechanism_t::socket_type_string
static const char * socket_type_string(int socket_type_)
Definition: mechanism.cpp:73
socket_type_dealer
const char socket_type_dealer[]
Definition: mechanism.cpp:54
ZMTP_PROPERTY_IDENTITY
#define ZMTP_PROPERTY_IDENTITY
Definition: mechanism.cpp:139
ZMTP_PROPERTY_SOCKET_TYPE
#define ZMTP_PROPERTY_SOCKET_TYPE
Definition: mechanism.cpp:138
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
socket_type_pair
const char socket_type_pair[]
Definition: mechanism.cpp:49
ZMQ_PULL
#define ZMQ_PULL
Definition: zmq.h:265
session_base.hpp
zmq::msg_t::data
unsigned char data[max_vsm_size]
Definition: msg.hpp:239
name_len_size
const size_t name_len_size
Definition: mechanism.cpp:96
zmq::mechanism_t::peer_routing_id
void peer_routing_id(msg_t *msg_)
Definition: mechanism.cpp:28
zmq::msg_t::set_flags
void set_flags(unsigned char flags_)
Definition: msg.cpp:433
zmq::mechanism_t::set_user_id
void set_user_id(const void *user_id_, size_t size_)
Definition: mechanism.cpp:36
it
MapIter it
Definition: php/ext/google/protobuf/map.c:205
zmq::mechanism_t::property
virtual int property(const std::string &name_, const void *value_, size_t length_)
Definition: mechanism.cpp:265
zmq::msg_t
Definition: msg.hpp:33
zmq::get_uint32
uint32_t get_uint32(const unsigned char *buffer_)
Definition: wire.hpp:43
options_
DebugStringOptions options_
Definition: src/google/protobuf/descriptor.cc:2410
prefix_
std::string prefix_
Definition: src/google/protobuf/descriptor.cc:378


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:56