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 0000000..d804b39 --- /dev/null +++ b/libbb/create_icmp_socket.c @@ -0,0 +1,37 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * create raw socket for icmp protocol test permision + * and drop root privilegies if running setuid + * + */ + +#include <sys/types.h> +#include <netdb.h> +#include <sys/socket.h> +#include <errno.h> +#include <unistd.h> +#include "libbb.h" + +int create_icmp_socket(void) +{ + struct protoent *proto; + int sock; + + proto = getprotobyname("icmp"); + /* if getprotobyname failed, just silently force + * proto->p_proto to have the correct value for "icmp" */ + if ((sock = socket(AF_INET, SOCK_RAW, + (proto ? proto->p_proto : 1))) < 0) { /* 1 == ICMP */ + if (errno == EPERM) + error_msg_and_die("permission denied. (are you root?)"); + else + perror_msg_and_die(can_not_create_raw_socket); + } + + /* drop root privs if running setuid */ + setuid(getuid()); + + return sock; +} diff --git a/libbb/libbb.h b/libbb/libbb.h index 224c561..e3d7133 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h @@ -252,6 +252,7 @@ extern void gz_close(int gunzip_pid); extern FILE *gz_open(FILE *compressed_file, int *pid); extern struct hostent *xgethostbyname(const char *name); +extern int create_icmp_socket(void); char *dirname (const char *path); @@ -284,5 +285,6 @@ extern const char * const write_error; extern const char * const too_few_args; extern const char * const name_longer_than_foo; extern const char * const unknown; +extern const char * const can_not_create_raw_socket; #endif /* __LIBBB_H__ */ diff --git a/libbb/messages.c b/libbb/messages.c index 910cb8f..552c3ab 100644 --- a/libbb/messages.c +++ b/libbb/messages.c @@ -62,3 +62,6 @@ const char * const unknown = "(unknown)"; #endif +#ifdef L_can_not_create_raw_socket + const char * const can_not_create_raw_socket = "can`t create raw socket"; +#endif |