Index: src/OFProcess.h ================================================================== --- src/OFProcess.h +++ src/OFProcess.h @@ -162,11 +162,11 @@ - initWithProgram: (OFString*)program programName: (OFString*)programName arguments: (OFArray*)arguments environment: (OFDictionary*)environment; -- (void)OF_setEnvironment: (OFDictionary*)dictionary; +- (char**)OF_environmentForDictionary: (OFDictionary*)dictionary; /*! * @brief Closes the write direction of the process. * * This method needs to be called for some programs before data can be read, Index: src/OFProcess.m ================================================================== --- src/OFProcess.m +++ src/OFProcess.m @@ -30,10 +30,11 @@ #import "OFProcess.h" #import "OFString.h" #import "OFArray.h" #import "OFDictionary.h" +#import "OFDataArray.h" #import "OFInitializationFailedException.h" #import "OFReadFailedException.h" #import "OFWriteFailedException.h" @@ -137,12 +138,19 @@ cStringUsingEncoding: OF_STRING_ENCODING_NATIVE]; argv[i + 1] = NULL; - if (environment != nil) - [self OF_setEnvironment: environment]; + if (environment != nil) { +#ifdef __MACH__ + *_NSGetEnviron() = [self + OF_environmentForDictionary: environment]; +#else + environ = [self + OF_environmentForDictionary: environment]; +#endif + } close(readPipe[0]); close(writePipe[1]); dup2(writePipe[0], 0); dup2(readPipe[1], 1); @@ -237,11 +245,12 @@ argumentsCString = strdup([argumentsString cStringUsingEncoding: OF_STRING_ENCODING_NATIVE]); @try { if (!CreateProcess([program cStringUsingEncoding: OF_STRING_ENCODING_NATIVE], argumentsCString, NULL, - NULL, TRUE, 0, NULL, NULL, &si, &pi)) + NULL, TRUE, 0, [self OF_environmentForDictionary: + environment], NULL, &si, &pi)) @throw [OFInitializationFailedException exceptionWithClass: [self class]]; } @finally { free(argumentsString); } @@ -260,15 +269,19 @@ } return self; } -- (void)OF_setEnvironment: (OFDictionary*)environment +- (char**)OF_environmentForDictionary: (OFDictionary*)environment { OFEnumerator *keyEnumerator, *objectEnumerator; +#ifndef _WIN32 char **envp; size_t i, count; + + if (environment == nil) + return NULL; count = [environment count]; envp = [self allocMemoryWithSize: sizeof(char*) count: count + 1]; @@ -298,14 +311,33 @@ envp[i][keyLen + objectLen + 1] = '\0'; } envp[i] = NULL; -#ifdef __MACH__ - *_NSGetEnviron() = envp; + return envp; #else - environ = envp; + OFDataArray *env = [OFDataArray dataArray]; + OFString *key, *object; + + keyEnumerator = [environment keyEnumerator]; + objectEnumerator = [environment objectEnumerator]; + + while ((key = [keyEnumerator nextObject]) != nil && + (object = [objectEnumerator nextObject]) != nil) { + [env addItems: [key UTF8String] + count: [key UTF8StringLength]]; + [env addItems: "=" + count: 1]; + [env addItems: [object UTF8String] + count: [object UTF8StringLength]]; + [env addItems: "" + count: 1]; + } + [env addItems: "" + count: 1]; + + return [env items]; #endif } - (BOOL)lowlevelIsAtEndOfStream {