+ * check if path/command exist by converting it to short file name
+ * if it exists, compose with args and return it
+ */
+
+static char *
+compose_command_line(const char *path, const char *command, const char *args)
+{
+ unsigned len;
+ char cmdPath[PATH_MAX];
+ char shortPath[PATH_MAX];
+
+ if (path != NULL)
+ SNPRINTF(cmdPath, sizeof cmdPath,
+ "%s" DIR_SEPARATOR_STRING "%s", path, command);
+ else
+ strncpyz(cmdPath, command, sizeof cmdPath);
+
+ /* Try if cmdPath or cmdPath.exe exist by converting it to the short path name */
+ len = GetShortPathName(cmdPath, shortPath, sizeof shortPath);
+ assert(len < sizeof shortPath);
+ if (0 == len) {
+ len = GetShortPathName(strncatz(cmdPath, EXE_EXT, sizeof cmdPath), shortPath, sizeof shortPath);
+ assert(len < sizeof shortPath);
+ }
+ if (0 != len) {
+ /* compose the command line */
+ return merge_command(shortPath, args);
+ }
+ else {
+ /* path/command not found */
+ return NULL;
+ }
+}
+
+
+static char *
+get_path(const char *cmd)
+{
+ char *cmdLine;
+ char *command;
+ char *args;
+ char *path;
+
+ /* get the command */
+ split_command(cmd, &command, &args);
+
+ if (NULL == (cmdLine = compose_command_line(NULL, command, args))) {
+ /* not an absolute path: try to find the command in predefined binary paths */
+ if (NULL != (path = (char *)setFirstItem(binPathSet))) {
+ while (NULL == (cmdLine = compose_command_line(path, command, args)) &&
+ NULL != (path = (char *)setNextItem(binPathSet)))
+ ;
+ }
+
+ if (NULL == cmdLine) {
+ /* didn't found the command in predefined binary paths: try with PATH */
+ char *envPath;
+
+ if (NULL != (envPath = getenv("PATH"))) {
+ /* make a local copy; strtok() will modify it */
+ envPath = Safe_strdup(envPath);
+
+ if (NULL != (path = strtok(envPath, ";"))) {
+ while (NULL == (cmdLine = compose_command_line(path, command, args)) &&
+ NULL != (path = strtok(NULL, ";")))
+ ;
+ }
+
+ Safe_free(envPath);
+ }
+ }
+
+ /* didn't found it; probably this won't help neither :-( */
+ if (NULL == cmdLine)
+ cmdLine = merge_command(command, args);
+ }
+
+ Safe_free(command);
+ Safe_free(args);
+
+ return cmdLine;
+}
+
+#else
+/* *nix version */
+
+/*!
+ * merge command and parameters to command line
+ */
+
+static char *
+merge_command(const char *command, const char *params)
+{
+ /* allocate extra space for 2x'"', ' ' and '\0' */
+ char *cmd_line = (char *)Safe_alloc(strlen(command) + strlen(params) + 4);
+ sprintf(cmd_line, "\"%s\" %s", command, params);
+ return cmd_line;
+}
+
+
+/*!
+ * check if the path is relative or absolute (if contains the dir separator)