summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/ctype.c48
-rw-r--r--src/core/exec.c5
-rw-r--r--src/core/misc.c15
-rw-r--r--src/image/script.c8
-rw-r--r--src/include/ctype.h2
5 files changed, 59 insertions, 19 deletions
diff --git a/src/core/ctype.c b/src/core/ctype.c
new file mode 100644
index 00000000..6185bb2f
--- /dev/null
+++ b/src/core/ctype.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/**
+ * @file
+ *
+ * Character types
+ *
+ */
+
+#include <ctype.h>
+
+/**
+ * Check to see if character is a space
+ *
+ * @v c Character
+ * @ret isspace Character is a space
+ */
+int isspace ( int c ) {
+ switch ( c ) {
+ case ' ' :
+ case '\f' :
+ case '\n' :
+ case '\r' :
+ case '\t' :
+ case '\v' :
+ return 1;
+ default:
+ return 0;
+ }
+}
diff --git a/src/core/exec.c b/src/core/exec.c
index 25c578d5..6c16aa44 100644
--- a/src/core/exec.c
+++ b/src/core/exec.c
@@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include <ctype.h>
#include <unistd.h>
#include <getopt.h>
#include <errno.h>
@@ -170,7 +171,7 @@ static int split_args ( char *args, char * argv[] ) {
while ( 1 ) {
/* Skip over any whitespace / convert to NUL */
- while ( *args == ' ' ) {
+ while ( isspace ( *args ) ) {
if ( argv )
*args = '\0';
args++;
@@ -183,7 +184,7 @@ static int split_args ( char *args, char * argv[] ) {
argv[argc] = args;
argc++;
/* Skip to start of next whitespace, if any */
- while ( *args && ( *args != ' ' ) ) {
+ while ( *args && ! isspace ( *args ) ) {
args++;
}
}
diff --git a/src/core/misc.c b/src/core/misc.c
index 5a82c85c..c19591bb 100644
--- a/src/core/misc.c
+++ b/src/core/misc.c
@@ -5,6 +5,7 @@ MISC Support Routines
FILE_LICENCE ( GPL2_OR_LATER );
#include <stdlib.h>
+#include <ctype.h>
#include <byteswap.h>
#include <gpxe/in.h>
#include <gpxe/timer.h>
@@ -32,20 +33,6 @@ int inet_aton ( const char *cp, struct in_addr *inp ) {
return 0;
}
-int isspace ( int c ) {
- switch ( c ) {
- case ' ':
- case '\f':
- case '\n':
- case '\r':
- case '\t':
- case '\v':
- return 1;
- default:
- return 0;
- }
-}
-
unsigned long strtoul ( const char *p, char **endp, int base ) {
unsigned long ret = 0;
unsigned int charval;
diff --git a/src/image/script.c b/src/image/script.c
index e94303ab..0835ecb5 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
#include <errno.h>
#include <gpxe/image.h>
@@ -90,8 +91,8 @@ static int script_exec ( struct image *image ) {
* @ret rc Return status code
*/
static int script_load ( struct image *image ) {
- static const char magic[] = "#!gpxe\n";
- char test[ sizeof ( magic ) - 1 ];
+ static const char magic[] = "#!gpxe";
+ char test[ sizeof ( magic ) - 1 /* NUL */ + 1 /* terminating space */];
/* Sanity check */
if ( image->len < sizeof ( test ) ) {
@@ -101,7 +102,8 @@ static int script_load ( struct image *image ) {
/* Check for magic signature */
copy_from_user ( test, image->data, 0, sizeof ( test ) );
- if ( memcmp ( test, magic, sizeof ( test ) ) != 0 ) {
+ if ( ( memcmp ( test, magic, ( sizeof ( test ) - 1 ) ) != 0 ) ||
+ ! isspace ( test[ sizeof ( test ) - 1 ] ) ) {
DBG ( "Invalid magic signature\n" );
return -ENOEXEC;
}
diff --git a/src/include/ctype.h b/src/include/ctype.h
index 8a04f47e..ed4d8846 100644
--- a/src/include/ctype.h
+++ b/src/include/ctype.h
@@ -26,4 +26,6 @@ static inline unsigned char toupper(unsigned char c)
return c;
}
+extern int isspace ( int c );
+
#endif /* _CTYPE_H */