X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..91447636331957f3d9b5ca5b508f07c526b0074d:/pexpert/gen/bootargs.c?ds=inline diff --git a/pexpert/gen/bootargs.c b/pexpert/gen/bootargs.c index 70463e769..09272e238 100644 --- a/pexpert/gen/bootargs.c +++ b/pexpert/gen/bootargs.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -28,10 +28,19 @@ extern int getval(char *s, int *val); #define NUM 0 #define STR 1 -boolean_t +boolean_t PE_parse_boot_arg( - char *arg_string, - void *arg_ptr) + const char *arg_string, + void *arg_ptr) +{ + return PE_parse_boot_argn(arg_string, arg_ptr, -1); +} + +boolean_t +PE_parse_boot_argn( + const char *arg_string, + void *arg_ptr, + int max_len) { char *args; char *cp, c; @@ -77,7 +86,13 @@ PE_parse_boot_arg( args = cp+1; goto gotit; } - + if ('_' == *arg_string) /* Force a string copy if the argument name begins with an underscore */ + { + int hacklen = 16 > max_len ? 16 : max_len; + argstrcpy2 (++cp, (char *)arg_ptr, hacklen); /* Hack - terminate after 16 characters */ + arg_found = TRUE; + break; + } switch (getval(cp, &val)) { case NUM: @@ -85,7 +100,10 @@ PE_parse_boot_arg( arg_found = TRUE; break; case STR: - argstrcpy(++cp, (char *)arg_ptr); + if(max_len > 0) //max_len of 0 performs no copy at all + argstrcpy2(++cp, (char *)arg_ptr, max_len); + else if(max_len == -1) + argstrcpy(++cp, (char *)arg_ptr); arg_found = TRUE; break; } @@ -126,6 +144,22 @@ argstrcpy( return(i); } +int +argstrcpy2( + char *from, + char *to, + unsigned maxlen) +{ + int i = 0; + + while (!isargsep(*from) && i < maxlen) { + i++; + *to++ = *from++; + } + *to = 0; + return(i); +} + int getval( char *s, @@ -172,6 +206,12 @@ getval( c -= 'a' - 10; else if ((c >= 'A') && (c <= 'F')) c -= 'A' - 10; + else if (c == 'k' || c == 'K') + { sign *= 1024; break; } + else if (c == 'm' || c == 'M') + { sign *= 1024 * 1024; break; } + else if (c == 'g' || c == 'G') + { sign *= 1024 * 1024 * 1024; break; } else if (isargsep(c)) break; else