summaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-08-19 21:15:42 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-08-19 21:15:42 +0000
commitd867f32a7aefe6694dbbc4c6370a36a30bfc8318 (patch)
tree3257bc9edfcce45db949620da0dbc9e3a6b817cd /networking
parent921799da4ec72eb353240e315b456171d2581d46 (diff)
downloadbusybox-w32-d867f32a7aefe6694dbbc4c6370a36a30bfc8318.tar.gz
busybox-w32-d867f32a7aefe6694dbbc4c6370a36a30bfc8318.tar.bz2
busybox-w32-d867f32a7aefe6694dbbc4c6370a36a30bfc8318.zip
httpd: explain IP/mask parsing, and simplify it a bit.
parse_conf 1258 1247 -11 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-11) Total: -11 bytes text data bss dec hex filename 772602 1058 11092 784752 bf970 busybox_old 772594 1058 11092 784744 bf968 busybox_unstripped
Diffstat (limited to 'networking')
-rw-r--r--networking/httpd.c81
1 files changed, 48 insertions, 33 deletions
diff --git a/networking/httpd.c b/networking/httpd.c
index a7473ede9..0b4e305d9 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -289,17 +289,26 @@ static ALWAYS_INLINE void free_Htaccess_IP_list(Htaccess_IP **pptr)
289 free_llist((has_next_ptr**)pptr); 289 free_llist((has_next_ptr**)pptr);
290} 290}
291 291
292static int scan_ip(const char **ep, unsigned *ip, unsigned char endc) 292//#undef isdigit
293//#define isdigit(a) ((unsigned)((a) - '0') <= 9)
294//#define notdigit(a) ((unsigned)((a) - '0') > 9)
295
296/* Returns presumed mask width in bits or < 0 on error.
297 * Updates strp, stores IP at provided pointer */
298static int scan_ip(const char **strp, unsigned *ipp, unsigned char endc)
293{ 299{
294 const char *p = *ep; 300 const char *p = *strp;
295 int auto_mask = 8; 301 int auto_mask = 8;
302 unsigned ip = 0;
296 int j; 303 int j;
297 304
298 *ip = 0; 305 if (*p == '/')
306 return -auto_mask;
307
299 for (j = 0; j < 4; j++) { 308 for (j = 0; j < 4; j++) {
300 unsigned octet; 309 unsigned octet;
301 310
302 if ((*p < '0' || *p > '9') && (*p != '/' || j == 0) && *p != '\0') 311 if ((*p < '0' || *p > '9') && *p != '/' && *p)
303 return -auto_mask; 312 return -auto_mask;
304 octet = 0; 313 octet = 0;
305 while (*p >= '0' && *p <= '9') { 314 while (*p >= '0' && *p <= '9') {
@@ -311,55 +320,61 @@ static int scan_ip(const char **ep, unsigned *ip, unsigned char endc)
311 } 320 }
312 if (*p == '.') 321 if (*p == '.')
313 p++; 322 p++;
314 if (*p != '/' && *p != '\0') 323 if (*p != '/' && *p)
315 auto_mask += 8; 324 auto_mask += 8;
316 *ip = ((*ip) << 8) | octet; 325 ip = (ip << 8) | octet;
317 } 326 }
318 if (*p != '\0') { 327 if (*p) {
319 if (*p != endc) 328 if (*p != endc)
320 return -auto_mask; 329 return -auto_mask;
321 p++; 330 p++;
322 if (*p == '\0') 331 if (*p == '\0')
323 return -auto_mask; 332 return -auto_mask;
324 } 333 }
325 *ep = p; 334 *ipp = ip;
335 *strp = p;
326 return auto_mask; 336 return auto_mask;
327} 337}
328 338
329static int scan_ip_mask(const char *ipm, unsigned *ip, unsigned *mask) 339/* Returns 0 on success. Stores IP and mask at provided pointers */
340static int scan_ip_mask(const char *str, unsigned *ipp, unsigned *maskp)
330{ 341{
331 int i; 342 int i;
332 unsigned msk; 343 unsigned mask;
344 char *p;
333 345
334 i = scan_ip(&ipm, ip, '/'); 346 i = scan_ip(&str, ipp, '/');
335 if (i < 0) 347 if (i < 0)
336 return i; 348 return i;
337 if (*ipm) { 349
338 const char *p = ipm; 350 if (*str) {
339 351 /* there is /xxx after dotted-IP address */
340 i = 0; 352 i = bb_strtou(str, &p, 10);
341 while (*p) { 353 if (*p == '.') {
342 if (*p < '0' || *p > '9') { 354 /* 'xxx' itself is dotted-IP mask, parse it */
343 if (*p == '.') { 355 /* (return 0 (success) only if it has N.N.N.N form) */
344 i = scan_ip(&ipm, mask, 0); 356 return scan_ip(&str, maskp, '\0') - 32;
345 return i != 32;
346 }
347 return -1;
348 }
349 i *= 10;
350 i += *p - '0';
351 p++;
352 } 357 }
358 if (*p)
359 return -1;
353 } 360 }
354 if (i > 32 || i < 0) 361
362 if (i > 32)
355 return -1; 363 return -1;
356 msk = 0x80000000; 364
357 *mask = 0; 365 if (sizeof(unsigned) == 4 && i == 32) {
358 while (i > 0) { 366 /* mask >>= 32 below may not work */
359 *mask |= msk; 367 mask = 0;
360 msk >>= 1; 368 } else {
361 i--; 369 mask = 0xffffffff;
370 mask >>= i;
362 } 371 }
372 /* i == 0 -> *maskp = 0x00000000
373 * i == 1 -> *maskp = 0x80000000
374 * i == 4 -> *maskp = 0xf0000000
375 * i == 31 -> *maskp = 0xfffffffe
376 * i == 32 -> *maskp = 0xffffffff */
377 *maskp = (uint32_t)(~mask);
363 return 0; 378 return 0;
364} 379}
365 380