#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
#include <sys/stat.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/string.h>
+
#include <freerdp/utils/file.h>
-#ifdef _WIN32
+#ifndef _WIN32
+#define PATH_SEPARATOR_STR "/"
+#define PATH_SEPARATOR_CHR '/'
+#define HOME_ENV_VARIABLE "HOME"
+#else
#include <windows.h>
+#define PATH_SEPARATOR_STR "\\"
+#define PATH_SEPARATOR_CHR '\\'
+#define HOME_ENV_VARIABLE "HOMEPATH"
#endif
+#define FREERDP_CONFIG_DIR ".freerdp"
+
+#define PARENT_PATH ".." PATH_SEPARATOR_STR
+
void freerdp_mkdir(char* path)
{
#ifndef _WIN32
#endif
}
+boolean freerdp_check_file_exists(char* file)
+{
+ struct stat stat_info;
+
+ if (stat(file, &stat_info) != 0)
+ return false;
+
+ return true;
+}
+
+char* freerdp_get_home_path(rdpSettings* settings)
+{
+ if (settings->home_path == NULL)
+ settings->home_path = getenv(HOME_ENV_VARIABLE);
+
+ return settings->home_path;
+}
+
+char* freerdp_get_config_path(rdpSettings* settings)
+{
+ char* path;
+
+ path = (char*) xmalloc(strlen(settings->home_path) + sizeof(FREERDP_CONFIG_DIR) + 2);
+ sprintf(path, "%s/%s", settings->home_path, FREERDP_CONFIG_DIR);
+
+ if (!freerdp_check_file_exists(path))
+ freerdp_mkdir(path);
+
+ settings->config_path = path;
+
+ return path;
+}
+
+char* freerdp_get_current_path(rdpSettings* settings)
+{
+ if (settings->current_path == NULL)
+ settings->current_path = getcwd(NULL, 0);
+
+ return settings->current_path;
+}
+
+char* freerdp_get_parent_path(char* base_path, int depth)
+{
+ int i;
+ char* p;
+ char* path;
+ int length;
+ int base_length;
+
+ if (base_path == NULL)
+ return NULL;
+
+ if (depth <= 0)
+ return xstrdup(base_path);
+
+ base_length = strlen(base_path);
+
+ p = &base_path[base_length];
+
+ for (i = base_length - 1; ((i >= 0) && (depth > 0)); i--)
+ {
+ if (base_path[i] == PATH_SEPARATOR_CHR)
+ {
+ p = &base_path[i];
+ depth--;
+ }
+ }
+
+ length = (p - base_path);
+
+ path = (char*) xmalloc(length + 1);
+ memcpy(path, base_path, length);
+ path[length] = '\0';
+
+ return path;
+}
+
+/* detects if we are running from the source tree */
+
+boolean freerdp_detect_development_mode(rdpSettings* settings)
+{
+ int depth = 0;
+ char* current_path;
+ char* development_path = NULL;
+ boolean development_mode = false;
+
+ if (freerdp_check_file_exists(".git"))
+ {
+ depth = 0;
+ development_mode = true;
+ }
+ else if (freerdp_check_file_exists(PARENT_PATH ".git"))
+ {
+ depth = 1;
+ development_mode = true;
+ }
+ else if (freerdp_check_file_exists(PARENT_PATH PARENT_PATH ".git"))
+ {
+ depth = 2;
+ development_mode = true;
+ }
+
+ current_path = freerdp_get_current_path(settings);
+
+ if (development_mode)
+ development_path = freerdp_get_parent_path(current_path, depth);
+
+ settings->development_mode = development_mode;
+ settings->development_path = development_path;
+
+ return settings->development_mode;
+}
+
+void freerdp_detect_paths(rdpSettings* settings)
+{
+ freerdp_get_home_path(settings);
+ freerdp_get_config_path(settings);
+ freerdp_detect_development_mode(settings);
+
+#if 0
+ printf("home path: %s\n", settings->home_path);
+ printf("config path: %s\n", settings->config_path);
+ printf("current path: %s\n", settings->current_path);
+
+ if (settings->development_mode)
+ printf("development path: %s\n", settings->development_path);
+#endif
+}