|
|
|
@ -35,6 +35,11 @@ |
|
|
|
#include "php_globals.h" |
|
|
|
#include "SAPI.h" |
|
|
|
|
|
|
|
#ifdef NETWARE |
|
|
|
#include <proc.h> |
|
|
|
#include <library.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#if HAVE_SYS_WAIT_H |
|
|
|
#include <sys/wait.h> |
|
|
|
#endif |
|
|
|
@ -477,6 +482,13 @@ PHP_FUNCTION(proc_open) |
|
|
|
SECURITY_ATTRIBUTES security; |
|
|
|
char *command_with_cmd; |
|
|
|
UINT old_error_mode; |
|
|
|
#endif |
|
|
|
#ifdef NETWARE |
|
|
|
char** child_argv = NULL; |
|
|
|
char* command_dup = NULL; |
|
|
|
char* orig_cwd = NULL; |
|
|
|
int command_num_args = 0; |
|
|
|
wiring_t channel; |
|
|
|
#endif |
|
|
|
php_process_id_t child; |
|
|
|
struct php_process_handle *proc; |
|
|
|
@ -811,6 +823,46 @@ 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 |
|
|
|
|