Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
AndroidSystemCore
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container registry
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Werner Sembach
AndroidSystemCore
Commits
5e924468
Commit
5e924468
authored
Jun 29, 2009
by
Android (Google) Code Review
Browse files
Options
Downloads
Plain Diff
Merge change 5662 into donut
* changes: toolbox: Revise route utility.
parents
4322f2d7
4a1465fe
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
toolbox/route.c
+79
-106
79 additions, 106 deletions
toolbox/route.c
with
79 additions
and
106 deletions
toolbox/route.c
+
79
−
106
View file @
5e924468
/*
* Copyright (c) 2009, The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<unistd.h>
#include
<stdarg.h>
#include
<errno.h>
#include
<string.h>
#include
<ctype.h>
#include
<errno.h>
#include
<sys/ioctl.h>
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<linux/if.h>
#include
<linux/sockios.h>
#include
<arpa/inet.h>
#include
<linux/route.h>
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
p
;
va_start
(
p
,
fmt
);
fprintf
(
stderr
,
"error(%s): "
,
strerror
(
errno
));
fprintf
(
stderr
,
fmt
,
p
);
va_end
(
p
);
exit
(
-
1
);
static
inline
int
set_address
(
const
char
*
address
,
struct
sockaddr
*
sa
)
{
return
inet_aton
(
address
,
&
((
struct
sockaddr_in
*
)
sa
)
->
sin_addr
);
}
static
inline
void
init_sockaddr_in
(
struct
sockaddr_in
*
sin
,
const
char
*
addr
)
{
sin
->
sin_family
=
AF_INET
;
sin
->
sin_port
=
0
;
sin
->
sin_addr
.
s_addr
=
inet_addr
(
addr
);
}
#define ADVANCE(argc, argv) do { argc--, argv++; } while(0)
#define EXPECT_NEXT(argc, argv) do { \
ADVANCE(argc, argv); \
if (0 == argc) { \
errno = EINVAL; \
die("expecting one more argument"); \
} \
} while(0)
/* current support the following routing entries */
/* route add default dev wlan0 */
/* route add default gw 192.168.
20
.1 dev wlan0 */
/* route add net 192.168.1.
1
netmask 255.255.255.0 gw 1
7
2.
24.192
.1
0
*/
/* route add default gw 192.168.
1
.1 dev wlan0 */
/* route add
-
net 192.168.1.
2
netmask 255.255.255.0 gw 1
9
2.
168.1
.1 */
int
route_main
(
int
argc
,
char
*
argv
[])
{
struct
ifreq
ifr
;
int
s
,
i
;
struct
rtentry
rt
;
struct
sockaddr_in
ina
;
if
(
!
argc
)
return
0
;
strncpy
(
ifr
.
ifr_name
,
argv
[
0
],
IFNAMSIZ
);
ifr
.
ifr_name
[
IFNAMSIZ
-
1
]
=
0
;
ADVANCE
(
argc
,
argv
);
if
((
s
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
))
<
0
)
{
die
(
"cannot open control socket
\n
"
);
struct
rtentry
rt
=
{
.
rt_dst
=
{.
sa_family
=
AF_INET
},
.
rt_genmask
=
{.
sa_family
=
AF_INET
},
.
rt_gateway
=
{.
sa_family
=
AF_INET
},
};
errno
=
EINVAL
;
if
(
argc
>
2
&&
!
strcmp
(
argv
[
1
],
"add"
))
{
if
(
!
strcmp
(
argv
[
2
],
"default"
))
{
/* route add default dev wlan0 */
if
(
argc
>
4
&&
!
strcmp
(
argv
[
3
],
"dev"
))
{
rt
.
rt_flags
=
RTF_UP
|
RTF_HOST
;
rt
.
rt_dev
=
argv
[
4
];
errno
=
0
;
goto
apply
;
}
while
(
argc
>
0
){
if
(
!
strcmp
(
argv
[
0
],
"add"
))
{
EXPECT_NEXT
(
argc
,
argv
);
if
(
!
strcmp
(
argv
[
0
],
"default"
))
{
EXPECT_NEXT
(
argc
,
argv
);
memset
((
char
*
)
&
rt
,
0
,
sizeof
(
struct
rtentry
));
rt
.
rt_dst
.
sa_family
=
AF_INET
;
if
(
!
strcmp
(
argv
[
0
],
"dev"
))
{
EXPECT_NEXT
(
argc
,
argv
);
rt
.
rt_flags
=
RTF_UP
|
RTF_HOST
;
rt
.
rt_dev
=
argv
[
0
];
if
(
ioctl
(
s
,
SIOCADDRT
,
&
rt
)
<
0
)
die
(
"SIOCADDRT
\n
"
);
}
else
if
(
!
strcmp
(
argv
[
0
],
"gw"
))
{
EXPECT_NEXT
(
argc
,
argv
);
/* route add default gw 192.168.1.1 dev wlan0 */
if
(
argc
>
6
&&
!
strcmp
(
argv
[
3
],
"gw"
)
&&
!
strcmp
(
argv
[
5
],
"dev"
))
{
rt
.
rt_flags
=
RTF_UP
|
RTF_GATEWAY
;
init_sockaddr_in
((
struct
sockaddr_in
*
)
&
(
rt
.
rt_genmask
),
"0.0.0.0"
);
if
(
isdigit
(
argv
[
0
][
0
]))
{
init_sockaddr_in
((
struct
sockaddr_in
*
)
&
(
rt
.
rt_gateway
),
argv
[
0
]);
}
else
{
die
(
"expecting an IP address for parameter
\"
gw
\"\n
"
);
}
EXPECT_NEXT
(
argc
,
argv
);
if
(
!
strcmp
(
argv
[
0
],
"dev"
))
{
EXPECT_NEXT
(
argc
,
argv
);
rt
.
rt_dev
=
argv
[
0
];
if
(
ioctl
(
s
,
SIOCADDRT
,
&
rt
)
<
0
)
{
die
(
"SIOCADDRT
\n
"
);
rt
.
rt_dev
=
argv
[
6
];
if
(
set_address
(
argv
[
4
],
&
rt
.
rt_gateway
))
{
errno
=
0
;
}
goto
apply
;
}
}
}
else
{
char
keywords
[
3
][
10
]
=
{
"-net"
,
"netmask"
,
"gw"
};
struct
sockaddr_in
*
paddr
[
3
]
=
{
&
rt
.
rt_dst
,
&
rt
.
rt_genmask
,
&
rt
.
rt_gateway
};
int
k
=
0
;
memset
((
char
*
)
&
rt
,
0
,
sizeof
(
struct
rtentry
));
/* route add -net 192.168.1.2 netmask 255.255.255.0 gw 192.168.1.1 */
if
(
argc
>
7
&&
!
strcmp
(
argv
[
2
],
"-net"
)
&&
!
strcmp
(
argv
[
4
],
"netmask"
)
&&
!
strcmp
(
argv
[
6
],
"gw"
))
{
rt
.
rt_flags
=
RTF_UP
|
RTF_GATEWAY
;
do
{
if
(
!
strcmp
(
argv
[
0
],
keywords
[
k
]))
{
EXPECT_NEXT
(
argc
,
argv
);
if
(
isdigit
(
argv
[
0
][
0
]))
{
init_sockaddr_in
(
paddr
[
k
],
argv
[
0
]);
}
else
{
die
(
"expecting an IP/MASK address for parameter %s
\n
"
,
keywords
[
k
]);
}
if
(
k
<
2
)
EXPECT_NEXT
(
argc
,
argv
);
}
else
{
die
(
"expecting keyword(s)
\n
"
);
}
}
while
(
++
k
<
3
);
if
(
ioctl
(
s
,
SIOCADDRT
,
&
rt
)
<
0
)
{
die
(
"SIOCADDRT
\n
"
);
if
(
set_address
(
argv
[
3
],
&
rt
.
rt_dst
)
&&
set_address
(
argv
[
5
],
&
rt
.
rt_genmask
)
&&
set_address
(
argv
[
7
],
&
rt
.
rt_gateway
))
{
errno
=
0
;
}
goto
apply
;
}
}
ADVANCE
(
argc
,
argv
);
}
apply:
if
(
!
errno
)
{
int
s
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
if
(
s
!=
-
1
&&
(
ioctl
(
s
,
SIOCADDRT
,
&
rt
)
!=
-
1
||
errno
==
EEXIST
))
{
return
0
;
}
}
puts
(
strerror
(
errno
));
return
errno
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment