The "arp" command now supports flushing all temporary entries using the new
-F option. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25264 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+24
-12
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2006, Haiku, Inc. All Rights Reserved.
|
* Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -32,8 +32,7 @@ enum modes {
|
|||||||
ARP_LIST = 0,
|
ARP_LIST = 0,
|
||||||
ARP_DELETE,
|
ARP_DELETE,
|
||||||
ARP_SET,
|
ARP_SET,
|
||||||
ARP_SET_FROM_FILE,
|
ARP_SET_FROM_FILE
|
||||||
ARP_FLUSH,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ parse_inet_address(const char* string, sockaddr_in& address)
|
|||||||
if (inet_aton(string, &inetAddress) != 1)
|
if (inet_aton(string, &inetAddress) != 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
address.sin_family = AF_INET;
|
address.sin_family = AF_INET;
|
||||||
address.sin_len = sizeof(struct sockaddr_in);
|
address.sin_len = sizeof(struct sockaddr_in);
|
||||||
address.sin_port = 0;
|
address.sin_port = 0;
|
||||||
address.sin_addr = inetAddress;
|
address.sin_addr = inetAddress;
|
||||||
@@ -85,7 +84,7 @@ check_for_arp_syscall(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
static void
|
||||||
usage(int status)
|
usage(int status)
|
||||||
{
|
{
|
||||||
printf("usage: %s [<command>] [<hostname>] [<ethernet-address>] [temp] [pub]\n"
|
printf("usage: %s [<command>] [<hostname>] [<ethernet-address>] [temp] [pub]\n"
|
||||||
@@ -95,6 +94,7 @@ usage(int status)
|
|||||||
" -d - deletes the specified ARP cache entry\n"
|
" -d - deletes the specified ARP cache entry\n"
|
||||||
" -a - list all entries [default]\n"
|
" -a - list all entries [default]\n"
|
||||||
" -f - read ARP entries from file\n"
|
" -f - read ARP entries from file\n"
|
||||||
|
" -F - flush all temporary ARP entries\n"
|
||||||
"The ethernet address is specified by six hex bytes separated by colons.\n"
|
"The ethernet address is specified by six hex bytes separated by colons.\n"
|
||||||
"When setting a new ARP cache entry, \"temp\" creates a temporary entry\n"
|
"When setting a new ARP cache entry, \"temp\" creates a temporary entry\n"
|
||||||
"that will be removed after a timeout, and \"pub\" will cause ARP to\n"
|
"that will be removed after a timeout, and \"pub\" will cause ARP to\n"
|
||||||
@@ -107,7 +107,7 @@ usage(int status)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
static bool
|
||||||
set_flags(uint32 &flags, const char *argument)
|
set_flags(uint32 &flags, const char *argument)
|
||||||
{
|
{
|
||||||
if (!strcmp(argument, "temp") || !strcmp(argument, "temporary"))
|
if (!strcmp(argument, "temp") || !strcmp(argument, "temporary"))
|
||||||
@@ -153,7 +153,7 @@ next_argument(char **_line)
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
void
|
static void
|
||||||
list_entry(arp_control &control)
|
list_entry(arp_control &control)
|
||||||
{
|
{
|
||||||
in_addr address;
|
in_addr address;
|
||||||
@@ -190,7 +190,7 @@ list_entry(arp_control &control)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
static void
|
||||||
list_entries(sockaddr_in *address)
|
list_entries(sockaddr_in *address)
|
||||||
{
|
{
|
||||||
arp_control control;
|
arp_control control;
|
||||||
@@ -217,7 +217,7 @@ list_entries(sockaddr_in *address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
static void
|
||||||
delete_entry(sockaddr_in *address)
|
delete_entry(sockaddr_in *address)
|
||||||
{
|
{
|
||||||
arp_control control;
|
arp_control control;
|
||||||
@@ -233,7 +233,7 @@ delete_entry(sockaddr_in *address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
static status_t
|
||||||
set_entry(sockaddr_in *address, uint8 *ethernetAddress, uint32 flags)
|
set_entry(sockaddr_in *address, uint8 *ethernetAddress, uint32 flags)
|
||||||
{
|
{
|
||||||
arp_control control;
|
arp_control control;
|
||||||
@@ -246,7 +246,7 @@ set_entry(sockaddr_in *address, uint8 *ethernetAddress, uint32 flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
static int
|
||||||
set_entries_from_file(const char *filename)
|
set_entries_from_file(const char *filename)
|
||||||
{
|
{
|
||||||
FILE *file = fopen(filename, "r");
|
FILE *file = fopen(filename, "r");
|
||||||
@@ -333,6 +333,16 @@ set_entries_from_file(const char *filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
flush_entries()
|
||||||
|
{
|
||||||
|
arp_control control;
|
||||||
|
|
||||||
|
_kern_generic_syscall(ARP_SYSCALLS, ARP_FLUSH_ENTRIES,
|
||||||
|
&control, sizeof(arp_control));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@@ -369,7 +379,9 @@ main(int argc, char** argv)
|
|||||||
if (argc != 2)
|
if (argc != 2)
|
||||||
usage(1);
|
usage(1);
|
||||||
|
|
||||||
mode = ARP_FLUSH;
|
check_for_arp_syscall();
|
||||||
|
flush_entries();
|
||||||
|
return 0;
|
||||||
} else if (!strcmp(argv[1], "-f")) {
|
} else if (!strcmp(argv[1], "-f")) {
|
||||||
// set from file
|
// set from file
|
||||||
if (argc != 3)
|
if (argc != 3)
|
||||||
|
|||||||
Reference in New Issue
Block a user