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.4 by pcg, Wed Apr 2 03:06:22 2003 UTC vs.
Revision 1.13 by pcg, Fri Apr 2 14:42:45 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 Marc Lehmann <pcg@goof.com>
3 4
4 Some 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
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>
29#include <sys/wait.h> 31#include <sys/wait.h>
30#include <unistd.h> 32#include <unistd.h>
31#include <time.h> 33#include <time.h>
32#include <sys/socket.h>
33#include <netinet/in.h>
34#include <arpa/inet.h>
35 34
36 35#include "netcompat.h"
37#include <sys/mman.h>
38 36
39#include "gettext.h" 37#include "gettext.h"
40#include "pidfile.h" 38#include "pidfile.h"
41#include "dropin.h" 39#include "dropin.h"
42 40
43#include "global.h" 41#include "global.h"
44#include "conf.h" 42#include "conf.h"
43#include "util.h"
45#include "slog.h" 44#include "slog.h"
46#include "protocol.h"
47 45
48int 46int
49write_pidfile (void) 47write_pidfile (void)
50{ 48{
51 int pid; 49 int pid;
52 50
53 pid = check_pid (pidfilename); 51 pid = check_pid (conf.pidfilename);
54 52
55 if (pid) 53 if (pid)
56 { 54 {
57 fprintf (stderr, _("A vped is already running with pid %d.\n"), pid); 55 fprintf (stderr, _("A vped is already running with pid %d.\n"), pid);
58 return 1; 56 return 1;
59 } 57 }
60 58
61 /* if it's locked, write-protected, or whatever */ 59 /* if it's locked, write-protected, or whatever */
62 if (!write_pid (pidfilename)) 60 if (!write_pid (conf.pidfilename))
63 return 1; 61 return 1;
64 62
65 return 0; 63 return 0;
66} 64}
67 65
68int 66int
69kill_other (int signal) 67kill_other (int signal)
70{ 68{
71 int pid; 69 int pid;
72 70
73 pid = read_pid (pidfilename); 71 pid = read_pid (conf.pidfilename);
74 72
75 if (!pid) 73 if (!pid)
76 { 74 {
77 fprintf (stderr, _("No other vped is running.\n")); 75 fprintf (stderr, _("No other vped is running.\n"));
78 return 1; 76 return 1;
84 if (kill (pid, signal) && errno == ESRCH) 82 if (kill (pid, signal) && errno == ESRCH)
85 { 83 {
86 fprintf (stderr, _("The vped is no longer running. ")); 84 fprintf (stderr, _("The vped is no longer running. "));
87 85
88 fprintf (stderr, _("Removing stale lock file.\n")); 86 fprintf (stderr, _("Removing stale lock file.\n"));
89 remove_pid (pidfilename); 87 remove_pid (conf.pidfilename);
90 } 88 }
91 89
92 return 0; 90 return 0;
93} 91}
94 92
114 return -1; 112 return -1;
115 } 113 }
116 114
117 /* Now UPDATE the pid in the pidfile, because we changed it... */ 115 /* Now UPDATE the pid in the pidfile, because we changed it... */
118 116
119 if (!write_pid (pidfilename)) 117 if (!write_pid (conf.pidfilename))
120 return -1; 118 return -1;
121 119
122 log_to (LOGTO_SYSLOG); 120 log_to (LOGTO_SYSLOG);
123 } 121 }
124 else 122 else
130} 128}
131 129
132void 130void
133make_names (void) 131make_names (void)
134{ 132{
135 if (!pidfilename) 133 if (!conf.pidfilename)
136 pidfilename = LOCALSTATEDIR "/run/vped.pid"; 134 conf.pidfilename = strdup (LOCALSTATEDIR "/run/vped.pid");
137 135
138 if (!confbase) 136 if (!confbase)
139 asprintf (&confbase, "%s/vpe", CONFDIR); 137 asprintf (&confbase, "%s/vpe", CONFDIR);
140} 138}
141 139
144 int pid; 142 int pid;
145 143
146 if ((pid = fork ()) == 0) 144 if ((pid = fork ()) == 0)
147 { 145 {
148 char *filename; 146 char *filename;
149 asprintf (&filename, "%s/%s", confbase, cb(0)); 147 asprintf (&filename, "%s/%s", confbase, cb());
150 execl (filename, filename, (char *) 0); 148 execl (filename, filename, (char *) 0);
151 exit (255); 149 exit (126);
152 } 150 }
153 else if (pid > 0) 151 else if (pid > 0)
154 { 152 {
155 if (wait) 153 if (wait)
156 { 154 {
157 waitpid (pid, 0, 0); 155 waitpid (pid, 0, 0);
158 /* TODO: check status */ 156 /* TODO: check status */
159 } 157 }
160 } 158 }
161} 159}
160
161#if ENABLE_HTTP_PROXY
162// works like strdup
163u8 *
164base64_encode (const u8 *data, unsigned int len)
165{
166 const static char base64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
167
168 unsigned int t, i;
169 const u8 *end = data + len;
170 u8 *res = new u8 [4 * ((len + 2) / 3) + 1];
171 u8 *out = res;
172
173 while (data <= end - 3)
174 {
175 t = (((data[0] << 8) | data[1]) << 8) | data[2];
176 data += 3;
177
178 *out++ = base64[(t >> 18) & 0x3f];
179 *out++ = base64[(t >> 12) & 0x3f];
180 *out++ = base64[(t >> 6) & 0x3f];
181 *out++ = base64[(t ) & 0x3f];
182 }
183
184 for (t = 0, i = 0; data < end; i++)
185 t = (t << 8) | *data++;
186
187 switch (i)
188 {
189 case 2:
190 *out++ = base64[(t >> 10) & 0x3f];
191 *out++ = base64[(t >> 4) & 0x3f];
192 *out++ = base64[(t << 2) & 0x3f];
193 *out++ = '=';
194 break;
195 case 1:
196 *out++ = base64[(t >> 2) & 0x3f];
197 *out++ = base64[(t << 4) & 0x3f];
198 *out++ = '=';
199 *out++ = '=';
200 break;
201 }
202
203 *out++ = 0;
204
205 return res;
206}
207#endif
208
209void
210id2mac (unsigned int id, void *m)
211{
212 mac &p = *(mac *)m;
213
214 if (id)
215 {
216 p[0] = 0xfe;
217 p[1] = 0xfd;
218 p[2] = 0x80;
219 p[3] = 0x00;
220 p[4] = id >> 8;
221 p[5] = id;
222 }
223 else
224 {
225 p[0] = 0xff;
226 p[1] = 0xff;
227 p[2] = 0xff;
228 p[3] = 0xff;
229 p[4] = 0xff;
230 p[5] = 0xff;
231 }
232}
233

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines