2 |
/* |
/* |
3 |
* Utility routines. |
* Utility routines. |
4 |
* |
* |
5 |
* create raw socket for icmp protocol test permission |
* create raw socket for icmp protocol |
6 |
* and drop root privileges if running setuid |
* and drop root privileges if running setuid |
|
* |
|
7 |
*/ |
*/ |
8 |
|
|
|
#include <sys/types.h> |
|
|
#include <netdb.h> |
|
|
#include <sys/socket.h> |
|
|
#include <errno.h> |
|
|
#include <unistd.h> |
|
9 |
#include "libbb.h" |
#include "libbb.h" |
10 |
|
|
11 |
int create_icmp_socket(void) |
int FAST_FUNC create_icmp_socket(void) |
12 |
{ |
{ |
|
struct protoent *proto; |
|
13 |
int sock; |
int sock; |
14 |
|
#if 0 |
15 |
|
struct protoent *proto; |
16 |
proto = getprotobyname("icmp"); |
proto = getprotobyname("icmp"); |
17 |
/* if getprotobyname failed, just silently force |
/* if getprotobyname failed, just silently force |
18 |
* proto->p_proto to have the correct value for "icmp" */ |
* proto->p_proto to have the correct value for "icmp" */ |
19 |
if ((sock = socket(AF_INET, SOCK_RAW, |
sock = socket(AF_INET, SOCK_RAW, |
20 |
(proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */ |
(proto ? proto->p_proto : 1)); /* 1 == ICMP */ |
21 |
|
#else |
22 |
|
sock = socket(AF_INET, SOCK_RAW, 1); /* 1 == ICMP */ |
23 |
|
#endif |
24 |
|
if (sock < 0) { |
25 |
if (errno == EPERM) |
if (errno == EPERM) |
26 |
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
27 |
else |
bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket); |
|
bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket); |
|
28 |
} |
} |
29 |
|
|
30 |
/* drop root privs if running setuid */ |
/* drop root privs if running setuid */ |