Browse Source

implemented proc_open for NETWARE

PHP-5.1
Anantha Kesari H Y 22 years ago
parent
commit
ec42c1432c
  1. 52
      ext/standard/proc_open.c

52
ext/standard/proc_open.c

@ -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

Loading…
Cancel
Save