ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/util.h
Revision: 1.1
Committed: Sat Mar 1 15:53:03 2003 UTC (21 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     util.h -- process management and other utility functions
3     Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>
4     2000-2002 Guus Sliepen <guus@sliepen.eu.org>
5     2003 Marc Lehmannn <pcg@goof.com>
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20     */
21    
22     #ifndef UTIL_H__
23     #define UTIL_H__
24    
25     #include <sys/socket.h>
26     #include <netinet/in.h>
27    
28     #include <map>
29    
30     #include "device.h"
31    
32     #define SOCKADDR sockaddr_in // this is lame, I know
33    
34     /*
35     * check for an existing vped for this net, and write pid to pidfile
36     */
37     extern int write_pidfile (void);
38    
39     /*
40     * kill older vped
41     */
42     extern int kill_other (int signal);
43    
44     /*
45     * Detach from current terminal, write pidfile, kill parent
46     */
47     extern int detach (int do_detach);
48    
49     /*
50     * Set all files and paths according to netname
51     */
52     extern void make_names (void);
53    
54     /*
55     * check wether the given path is an absolute pathname
56     */
57     #define ABSOLUTE_PATH(c) ((c)[0] == '/')
58    
59     static inline void
60     id2mac (unsigned int id, void *m)
61     {
62     mac &p = *(mac *)m;
63    
64     p[0] = 0xfe;
65     p[1] = 0xfd;
66     p[2] = 0x80;
67     p[3] = 0x00;
68     p[4] = id >> 8;
69     p[5] = id;
70     }
71    
72     #define mac2id(p) (p[0] & 0x01 ? 0 : (p[4] << 8) | p[5])
73    
74     // a very simple fifo pkt-queue
75     class pkt_queue
76     {
77     tap_packet *queue[QUEUEDEPTH];
78     int i, j;
79    
80     public:
81    
82     void put (tap_packet *p);
83     tap_packet *get ();
84    
85     pkt_queue ();
86     ~pkt_queue ();
87     };
88    
89     struct sockinfo
90     {
91     u32 host;
92     u16 port;
93    
94     void set (const SOCKADDR *sa)
95     {
96     host = sa->sin_addr.s_addr;
97     port = sa->sin_port;
98     }
99    
100     sockinfo()
101     {
102     host = port = 0;
103     }
104    
105     sockinfo(const SOCKADDR &sa)
106     {
107     set (&sa);
108     }
109    
110     sockinfo(const SOCKADDR *sa)
111     {
112     set (sa);
113     }
114    
115     SOCKADDR *sa()
116     {
117     static SOCKADDR sa;
118    
119     sa.sin_family = AF_INET;
120     sa.sin_port = port;
121     sa.sin_addr.s_addr = host;
122    
123     return &sa;
124     }
125    
126     operator const char *();
127     };
128    
129     inline bool
130     operator == (const sockinfo &a, const sockinfo &b)
131     {
132     return a.host == b.host && a.port == b.port;
133     }
134    
135     inline bool
136     operator < (const sockinfo &a, const sockinfo &b)
137     {
138     return a.host < b.host
139     || (a.host == b.host && a.port < b.port);
140     }
141    
142     // only do action once every x seconds per host.
143     // currently this is quite a slow implementation,
144     // but suffices for normal operation.
145     struct u32_rate_limiter : private map<u32, time_t>
146     {
147     int every;
148    
149     bool can (u32 host);
150    
151     u32_rate_limiter (time_t every = 1)
152     {
153     this->every = every;
154     }
155     };
156    
157     struct net_rate_limiter : u32_rate_limiter
158     {
159     bool can (SOCKADDR *sa) { return u32_rate_limiter::can((u32)sa->sin_addr.s_addr); }
160     bool can (sockinfo &si) { return u32_rate_limiter::can((u32)si.host); }
161    
162     net_rate_limiter (time_t every) : u32_rate_limiter (every) {}
163     };
164    
165     #endif
166