return 0;
}
+static int
+dns_client_send_request(struct dns_client *client, const char *cmd,
+ const char **error_r)
+{
+ int ret;
+
+ if (client->fd == -1) {
+ if (dns_client_connect(client, error_r) < 0)
+ return -1;
+ ret = -1;
+ } else {
+ /* already connected. if write() fails, retry connecting */
+ ret = 0;
+ }
+
+ if (write_full(client->fd, cmd, strlen(cmd)) < 0) {
+ *error_r = t_strdup_printf("write(%s) failed: %m", client->path);
+ return ret;
+ }
+ return 1;
+}
+
static int
dns_client_lookup_common(struct dns_client *client,
const char *cmd, bool ptr_lookup,
{
struct dns_lookup *lookup;
struct dns_lookup_result result;
+ int ret;
memset(&result, 0, sizeof(result));
result.ret = EAI_FAIL;
- if (dns_client_connect(client, &result.error) < 0) {
- callback(&result, context);
- return -1;
- }
- if (write_full(client->fd, cmd, strlen(cmd)) < 0) {
- result.error = t_strdup_printf("write(%s) failed: %m",
- client->path);
- dns_client_disconnect(client, result.error);
- callback(&result, context);
- return -1;
+ if ((ret = dns_client_send_request(client, cmd, &result.error)) <= 0) {
+ if (ret == 0) {
+ /* retry once */
+ ret = dns_client_send_request(client, cmd, &result.error);
+ }
+ if (ret <= 0) {
+ callback(&result, context);
+ return -1;
+ }
}
lookup = i_new(struct dns_lookup, 1);