diff options
| author | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-07-12 20:26:32 +0000 |
|---|---|---|
| committer | andersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-07-12 20:26:32 +0000 |
| commit | 7baffca714b6264cd5cfd05c314a59aeea938f8f (patch) | |
| tree | 10dcece1e0bb88e35aa95c3a68896ad426e43f7a /libbb | |
| parent | 2e2b0c24a40ade30387df0a9114a8ce5c77f059f (diff) | |
| download | busybox-w32-7baffca714b6264cd5cfd05c314a59aeea938f8f.tar.gz busybox-w32-7baffca714b6264cd5cfd05c314a59aeea938f8f.tar.bz2 busybox-w32-7baffca714b6264cd5cfd05c314a59aeea938f8f.zip | |
Patch from vodz:
Changed email address
cmdedit API change
optimizations for traceroute and md5sum
added a new shared create_icmp_socket() function
git-svn-id: svn://busybox.net/trunk/busybox@3078 69ca8d6d-28ef-0310-b511-8ec308f3f277
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 | ||
