ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/util.C
(Generate patch)

Comparing gvpe/src/util.C (file contents):
Revision 1.1 by pcg, Sat Mar 1 15:53:03 2003 UTC vs.
Revision 1.7 by pcg, Mon Apr 7 01:12:56 2003 UTC

1/* 1/*
2 util.C -- process management and other utility functions 2 util.C -- process management and other utility functions
3 3
4 Most of these are taken from tinc, see the AUTHORS file. 4 Some of these are taken from tinc, see the AUTHORS file.
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
24#include <cstring> 24#include <cstring>
25 25
26#include <errno.h> 26#include <errno.h>
27#include <signal.h> 27#include <signal.h>
28#include <sys/types.h> 28#include <sys/types.h>
29#include <sys/wait.h>
29#include <unistd.h> 30#include <unistd.h>
30#include <time.h> 31#include <time.h>
31#include <sys/socket.h> 32#include <sys/socket.h>
32#include <netinet/in.h> 33#include <netinet/in.h>
33#include <arpa/inet.h> 34#include <arpa/inet.h>
34 35
36
35#include <sys/mman.h> 37#include <sys/mman.h>
36
37#include <openssl/rand.h>
38#include <openssl/rsa.h>
39#include <openssl/pem.h>
40#include <openssl/evp.h>
41 38
42#include "gettext.h" 39#include "gettext.h"
43#include "pidfile.h" 40#include "pidfile.h"
44#include "dropin.h" 41#include "dropin.h"
45 42
46#include "global.h" 43#include "global.h"
47#include "conf.h" 44#include "conf.h"
45#include "util.h"
48#include "slog.h" 46#include "slog.h"
49#include "protocol.h"
50
51time_t now;
52 47
53int 48int
54write_pidfile (void) 49write_pidfile (void)
55{ 50{
56 int pid; 51 int pid;
142 137
143 if (!confbase) 138 if (!confbase)
144 asprintf (&confbase, "%s/vpe", CONFDIR); 139 asprintf (&confbase, "%s/vpe", CONFDIR);
145} 140}
146 141
147void pkt_queue::put (tap_packet *p) 142void run_script (const run_script_cb &cb, bool wait)
148{ 143{
149 if (queue[i]) 144 int pid;
150 { 145
151 delete queue[i]; 146 if ((pid = fork ()) == 0)
152 j = (j + 1) % QUEUEDEPTH;
153 } 147 {
154 148 char *filename;
155 queue[i] = p; 149 asprintf (&filename, "%s/%s", confbase, cb());
156 150 execl (filename, filename, (char *) 0);
157 i = (i + 1) % QUEUEDEPTH; 151 exit (255);
158}
159
160tap_packet *pkt_queue::get ()
161{
162 tap_packet *p = queue[j];
163
164 if (p)
165 { 152 }
166 queue[j] = 0; 153 else if (pid > 0)
167 j = (j + 1) % QUEUEDEPTH;
168 } 154 {
169 155 if (wait)
170 return p; 156 {
157 waitpid (pid, 0, 0);
158 /* TODO: check status */
159 }
160 }
171} 161}
172 162
173pkt_queue::pkt_queue () 163#if ENABLE_HTTP_PROXY
164// works like strdup
165u8 *
166base64_encode (const u8 *data, unsigned int len)
174{ 167{
175 memset (queue, 0, sizeof (queue)); 168 const static char base64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
176 i = 0;
177 j = 0;
178}
179 169
180pkt_queue::~pkt_queue () 170 unsigned int t, i;
181{ 171 const u8 *end = data + len;
182 for (i = QUEUEDEPTH; --i > 0; ) 172 u8 *res = new u8 [4 * ((len + 2) / 3) + 1];
183 delete queue[i]; 173 u8 *out = res;
184}
185 174
186sockinfo::operator const char *() 175 while (data <= end - 3)
187{ 176 {
188 static char hostport[15 + 1 + 5 + 1]; 177 t = (((data[0] << 8) | data[1]) << 8) | data[2];
189 in_addr ia = { host }; 178 data += 3;
190
191 sprintf (hostport, "%.15s:%d", inet_ntoa (ia), ntohs (port) & 0xffff);
192
193 return hostport;
194}
195
196bool u32_rate_limiter::can (u32 host)
197{
198 iterator i;
199
200 for (i = begin (); i != end (); )
201 if (i->second <= now)
202 { 179
203 erase (i); 180 *out++ = base64[(t >> 18) & 0x3f];
204 i = begin (); 181 *out++ = base64[(t >> 12) & 0x3f];
182 *out++ = base64[(t >> 6) & 0x3f];
183 *out++ = base64[(t ) & 0x3f];
205 } 184 }
206 else
207 ++i;
208 185
209 i = find (host); 186 for (t = 0, i = 0; data < end; i++)
187 t = (t << 8) | *data++;
210 188
211 if (i != end ()) 189 switch (i)
212 return false; 190 {
191 case 2:
192 *out++ = base64[(t >> 10) & 0x3f];
193 *out++ = base64[(t >> 4) & 0x3f];
194 *out++ = base64[(t << 2) & 0x3f];
195 *out++ = '=';
196 break;
197 case 1:
198 *out++ = base64[(t >> 2) & 0x3f];
199 *out++ = base64[(t << 4) & 0x3f];
200 *out++ = '=';
201 *out++ = '=';
202 break;
203 }
213 204
214 insert (value_type (host, now + every)); 205 *out++ = 0;
215 206
216 return true; 207 return res;
217} 208}
209#endif
218 210

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines