tipc_address.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "precompiled.hpp"
4 
5 #include "tipc_address.hpp"
6 
7 #if defined ZMQ_HAVE_TIPC
8 
9 #include "err.hpp"
10 
11 #include <string>
12 #include <sstream>
13 
14 zmq::tipc_address_t::tipc_address_t ()
15 {
16  memset (&address, 0, sizeof address);
17  _random = false;
18 }
19 
20 zmq::tipc_address_t::tipc_address_t (const sockaddr *sa_, socklen_t sa_len_)
21 {
22  zmq_assert (sa_ && sa_len_ > 0);
23 
24  memset (&address, 0, sizeof address);
25  if (sa_->sa_family == AF_TIPC)
26  memcpy (&address, sa_, sa_len_);
27 
28  _random = false;
29 }
30 
31 void zmq::tipc_address_t::set_random ()
32 {
33  _random = true;
34 }
35 bool zmq::tipc_address_t::is_random () const
36 {
37  return _random;
38 }
39 bool zmq::tipc_address_t::is_service () const
40 {
41  if (address.addrtype == TIPC_ADDR_ID)
42  return false;
43 
44  return true;
45 }
46 int zmq::tipc_address_t::resolve (const char *name_)
47 {
48  unsigned int type = 0;
49  unsigned int lower = 0;
50  unsigned int upper = 0;
51  unsigned int ref = 0;
52  unsigned int z = 1, c = 0, n = 0;
53  char eof;
54  const char *domain;
55  int res;
56 
57 
58  if (strncmp (name_, "<*>", 3) == 0) {
59  set_random ();
60  address.family = AF_TIPC;
61  address.addrtype = TIPC_ADDR_ID;
62  address.addr.id.node = 0;
63  address.addr.id.ref = 0;
64  address.scope = 0;
65  return 0;
66  }
67 
68  res = sscanf (name_, "{%u,%u,%u}", &type, &lower, &upper);
69  /* Fetch optional domain suffix. */
70  if ((domain = strchr (name_, '@'))) {
71  if (sscanf (domain, "@%u.%u.%u%c", &z, &c, &n, &eof) != 3)
72  return EINVAL;
73  }
74  if (res == 3) {
75  if (type < TIPC_RESERVED_TYPES || upper < lower)
76  return EINVAL;
77  address.family = AF_TIPC;
78  address.addrtype = TIPC_ADDR_NAMESEQ;
79  address.addr.nameseq.type = type;
80  address.addr.nameseq.lower = lower;
81  address.addr.nameseq.upper = upper;
82  address.scope = TIPC_ZONE_SCOPE;
83  return 0;
84  }
85  if (res == 2 && type > TIPC_RESERVED_TYPES) {
86  address.family = AF_TIPC;
87  address.addrtype = TIPC_ADDR_NAME;
88  address.addr.name.name.type = type;
89  address.addr.name.name.instance = lower;
90  address.addr.name.domain = tipc_addr (z, c, n);
91  address.scope = 0;
92  return 0;
93  } else if (res == 0) {
94  res = sscanf (name_, "<%u.%u.%u:%u>", &z, &c, &n, &ref);
95  if (res == 4) {
96  address.family = AF_TIPC;
97  address.addrtype = TIPC_ADDR_ID;
98  address.addr.id.node = tipc_addr (z, c, n);
99  address.addr.id.ref = ref;
100  address.scope = 0;
101  return 0;
102  }
103  }
104  return EINVAL;
105 }
106 
107 int zmq::tipc_address_t::to_string (std::string &addr_) const
108 {
109  if (address.family != AF_TIPC) {
110  addr_.clear ();
111  return -1;
112  }
113  std::stringstream s;
114  if (address.addrtype == TIPC_ADDR_NAMESEQ
115  || address.addrtype == TIPC_ADDR_NAME) {
116  s << "tipc://"
117  << "{" << address.addr.nameseq.type;
118  s << ", " << address.addr.nameseq.lower;
119  s << ", " << address.addr.nameseq.upper << "}";
120  addr_ = s.str ();
121  } else if (address.addrtype == TIPC_ADDR_ID || is_random ()) {
122  s << "tipc://"
123  << "<" << tipc_zone (address.addr.id.node);
124  s << "." << tipc_cluster (address.addr.id.node);
125  s << "." << tipc_node (address.addr.id.node);
126  s << ":" << address.addr.id.ref << ">";
127  addr_ = s.str ();
128  } else {
129  addr_.clear ();
130  return -1;
131  }
132  return 0;
133 }
134 
135 const sockaddr *zmq::tipc_address_t::addr () const
136 {
137  return (sockaddr *) &address;
138 }
139 
140 socklen_t zmq::tipc_address_t::addrlen () const
141 {
142  return static_cast<socklen_t> (sizeof address);
143 }
144 
145 #endif
domain
const char domain[]
Definition: test_security_plain.cpp:74
EINVAL
#define EINVAL
Definition: errno.hpp:25
s
XmlRpcServer s
precompiled.hpp
zmq_assert
#define zmq_assert(x)
Definition: err.hpp:102
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
address
const char * address
Definition: builds/zos/test_fork.cpp:6
name_
string name_
Definition: googletest.cc:182
n
GLdouble n
Definition: glcorearb.h:4153
type
GLenum type
Definition: glcorearb.h:2695
z
GLdouble GLdouble GLdouble z
Definition: glcorearb.h:3117
err.hpp
tipc_address.hpp
ref
GLint ref
Definition: glcorearb.h:2789


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:00