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.15 by pcg, Fri Jun 11 15:56:34 2004 UTC

1/* 1/*
2 util.C -- process management and other utility functions 2 util.C -- process management and other utility functions
3 Copyright (C) 2003-2004 Marc Lehmann <pcg@goof.com>
3 4
4 Most of these are taken from tinc, see the AUTHORS file. 5 Some of these are taken from tinc, see the AUTHORS file.
5 6
6 This program is free software; you can redistribute it and/or modify 7 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 8 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 9 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 10 (at your option) any later version.
19*/ 20*/
20 21
21#include "config.h" 22#include "config.h"
22 23
23#include <cstdio> 24#include <cstdio>
25#include <cstdlib>
24#include <cstring> 26#include <cstring>
25 27
26#include <errno.h> 28#include <errno.h>
27#include <signal.h> 29#include <signal.h>
28#include <sys/types.h> 30#include <sys/types.h>
31#include <sys/wait.h>
29#include <unistd.h> 32#include <unistd.h>
30#include <time.h> 33#include <time.h>
31#include <sys/socket.h>
32#include <netinet/in.h>
33#include <arpa/inet.h>
34 34
35#include <sys/mman.h> 35#include "netcompat.h"
36
37#include <openssl/rand.h>
38#include <openssl/rsa.h>
39#include <openssl/pem.h>
40#include <openssl/evp.h>
41 36
42#include "gettext.h" 37#include "gettext.h"
43#include "pidfile.h" 38#include "pidfile.h"
44#include "dropin.h" 39#include "dropin.h"
45 40
46#include "global.h" 41#include "global.h"
47#include "conf.h" 42#include "conf.h"
43#include "util.h"
48#include "slog.h" 44#include "slog.h"
49#include "protocol.h"
50
51time_t now;
52 45
53int 46int
54write_pidfile (void) 47write_pidfile (void)
55{ 48{
56 int pid; 49 int pid;
57 50
58 pid = check_pid (pidfilename); 51 pid = check_pid (conf.pidfilename);
59 52
60 if (pid) 53 if (pid)
61 { 54 {
62 fprintf (stderr, _("A vped is already running with pid %d.\n"), pid); 55 fprintf (stderr, _("A gvpe daemon is already running with pid %d.\n"), pid);
63 return 1; 56 return 1;
64 } 57 }
65 58
66 /* if it's locked, write-protected, or whatever */ 59 /* if it's locked, write-protected, or whatever */
67 if (!write_pid (pidfilename)) 60 if (!write_pid (conf.pidfilename))
68 return 1; 61 return 1;
69 62
70 return 0; 63 return 0;
71} 64}
72 65
73int 66int
74kill_other (int signal) 67kill_other (int signal)
75{ 68{
76 int pid; 69 int pid;
77 70
78 pid = read_pid (pidfilename); 71 pid = read_pid (conf.pidfilename);
79 72
80 if (!pid) 73 if (!pid)
81 { 74 {
82 fprintf (stderr, _("No other vped is running.\n")); 75 fprintf (stderr, _("No other gvpe daemon is running.\n"));
83 return 1; 76 return 1;
84 } 77 }
85 78
86 errno = 0; /* No error, sometimes errno is only changed on error */ 79 errno = 0; /* No error, sometimes errno is only changed on error */
87 80
88 /* ESRCH is returned when no process with that pid is found */ 81 /* ESRCH is returned when no process with that pid is found */
89 if (kill (pid, signal) && errno == ESRCH) 82 if (kill (pid, signal) && errno == ESRCH)
90 { 83 {
91 fprintf (stderr, _("The vped is no longer running. ")); 84 fprintf (stderr, _("The gvpe daemon is no longer running. "));
92 85
93 fprintf (stderr, _("Removing stale lock file.\n")); 86 fprintf (stderr, _("Removing stale lock file.\n"));
94 remove_pid (pidfilename); 87 remove_pid (conf.pidfilename);
95 } 88 }
96 89
97 return 0; 90 return 0;
98} 91}
99 92
119 return -1; 112 return -1;
120 } 113 }
121 114
122 /* Now UPDATE the pid in the pidfile, because we changed it... */ 115 /* Now UPDATE the pid in the pidfile, because we changed it... */
123 116
124 if (!write_pid (pidfilename)) 117 if (!write_pid (conf.pidfilename))
125 return -1; 118 return -1;
126 119
127 log_to (LOGTO_SYSLOG); 120 log_to (LOGTO_SYSLOG);
128 } 121 }
129 else 122 else
130 log_to (LOGTO_SYSLOG | LOGTO_STDERR); 123 log_to (LOGTO_SYSLOG | LOGTO_STDERR);
131 124
132 slog (L_INFO, _("vped %s (%s %s) starting"), VERSION, __DATE__, __TIME__); 125 slog (L_INFO, _("gvpe daemon %s (%s %s) starting"), VERSION, __DATE__, __TIME__);
133 126
134 return 0; 127 return 0;
135} 128}
136 129
130void run_script (const run_script_cb &cb, bool wait)
131{
132 int pid;
133
134 if ((pid = fork ()) == 0)
135 {
136 char *filename;
137 asprintf (&filename, "%s/%s", confbase, cb());
138 execl (filename, filename, (char *) 0);
139 exit (126);
140 }
141 else if (pid > 0)
142 {
143 if (wait)
144 {
145 waitpid (pid, 0, 0);
146 /* TODO: check status */
147 }
148 }
149}
150
151#if ENABLE_HTTP_PROXY
152// works like strdup
153u8 *
154base64_encode (const u8 *data, unsigned int len)
155{
156 const static char base64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
157
158 unsigned int t, i;
159 const u8 *end = data + len;
160 u8 *res = new u8 [4 * ((len + 2) / 3) + 1];
161 u8 *out = res;
162
163 while (data <= end - 3)
164 {
165 t = (((data[0] << 8) | data[1]) << 8) | data[2];
166 data += 3;
167
168 *out++ = base64[(t >> 18) & 0x3f];
169 *out++ = base64[(t >> 12) & 0x3f];
170 *out++ = base64[(t >> 6) & 0x3f];
171 *out++ = base64[(t ) & 0x3f];
172 }
173
174 for (t = 0, i = 0; data < end; i++)
175 t = (t << 8) | *data++;
176
177 switch (i)
178 {
179 case 2:
180 *out++ = base64[(t >> 10) & 0x3f];
181 *out++ = base64[(t >> 4) & 0x3f];
182 *out++ = base64[(t << 2) & 0x3f];
183 *out++ = '=';
184 break;
185 case 1:
186 *out++ = base64[(t >> 2) & 0x3f];
187 *out++ = base64[(t << 4) & 0x3f];
188 *out++ = '=';
189 *out++ = '=';
190 break;
191 }
192
193 *out++ = 0;
194
195 return res;
196}
197#endif
198
137void 199void
138make_names (void) 200id2mac (unsigned int id, void *m)
139{ 201{
140 if (!pidfilename) 202 mac &p = *(mac *)m;
141 pidfilename = LOCALSTATEDIR "/run/vped.pid";
142 203
143 if (!confbase)
144 asprintf (&confbase, "%s/vpe", CONFDIR);
145}
146
147void pkt_queue::put (tap_packet *p)
148{
149 if (queue[i])
150 {
151 delete queue[i];
152 j = (j + 1) % QUEUEDEPTH;
153 }
154
155 queue[i] = p;
156
157 i = (i + 1) % QUEUEDEPTH;
158}
159
160tap_packet *pkt_queue::get ()
161{
162 tap_packet *p = queue[j];
163
164 if (p) 204 if (id)
165 {
166 queue[j] = 0;
167 j = (j + 1) % QUEUEDEPTH;
168 }
169
170 return p;
171}
172
173pkt_queue::pkt_queue ()
174{
175 memset (queue, 0, sizeof (queue));
176 i = 0;
177 j = 0;
178}
179
180pkt_queue::~pkt_queue ()
181{
182 for (i = QUEUEDEPTH; --i > 0; )
183 delete queue[i];
184}
185
186sockinfo::operator const char *()
187{
188 static char hostport[15 + 1 + 5 + 1];
189 in_addr ia = { host };
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 { 205 {
203 erase (i); 206 p[0] = 0xfe;
204 i = begin (); 207 p[1] = 0xfd;
208 p[2] = 0x80;
209 p[3] = 0x00;
210 p[4] = id >> 8;
211 p[5] = id;
205 } 212 }
206 else 213 else
207 ++i; 214 {
208 215 p[0] = 0xff;
209 i = find (host); 216 p[1] = 0xff;
210 217 p[2] = 0xff;
211 if (i != end ()) 218 p[3] = 0xff;
212 return false; 219 p[4] = 0xff;
213 220 p[5] = 0xff;
214 insert (value_type (host, now + every)); 221 }
215
216 return true;
217} 222}
218 223

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines