131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
arguments: (OFArray*)arguments
environment: (OFDictionary*)environment
{
self = [super init];
@try {
#ifndef _WIN32
if (pipe(_readPipe) != 0 || pipe(_writePipe) != 0)
@throw [OFInitializationFailedException
exceptionWithClass: [self class]];
switch ((_pid = fork())) {
case 0:;
OFString *const *objects = [arguments objects];
size_t i, count = [arguments count];
char **argv;
of_string_encoding_t encoding;
argv = [self allocMemoryWithSize: sizeof(char*)
count: count + 2];
encoding = [OFSystemInfo native8BitEncoding];
argv[0] = (char*)[programName
cStringWithEncoding: encoding];
for (i = 0; i < count; i++)
argv[i + 1] = (char*)[objects[i]
cStringWithEncoding: encoding];
argv[i + 1] = NULL;
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);
execvp([program cStringWithEncoding: encoding], argv);
_exit(EXIT_FAILURE);
case -1:
@throw [OFInitializationFailedException
exceptionWithClass: [self class]];
default:
close(_readPipe[1]);
close(_writePipe[0]);
break;
}
#else
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
STARTUPINFOW si;
void *pool;
OFMutableString *argumentsString;
OFEnumerator *enumerator;
|
>
>
>
>
>
<
<
<
<
<
<
|
<
<
<
|
|
>
|
<
|
<
<
<
|
<
|
|
<
|
<
<
|
>
|
<
<
<
|
|
>
|
>
>
>
|
>
|
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
arguments: (OFArray*)arguments
environment: (OFDictionary*)environment
{
self = [super init];
@try {
#ifndef _WIN32
void *pool = objc_autoreleasePoolPush();
const char *path;
int argc;
char **argv, **env;
if (pipe(_readPipe) != 0 || pipe(_writePipe) != 0)
@throw [OFInitializationFailedException
exceptionWithClass: [self class]];
path = [program cStringWithEncoding:
[OFSystemInfo native8BitEncoding]];
[self OF_getArgC: &argc
andArgV: &argv
forProgramName: programName
andArguments: arguments];
env = [self OF_environmentForDictionary: environment];
if ((_pid = fork()) == 0) {
#ifdef __MACH__
*_NSGetEnviron() = env;
#else
environ = env;
#endif
close(_readPipe[0]);
close(_writePipe[1]);
dup2(_writePipe[0], 0);
dup2(_readPipe[1], 1);
execvp(path, argv);
_exit(EXIT_FAILURE);
}
close(_readPipe[1]);
close(_writePipe[0]);
[self freeMemory: argv];
if (_pid == -1)
@throw [OFInitializationFailedException
exceptionWithClass: [self class]];
objc_autoreleasePoolPop(pool);
#else
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
STARTUPINFOW si;
void *pool;
OFMutableString *argumentsString;
OFEnumerator *enumerator;
|
299
300
301
302
303
304
305
306
307
308
309
310
311
312
|
{
[self close];
[super dealloc];
}
#ifndef _WIN32
- (char**)OF_environmentForDictionary: (OFDictionary*)environment
{
OFEnumerator *keyEnumerator, *objectEnumerator;
char **envp;
size_t i, count;
of_string_encoding_t encoding;
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
|
{
[self close];
[super dealloc];
}
#ifndef _WIN32
- (void)OF_getArgC: (int*)argc
andArgV: (char***)argv
forProgramName: (OFString*)programName
andArguments: (OFArray*)arguments
{
OFString *const *objects = [arguments objects];
size_t i, count = [arguments count];
of_string_encoding_t encoding;
*argv = [self allocMemoryWithSize: sizeof(char*)
count: count + 2];
encoding = [OFSystemInfo native8BitEncoding];
(*argv)[0] = (char*)[programName cStringWithEncoding: encoding];
for (i = 0; i < count; i++)
(*argv)[i + 1] =
(char*)[objects[i] cStringWithEncoding: encoding];
(*argv)[i + 1] = NULL;
}
- (char**)OF_environmentForDictionary: (OFDictionary*)environment
{
OFEnumerator *keyEnumerator, *objectEnumerator;
char **envp;
size_t i, count;
of_string_encoding_t encoding;
|