bool finish_client_login(PgSocket *client) _MUSTCHECK;
PgSocket * accept_client(int sock, const struct sockaddr_in *addr, bool is_unix) _MUSTCHECK;
-void disconnect_server(PgSocket *server, bool notify, const char *reason);
-void disconnect_client(PgSocket *client, bool notify, const char *reason);
+void disconnect_server(PgSocket *server, bool notify, const char *reason, ...) _PRINTF(3, 4);
+void disconnect_client(PgSocket *client, bool notify, const char *reason, ...) _PRINTF(3, 4);
PgDatabase * add_database(const char *name) _MUSTCHECK;
PgDatabase *register_auto_database(const char *name);
statlist_for_each_safe(item, sk_list, tmp) {
server = container_of(item, PgSocket, head);
- disconnect_server(server, true, reason);
+ disconnect_server(server, true, "%s", reason);
}
}
statlist_for_each_safe(item, sk_list, tmp) {
client = container_of(item, PgSocket, head);
- disconnect_client(client, true, reason);
+ disconnect_client(client, true, "%s", reason);
}
}
}
/* drop server connection */
-void disconnect_server(PgSocket *server, bool notify, const char *reason)
+void disconnect_server(PgSocket *server, bool notify, const char *reason, ...)
{
PgPool *pool = server->pool;
PgSocket *client = server->link;
static const uint8_t pkt_term[] = {'X', 0,0,0,4};
int send_term = 1;
usec_t now = get_cached_time();
+ char buf[128];
+ va_list ap;
+
+ va_start(ap, reason);
+ vsnprintf(buf, sizeof(buf), reason, ap);
+ va_end(ap);
+ reason = buf;
if (cf_log_disconnections)
slog_info(server, "closing because: %s (age=%llu)", reason,
if (client) {
client->link = NULL;
server->link = NULL;
- disconnect_client(client, true, reason);
+ disconnect_client(client, true, "%s", reason);
}
break;
case SV_TESTED:
}
/* drop client connection */
-void disconnect_client(PgSocket *client, bool notify, const char *reason)
+void disconnect_client(PgSocket *client, bool notify, const char *reason, ...)
{
+ char buf[128];
+ va_list ap;
usec_t now = get_cached_time();
+ va_start(ap, reason);
+ vsnprintf(buf, sizeof(buf), reason, ap);
+ va_end(ap);
+ reason = buf;
+
if (cf_log_disconnections)
slog_info(client, "closing because: %s (age=%llu)", reason,
(now - client->connect_time) / USEC);
/* notify readiness */
SEND_ReadyForQuery(res, main_client);
if (!res)
- disconnect_client(main_client, true,
- "ReadyForQuery for main_client failed");
+ disconnect_client(main_client, true, "ReadyForQuery for main_client failed");
return;
}
if (!client->wait_for_welcome)
continue;
- disconnect_client(client, true, msg);
+ disconnect_client(client, true, "%s", msg);
}
}
if (state == 'I')
ready = 1;
else if (cf_pool_mode == POOL_STMT) {
- disconnect_server(server, true,
- "Long transactions not allowed");
+ disconnect_server(server, true, "Long transactions not allowed");
return false;
}
break;