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

Re: [tyndur-devel] [PATCH 7/7] argv über PPB übergeben



On Sat, Jan 08, 2011 at 07:39:51PM +0100, Antoine Kaufmann wrote:
> On Wed, Dec 29 14:12, Kevin Wolf wrote:
> > * libc: Die Argumente von neu gestarteten Programmen werden jetzt in
> >   einem PPB statt in der Kommandozeile übergeben
> > * init: Angepasst, um Programme mit PPB starten zu können
> > * Pascal-RTL: argv wird jetzt aus dem PPB ausgelesen
> 
> Wäre der letzte Punkt nicht eher was für einen separaten Pätsch?

Wollte ich eigentlich, aber egal wierum ich es ändere, mache ich damit
die Pascal-RTL für einen Commit kaputt, weil ich mir dort nicht die Mühe
mache, veralteten Code mitzuschleppen.

> > @@ -496,14 +501,29 @@ pid_t start_program(char* path, char* args, pid_t parent_pid)
> >              return false;
> >          }
> >  
> > -        asprintf(&new_args, "%s%s%s",
> > -            interpreter + 2,
> > -            args ? " " : "",
> > -            args ? args : "");
> > -        new_path = strtok(interpreter + 2, " ");
> > +        interp_args = interpreter + 2;
> > +
> > +        ppb = open_shared_memory(shm);
> > +        if (ppb == NULL) {
> > +            return false;
> > +        }
> > +        ppb_size = PAGE_SIZE; // FIXME
> 
> Was gehoert denn hier in richtig hin? Ein shm_size-Syscall?

Ja, irgendwie sowas.

> > @@ -223,41 +212,21 @@ begin
> >      OpenStdIO(StdErr, fmOutput, StdErrorHandle);
> >  end;
> >  
> > +function ppb_get_argc(ppb: Pointer; size: integer): integer;
> > +    cdecl; external name 'ppb_get_argc';
> > +procedure ppb_copy_argv(ppb: Pointer; size: integer; argv: PPChar; argc: integer);
> > +    cdecl; external name 'ppb_copy_argv';
> > +
> >  procedure InitParams;
> >  var
> >      i: integer;
> >      p: PChar;
> >      space: boolean;
> >  begin
> > -    commandline := GetCmdline();
> > -
> > -    p := commandline;
> > -    argc := 0;
> > -    space := false;
> > -    while p^ <> #0 do begin
> > -        if p^ = ' ' then begin
> > -            space := true;
> > -        end else if space then begin
> > -            space := false;
> > -            Inc(argc);
> > -        end;
> > -
> > -        Inc(p);
> > -    end;
> > +    argc := ppb_get_argc(ppb_ptr, ppb_size);
> 
> Hier vielleicht noch etwas Fehlerbehandlung?

Wird überbewertet. ;-) Ich bau's für die nächste Version ein.

> 
> >  
> > -    (*argv := GetMem((argc + 1) * sizeof(PChar));
> > -    
> > -    p := cmdline;
> > -    argv^ := p;
> > -    i := 1;
> > -    while p^ <> #0 do begin
> > -        if p^ = ' ' then begin
> > -            (argv + i)^ := p;
> > -            Inc(i);
> > -        end;
> > -
> > -        Inc(p);
> > -    end;*)
> > +    argv := GetMem((argc + 1) * sizeof(PChar));
> > +    ppb_copy_argv(ppb_ptr, ppb_size, argv, argc);
> >  end;
> >  
> >  Begin
> 
> Weiter fällt mir auf, dass die crt0 noch den Code für ohne PPB enthält,
> aber prt0 nicht. Hat das irgend einen konkreten Grund? ;-)

Jo, init kriegt vom Kernel keinen PPB, deswegen kann das in der libc
nicht raus. Wobei man es vielleicht von der libc nach init verschieben
könnte, das wäre wahrscheinlich sauberer.

Kevin