aboutsummaryrefslogtreecommitdiff
path: root/ares/ares_cancel.c
diff options
context:
space:
mode:
Diffstat (limited to 'ares/ares_cancel.c')
-rw-r--r--ares/ares_cancel.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/ares/ares_cancel.c b/ares/ares_cancel.c
new file mode 100644
index 000000000..b127ed112
--- /dev/null
+++ b/ares/ares_cancel.c
@@ -0,0 +1,44 @@
+/* Copyright 1998 by the Massachusetts Institute of Technology.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * M.I.T. makes no representations about the suitability of
+ * this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ */
+
+#include <stdlib.h>
+#include "ares.h"
+#include "ares_private.h"
+
+/*
+ * ares_cancel() cancels a ongoing request/resolve that might be going on on
+ * the given channel. It does NOT kill the channel, use ares_destroy() for
+ * that.
+ */
+void ares_cancel(ares_channel channel)
+{
+ struct query *query, *next;
+ int i;
+
+ for (query = channel->queries; query; query = next)
+ {
+ next = query->next;
+ query->callback(query->arg, ARES_ETIMEOUT, NULL, 0);
+ free(query->tcpbuf);
+ free(query->skip_server);
+ free(query);
+ }
+ channel->queries = NULL;
+ if (!(channel->flags & ARES_FLAG_STAYOPEN))
+ {
+ for (i = 0; i < channel->nservers; i++)
+ ares__close_sockets(&channel->servers[i]);
+ }
+}