[gPXE-devel] [PATCH] [hci] Modify 'set' command to allow space separated values

Aaron Brooks aaron at brooks1.net
Mon Sep 20 23:49:49 EDT 2010


Just a ping to see if anyone has any comments or feedback. :-)

On Sat, Sep 18, 2010 at 9:12 AM, Aaron Brooks <aaron at brooks1.net> wrote:
> It appears that GMail converted spaces to tabs even though I
> specifically checked that the textbox contained tabs before I sent.
> Sorry about the annoyance. I'm attaching an identical (albeit tabbed)
> version of the patch.
>
> Sincerely,
>
> Aaron
>
> On Fri, Sep 17, 2010 at 6:05 PM, Aaron Brooks <aaron at brooks1.net> wrote:
>> At our site we want to be able to store a series of values from a
>> single DHCP option (in our case, kernel arguments) in this manner:
>>
>>    set kargs ${net0/224:string}
>>
>> I'm including our patch which allows multiple value arguments to the
>> 'set' command. This change does not break or affect existing 'set'
>> usage but will now make it legal to store space concatenated values.
>>
>> Let me know if you would like me to change any aspects of the implementation.
>>
>> I've fully tested the functionality including both error paths.
>>
>> Sincerely,
>>
>> Aaron
>>
>> -------------
>> From: Aaron Brooks <aaron at brooks1.net>
>> Date: Sun, 12 Sep 2010 22:53:45 -0400
>> Subject: [PATCH] [hci] Modify 'set' command to allow space separated values
>>
>> The 'set' command previously assigned an identifier with the single
>> value of the following positional argument. The following would assign
>> the value of "bar" to the identifier of "foo"
>>
>>    set foo bar
>>    show foo
>>    foo = bar
>>
>> Providing additional positional arguments would lead to an error.
>>
>> The modification allows multiple positional arguments (either direct
>> or via identifier expansion) to be concatenated with spaces and
>> assigned as a single value to the declared identifier "foo":
>>
>>    set foo bar baz quux
>>    show foo
>>    foo = bar baz quux
>>
>> This functionallity was added to allow for multiple, space separated
>> values (such as kernel arguments, passed via DHCP) to be assigned to an
>> identifier.
>>
>> Signed-off-by: Aaron Brooks <aaron at brooks1.net>
>> ---
>>  src/hci/commands/nvo_cmd.c |   41 +++++++++++++++++++++++++++++++++++++----
>>  1 files changed, 37 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c
>> index 5eb2f06..ac18ee3 100644
>> --- a/src/hci/commands/nvo_cmd.c
>> +++ b/src/hci/commands/nvo_cmd.c
>> @@ -30,19 +30,52 @@ static int show_exec ( int argc, char **argv ) {
>>  }
>>
>>  static int set_exec ( int argc, char **argv ) {
>> +       char *buf;
>> +       int len = 0;
>> +       int ofs = 0;
>> +       int i;
>>        int rc;
>>
>> -       if ( argc != 3 ) {
>> -               printf ( "Syntax: %s <identifier> <value>\n", argv[0] );
>> +       if ( argc < 3 ) {
>> +               printf ( "Syntax: %s <identifier> <value>...\n", argv[0] );
>>                return 1;
>>        }
>>
>> -       if ( ( rc = storef_named_setting ( argv[1], argv[2] ) ) != 0 ) {
>> +       /* Compute length of buffer */
>> +       for ( i = 2; i < argc; i++ ) {
>> +               len += strlen ( argv[i] );
>> +               /* For joining space or trailing null */
>> +               len += 1;
>> +       }
>> +
>> +       buf = malloc ( len );
>> +       if ( ! buf ) {
>> +               const char *emsg = strerror ( errno );
>> +               printf ( "Could not allocate memory to set \"%s\"=\"", argv[1] );
>> +               for ( i = 2; i < (argc - 1); i++ ) {
>> +                       printf ( "%s ", argv[i] );
>> +               }
>> +               printf ( "%s\": %s\n", argv[i], emsg );
>> +               return 1;
>> +       }
>> +
>> +       /* Join arguments into buffer with spaces */
>> +       for ( i = 2; i < argc; i++ ) {
>> +               strcpy ( buf + ofs, argv[i] );
>> +               ofs += strlen ( argv[i] );
>> +               buf[ofs] = ' ';
>> +               ofs += 1;
>> +       }
>> +       buf[ofs - 1] = '\0';
>> +
>> +       if ( ( rc = storef_named_setting ( argv[1], buf ) ) != 0 ) {
>>                printf ( "Could not set \"%s\"=\"%s\": %s\n",
>> -                        argv[1], argv[2], strerror ( rc ) );
>> +                        argv[1], buf, strerror ( rc ) );
>> +               free ( buf );
>>                return 1;
>>        }
>>
>> +       free ( buf );
>>        return 0;
>>  }
>>
>> --
>> 1.7.0.4
>>
>


More information about the gPXE-devel mailing list