summary refs log tree commit diff stats
path: root/plugins/dns/thread.c
diff options
context:
space:
mode:
authorberkeviktor@aol.com <berkeviktor@aol.com>2010-04-02 07:29:16 +0200
committerberkeviktor@aol.com <berkeviktor@aol.com>2010-04-02 07:29:16 +0200
commitc7ec88c88adb4f15b154ad125977d9c2c4ae4956 (patch)
tree09b886a96255b141e59747b3d3b375b576b2cdc5 /plugins/dns/thread.c
parent876a185af371a92d73725a25ccda3a41fdaebd37 (diff)
move additions to own repo, so that patch contains only modifications
Diffstat (limited to 'plugins/dns/thread.c')
-rw-r--r--plugins/dns/thread.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/plugins/dns/thread.c b/plugins/dns/thread.c
new file mode 100644
index 00000000..aa153137
--- /dev/null
+++ b/plugins/dns/thread.c
@@ -0,0 +1,111 @@
+#include <stdlib.h>
+
+#define USE_PTHREAD
+
+#ifdef WIN32
+
+#include <windows.h>
+#define pthread_t DWORD
+#define pipe(a) _pipe(a,4096,_O_BINARY)
+
+#else
+#ifdef USE_PTHREAD
+
+#include <pthread.h>
+
+#else
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#define pthread_t int
+
+#endif
+#endif
+
+
+typedef struct
+{
+	pthread_t threadid;
+	int pipe_fd[2];
+	void *userdata;
+} thread;
+
+thread *
+thread_new (void)
+{
+	thread *th;
+
+	th = calloc (1, sizeof (*th));
+	if (!th)
+		return NULL;
+
+	if (pipe (th->pipe_fd) == -1)
+	{
+		free (th);
+		return NULL;
+	}
+
+#ifdef __EMX__ /* os/2 */
+	setmode (pipe_fd[0], O_BINARY);
+	setmode (pipe_fd[1], O_BINARY);
+#endif
+
+	return th;
+}
+
+int
+thread_start (thread *th, void *(*start_routine)(void *), void *arg)
+{
+	pthread_t id;
+
+#ifdef WIN32
+	CloseHandle (CreateThread (NULL, 0,
+										(LPTHREAD_START_ROUTINE)start_routine,
+										arg, 0, (DWORD *)&id));
+#else
+#ifdef USE_PTHREAD
+	if (pthread_create (&id, NULL, start_routine, arg) != 0)
+		return 0;
+#else
+	switch (id = fork ())
+	{
+	case -1:
+		return 0;
+	case 0:
+		/* this is the child */
+		setuid (getuid ());
+		start_routine (arg);
+		_exit (0);
+	}
+#endif
+#endif
+
+	th->threadid = id;
+
+	return 1;
+}
+
+/*void
+thread_kill (thread *th)
+{
+#ifdef WIN32
+	PostThreadMessage (th->threadid, WM_QUIT, 0, 0);
+#else
+#ifdef USE_PTHREAD
+	pthread_cancel (th->threadid);
+	pthread_join (th->threadid, (void *)&th);
+#else
+	kill (th->threadid, SIGKILL);
+	waitpid (th->threadid, NULL, 0);
+#endif
+#endif
+}
+
+void
+thread_free (thread *th)
+{
+	close (th->pipe_fd[0]);
+	close (th->pipe_fd[1]);
+	free (th);
+}*/