[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 2/7] libc: cmdline_get_argc/copy_argv



On Wed, Dec 29 14:12, Kevin Wolf wrote:
> + libc: Neue Funktionen cmdline_get_argc und cmdline_copy_argv, die aus
>   einer gegebenen Kommandozeile argc auslesen bzw. ein gegebenes argv
>   aus der Kommandozeile befuellen
> * libc: crt0.c benutzt die neuen Funktionen statt der eigenen
>   Implementierung
> 
> Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
> ---
>  src/modules/include/init.h |    2 ++
>  src/modules/lib/crt0.c     |   42 ++++++++++--------------------------------
>  src/modules/lib/init.c     |   38 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 50 insertions(+), 32 deletions(-)
> 
> diff --git a/src/modules/include/init.h b/src/modules/include/init.h
> index 195511a..d431cee 100644
> --- a/src/modules/include/init.h
> +++ b/src/modules/include/init.h
> @@ -43,6 +43,8 @@ char *init_service_get_name(pid_t pid);
>  void init_process_exit(int result);
>  pid_t init_execute(const char* cmd);
>  
> +int cmdline_get_argc(const char* args);
> +void cmdline_copy_argv(char* args, const char** argv, size_t argc);
>  
>  
>  
> diff --git a/src/modules/lib/crt0.c b/src/modules/lib/crt0.c
> index 4c3192d..fb42271 100644
> --- a/src/modules/lib/crt0.c
> +++ b/src/modules/lib/crt0.c
> @@ -27,8 +27,9 @@
>   */
>  
>  #include <stdlib.h>
> -#include "syscall.h"
> -#include "rpc.h"
> +#include <syscall.h>
> +#include <rpc.h>
> +#include <init.h>
>  #include <string.h>
>  #include <stdio.h>
>  
> @@ -56,7 +57,9 @@ static void call_constructors(void)
>  
>  void __attribute__((weak)) _start(void)
>  {
> -    //v();
> +    char* args = NULL;
> +    int argc;
> +
>      init_memory_manager();
>      init_messaging();
>      init_sync_messages();
> @@ -70,37 +73,12 @@ void __attribute__((weak)) _start(void)
>      //Kommandozeilenargumente Parsen ----
>      //TODO: Das ist alles noch sehr primitiv
>      //Erst den String vom Kernel holen
> -    char* args = get_cmdline();
> -    int argc, pos, f;
> -    argc = 0;
> -    f = 0;
> -    //Jetzt werden die Argumente gezaehlt.
> -    for (pos = 0; pos < strlen(args); pos++) {
> -        if (args[pos] == ' ') {
> -            // mehrere leerzeichen direkt hintereinander nur einmal z???hlen
> -            if(f == 1)
> -            {
> -                argc++;
> -            }
> -            f = 0;
> -        }
> -        else
> -        {
> -            f = 1;
> -        }
> -    }
> -    if(f == 1)
> -    {
> -        argc++;
> -    }
> +    args = get_cmdline();
> +    argc = cmdline_get_argc(args);
>  
>      char* argv[argc + 1];
> -    argv[0] = strtok(args, " ");
> -    for(pos = 1; pos < argc; pos++)
> -    {
> -        argv[pos] = strtok(NULL, " ");
> -    }
> -    argv[argc] = NULL;
> +
> +    cmdline_copy_argv(args, (const char**) argv, argc);
>  
>      call_constructors();
>      int result = main(argc, argv);
> diff --git a/src/modules/lib/init.c b/src/modules/lib/init.c
> index 3e021c8..ea0a7d2 100644
> --- a/src/modules/lib/init.c
> +++ b/src/modules/lib/init.c
> @@ -35,6 +35,7 @@
>  #include "stdlib.h"
>  #include <io.h>
>  #include <unistd.h>
> +#include <ctype.h>
>  #include <dir.h>
>  
>  // Kindprozess eintragen
> @@ -177,6 +178,43 @@ pid_t init_execute(const char* cmd)
>      return pid;
>  }
>  
> +/*
> + * Zaehlt die Argumente in einer Kommandozeile. Mehrere aufeinanderfolgende
> + * Leerzeichen werden als ein einziger Trenner aufgefasst.
> + */
> +int cmdline_get_argc(const char* args)
> +{
> +    bool space = false;
> +    int argc = 0;
> +    int pos;
> +
> +    for (pos = 0; pos < strlen(args); pos++) {
> +        if (isspace(args[pos]) && !space) {
> +            argc++;
> +        }
> +
> +        space = isspace(args[pos]);
> +    }
> +
> +    if (!space) {
> +        argc++;
> +    }
> +
> +    return argc;
> +}
> +

Vielleicht sollte man hier in einem Kommentar noch anmerken dass args
veraendert wird, und auch nicht freigegeben werden darf.

> +void cmdline_copy_argv(char* args, const char** argv, size_t argc)
> +{
> +    int pos;
> +    argv[0] = strtok(args, " ");
> +
> +    for(pos = 1; pos < argc; pos++) {
> +        argv[pos] = strtok(NULL, " ");
> +    }
> +
> +    argv[argc] = NULL;
> +}
> +
>  int init_dev_register(struct init_dev_desc* dev, size_t size)
>  {
>      return rpc_get_int(1, "DEV_REG ", size, (char*) dev);

Sonst sieht das gut aus, glaube ich. ;-)

Acked-by: Antoine Kaufmann <toni@xxxxxxxxxx>

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgplr8uLM5BCt.pgp
Description: PGP signature