diff options
-rw-r--r-- | networking/route.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/networking/route.c b/networking/route.c index 49d219ae0..59c756408 100644 --- a/networking/route.c +++ b/networking/route.c | |||
@@ -184,14 +184,33 @@ static void INET_setroute(int action, char **args) | |||
184 | 184 | ||
185 | { | 185 | { |
186 | const char *target = *args++; | 186 | const char *target = *args++; |
187 | char *prefix; | ||
187 | 188 | ||
189 | /* recognize x.x.x.x/mask format. */ | ||
190 | prefix = strchr(target, '/'); | ||
191 | if(prefix) { | ||
192 | int prefix_len; | ||
193 | |||
194 | prefix_len = bb_xgetularg10_bnd(prefix+1, 0, 32); | ||
195 | mask_in_addr(rt) = htonl( ~ (0xffffffffUL >> prefix_len)); | ||
196 | *prefix = '\0'; | ||
197 | #if HAVE_NEW_ADDRT | ||
198 | rt.rt_genmask.sa_family = AF_INET; | ||
199 | #endif | ||
200 | } else { | ||
201 | /* Default netmask. */ | ||
202 | netmask = bb_INET_default; | ||
203 | } | ||
188 | /* Prefer hostname lookup is -host flag (xflag==1) was given. */ | 204 | /* Prefer hostname lookup is -host flag (xflag==1) was given. */ |
189 | isnet = INET_resolve(target, (struct sockaddr_in *) &rt.rt_dst, | 205 | isnet = INET_resolve(target, (struct sockaddr_in *) &rt.rt_dst, |
190 | (xflag & HOST_FLAG)); | 206 | (xflag & HOST_FLAG)); |
191 | if (isnet < 0) { | 207 | if (isnet < 0) { |
192 | bb_error_msg_and_die("resolving %s", target); | 208 | bb_error_msg_and_die("resolving %s", target); |
193 | } | 209 | } |
194 | 210 | if(prefix) { | |
211 | /* do not destroy prefix for process args */ | ||
212 | *prefix = '/'; | ||
213 | } | ||
195 | } | 214 | } |
196 | 215 | ||
197 | if (xflag) { /* Reinit isnet if -net or -host was specified. */ | 216 | if (xflag) { /* Reinit isnet if -net or -host was specified. */ |
@@ -201,8 +220,6 @@ static void INET_setroute(int action, char **args) | |||
201 | /* Fill in the other fields. */ | 220 | /* Fill in the other fields. */ |
202 | rt.rt_flags = ((isnet) ? RTF_UP : (RTF_UP | RTF_HOST)); | 221 | rt.rt_flags = ((isnet) ? RTF_UP : (RTF_UP | RTF_HOST)); |
203 | 222 | ||
204 | netmask = bb_INET_default; | ||
205 | |||
206 | while (*args) { | 223 | while (*args) { |
207 | int k = kw_lookup(tbl_ipvx, &args); | 224 | int k = kw_lookup(tbl_ipvx, &args); |
208 | const char *args_m1 = args[-1]; | 225 | const char *args_m1 = args[-1]; |