aboutsummaryrefslogtreecommitdiff
path: root/src/vpn/gnunet-helper-vpn-api.c
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-02-02 23:02:52 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-02-02 23:02:52 +0000
commitac0d240e011c27b1d660b6db05d067bf8766db73 (patch)
treea8e3192455ab15ab08b2c38f1d075751795529ff /src/vpn/gnunet-helper-vpn-api.c
parentb13a84b528dc581a6c1a042317f8e9cc3874642e (diff)
downloadgnunet-ac0d240e011c27b1d660b6db05d067bf8766db73.tar.gz
gnunet-ac0d240e011c27b1d660b6db05d067bf8766db73.zip
refactor the interface to the helper a bit to make it easier to use from -exit
Diffstat (limited to 'src/vpn/gnunet-helper-vpn-api.c')
-rw-r--r--src/vpn/gnunet-helper-vpn-api.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/vpn/gnunet-helper-vpn-api.c b/src/vpn/gnunet-helper-vpn-api.c
new file mode 100644
index 000000000..c2ab6081d
--- /dev/null
+++ b/src/vpn/gnunet-helper-vpn-api.c
@@ -0,0 +1,136 @@
1/*
2 This file is part of GNUnet.
3 (C) 2010 Christian Grothoff
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/**
22 * @file vpn/gnunet-helper-vpn-api.c
23 * @brief exposes the API (the convenience-functions) of dealing with the
24 * helper-vpn
25 * @author Philipp Toelke
26 */
27
28#include <platform.h>
29#include <gnunet_common.h>
30#include <gnunet_server_lib.h>
31#include <gnunet_os_lib.h>
32
33#include "gnunet-helper-vpn-api.h"
34
35static void
36stop_helper (struct GNUNET_VPN_HELPER_Handle *handle)
37{
38 if (NULL == handle->helper_proc)
39 return;
40 GNUNET_OS_process_kill (handle->helper_proc, SIGKILL);
41 GNUNET_OS_process_wait (handle->helper_proc);
42 GNUNET_OS_process_close (handle->helper_proc);
43 handle->helper_proc = NULL;
44
45 GNUNET_DISK_pipe_close (handle->helper_in);
46 GNUNET_DISK_pipe_close (handle->helper_out);
47}
48
49/**
50 * Read from the helper-process
51 */
52static void
53helper_read (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tsdkctx)
54{
55 struct GNUNET_VPN_HELPER_Handle *handle = cls;
56 /* no message can be bigger then 64k */
57 char buf[65535];
58
59 if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)
60 return;
61
62 int t = GNUNET_DISK_file_read (handle->fh_from_helper, &buf, 65535);
63
64 /* On read-error, restart the helper */
65 if (t <= 0)
66 {
67 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
68 "Read error for header from vpn-helper: %m\n");
69 stop_helper (handle);
70
71 /* Restart the helper */
72 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
73 handle->restart_task, handle);
74 return;
75 }
76
77 /* FIXME */ GNUNET_SERVER_mst_receive (handle->mst, handle->client, buf, t,
78 0, 0);
79
80 GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
81 handle->fh_from_helper, &helper_read,
82 handle);
83}
84
85void
86cleanup_helper (struct GNUNET_VPN_HELPER_Handle *handle)
87{
88 stop_helper (handle);
89 GNUNET_free (handle);
90}
91
92struct GNUNET_VPN_HELPER_Handle *
93start_helper (const char *ifname,
94 const char *ipv6addr,
95 const char *ipv6prefix,
96 const char *ipv4addr,
97 const char *ipv4mask, const char *process_name,
98 GNUNET_SCHEDULER_Task restart_task,
99 GNUNET_SERVER_MessageTokenizerCallback cb, void *cb_cls,
100 void *client)
101{
102 struct GNUNET_VPN_HELPER_Handle *handle =
103 GNUNET_malloc (sizeof (struct GNUNET_VPN_HELPER_Handle));
104
105 handle->helper_in = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO);
106 handle->helper_out = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_NO, GNUNET_YES);
107
108 handle->restart_task = restart_task;
109
110 if (handle->helper_in == NULL || handle->helper_out == NULL)
111 {
112 GNUNET_free (handle);
113 return NULL;
114 }
115
116 handle->helper_proc =
117 GNUNET_OS_start_process (handle->helper_in, handle->helper_out,
118 "gnunet-helper-vpn", process_name, ifname,
119 ipv6addr, ipv6prefix, ipv4addr, ipv4mask, NULL);
120
121 handle->fh_from_helper =
122 GNUNET_DISK_pipe_handle (handle->helper_out, GNUNET_DISK_PIPE_END_READ);
123 handle->fh_to_helper =
124 GNUNET_DISK_pipe_handle (handle->helper_in, GNUNET_DISK_PIPE_END_WRITE);
125
126 GNUNET_DISK_pipe_close_end (handle->helper_out, GNUNET_DISK_PIPE_END_WRITE);
127 GNUNET_DISK_pipe_close_end (handle->helper_in, GNUNET_DISK_PIPE_END_READ);
128
129 handle->mst = GNUNET_SERVER_mst_create (cb, cb_cls);
130
131 GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
132 handle->fh_from_helper, &helper_read,
133 handle);
134
135 return handle;
136}