1173
This is used to canonicalize a ctdb_sock_addr structure.
1175
static void smbd_ctdb_canonicalize_ip(const struct sockaddr_storage *in,
1176
struct sockaddr_storage *out)
1178
memcpy(out, in, sizeof (*out));
1181
if (in->ss_family == AF_INET6) {
1182
const char prefix[12] = { 0,0,0,0,0,0,0,0,0,0,0xff,0xff };
1183
const struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)in;
1184
struct sockaddr_in *out4 = (struct sockaddr_in *)out;
1185
if (memcmp(&in6->sin6_addr, prefix, 12) == 0) {
1186
memset(out, 0, sizeof(*out));
1187
#ifdef HAVE_SOCK_SIN_LEN
1188
out4->sin_len = sizeof(*out);
1190
out4->sin_family = AF_INET;
1191
out4->sin_port = in6->sin6_port;
1192
memcpy(&out4->sin_addr, &in6->sin6_addr.s6_addr32[3], 4);
1173
1199
* Register us as a server for a particular tcp connection
1176
1202
NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
1177
const struct sockaddr_storage *server,
1178
const struct sockaddr_storage *client,
1203
const struct sockaddr_storage *_server,
1204
const struct sockaddr_storage *_client,
1179
1205
void (*release_ip_handler)(const char *ip_addr,
1180
1206
void *private_data),
1181
1207
void *private_data)
1183
struct sockaddr *sock = (struct sockaddr *)client;
1185
1210
* we still use ctdb_control_tcp for ipv4
1186
1211
* because we want to work against older ctdb
1187
1212
* versions at runtime
1189
1214
struct ctdb_control_tcp p4;
1215
#ifdef HAVE_STRUCT_CTDB_CONTROL_TCP_ADDR
1191
1216
struct ctdb_control_tcp_addr p;
1194
1219
NTSTATUS status;
1220
struct sockaddr_storage client;
1221
struct sockaddr_storage server;
1197
1224
* Only one connection so far
1199
1226
SMB_ASSERT(conn->release_ip_handler == NULL);
1201
switch (sock->sa_family) {
1228
smbd_ctdb_canonicalize_ip(_client, &client);
1229
smbd_ctdb_canonicalize_ip(_server, &server);
1231
switch (client.ss_family) {
1203
p4.dest = *(struct sockaddr_in *)server;
1204
p4.src = *(struct sockaddr_in *)client;
1233
p4.dest = *(struct sockaddr_in *)&server;
1234
p4.src = *(struct sockaddr_in *)&client;
1205
1235
data.dptr = (uint8_t *)&p4;
1206
1236
data.dsize = sizeof(p4);
1238
#ifdef HAVE_STRUCT_CTDB_CONTROL_TCP_ADDR
1210
p.dest.ip6 = *(struct sockaddr_in6 *)server;
1211
p.src.ip6 = *(struct sockaddr_in6 *)client;
1240
p.dest.ip6 = *(struct sockaddr_in6 *)&server;
1241
p.src.ip6 = *(struct sockaddr_in6 *)&client;
1212
1242
data.dptr = (uint8_t *)&p;
1213
1243
data.dsize = sizeof(p);