Skip to content

Commit

Permalink
[script] Allow for backslash continuation of script lines
Browse files Browse the repository at this point in the history
Allow long script lines to be broken up using backslash continuation.
For example:

   choose --default linux --timeout 3000 os \
   	  && goto boot_${os} || goto cancelled

Requested-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Jul 15, 2013
1 parent 3aafe5f commit bba5a39
Showing 1 changed file with 41 additions and 13 deletions.
54 changes: 41 additions & 13 deletions src/image/script.c
Expand Up @@ -57,9 +57,11 @@ static size_t script_offset;
static int process_script ( struct image *image,
int ( * process_line ) ( const char *line ),
int ( * terminate ) ( int rc ) ) {
size_t len = 0;
char *line = NULL;
off_t eol;
size_t len;
char *line;
size_t frag_len;
char *tmp;
int rc;

script_offset = 0;
Expand All @@ -71,28 +73,54 @@ static int process_script ( struct image *image,
( image->len - script_offset ) );
if ( eol < 0 )
eol = image->len;
len = ( eol - script_offset );
frag_len = ( eol - script_offset );

/* Allocate buffer for line */
line = zalloc ( len + 1 /* NUL */ );
if ( ! line )
return -ENOMEM;
tmp = realloc ( line, ( len + frag_len + 1 /* NUL */ ) );
if ( ! tmp ) {
rc = -ENOMEM;
goto err_alloc;
}
line = tmp;

/* Copy line */
copy_from_user ( line, image->data, script_offset, len );
copy_from_user ( ( line + len ), image->data, script_offset,
frag_len );
len += frag_len;

/* Move to next line in script */
script_offset += ( frag_len + 1 );

/* Strip trailing CR, if present */
if ( line[ len - 1 ] == '\r' )
len--;

/* Handle backslash continuations */
if ( line[ len - 1 ] == '\\' ) {
len--;
rc = -EINVAL;
continue;
}

/* Terminate line */
line[len] = '\0';
DBG ( "$ %s\n", line );

/* Move to next line */
script_offset += ( len + 1 );

/* Process and free line */
/* Process line */
rc = process_line ( line );
free ( line );
if ( terminate ( rc ) )
return rc;
goto err_process;

/* Free line */
free ( line );
line = NULL;
len = 0;

} while ( script_offset < image->len );

err_process:
err_alloc:
free ( line );
return rc;
}

Expand Down

0 comments on commit bba5a39

Please sign in to comment.