diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/create_icmp_socket.c | 37 | ||||
-rw-r--r-- | libbb/libbb.h | 2 | ||||
-rw-r--r-- | libbb/messages.c | 3 |
3 files changed, 42 insertions, 0 deletions
diff --git a/libbb/create_icmp_socket.c b/libbb/create_icmp_socket.c new file mode 100644 index 000000000..d804b3987 --- /dev/null +++ b/libbb/create_icmp_socket.c | |||
@@ -0,0 +1,37 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Utility routines. | ||
4 | * | ||
5 | * create raw socket for icmp protocol test permision | ||
6 | * and drop root privilegies if running setuid | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <sys/types.h> | ||
11 | #include <netdb.h> | ||
12 | #include <sys/socket.h> | ||
13 | #include <errno.h> | ||
14 | #include <unistd.h> | ||
15 | #include "libbb.h" | ||
16 | |||
17 | int create_icmp_socket(void) | ||
18 | { | ||
19 | struct protoent *proto; | ||
20 | int sock; | ||
21 | |||
22 | proto = getprotobyname("icmp"); | ||
23 | /* if getprotobyname failed, just silently force | ||
24 | * proto->p_proto to have the correct value for "icmp" */ | ||
25 | if ((sock = socket(AF_INET, SOCK_RAW, | ||
26 | (proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */ | ||
27 | if (errno == EPERM) | ||
28 | error_msg_and_die("permission denied. (are you root?)"); | ||
29 | else | ||
30 | perror_msg_and_die(can_not_create_raw_socket); | ||
31 | } | ||
32 | |||
33 | /* drop root privs if running setuid */ | ||
34 | setuid(getuid()); | ||
35 | |||
36 | return sock; | ||
37 | } | ||
diff --git a/libbb/libbb.h b/libbb/libbb.h index 224c561d5..e3d713321 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h | |||
@@ -252,6 +252,7 @@ extern void gz_close(int gunzip_pid); | |||
252 | extern FILE *gz_open(FILE *compressed_file, int *pid); | 252 | extern FILE *gz_open(FILE *compressed_file, int *pid); |
253 | 253 | ||
254 | extern struct hostent *xgethostbyname(const char *name); | 254 | extern struct hostent *xgethostbyname(const char *name); |
255 | extern int create_icmp_socket(void); | ||
255 | 256 | ||
256 | char *dirname (const char *path); | 257 | char *dirname (const char *path); |
257 | 258 | ||
@@ -284,5 +285,6 @@ extern const char * const write_error; | |||
284 | extern const char * const too_few_args; | 285 | extern const char * const too_few_args; |
285 | extern const char * const name_longer_than_foo; | 286 | extern const char * const name_longer_than_foo; |
286 | extern const char * const unknown; | 287 | extern const char * const unknown; |
288 | extern const char * const can_not_create_raw_socket; | ||
287 | 289 | ||
288 | #endif /* __LIBBB_H__ */ | 290 | #endif /* __LIBBB_H__ */ |
diff --git a/libbb/messages.c b/libbb/messages.c index 910cb8fa2..552c3ab5b 100644 --- a/libbb/messages.c +++ b/libbb/messages.c | |||
@@ -62,3 +62,6 @@ | |||
62 | const char * const unknown = "(unknown)"; | 62 | const char * const unknown = "(unknown)"; |
63 | #endif | 63 | #endif |
64 | 64 | ||
65 | #ifdef L_can_not_create_raw_socket | ||
66 | const char * const can_not_create_raw_socket = "can`t create raw socket"; | ||
67 | #endif | ||