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