return rc;
}
+/**
+ * Concatenate arguments
+ *
+ * @v args Argument list (NULL-terminated)
+ * @ret string Concatenated arguments
+ *
+ * The returned string is allocated with malloc(). The caller is
+ * responsible for eventually free()ing this string.
+ */
+char * concat_args ( char **args ) {
+ char **arg;
+ size_t len;
+ char *string;
+ char *ptr;
+
+ /* Calculate total string length */
+ len = 1 /* NUL */;
+ for ( arg = args ; *arg ; arg++ )
+ len += ( 1 /* possible space */ + strlen ( *arg ) );
+
+ /* Allocate string */
+ string = zalloc ( len );
+ if ( ! string )
+ return NULL;
+
+ /* Populate string */
+ ptr = string;
+ for ( arg = args ; *arg ; arg++ ) {
+ ptr += sprintf ( ptr, "%s%s",
+ ( ( ptr == string ) ? "" : " " ), *arg );
+ }
+ assert ( ptr < ( string + len ) );
+
+ return string;
+}
+
/**
* "echo" command
*
* @v argv Argument list
* @ret rc Return status code
*/
-static int echo_exec ( int argc, char **argv ) {
- int i;
+static int echo_exec ( int argc __unused, char **argv ) {
+ char *text;
- for ( i = 1 ; i < argc ; i++ ) {
- printf ( "%s%s", ( ( i == 1 ) ? "" : " " ), argv[i] );
- }
- printf ( "\n" );
+ text = concat_args ( &argv[1] );
+ if ( ! text )
+ return -ENOMEM;
+ printf ( "%s\n", text );
+ free ( text );
return 0;
}
* Fill in image command line
*
* @v image Image
- * @v nargs Argument count
* @v args Argument list
* @ret rc Return status code
*/
-static int imgfill_cmdline ( struct image *image, unsigned int nargs,
- char **args ) {
- size_t len = 0;
- unsigned int i;
-
- /* Clear command line if no arguments given */
- if ( ! nargs )
- return image_set_cmdline ( image, NULL );
-
- /* Determine total length of command line */
- for ( i = 0 ; i < nargs ; i++ )
- len += ( strlen ( args[i] ) + 1 /* space or NUL */ );
-
- {
- char buf[len];
- char *ptr = buf;
-
- /* Assemble command line */
- buf[0] = '\0';
- for ( i = 0 ; i < nargs ; i++ ) {
- ptr += sprintf ( ptr, "%s%s", ( i ? " " : "" ),
- args[i] );
- }
- assert ( ptr < ( buf + len ) );
+static int imgfill_cmdline ( struct image *image, char **args ) {
+ char *cmdline = NULL;
+ int rc;
- return image_set_cmdline ( image, buf );
+ /* Construct command line (if arguments are present) */
+ if ( *args ) {
+ cmdline = concat_args ( args );
+ if ( ! cmdline )
+ return -ENOMEM;
}
+
+ /* Apply command line */
+ rc = image_set_cmdline ( image, cmdline );
+ free ( cmdline );
+ return rc;
}
/** "imgfetch" options */
return rc;
/* Fill in command line */
- if ( ( rc = imgfill_cmdline ( image, ( argc - optind - 1 ),
- &argv[ optind + 1 ] ) ) != 0 )
+ if ( ( rc = imgfill_cmdline ( image, &argv[ optind + 1 ] ) ) != 0 )
return rc;
/* Fetch the image */
return rc;
/* Fill in command line */
- if ( ( rc = imgfill_cmdline ( image, ( argc - optind - 1 ),
- &argv[ optind + 1 ] ) ) != 0 )
+ if ( ( rc = imgfill_cmdline ( image, &argv[ optind + 1 ] ) ) != 0 )
return rc;
return 0;