diff --git a/include/execp.cpp b/include/execp.cpp index 34666bddc..a72d2919b 100755 --- a/include/execp.cpp +++ b/include/execp.cpp @@ -1,18 +1,21 @@ #include -#define XVT_INCL_NATIVE #define STRICT +#define XVT_INCL_NATIVE #include +#if XVT_OS == XVT_OS_WIN +#include +#include +#include +#endif + #if XVT_OS == XVT_OS_SCOUNIX #include #include #endif -#if XVT_OS == XVT_OS_WIN -#include #include -#endif #include #include @@ -21,6 +24,7 @@ #include #include + // @doc EXTERNAL // @mfunc Controlla se il processo puo' essere eseguito @@ -45,7 +49,7 @@ bool TExternal_app::can_run() const #endif } - + // @doc EXTERNAL // @mfunc Esegue il processo @@ -59,10 +63,23 @@ word TExternal_app::run( // @comm Se

e' FALSE aspetta che termini il processo in esecuzione prima di iniziare il nuovo { - TString256 path(_path); + TFilename path(_path); + TString name(path.name()); + int p = name.find(' '); + if (p >=0) + name = name.left(p); + const bool our_app = name.len() > 2 && (isalpha(name[0]) || name[0] == '7') && + isalnum(name[1]) && isdigit(name[2]); + + if (!our_app) + utente = FALSE; if (utente) +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 path << " /u" << user(); +#else + path << " -u" << user(); +#endif _error = 0; _exitcode = 0; @@ -70,20 +87,62 @@ word TExternal_app::run( // save cwd xvt_fsys_save_dir(); -#if XVT_OS == XVT_OS_WIN + const TFilename dir(path.path()); + + if (dir.not_empty()) + { + DIRECTORY d; + + if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d)) + xvt_fsys_set_dir(&d); + } + if (our_app) + { + TString parms(_path); + TString new_suffix; + int p = parms.find(' '); + + if (p < 0) + { + parms = ""; + new_suffix = "_0"; + } + else + { + parms = parms.mid(p + 1); + p = parms.find(' '); + if (p >= 0) + new_suffix = parms.left(p); + else new_suffix = parms; + if (new_suffix[0] == '-') new_suffix[0] = '_'; + else new_suffix = "__"; + } + + TFilename newpath(dir); + + if (newpath.not_empty()) + newpath << '/'; + newpath << name << new_suffix; + newpath.ext("exe"); + if (fexist(newpath)) + { + newpath.ext(""); + newpath << parms; + path = newpath; + if (utente) +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 + path << " /u" << user(); +#else + path << " -u" << user(); +#endif + + } + } +#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 if (can_run()) { - TFilename dir(_path); - - dir = dir.path(); - if (dir.not_empty()) - { - DIRECTORY d; - - if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d)) - xvt_fsys_set_dir(&d); - } main_app().begin_wait(); +#if XVT_OS == XVT_OS_WIN HL_LOGOUT(); _exitcode = WinExec((char*)(const char*)path, SW_SHOW); @@ -130,9 +189,61 @@ word TExternal_app::run( } xvt_statbar_refresh(); } +#else + STARTUPINFO start; + PROCESS_INFORMATION pi; + + start.cb = sizeof(start); + start.lpReserved = start.lpDesktop = start.lpTitle = NULL; + start.dwX = start.dwY = start.dwXSize = start.dwYSize = CW_USEDEFAULT; + start.dwXCountChars = start.dwYCountChars = start.dwFillAttribute = 0L; + start.dwFlags = STARTF_USESHOWWINDOW; + start.wShowWindow = SW_SHOW ; + start.cbReserved2 = 0; + start.lpReserved2 = NULL; + start.hStdInput = NULL; + start.hStdOutput = NULL ; + start.hStdError = NULL; + BOOL started = CreateProcess(NULL,(char*)(const char*)path, NULL, NULL, FALSE, 0, + NULL, NULL, &start, &pi); + if (started) + { + HANDLE hProcess = pi.hProcess; + + if (!async) + { + TTemp_window tw(TASK_WIN); + if (utente) + { + tw.iconize(); + tw.deactivate(); + } + if (WaitForSingleObject(hProcess, INFINITE) != 0xFFFFFFFF) + { + unsigned long exitcode; + if (GetExitCodeProcess(hProcess, &exitcode)) + _exitcode = (int) exitcode; + else + _exitcode = -2; + } + if (utente) + { + tw.maximize(); + tw.activate(); + } + } + else + _exitcode = 0; + CloseHandle(pi.hThread); + CloseHandle(hProcess); + } + else _exitcode = -1; + +#endif main_app().end_wait(); } else _exitcode = 1; +#if XVT_OS == XVT_OS_WIN _error = _exitcode; switch (_exitcode) { @@ -154,6 +265,21 @@ word TExternal_app::run( } break; } +#else + switch (_exitcode) + { + case -2: + error_box("Impossibile ricevere il valore di ritorno da '%s':\nErrore %ld", (const char*)_path, GetLastError()); break; + case -1: + error_box("Impossibile eseguire '%s':\nErrore %ld", (const char*)_path, GetLastError()); break; + case 8: + error_box("Risorse insufficienti per eseguire '%s'", (const char*)_path); break; + case 0: + break; + default: + error_box("Valore di ritorno di '%s':\n %ld", (const char*)_path, _exitcode); break; + } +#endif #else switch (fork())