aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/route.c23
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];