settings++;
}
while (*settings != NULL) {
- if (strcmp(*settings, "ssl") == 0) {
+ const char *sname, *svalue;
+
+ svalue = strchr(*settings, '=');
+ if (svalue != NULL) {
+ sname = t_strdup_until(*settings,
+ svalue++);
+ } else {
+ sname = *settings;
+ svalue = "";
+ }
+ if (strcmp(sname, "ssl") == 0) {
l->ssl = TRUE;
have_ssl_sockets = TRUE;
- } else if (strcmp(*settings, "haproxy") == 0) {
+ } else if (strcmp(sname, "haproxy") == 0) {
l->haproxy = TRUE;
+ } else if (strcmp(sname, "type") == 0) {
+ i_free(l->type);
+ l->type = i_strdup_empty(svalue);
}
settings++;
}
service->listeners[i].name : "";
}
+const char *
+master_service_get_socket_type(struct master_service *service, int listen_fd)
+{
+ unsigned int i;
+
+ i_assert(listen_fd >= MASTER_LISTEN_FD_FIRST);
+
+ i = listen_fd - MASTER_LISTEN_FD_FIRST;
+ i_assert(i < service->socket_count);
+ return service->listeners[i].type != NULL ?
+ service->listeners[i].type : "";
+}
+
void master_service_set_avail_overflow_callback(struct master_service *service,
master_service_avail_overflow_callback_t *callback)
{
{
unsigned int i;
- for (i = 0; i < service->socket_count; i++)
+ for (i = 0; i < service->socket_count; i++) {
i_free(service->listeners[i].name);
+ i_free(service->listeners[i].type);
+ }
i_free(service->listeners);
i_free(service->getopt_str);
i_free(service->configured_name);
}
conn.ssl = l->ssl;
conn.name = conn_name;
+ conn.type = (l->type != NULL ? l->type : "");
(void)net_getsockname(conn.fd, &conn.local_ip, &conn.local_port);
conn.real_remote_ip = conn.remote_ip;
int listen_fd;
/* listener name as in configuration file, or "" if unnamed. */
const char *name;
+ /* listener type as in configuration file, or "" if no type is
+ specified */
+ const char *type;
/* Original client/server IP/port. Both of these may have been changed
by the haproxy protocol. */
/* Returns the name of the listener socket, or "" if none is specified. */
const char *master_service_get_socket_name(struct master_service *service,
int listen_fd);
+/* Returns the type of the listener socket, or "" if none is specified. */
+const char *
+master_service_get_socket_type(struct master_service *service, int listen_fd);
/* Returns configuration file path. */
const char *master_service_get_config_path(struct master_service *service);
str_append(listener_settings, "\tssl");
if (listeners[i]->set.inetset.set->haproxy)
str_append(listener_settings, "\thaproxy");
+ if (listeners[i]->set.inetset.set->type != NULL &&
+ *listeners[i]->set.inetset.set->type != '\0') {
+ str_append(listener_settings, "\ttype=");
+ str_append_tabescaped(
+ listener_settings,
+ listeners[i]->set.inetset.set->type);
+ }
+ }
+ if (listeners[i]->type == SERVICE_LISTENER_FIFO ||
+ listeners[i]->type == SERVICE_LISTENER_UNIX) {
+ if (listeners[i]->set.fileset.set->type != NULL &&
+ *listeners[i]->set.fileset.set->type != '\0') {
+ str_append(listener_settings, "\ttype=");
+ str_append_tabescaped(
+ listener_settings,
+ listeners[i]->set.fileset.set->type);
+ }
}
dup2_append(&dups, listeners[i]->fd, fd++);