]> granicus.if.org Git - php/commitdiff
windows is smart enough to provide a way to set cwd for new processes.
authorShane Caraveo <shane@php.net>
Tue, 29 Oct 2002 07:32:52 +0000 (07:32 +0000)
committerShane Caraveo <shane@php.net>
Tue, 29 Oct 2002 07:32:52 +0000 (07:32 +0000)
TSRM/tsrm_virtual_cwd.c
TSRM/tsrm_win32.c
TSRM/tsrm_win32.h

index ce4f2538f2e83a82d42d681e9a7d92d61c2095aa..bb5bac0c3a3f0e934b7f3123fdacc6a322357d18 100644 (file)
@@ -799,33 +799,9 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC)
 
 #ifdef TSRM_WIN32
 
-/* On Windows the trick of prepending "cd cwd; " doesn't work so we need to perform
-   a real chdir() and mutex it
- */
 CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
 {
-       char prev_cwd[MAXPATHLEN];
-       char *getcwd_result;
-       FILE *retval;
-
-       getcwd_result = getcwd(prev_cwd, MAXPATHLEN);
-       if (!getcwd_result) {
-               return NULL;
-       }
-
-#ifdef ZTS
-       tsrm_mutex_lock(cwd_mutex);
-#endif
-
-       chdir(CWDG(cwd).cwd);
-       retval = popen(command, type);
-       chdir(prev_cwd);
-
-#ifdef ZTS
-       tsrm_mutex_unlock(cwd_mutex);
-#endif
-
-       return retval;
+       return popen_ex(command, type, CWDG(cwd).cwd, NULL);
 }
 
 #elif defined(NETWARE)
index 691443a243f16061c4eb0817e580197729f8fe9a..aecdec88108a0ee73256bc8349358bda3e8171bc 100644 (file)
@@ -148,6 +148,11 @@ static HANDLE dupHandle(HANDLE fh, BOOL inherit) {
 }
 
 TSRM_API FILE *popen(const char *command, const char *type)
+{
+       return popen_ex(command, type, NULL, NULL);
+}
+
+TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env)
 {
        FILE *stream = NULL;
        int fno, str_len = strlen(type), read, mode;
@@ -190,7 +195,7 @@ TSRM_API FILE *popen(const char *command, const char *type)
 
        cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c "));
        sprintf(cmd, "%s /c %s", TWG(comspec), command);
-       if (!CreateProcess(NULL, cmd, &security, &security, security.bInheritHandle, NORMAL_PRIORITY_CLASS, NULL, NULL, &startup, &process)) {
+       if (!CreateProcess(NULL, cmd, &security, &security, security.bInheritHandle, NORMAL_PRIORITY_CLASS, env, cwd, &startup, &process)) {
                return NULL;
        }
        free(cmd);
index 5e6ec7ece794f1cb0839b14572bbe68f4897954e..0a78c394504d9844c1aef01a193a0c70d467ef68 100644 (file)
@@ -92,6 +92,7 @@ typedef struct {
 TSRM_API void tsrm_win32_startup(void);
 TSRM_API void tsrm_win32_shutdown(void);
 
+TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env);
 TSRM_API FILE *popen(const char *command, const char *type);
 TSRM_API int pclose(FILE *stream);