Changeset 2048

Show
Ignore:
Timestamp:
04/03/09 19:08:21 (3 years ago)
Author:
mwhitworth
Message:

Copy the command line over.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/fs/vfs/load.c

    r1903 r2048  
    4646        int* fds; 
    4747        char** argv; 
    48         int argc; 
     48        int argc, argCount; /* FIXME: difference? */ 
    4949        DWORD entryPoint,stackPos; 
    5050        DWORD* stackP; 
     
    182182        DWORD currVirtPage=0; 
    183183        int err=0; 
    184         args->argc+=count; 
     184        args->argc += count; 
    185185 
    186186        PreemptDisable(); 
     
    268268static int ExecCopyArgs(struct ExecArgs* args) 
    269269{ 
    270         int argCount; 
    271          
    272270        /* FIXME: Should be less than PAGE_SIZE*NUM_ARG_PAGES? */ 
    273         argCount=ExecCountArgs(args->argv, PAGE_SIZE*NUM_ARG_PAGES); 
    274         if (argCount < 0) 
    275                 return argCount; 
     271        args->argCount=ExecCountArgs(args->argv, PAGE_SIZE*NUM_ARG_PAGES); 
     272         
     273        if (args->argCount < 0) 
     274                return args->argCount; 
    276275                 
    277276        if (args->argv) 
    278                 ExecCopyStrings(args, args->argv, argCount); 
     277                ExecCopyStrings(args, args->argv, args->argCount); 
    279278 
    280279        ExecCopyStrings(args, &args->process->name, 1); 
    281280 
    282281        return ExecSetupArgs(args); 
     282} 
     283 
     284static int ExecCopyCmdLine(struct ExecArgs* args) 
     285{ 
     286        int i; 
     287        int len = 1 + strlen(args->process->name); 
     288        char* p; 
     289         
     290        for (i = 0; i < args->argCount; i++) 
     291        { 
     292                len += strlen(args->argv[i]) + 1; 
     293        } 
     294         
     295        p = args->process->cmdLine = (char*)MemAlloc(len); 
     296         
     297        p = stpcpy(p, args->process->name); 
     298         
     299        for (i = 0; i < args->argCount; i++) 
     300        { 
     301                *p = ' '; 
     302                p++; 
     303                 
     304                p = stpcpy(p, args->argv[i]); 
     305        } 
     306         
     307        return 0; 
    283308} 
    284309 
     
    373398        struct Process* process; 
    374399 
    375         ExecSetupContext(&execArgs,pathName,fds,argv); 
     400        ExecSetupContext(&execArgs,pathName,fds, argv); 
    376401 
    377402        /* Open executable */ 
     
    391416        err=ExecCopyArgs(&execArgs); 
    392417 
     418        if (err) 
     419                return err; 
     420                 
     421        /* Save off the command line so we can retrieve it later. */ 
     422        err = ExecCopyCmdLine(&execArgs); 
     423         
    393424        if (err) 
    394425                return err; 
     
    569600        VirtSetCurrent(args->process->memManager); 
    570601 
     602        VirtMemMapPage(ARCH_STACK_TOP - PAGE_SIZE, PageAlloc()->physAddr, 7); 
     603        ZeroMemory(ARCH_STACK_TOP - PAGE_SIZE, PAGE_SIZE); 
     604 
    571605        /* The dynamic linker need this information to find out the base of the linker etc. */ 
    572606 
    573         PUSH_AUX_ENT(args->stackP,AT_NULL, 0); /* Marker. */ 
    574         PUSH_AUX_ENT(args->stackP,AT_PAGESZ, PAGE_SIZE); 
    575         PUSH_AUX_ENT(args->stackP,AT_BASE, loadAddr); 
    576         PUSH_AUX_ENT(args->stackP,AT_ENTRY, header->entryPoint); 
    577         PUSH_AUX_ENT(args->stackP,AT_PHDR, args->process->memManager->start+header->phOffset); 
    578         PUSH_AUX_ENT(args->stackP,AT_PHENT, header->phEntrySize); 
    579         PUSH_AUX_ENT(args->stackP,AT_PHNUM, header->phEntries); 
    580         PUSH_AUX_ENT(args->stackP,AT_FLAGS, 0); 
     607        PUSH_AUX_ENT(args->stackP, AT_NULL, 0); /* Marker. */ 
     608        PUSH_AUX_ENT(args->stackP, AT_PAGESZ, PAGE_SIZE); 
     609        PUSH_AUX_ENT(args->stackP, AT_BASE, loadAddr); 
     610        PUSH_AUX_ENT(args->stackP, AT_ENTRY, header->entryPoint); 
     611        PUSH_AUX_ENT(args->stackP, AT_PHDR, args->process->memManager->start+header->phOffset); 
     612        PUSH_AUX_ENT(args->stackP, AT_PHENT, header->phEntrySize); 
     613        PUSH_AUX_ENT(args->stackP, AT_PHNUM, header->phEntries); 
     614        PUSH_AUX_ENT(args->stackP, AT_FLAGS, 0); 
    581615 
    582616        /* Seperate argv and the auxillary entries table */