Browse Source

As fork implementation of NetWare LibC still in experimental stages making the procve based solution ahead of HAVE_FORK. Later When fork becomes stable will revert this fix.

--Kamesh from hyanantha's account
PHP-5.1
Anantha Kesari H Y 21 years ago
parent
commit
98a2eeacc7
  1. 80
      ext/standard/proc_open.c

80
ext/standard/proc_open.c

@ -761,6 +761,46 @@ PHP_FUNCTION(proc_open)
child = pi.hProcess;
CloseHandle(pi.hThread);
#elif defined(NETWARE)
if (cwd) {
orig_cwd = getcwd(NULL, PATH_MAX);
chdir2(cwd);
}
channel.infd = descriptors[0].childend;
channel.outfd = descriptors[1].childend;
channel.errfd = -1;
/* Duplicate the command as processing downwards will modify it*/
command_dup = strdup(command);
/* get a number of args */
construct_argc_argv(command_dup, NULL, &command_num_args, NULL);
child_argv = (char**) malloc((command_num_args + 1) * sizeof(char*));
if(!child_argv) {
free(command_dup);
if (cwd && orig_cwd) {
chdir2(orig_cwd);
free(orig_cwd);
}
}
/* fill the child arg vector */
construct_argc_argv(command_dup, NULL, &command_num_args, child_argv);
child_argv[command_num_args] = NULL;
child = procve(child_argv[0], PROC_DETACHED|PROC_INHERIT_CWD, NULL, &channel, NULL, NULL, 0, NULL, (const char**)child_argv);
free(child_argv);
free(command_dup);
if (cwd && orig_cwd) {
chdir2(orig_cwd);
free(orig_cwd);
}
if (child < 0) {
/* failed to fork() */
/* clean up all the descriptors */
for (i = 0; i < ndesc; i++) {
close(descriptors[i].childend);
close(descriptors[i].parentend);
}
php_error_docref(NULL TSRMLS_CC, E_WARNING, "procve failed - %s", strerror(errno));
goto exit_fail;
}
#elif HAVE_FORK
/* the unix way */
child = fork();
@ -831,46 +871,6 @@ PHP_FUNCTION(proc_open)
goto exit_fail;
}
#elif defined(NETWARE)
if (cwd) {
orig_cwd = getcwd(NULL, PATH_MAX);
chdir2(cwd);
}
channel.infd = descriptors[0].childend;
channel.outfd = descriptors[1].childend;
channel.errfd = -1;
/* Duplicate the command as processing downwards will modify it*/
command_dup = strdup(command);
/* get a number of args */
construct_argc_argv(command_dup, NULL, &command_num_args, NULL);
child_argv = (char**) malloc((command_num_args + 1) * sizeof(char*));
if(!child_argv) {
free(command_dup);
if (cwd && orig_cwd) {
chdir2(orig_cwd);
free(orig_cwd);
}
}
/* fill the child arg vector */
construct_argc_argv(command_dup, NULL, &command_num_args, child_argv);
child_argv[command_num_args] = NULL;
child = procve(child_argv[0], PROC_DETACHED|PROC_INHERIT_CWD, NULL, &channel, NULL, NULL, 0, NULL, (const char**)child_argv);
free(child_argv);
free(command_dup);
if (cwd && orig_cwd) {
chdir2(orig_cwd);
free(orig_cwd);
}
if (child < 0) {
/* failed to fork() */
/* clean up all the descriptors */
for (i = 0; i < ndesc; i++) {
close(descriptors[i].childend);
close(descriptors[i].parentend);
}
php_error_docref(NULL TSRMLS_CC, E_WARNING, "procve failed - %s", strerror(errno));
goto exit_fail;
}
#else
# error You lose (configure should not have let you get here)
#endif

Loading…
Cancel
Save