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