author | clem <clem> | 2004-09-16 22:30:54 (UTC) |
---|---|---|
committer | clem <clem> | 2004-09-16 22:30:54 (UTC) |
commit | ba8276a03172cfdb41aac4b0cd53307dfdd2b8f1 (patch) (unidiff) | |
tree | c1a6f6712064942b773bbc0b11cc474955a96a74 | |
parent | 85ebe50b5cfa9244c1610aac5d72de8a4cc263b6 (diff) | |
download | opie-ba8276a03172cfdb41aac4b0cd53307dfdd2b8f1.zip opie-ba8276a03172cfdb41aac4b0cd53307dfdd2b8f1.tar.gz opie-ba8276a03172cfdb41aac4b0cd53307dfdd2b8f1.tar.bz2 |
define ARPHRD_IEEE80211 if <net/if_arp.h> doesn't (i.e. if our crosscompiler's version is 2.95 and not 3.3)
-rw-r--r-- | noncore/settings/networksettings2/networksettings2/system.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/noncore/settings/networksettings2/networksettings2/system.cpp b/noncore/settings/networksettings2/networksettings2/system.cpp index 271e73d..298bdc9 100644 --- a/noncore/settings/networksettings2/networksettings2/system.cpp +++ b/noncore/settings/networksettings2/networksettings2/system.cpp | |||
@@ -1,429 +1,433 @@ | |||
1 | #include <sys/types.h> | 1 | #include <sys/types.h> |
2 | #include <sys/wait.h> | 2 | #include <sys/wait.h> |
3 | 3 | ||
4 | #include <net/if.h> | 4 | #include <net/if.h> |
5 | #include <net/if_arp.h> | 5 | #include <net/if_arp.h> |
6 | #include <netinet/in.h> | 6 | #include <netinet/in.h> |
7 | #include <arpa/inet.h> | 7 | #include <arpa/inet.h> |
8 | #include <sys/ioctl.h> | 8 | #include <sys/ioctl.h> |
9 | #include <sys/socket.h> | 9 | #include <sys/socket.h> |
10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
11 | #include <stdio.h> | 11 | #include <stdio.h> |
12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
13 | #include <errno.h> | 13 | #include <errno.h> |
14 | #include <unistd.h> | 14 | #include <unistd.h> |
15 | 15 | ||
16 | #include <qdir.h> | 16 | #include <qdir.h> |
17 | #include <qregexp.h> | 17 | #include <qregexp.h> |
18 | #include <qstringlist.h> | 18 | #include <qstringlist.h> |
19 | #include <qfile.h> | 19 | #include <qfile.h> |
20 | #include <qtextstream.h> | 20 | #include <qtextstream.h> |
21 | #include <qapplication.h> | 21 | #include <qapplication.h> |
22 | 22 | ||
23 | #include "resources.h" | 23 | #include "resources.h" |
24 | #include "system.h" | 24 | #include "system.h" |
25 | 25 | ||
26 | #define PROCNETDEV "/proc/net/dev" | 26 | #define PROCNETDEV "/proc/net/dev" |
27 | 27 | ||
28 | #ifndef ARPHRD_IEEE80211 | ||
29 | #define ARPHRD_IEEE80211 801 | ||
30 | #endif | ||
31 | |||
28 | static char Dig2Hex[] = { | 32 | static char Dig2Hex[] = { |
29 | '0', '1', '2', '3', | 33 | '0', '1', '2', '3', |
30 | '4', '5', '6', '7', | 34 | '4', '5', '6', '7', |
31 | '8', '9', 'A', 'B', | 35 | '8', '9', 'A', 'B', |
32 | 'C', 'D', 'E', 'F' | 36 | 'C', 'D', 'E', 'F' |
33 | }; | 37 | }; |
34 | 38 | ||
35 | // get HIGH nibble of byte | 39 | // get HIGH nibble of byte |
36 | #define HN(x) Dig2Hex[(((x)&0xf0)>>4)] | 40 | #define HN(x) Dig2Hex[(((x)&0xf0)>>4)] |
37 | // get LOW nibble of byte | 41 | // get LOW nibble of byte |
38 | #define LN(x) Dig2Hex[((x)&0x0f)] | 42 | #define LN(x) Dig2Hex[((x)&0x0f)] |
39 | 43 | ||
40 | System::System( void ) : QObject(), ProbedInterfaces() { | 44 | System::System( void ) : QObject(), ProbedInterfaces() { |
41 | probeInterfaces(); | 45 | probeInterfaces(); |
42 | } | 46 | } |
43 | 47 | ||
44 | System::~System( void ) { | 48 | System::~System( void ) { |
45 | if( ProcDevNet ) | 49 | if( ProcDevNet ) |
46 | delete ProcDevNet; | 50 | delete ProcDevNet; |
47 | } | 51 | } |
48 | 52 | ||
49 | int System::runAsRoot( const QString & S ) { | 53 | int System::runAsRoot( const QString & S ) { |
50 | QString MyS = S; | 54 | QString MyS = S; |
51 | char * usr = getenv("USER"); | 55 | char * usr = getenv("USER"); |
52 | char ch; | 56 | char ch; |
53 | 57 | ||
54 | if( S.isEmpty() ) { | 58 | if( S.isEmpty() ) { |
55 | // loophole to start shell | 59 | // loophole to start shell |
56 | return 8888; | 60 | return 8888; |
57 | } | 61 | } |
58 | if( usr == 0 || strcmp( usr, "root" ) ) { | 62 | if( usr == 0 || strcmp( usr, "root" ) ) { |
59 | // unknown or non-root user -> use SUDO | 63 | // unknown or non-root user -> use SUDO |
60 | MyS.prepend( "sudo " ); | 64 | MyS.prepend( "sudo " ); |
61 | } | 65 | } |
62 | 66 | ||
63 | Log(("Executing %s\n", MyS.latin1() )); | 67 | Log(("Executing %s\n", MyS.latin1() )); |
64 | 68 | ||
65 | emit lineFromCommand( tr("Command : ") + MyS ); | 69 | emit lineFromCommand( tr("Command : ") + MyS ); |
66 | emit lineFromCommand( "---------------" ); | 70 | emit lineFromCommand( "---------------" ); |
67 | Log(( "Command : %s\n", MyS.latin1() ) ); | 71 | Log(( "Command : %s\n", MyS.latin1() ) ); |
68 | MyS += " 2>&1 "; | 72 | MyS += " 2>&1 "; |
69 | OutputOfCmd = popen( MyS.latin1(), "r" ) ; | 73 | OutputOfCmd = popen( MyS.latin1(), "r" ) ; |
70 | if( ! OutputOfCmd ) { | 74 | if( ! OutputOfCmd ) { |
71 | // cannot fork | 75 | // cannot fork |
72 | return 1; | 76 | return 1; |
73 | } | 77 | } |
74 | 78 | ||
75 | // read all data | 79 | // read all data |
76 | QString Line = ""; | 80 | QString Line = ""; |
77 | while( 1 ) { | 81 | while( 1 ) { |
78 | if( fread( &ch, 1, 1, OutputOfCmd ) < 1 ) | 82 | if( fread( &ch, 1, 1, OutputOfCmd ) < 1 ) |
79 | // eof | 83 | // eof |
80 | break; | 84 | break; |
81 | if( ch == '\n' || ch == '\r' ) { | 85 | if( ch == '\n' || ch == '\r' ) { |
82 | if( ! Line.isEmpty() ) { | 86 | if( ! Line.isEmpty() ) { |
83 | Log(( "read cmd output : **%s**\n", Line.latin1() ) ); | 87 | Log(( "read cmd output : **%s**\n", Line.latin1() ) ); |
84 | emit lineFromCommand( Line ); | 88 | emit lineFromCommand( Line ); |
85 | Line = ""; | 89 | Line = ""; |
86 | qApp->processEvents(); | 90 | qApp->processEvents(); |
87 | } | 91 | } |
88 | } else { | 92 | } else { |
89 | Line += ch; | 93 | Line += ch; |
90 | } | 94 | } |
91 | } | 95 | } |
92 | 96 | ||
93 | if( ! Line.isEmpty() ) { | 97 | if( ! Line.isEmpty() ) { |
94 | emit lineFromCommand( Line ); | 98 | emit lineFromCommand( Line ); |
95 | Log(( "read cmd output : **%s**\n", Line.latin1() ) ); | 99 | Log(( "read cmd output : **%s**\n", Line.latin1() ) ); |
96 | } | 100 | } |
97 | Log(( "End of command\n", Line.latin1() ) ); | 101 | Log(( "End of command\n", Line.latin1() ) ); |
98 | 102 | ||
99 | if( pclose( OutputOfCmd ) < 0 ) { | 103 | if( pclose( OutputOfCmd ) < 0 ) { |
100 | // error in command | 104 | // error in command |
101 | return 3; | 105 | return 3; |
102 | } | 106 | } |
103 | 107 | ||
104 | // all is fine | 108 | // all is fine |
105 | return 0; | 109 | return 0; |
106 | } | 110 | } |
107 | 111 | ||
108 | void System::refreshStatistics( InterfaceInfo & I ) { | 112 | void System::refreshStatistics( InterfaceInfo & I ) { |
109 | if( ! ProcDevNet ) { | 113 | if( ! ProcDevNet ) { |
110 | return; | 114 | return; |
111 | } | 115 | } |
112 | // cannot seek on dev | 116 | // cannot seek on dev |
113 | ProcDevNet->close(); | 117 | ProcDevNet->close(); |
114 | ProcDevNet->open( IO_ReadOnly ); | 118 | ProcDevNet->open( IO_ReadOnly ); |
115 | 119 | ||
116 | QString line; | 120 | QString line; |
117 | QTextStream procTs(ProcDevNet); | 121 | QTextStream procTs(ProcDevNet); |
118 | QStringList SL; | 122 | QStringList SL; |
119 | int loc = -1; | 123 | int loc = -1; |
120 | int version; | 124 | int version; |
121 | 125 | ||
122 | procTs.readLine(); | 126 | procTs.readLine(); |
123 | line = procTs.readLine(); | 127 | line = procTs.readLine(); |
124 | // get version | 128 | // get version |
125 | if( line.find("compressed") ) | 129 | if( line.find("compressed") ) |
126 | version = 3; | 130 | version = 3; |
127 | else if( line.find( "bytes" ) ) | 131 | else if( line.find( "bytes" ) ) |
128 | version = 2; | 132 | version = 2; |
129 | else | 133 | else |
130 | version = 1; | 134 | version = 1; |
131 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { | 135 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { |
132 | if( (loc = line.find(":") ) == -1) { | 136 | if( (loc = line.find(":") ) == -1) { |
133 | continue; | 137 | continue; |
134 | } | 138 | } |
135 | 139 | ||
136 | if( I.Name != line.left(loc) ) | 140 | if( I.Name != line.left(loc) ) |
137 | continue; | 141 | continue; |
138 | 142 | ||
139 | // tokenize | 143 | // tokenize |
140 | SL = QStringList::split( ' ', line, FALSE ); | 144 | SL = QStringList::split( ' ', line, FALSE ); |
141 | 145 | ||
142 | // update data | 146 | // update data |
143 | switch( version ) { | 147 | switch( version ) { |
144 | case 1 : | 148 | case 1 : |
145 | I.RcvBytes = SL[1]; | 149 | I.RcvBytes = SL[1]; |
146 | I.RcvErrors = SL[3]; | 150 | I.RcvErrors = SL[3]; |
147 | I.RcvDropped = SL[4]; | 151 | I.RcvDropped = SL[4]; |
148 | I.SndBytes = SL[6]; | 152 | I.SndBytes = SL[6]; |
149 | I.SndErrors = SL[8]; | 153 | I.SndErrors = SL[8]; |
150 | I.SndDropped = SL[9]; | 154 | I.SndDropped = SL[9]; |
151 | I.Collisions = SL[11]; | 155 | I.Collisions = SL[11]; |
152 | break; | 156 | break; |
153 | case 2 : | 157 | case 2 : |
154 | I.RcvBytes = SL[1]; | 158 | I.RcvBytes = SL[1]; |
155 | I.RcvErrors = SL[3]; | 159 | I.RcvErrors = SL[3]; |
156 | I.RcvDropped = SL[4]; | 160 | I.RcvDropped = SL[4]; |
157 | I.SndBytes = SL[7]; | 161 | I.SndBytes = SL[7]; |
158 | I.SndErrors = SL[9]; | 162 | I.SndErrors = SL[9]; |
159 | I.SndDropped = SL[10]; | 163 | I.SndDropped = SL[10]; |
160 | I.Collisions = SL[12]; | 164 | I.Collisions = SL[12]; |
161 | break; | 165 | break; |
162 | case 3 : | 166 | case 3 : |
163 | I.RcvBytes = SL[1]; | 167 | I.RcvBytes = SL[1]; |
164 | I.RcvErrors = SL[3]; | 168 | I.RcvErrors = SL[3]; |
165 | I.RcvDropped = SL[4]; | 169 | I.RcvDropped = SL[4]; |
166 | I.SndBytes = SL[9]; | 170 | I.SndBytes = SL[9]; |
167 | I.SndErrors = SL[11]; | 171 | I.SndErrors = SL[11]; |
168 | I.SndDropped = SL[12]; | 172 | I.SndDropped = SL[12]; |
169 | I.Collisions = SL[14]; | 173 | I.Collisions = SL[14]; |
170 | break; | 174 | break; |
171 | } | 175 | } |
172 | break; | 176 | break; |
173 | } | 177 | } |
174 | } | 178 | } |
175 | 179 | ||
176 | // | 180 | // |
177 | // THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT | 181 | // THIS UPDATES THE LIST -> INTERFACES ARE NOT DELETED BUT |
178 | // FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT | 182 | // FLAGGED AS ! 'IsUp' IF NO LONGER PRESENT |
179 | // | 183 | // |
180 | 184 | ||
181 | void System::probeInterfaces( void ) { | 185 | void System::probeInterfaces( void ) { |
182 | 186 | ||
183 | // probe interfaces | 187 | // probe interfaces |
184 | int sockfd; | 188 | int sockfd; |
185 | // get list of all interfaces | 189 | // get list of all interfaces |
186 | struct ifreq ifrs; | 190 | struct ifreq ifrs; |
187 | InterfaceInfo * IFI; | 191 | InterfaceInfo * IFI; |
188 | 192 | ||
189 | // flag all as 'down' | 193 | // flag all as 'down' |
190 | for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); | 194 | for( QDictIterator<InterfaceInfo> it( ProbedInterfaces ); |
191 | it.current(); | 195 | it.current(); |
192 | ++it ) { | 196 | ++it ) { |
193 | it.current()->IsUp = 0; | 197 | it.current()->IsUp = 0; |
194 | } | 198 | } |
195 | 199 | ||
196 | sockfd = socket(PF_INET, SOCK_DGRAM, 0); | 200 | sockfd = socket(PF_INET, SOCK_DGRAM, 0); |
197 | if(sockfd == -1) | 201 | if(sockfd == -1) |
198 | return; | 202 | return; |
199 | 203 | ||
200 | // read interfaces from /proc/dev/net | 204 | // read interfaces from /proc/dev/net |
201 | // SIOCGIFCONF does not return ALL interfaces ???!? | 205 | // SIOCGIFCONF does not return ALL interfaces ???!? |
202 | ProcDevNet = new QFile(PROCNETDEV); | 206 | ProcDevNet = new QFile(PROCNETDEV); |
203 | if( ! ProcDevNet->open(IO_ReadOnly) ) { | 207 | if( ! ProcDevNet->open(IO_ReadOnly) ) { |
204 | delete ProcDevNet; | 208 | delete ProcDevNet; |
205 | ProcDevNet =0; | 209 | ProcDevNet =0; |
206 | return; | 210 | return; |
207 | } | 211 | } |
208 | 212 | ||
209 | QString line; | 213 | QString line; |
210 | QString NicName; | 214 | QString NicName; |
211 | QTextStream procTs(ProcDevNet); | 215 | QTextStream procTs(ProcDevNet); |
212 | int loc = -1; | 216 | int loc = -1; |
213 | 217 | ||
214 | procTs.readLine(); // eat a line | 218 | procTs.readLine(); // eat a line |
215 | procTs.readLine(); // eat a line | 219 | procTs.readLine(); // eat a line |
216 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { | 220 | while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null) { |
217 | if((loc = line.find(":")) == -1) { | 221 | if((loc = line.find(":")) == -1) { |
218 | continue; | 222 | continue; |
219 | } | 223 | } |
220 | 224 | ||
221 | NicName = line.left(loc); | 225 | NicName = line.left(loc); |
222 | 226 | ||
223 | // set name for ioctl | 227 | // set name for ioctl |
224 | strcpy( ifrs.ifr_name, NicName.latin1() ); | 228 | strcpy( ifrs.ifr_name, NicName.latin1() ); |
225 | 229 | ||
226 | if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { | 230 | if ( ! ( IFI = ProbedInterfaces.find( NicName ) ) ) { |
227 | // new nic | 231 | // new nic |
228 | Log(("NEWNIC %s\n", NicName.latin1())); | 232 | Log(("NEWNIC %s\n", NicName.latin1())); |
229 | IFI = new InterfaceInfo; | 233 | IFI = new InterfaceInfo; |
230 | IFI->Name = line.left(loc); | 234 | IFI->Name = line.left(loc); |
231 | IFI->NetNode = 0; | 235 | IFI->NetNode = 0; |
232 | ProbedInterfaces.insert( IFI->Name, IFI ); | 236 | ProbedInterfaces.insert( IFI->Name, IFI ); |
233 | 237 | ||
234 | // get dynamic info | 238 | // get dynamic info |
235 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { | 239 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { |
236 | IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); | 240 | IFI->IsPointToPoint = ((ifrs.ifr_flags & IFF_POINTOPOINT) == IFF_POINTOPOINT); |
237 | } else { | 241 | } else { |
238 | IFI->IsPointToPoint = 0; | 242 | IFI->IsPointToPoint = 0; |
239 | } | 243 | } |
240 | 244 | ||
241 | // settings that never change | 245 | // settings that never change |
242 | IFI->DstAddress = ""; | 246 | IFI->DstAddress = ""; |
243 | 247 | ||
244 | if( IFI->IsPointToPoint ) { | 248 | if( IFI->IsPointToPoint ) { |
245 | if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { | 249 | if( ioctl(sockfd, SIOCGIFDSTADDR, &ifrs) >= 0 ) { |
246 | IFI->DstAddress = | 250 | IFI->DstAddress = |
247 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); | 251 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_dstaddr)->sin_addr); |
248 | } | 252 | } |
249 | } | 253 | } |
250 | 254 | ||
251 | IFI->CardType = 999999; | 255 | IFI->CardType = 999999; |
252 | IFI->MACAddress = ""; | 256 | IFI->MACAddress = ""; |
253 | 257 | ||
254 | if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { | 258 | if( ioctl(sockfd, SIOCGIFHWADDR, &ifrs) >= 0 ) { |
255 | Log(("%s = %d\n", IFI->Name.latin1(), | 259 | Log(("%s = %d\n", IFI->Name.latin1(), |
256 | ifrs.ifr_hwaddr.sa_family )); | 260 | ifrs.ifr_hwaddr.sa_family )); |
257 | 261 | ||
258 | IFI->CardType = ifrs.ifr_hwaddr.sa_family; | 262 | IFI->CardType = ifrs.ifr_hwaddr.sa_family; |
259 | switch( ifrs.ifr_hwaddr.sa_family ) { | 263 | switch( ifrs.ifr_hwaddr.sa_family ) { |
260 | case ARPHRD_ETHER : // regular MAC address | 264 | case ARPHRD_ETHER : // regular MAC address |
261 | // valid address -> convert to regular ::: format | 265 | // valid address -> convert to regular ::: format |
262 | // length = 6 bytes = 12 DIGITS -> 6 : | 266 | // length = 6 bytes = 12 DIGITS -> 6 : |
263 | IFI->MACAddress.sprintf( | 267 | IFI->MACAddress.sprintf( |
264 | "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", | 268 | "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", |
265 | HN( ifrs.ifr_hwaddr.sa_data[0] ), | 269 | HN( ifrs.ifr_hwaddr.sa_data[0] ), |
266 | LN( ifrs.ifr_hwaddr.sa_data[0] ), | 270 | LN( ifrs.ifr_hwaddr.sa_data[0] ), |
267 | HN( ifrs.ifr_hwaddr.sa_data[1] ), | 271 | HN( ifrs.ifr_hwaddr.sa_data[1] ), |
268 | LN( ifrs.ifr_hwaddr.sa_data[1] ), | 272 | LN( ifrs.ifr_hwaddr.sa_data[1] ), |
269 | HN( ifrs.ifr_hwaddr.sa_data[2] ), | 273 | HN( ifrs.ifr_hwaddr.sa_data[2] ), |
270 | LN( ifrs.ifr_hwaddr.sa_data[2] ), | 274 | LN( ifrs.ifr_hwaddr.sa_data[2] ), |
271 | HN( ifrs.ifr_hwaddr.sa_data[3] ), | 275 | HN( ifrs.ifr_hwaddr.sa_data[3] ), |
272 | LN( ifrs.ifr_hwaddr.sa_data[3] ), | 276 | LN( ifrs.ifr_hwaddr.sa_data[3] ), |
273 | HN( ifrs.ifr_hwaddr.sa_data[4] ), | 277 | HN( ifrs.ifr_hwaddr.sa_data[4] ), |
274 | LN( ifrs.ifr_hwaddr.sa_data[4] ), | 278 | LN( ifrs.ifr_hwaddr.sa_data[4] ), |
275 | HN( ifrs.ifr_hwaddr.sa_data[5] ), | 279 | HN( ifrs.ifr_hwaddr.sa_data[5] ), |
276 | LN( ifrs.ifr_hwaddr.sa_data[5] ) | 280 | LN( ifrs.ifr_hwaddr.sa_data[5] ) |
277 | ); | 281 | ); |
278 | break; | 282 | break; |
279 | #ifdef ARPHRD_IEEE1394 | 283 | #ifdef ARPHRD_IEEE1394 |
280 | case ARPHRD_IEEE1394 : // Firewire Eth address | 284 | case ARPHRD_IEEE1394 : // Firewire Eth address |
281 | IFI->MACAddress.sprintf( | 285 | IFI->MACAddress.sprintf( |
282 | "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", | 286 | "%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-%c%c-00-00", |
283 | HN( ifrs.ifr_hwaddr.sa_data[0] ), | 287 | HN( ifrs.ifr_hwaddr.sa_data[0] ), |
284 | LN( ifrs.ifr_hwaddr.sa_data[0] ), | 288 | LN( ifrs.ifr_hwaddr.sa_data[0] ), |
285 | HN( ifrs.ifr_hwaddr.sa_data[1] ), | 289 | HN( ifrs.ifr_hwaddr.sa_data[1] ), |
286 | LN( ifrs.ifr_hwaddr.sa_data[1] ), | 290 | LN( ifrs.ifr_hwaddr.sa_data[1] ), |
287 | HN( ifrs.ifr_hwaddr.sa_data[2] ), | 291 | HN( ifrs.ifr_hwaddr.sa_data[2] ), |
288 | LN( ifrs.ifr_hwaddr.sa_data[2] ), | 292 | LN( ifrs.ifr_hwaddr.sa_data[2] ), |
289 | HN( ifrs.ifr_hwaddr.sa_data[3] ), | 293 | HN( ifrs.ifr_hwaddr.sa_data[3] ), |
290 | LN( ifrs.ifr_hwaddr.sa_data[3] ), | 294 | LN( ifrs.ifr_hwaddr.sa_data[3] ), |
291 | HN( ifrs.ifr_hwaddr.sa_data[4] ), | 295 | HN( ifrs.ifr_hwaddr.sa_data[4] ), |
292 | LN( ifrs.ifr_hwaddr.sa_data[4] ), | 296 | LN( ifrs.ifr_hwaddr.sa_data[4] ), |
293 | HN( ifrs.ifr_hwaddr.sa_data[5] ), | 297 | HN( ifrs.ifr_hwaddr.sa_data[5] ), |
294 | LN( ifrs.ifr_hwaddr.sa_data[5] ), | 298 | LN( ifrs.ifr_hwaddr.sa_data[5] ), |
295 | HN( ifrs.ifr_hwaddr.sa_data[6] ), | 299 | HN( ifrs.ifr_hwaddr.sa_data[6] ), |
296 | LN( ifrs.ifr_hwaddr.sa_data[6] ), | 300 | LN( ifrs.ifr_hwaddr.sa_data[6] ), |
297 | HN( ifrs.ifr_hwaddr.sa_data[7] ), | 301 | HN( ifrs.ifr_hwaddr.sa_data[7] ), |
298 | LN( ifrs.ifr_hwaddr.sa_data[7] ), | 302 | LN( ifrs.ifr_hwaddr.sa_data[7] ), |
299 | HN( ifrs.ifr_hwaddr.sa_data[8] ), | 303 | HN( ifrs.ifr_hwaddr.sa_data[8] ), |
300 | LN( ifrs.ifr_hwaddr.sa_data[8] ), | 304 | LN( ifrs.ifr_hwaddr.sa_data[8] ), |
301 | HN( ifrs.ifr_hwaddr.sa_data[9] ), | 305 | HN( ifrs.ifr_hwaddr.sa_data[9] ), |
302 | LN( ifrs.ifr_hwaddr.sa_data[9] ), | 306 | LN( ifrs.ifr_hwaddr.sa_data[9] ), |
303 | HN( ifrs.ifr_hwaddr.sa_data[10] ), | 307 | HN( ifrs.ifr_hwaddr.sa_data[10] ), |
304 | LN( ifrs.ifr_hwaddr.sa_data[10] ), | 308 | LN( ifrs.ifr_hwaddr.sa_data[10] ), |
305 | HN( ifrs.ifr_hwaddr.sa_data[11] ), | 309 | HN( ifrs.ifr_hwaddr.sa_data[11] ), |
306 | LN( ifrs.ifr_hwaddr.sa_data[11] ), | 310 | LN( ifrs.ifr_hwaddr.sa_data[11] ), |
307 | HN( ifrs.ifr_hwaddr.sa_data[12] ), | 311 | HN( ifrs.ifr_hwaddr.sa_data[12] ), |
308 | LN( ifrs.ifr_hwaddr.sa_data[12] ), | 312 | LN( ifrs.ifr_hwaddr.sa_data[12] ), |
309 | HN( ifrs.ifr_hwaddr.sa_data[13] ), | 313 | HN( ifrs.ifr_hwaddr.sa_data[13] ), |
310 | LN( ifrs.ifr_hwaddr.sa_data[13] ) | 314 | LN( ifrs.ifr_hwaddr.sa_data[13] ) |
311 | ); | 315 | ); |
312 | break; | 316 | break; |
313 | #endif | 317 | #endif |
314 | case ARPHRD_PPP : // PPP | 318 | case ARPHRD_PPP : // PPP |
315 | break; | 319 | break; |
316 | case ARPHRD_IEEE80211 : // WLAN | 320 | case ARPHRD_IEEE80211 : // WLAN |
317 | break; | 321 | break; |
318 | case ARPHRD_IRDA : // IRDA | 322 | case ARPHRD_IRDA : // IRDA |
319 | break; | 323 | break; |
320 | } | 324 | } |
321 | } | 325 | } |
322 | } else // else already probed before -> just update | 326 | } else // else already probed before -> just update |
323 | Log(("OLDNIC %s\n", NicName.latin1())); | 327 | Log(("OLDNIC %s\n", NicName.latin1())); |
324 | 328 | ||
325 | // get dynamic info | 329 | // get dynamic info |
326 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { | 330 | if( ioctl(sockfd, SIOCGIFFLAGS, &ifrs) >= 0 ) { |
327 | IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); | 331 | IFI->IsUp = ((ifrs.ifr_flags & IFF_UP) == IFF_UP); |
328 | IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); | 332 | IFI->HasMulticast = ((ifrs.ifr_flags & IFF_MULTICAST) == IFF_MULTICAST); |
329 | } else { | 333 | } else { |
330 | IFI->IsUp = 0; | 334 | IFI->IsUp = 0; |
331 | IFI->HasMulticast = 0; | 335 | IFI->HasMulticast = 0; |
332 | } | 336 | } |
333 | 337 | ||
334 | if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { | 338 | if( ioctl(sockfd, SIOCGIFADDR, &ifrs) >= 0 ) { |
335 | IFI->Address = | 339 | IFI->Address = |
336 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); | 340 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_addr)->sin_addr); |
337 | } else { | 341 | } else { |
338 | IFI->Address = ""; | 342 | IFI->Address = ""; |
339 | IFI->IsUp = 0; | 343 | IFI->IsUp = 0; |
340 | } | 344 | } |
341 | if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { | 345 | if( ioctl(sockfd, SIOCGIFBRDADDR, &ifrs) >= 0 ) { |
342 | IFI->BCastAddress = | 346 | IFI->BCastAddress = |
343 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); | 347 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_broadaddr)->sin_addr); |
344 | } else { | 348 | } else { |
345 | IFI->BCastAddress = ""; | 349 | IFI->BCastAddress = ""; |
346 | } | 350 | } |
347 | if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { | 351 | if( ioctl(sockfd, SIOCGIFNETMASK, &ifrs) >= 0 ) { |
348 | IFI->Netmask = | 352 | IFI->Netmask = |
349 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); | 353 | inet_ntoa(((struct sockaddr_in*)&ifrs.ifr_netmask)->sin_addr); |
350 | } else { | 354 | } else { |
351 | IFI->Netmask = ""; | 355 | IFI->Netmask = ""; |
352 | } | 356 | } |
353 | Log(("NIC %s UP %d\n", NicName.latin1(), IFI->IsUp )); | 357 | Log(("NIC %s UP %d\n", NicName.latin1(), IFI->IsUp )); |
354 | } | 358 | } |
355 | } | 359 | } |
356 | 360 | ||
357 | void System::execAsUser( QString & Cmd, char * argv[] ) { | 361 | void System::execAsUser( QString & Cmd, char * argv[] ) { |
358 | CurrentQPEUser CU = NSResources->currentUser(); | 362 | CurrentQPEUser CU = NSResources->currentUser(); |
359 | 363 | ||
360 | if( CU.UserName.isEmpty() ) { | 364 | if( CU.UserName.isEmpty() ) { |
361 | // if we come here, the exec was not successfull | 365 | // if we come here, the exec was not successfull |
362 | Log(("User not known \n" )); | 366 | Log(("User not known \n" )); |
363 | return; | 367 | return; |
364 | } | 368 | } |
365 | 369 | ||
366 | // now we are ready to exec the requested command | 370 | // now we are ready to exec the requested command |
367 | setuid( CU.Uid ); | 371 | setuid( CU.Uid ); |
368 | setgid( CU.Gid ); | 372 | setgid( CU.Gid ); |
369 | 373 | ||
370 | char ** envp = (char **)alloca( sizeof( char *) * | 374 | char ** envp = (char **)alloca( sizeof( char *) * |
371 | (CU.EnvList.count()+1) ); | 375 | (CU.EnvList.count()+1) ); |
372 | 376 | ||
373 | for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { | 377 | for( unsigned int i = 0 ; i < CU.EnvList.count() ; i ++ ) { |
374 | *(envp+i) = CU.EnvList[i]; | 378 | *(envp+i) = CU.EnvList[i]; |
375 | } | 379 | } |
376 | envp[CU.EnvList.count()]=NULL; | 380 | envp[CU.EnvList.count()]=NULL; |
377 | 381 | ||
378 | execve( Cmd.latin1(), argv, envp ); | 382 | execve( Cmd.latin1(), argv, envp ); |
379 | 383 | ||
380 | // if we come here, the exec was not successfull | 384 | // if we come here, the exec was not successfull |
381 | Log(("Could not exec : %d\n", errno )); | 385 | Log(("Could not exec : %d\n", errno )); |
382 | } | 386 | } |
383 | 387 | ||
384 | #include <stdarg.h> | 388 | #include <stdarg.h> |
385 | static FILE * logf = 0; | 389 | static FILE * logf = 0; |
386 | 390 | ||
387 | void VLog( char * Format, ... ) { | 391 | void VLog( char * Format, ... ) { |
388 | va_list l; | 392 | va_list l; |
389 | 393 | ||
390 | va_start(l, Format ); | 394 | va_start(l, Format ); |
391 | 395 | ||
392 | if( logf == (FILE *)0 ) { | 396 | if( logf == (FILE *)0 ) { |
393 | if( getenv("NS2STDERR") ) { | 397 | if( getenv("NS2STDERR") ) { |
394 | logf = stderr; | 398 | logf = stderr; |
395 | } else { | 399 | } else { |
396 | logf = fopen( "/tmp/ns2log", "a" ); | 400 | logf = fopen( "/tmp/ns2log", "a" ); |
397 | } | 401 | } |
398 | if( ! logf ) { | 402 | if( ! logf ) { |
399 | fprintf( stderr, "Cannot open logfile /tmp/ns2log %d\n", | 403 | fprintf( stderr, "Cannot open logfile /tmp/ns2log %d\n", |
400 | errno ); | 404 | errno ); |
401 | logf = (FILE *)1; | 405 | logf = (FILE *)1; |
402 | } else { | 406 | } else { |
403 | fprintf( logf, "____ OPEN LOGFILE ____\n"); | 407 | fprintf( logf, "____ OPEN LOGFILE ____\n"); |
404 | } | 408 | } |
405 | } | 409 | } |
406 | 410 | ||
407 | if( (long)logf > 1 ) { | 411 | if( (long)logf > 1 ) { |
408 | vfprintf( logf, Format, l ); | 412 | vfprintf( logf, Format, l ); |
409 | } | 413 | } |
410 | va_end( l ); | 414 | va_end( l ); |
411 | 415 | ||
412 | } | 416 | } |
413 | 417 | ||
414 | void LogClose( void ) { | 418 | void LogClose( void ) { |
415 | if( (long)logf > 1 ) { | 419 | if( (long)logf > 1 ) { |
416 | fprintf( logf, "____ CLOSE LOGFILE ____\n"); | 420 | fprintf( logf, "____ CLOSE LOGFILE ____\n"); |
417 | if( logf != stderr ) { | 421 | if( logf != stderr ) { |
418 | fclose( logf ); | 422 | fclose( logf ); |
419 | } | 423 | } |
420 | logf = 0; | 424 | logf = 0; |
421 | } | 425 | } |
422 | } | 426 | } |
423 | 427 | ||
424 | QString removeSpaces( const QString & X ) { | 428 | QString removeSpaces( const QString & X ) { |
425 | QStringList SL; | 429 | QStringList SL; |
426 | 430 | ||
427 | SL = QStringList::split( " ", X ); | 431 | SL = QStringList::split( " ", X ); |
428 | return SL.join( "_" ); | 432 | return SL.join( "_" ); |
429 | } | 433 | } |