#define AF_CUST_SOCKPAIR (AF_MAX + 2)
#define AF_CUST_RHTTP_SRV (AF_MAX + 3)
#define AF_CUST_ABNS (AF_MAX + 4)
-#define AF_CUST_MAX (AF_MAX + 5)
+#define AF_CUST_ABNSZ (AF_MAX + 5)
+#define AF_CUST_MAX (AF_MAX + 6)
/*
* Test in case AF_CUST_MAX overflows the sa_family_t (unsigned int)
extern struct proto_fam proto_fam_unix;
extern struct proto_fam proto_fam_abns;
+extern struct proto_fam proto_fam_abnsz;
int sock_unix_addrcmp(const struct sockaddr_storage *a, const struct sockaddr_storage *b);
int sock_unix_bind_receiver(struct receiver *rx, char **errmsg);
/* WT: ideally we should use real_family(addr->ss_family) here, but we
* have so few custom addresses that it's simple enough to test them all.
*/
- if (addr->ss_family == AF_UNIX || addr->ss_family == AF_CUST_ABNS || addr->ss_family == AF_CUST_SOCKPAIR)
+ if (addr->ss_family == AF_UNIX || addr->ss_family == AF_CUST_ABNS ||
+ addr->ss_family == AF_CUST_ABNSZ || addr->ss_family == AF_CUST_SOCKPAIR)
return 1;
else
return is_inet_addr(addr);
return sizeof(struct sockaddr_in6);
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
return sizeof(struct sockaddr_un);
}
return 0;
if (trash->data)
chunk_appendf(trash, ";");
- if (l->rx.addr.ss_family == AF_UNIX || l->rx.addr.ss_family == AF_CUST_ABNS) {
+ if (l->rx.addr.ss_family == AF_UNIX ||
+ l->rx.addr.ss_family == AF_CUST_ABNS ||
+ l->rx.addr.ss_family == AF_CUST_ABNSZ) {
const struct sockaddr_un *un;
un = (struct sockaddr_un *)&l->rx.addr;
- if (l->rx.addr.ss_family == AF_CUST_ABNS) {
+ if (l->rx.addr.ss_family == AF_CUST_ABNS ||
+ l->rx.addr.ss_family == AF_CUST_ABNSZ) {
chunk_appendf(trash, "abns@%s", un->sun_path+1);
} else {
chunk_appendf(trash, "unix@%s", un->sun_path);
char addr[46];
char port[6];
- if (l->rx.addr.ss_family == AF_UNIX || l->rx.addr.ss_family == AF_CUST_ABNS) {
+ if (l->rx.addr.ss_family == AF_UNIX ||
+ l->rx.addr.ss_family == AF_CUST_ABNS ||
+ l->rx.addr.ss_family == AF_CUST_ABNSZ) {
const struct sockaddr_un *un;
un = (struct sockaddr_un *)&l->rx.addr;
- if (l->rx.addr.ss_family == AF_CUST_ABNS) {
+ if (l->rx.addr.ss_family == AF_CUST_ABNS ||
+ l->rx.addr.ss_family == AF_CUST_ABNSZ) {
chunk_appendf(&trash, "abns@%s ", un->sun_path+1);
} else {
chunk_appendf(&trash, "unix@%s ", un->sun_path);
break;
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
conn_hash_update(hash,
&((struct sockaddr_un *)ss)->sun_path,
sizeof(((struct sockaddr_un *)ss)->sun_path),
check->argv[2] = strdup(buf);
}
else if (listener->rx.addr.ss_family == AF_UNIX ||
- listener->rx.addr.ss_family == AF_CUST_ABNS) {
+ listener->rx.addr.ss_family == AF_CUST_ABNS ||
+ listener->rx.addr.ss_family == AF_CUST_ABNSZ) {
const struct sockaddr_un *un;
un = (struct sockaddr_un *)&listener->rx.addr;
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
/* UNIX socket, only the destination is known */
send_log(fe, LOG_INFO, "Connect to unix:%d (%s/%s)\n",
l->luid,
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
/* UNIX socket, only the destination is known */
chunk_printf(&trash, "%08x:%s.accept(%04x)=%04x from [unix:%d] ALPN=%s\n",
s->uniq_id, fe->id, (unsigned short)l->rx.fd, (unsigned short)conn->handle.fd,
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(&trash, " src=unix:%d", strm_li(peer_s)->luid);
break;
}
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(&trash, " addr=unix:%d", strm_li(peer_s)->luid);
break;
}
.nb_receivers = 0,
};
+/* Note: must not be declared <const> as its list will be overwritten */
+struct protocol proto_abnsz_dgram = {
+ .name = "abnsz_dgram",
+
+ /* connection layer */
+ .xprt_type = PROTO_TYPE_DGRAM,
+ .listen = uxdg_bind_listener,
+ .enable = uxdg_enable_listener,
+ .disable = uxdg_disable_listener,
+ .add = default_add_listener,
+ .unbind = default_unbind_listener,
+ .suspend = default_suspend_listener,
+ .resume = default_resume_listener,
+
+ /* binding layer */
+ .rx_suspend = uxdg_suspend_receiver,
+
+ /* address family */
+ .fam = &proto_fam_abnsz,
+
+ /* socket layer */
+ .proto_type = PROTO_TYPE_DGRAM,
+ .sock_type = SOCK_DGRAM,
+ .sock_prot = 0,
+ .rx_enable = sock_enable,
+ .rx_disable = sock_disable,
+ .rx_unbind = sock_unbind,
+ .receivers = LIST_HEAD_INIT(proto_abnsz_dgram.receivers),
+ .nb_receivers = 0,
+};
+
INITCALL1(STG_REGISTER, protocol_register, &proto_uxdg);
INITCALL1(STG_REGISTER, protocol_register, &proto_abns_dgram);
+INITCALL1(STG_REGISTER, protocol_register, &proto_abnsz_dgram);
/* This function tries to bind dgram unix socket listener. It may return a warning or
* an error message in <errmsg> if the message is at most <errlen> bytes long
.nb_receivers = 0,
};
+/* Note: must not be declared <const> as its list will be overwritten */
+struct protocol proto_abnsz_stream = {
+ .name = "abnsz_stream",
+
+ /* connection layer */
+ .xprt_type = PROTO_TYPE_STREAM,
+ .listen = uxst_bind_listener,
+ .enable = uxst_enable_listener,
+ .disable = uxst_disable_listener,
+ .add = default_add_listener,
+ .unbind = default_unbind_listener,
+ .suspend = default_suspend_listener,
+ .resume = default_resume_listener,
+ .accept_conn = sock_accept_conn,
+ .ctrl_init = sock_conn_ctrl_init,
+ .ctrl_close = sock_conn_ctrl_close,
+ .connect = uxst_connect_server,
+ .drain = sock_drain,
+ .check_events = sock_check_events,
+ .ignore_events = sock_ignore_events,
+
+ /* binding layer */
+ .rx_suspend = uxst_suspend_receiver,
+
+ /* address family */
+ .fam = &proto_fam_abnsz,
+
+ /* socket layer */
+ .proto_type = PROTO_TYPE_STREAM,
+ .sock_type = SOCK_STREAM,
+ .sock_prot = 0,
+ .rx_enable = sock_enable,
+ .rx_disable = sock_disable,
+ .rx_unbind = sock_unbind,
+ .rx_listening = sock_accepting_conn,
+ .default_iocb = sock_accept_iocb,
+
+ .nb_receivers = 0,
+};
+
INITCALL1(STG_REGISTER, protocol_register, &proto_uxst);
INITCALL1(STG_REGISTER, protocol_register, &proto_abns_stream);
+INITCALL1(STG_REGISTER, protocol_register, &proto_abnsz_stream);
/********************************
* 1) low-level socket functions
.get_dst = sock_get_dst,
};
+struct proto_fam proto_fam_abnsz = {
+ .name = "abnsz",
+ .sock_domain = AF_UNIX,
+ .sock_family = AF_CUST_ABNSZ,
+ .real_family = AF_UNIX,
+ .sock_addrlen = sizeof(struct sockaddr_un),
+ .l3_addrlen = sizeof(((struct sockaddr_un*)0)->sun_path),
+ .addrcmp = sock_unix_addrcmp,
+ .bind = sock_unix_bind_receiver,
+ .get_src = sock_get_src,
+ .get_dst = sock_get_dst,
+};
+
/* PLEASE NOTE for functions below:
*
* The address family SHOULD always be checked. In some cases a function will
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
field = mkf_str(FO_CONFIG|FS_SERVICE, "unix");
break;
case -1:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
field = mkf_str(FO_CONFIG|FS_SERVICE, "unix");
break;
case -1:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(buf, " source=unix:%d\n", strm_li(strm)->luid);
break;
default:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(buf, " addr=unix:%d\n", strm_li(strm)->luid);
break;
default:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(buf, " addr=unix\n");
break;
default:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(buf, " addr=unix\n");
break;
default:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
chunk_appendf(&trash,
" src=unix:%d fe=%s be=%s srv=%s",
strm_li(curr_strm)->luid,
str2 += 5;
ss.ss_family = AF_CUST_ABNS;
}
+ else if (strncmp(str2, "abnsz@", 5) == 0) {
+ str2 += 6;
+ ss.ss_family = AF_CUST_ABNSZ;
+ }
else if (strncmp(str2, "ip@", 3) == 0) {
str2 += 3;
ss.ss_family = AF_UNSPEC;
goto out;
}
}
- else if (ss.ss_family == AF_UNIX || ss.ss_family == AF_CUST_ABNS) {
+ else if (ss.ss_family == AF_UNIX || ss.ss_family == AF_CUST_ABNS || ss.ss_family == AF_CUST_ABNSZ) {
struct sockaddr_un *un = (struct sockaddr_un *)&ss;
int prefix_path_len;
int max_path_len;
int adr_len;
int abstract = 0;
- if (ss.ss_family == AF_CUST_ABNS)
+ if (ss.ss_family == AF_CUST_ABNS || ss.ss_family == AF_CUST_ABNSZ)
abstract = 1;
/* complete unix socket path name during startup or soft-restart is
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
path = ((struct sockaddr_un *)addr)->sun_path;
- if (addr->ss_family == AF_CUST_ABNS) {
+ if (addr->ss_family == AF_CUST_ABNS ||
+ addr->ss_family == AF_CUST_ABNSZ) {
const int max_length = sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path) - 1;
return memprintf(&out, "abns@%.*s", max_length, path+1);
} else {
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
memcpy(str, "unix", 5);
return addr->ss_family;
default:
break;
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
memcpy(str, "unix", 5);
return addr->ss_family;
default:
case AF_UNIX:
case AF_CUST_ABNS:
+ case AF_CUST_ABNSZ:
return HA_ANON_STR(scramble, ipstring);
break;