[PATCH] bsp/pc386: Fix --console=/--printk argument parsing.
Chris Johns
chrisj at rtems.org
Wed Mar 30 04:56:36 UTC 2016
---
.../lib/libbsp/i386/pc386/console/console_select.c | 62 ++++++++++++++--------
1 file changed, 41 insertions(+), 21 deletions(-)
diff --git a/c/src/lib/libbsp/i386/pc386/console/console_select.c b/c/src/lib/libbsp/i386/pc386/console/console_select.c
index 3fb31ec..7b40f97 100644
--- a/c/src/lib/libbsp/i386/pc386/console/console_select.c
+++ b/c/src/lib/libbsp/i386/pc386/console/console_select.c
@@ -33,6 +33,8 @@
#include <crt.h>
#endif
+#include <bsp/bspimpl.h>
+
/*
* Forward prototype
*/
@@ -137,14 +139,19 @@ static void parse_com1_com4_enable(void)
}
}
+extern char* bsp_boot_cmdline;
+
static bool parse_printk_or_console(
const char *param,
rtems_device_minor_number *minor_out
)
{
- static const char *opt;
- char working[64] = "";
- char *p;
+ static const char *opt;
+ const char *option;
+ const char *comma;
+ size_t length;
+ size_t index;
+ rtems_device_minor_number minor;
/*
* Check the command line for the type of mode the console is.
@@ -155,30 +162,43 @@ static bool parse_printk_or_console(
}
/*
- * bsp_cmdline_arg() returns pointer to a string. It may not be the
- * last string on the command line.
+ * Fine the length, there can be more command line visible.
*/
- strncpy( working, opt, sizeof(working) );
- p = strchr( working, ' ' );
- if ( p ) {
- *p = '\0';
+ length = 0;
+ while ((opt[length] != ' ') && (opt[length] != '\0')) {
+ ++length;
+ if (length > NAME_MAX) {
+ printk("invalid option (%s): too long\n", param);
+ return false;
+ }
}
- const char *comma;
- size_t length = NAME_MAX;
- rtems_device_minor_number minor;
- char *option = working;
-
/*
* Only match up to a comma or NULL
*/
- comma = strchr (option, ',');
+ index = 0;
+ while ((opt[index] != '=') && (index < length)) {
+ ++index;
+ }
+
+ if (opt[index] != '=') {
+ printk("invalid option (%s): no equals\n", param);
+ return false;
+ }
+
+ ++index;
+ option = &opt[index];
- if ( comma ) {
- length = comma - option;
+ while ((opt[index] != ',') && (index < length)) {
+ ++index;
}
- option += strnlen(param, 32);
+ if (opt[index] == ',')
+ comma = &opt[index];
+ else
+ comma = NULL;
+
+ length = &opt[index] - option;
if ( !bsp_find_console_entry( option, length, &minor ) ) {
return false;
@@ -186,10 +206,10 @@ static bool parse_printk_or_console(
*minor_out = minor;
if (comma) {
- console_tbl *conscfg;
+ console_tbl *conscfg = &Console_Configuration_Ports[minor];
+
+ option = comma + 1;
- comma += 1;
- conscfg = &Console_Configuration_Ports[minor];
if (strncmp (option, "115200", sizeof ("115200") - 1) == 0)
conscfg->pDeviceParams = (void *)115200;
else if (strncmp (option, "57600", sizeof ("57600") - 1) == 0)
--
2.3.0
More information about the devel
mailing list