and I edited it to also get duped by ares_dup().
Changelog for the c-ares project
+* Dec 4 2008 (Daniel Stenberg)
+
+ Gregor Jasny provided the patch that introduces ares_set_socket_callback(),
+ and I edited it to also get duped by ares_dup().
+
* Dec 3 2008 (Daniel Stenberg)
API changes:
-This is what's new and changed in the c-ares 1.5.4 release:
+This is what's new and changed in the c-ares 1.6.0 release:
+
+Changed:
+
+ o Added support for the glibc "rotate" resolv.conf option (or ARES_OPT_ROTATE)
+ o Added ares_gethostbyname_file()
+ o Added ares_dup()
+ o Added ares_set_socket_callback()
+
+Fixed:
o improved configure detection of several functions
o improved source code portability
o adig supports a regular numerical dotted IP address for the -s option
o handling of EINPROGRESS for UDP connects
- o supports the glibc "rotate" resolv.conf option (or ARES_OPT_ROTATE)
- o added the new function ares_gethostbyname_file()
- o bugfix in ares_parse_ptr_reply() which would cause a buffer to shrink
- instead of expand if a reply contained 8 or more records
+ o ares_parse_ptr_reply()would cause a buffer to shrink instead of expand if a
+ reply contained 8 or more records
o buildconf works on OS X
Thanks go to these friendly people for their efforts and contributions:
- Yang Tse, Charles Hardin, Carlo Contavalli, Brad Spencer, Gerald Combs
- and obviously Daniel Stenberg
+ Yang Tse, Charles Hardin, Carlo Contavalli, Brad Spencer, Gerald Combs,
+ Gregor Jasny
Have fun!
struct hostent *hostent);
typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts,
char *node, char *service);
+typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd,
+ int type, void *data);
int ares_init(ares_channel *channelptr);
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
int ares_dup(ares_channel *dest, ares_channel src);
void ares_destroy(ares_channel channel);
void ares_cancel(ares_channel channel);
+void ares_set_socket_callback(ares_channel channel,
+ ares_sock_create_callback callback,
+ void *user_data);
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
ares_callback callback, void *arg);
void ares_query(ares_channel channel, const char *name, int dnsclass,
channel->servers = NULL;
channel->sock_state_cb = NULL;
channel->sock_state_cb_data = NULL;
+ channel->sock_create_cb = NULL;
+ channel->sock_create_cb_data = NULL;
channel->last_server = 0;
channel->last_timeout_processed = (time_t)now.tv_sec;
return rc;
/* Now clone the options that ares_save_options() doesn't support. */
+ (*dest)->sock_create_cb = src->sock_create_cb;
+ (*dest)->sock_create_cb_data = src->sock_create_cb_data;
- /* No such options available yet */
return ARES_SUCCESS; /* everything went fine */
ares__rc4(key, (unsigned char *)&r, sizeof(r));
return r;
}
+
+void ares_set_socket_callback(ares_channel channel,
+ ares_sock_create_callback cb,
+ void *data)
+{
+ channel->sock_create_cb = cb;
+ channel->sock_create_cb_data = data;
+}
ares_sock_state_cb sock_state_cb;
void *sock_state_cb_data;
+
+ ares_sock_create_callback sock_create_cb;
+ void *sock_create_cb_data;
};
/* return true if now is exactly check time or later */
}
}
+ if (channel->sock_create_cb)
+ {
+ int err = channel->sock_create_cb(s, SOCK_STREAM,
+ channel->sock_create_cb_data);
+ if (err < 0)
+ {
+ closesocket(s);
+ return err;
+ }
+ }
+
SOCK_STATE_CALLBACK(channel, s, 1, 0);
server->tcp_buffer_pos = 0;
server->tcp_socket = s;
}
}
+ if (channel->sock_create_cb)
+ {
+ int err = channel->sock_create_cb(s, SOCK_DGRAM,
+ channel->sock_create_cb_data);
+ if (err < 0)
+ {
+ closesocket(s);
+ return err;
+ }
+ }
+
SOCK_STATE_CALLBACK(channel, s, 1, 0);
server->udp_socket = s;