[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 2/7] libc: cmdline_get_argc/copy_argv
+ 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;
+}
+
+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);
--
1.6.0.2