Ya crea la carpeta de sistema en Linux

This commit is contained in:
2022-11-18 09:48:46 +01:00
parent 896dd9daef
commit 85d6c48f42
5 changed files with 108 additions and 18 deletions

View File

@@ -1,7 +1,14 @@
#include "director.h"
#include "common/utils.h"
#include "director.h"
#include <errno.h>
#include <iostream>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
// Constructor
Director::Director(int argc, char *argv[])
@@ -19,6 +26,9 @@ Director::Director(int argc, char *argv[])
// Comprueba los parametros del programa
checkProgramArguments(argc, argv);
// Crea la carpeta del sistema donde guardar datos
createSystemFolder();
// Crea el objeto que controla los ficheros de recursos
asset = new Asset(executablePath);
asset->setVerbose(options->console);
@@ -26,7 +36,7 @@ Director::Director(int argc, char *argv[])
// Si falta algún fichero no inicia el programa
if (!setFileList())
{
section.name = SECTION_PROG_QUIT;
exit(EXIT_FAILURE);
}
// Inicializa variables desde el fichero de configuración
@@ -263,6 +273,81 @@ bool Director::saveConfig()
return success;
}
// Crea la carpeta del sistema donde guardar datos
void Director::createSystemFolder()
{
#ifdef _WIN32
systemFolder = "/%APPDATA/%/jaildoctors_dilemma";
if (CreateDirectory(systemFolder.c_str(), NULL) || ERROR_ALREADY_EXISTS == GetLastError())
{
std::cout << "System directory created" << std::endl;
}
else
{
// Failed to create directory.
std::cout << "Failed to create system directory" << std::endl;
}
#elif __APPLE__
struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir;
systemFolder = std::string(homedir) + "/Library/Application Support/jaildoctors_dilemma";
struct stat st = {0};
if (stat(systemFolder.c_str(), &st) == -1)
{
errno = 0;
int ret = mkdir(systemFolder.c_str(), S_IRWXU);
if (ret == -1)
{
switch (errno)
{
case EACCES:
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
}
#elif __linux__
struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir;
systemFolder = std::string(homedir) + "/.jaildoctors_dilemma";
struct stat st = {0};
if (stat(systemFolder.c_str(), &st) == -1)
{
errno = 0;
int ret = mkdir(systemFolder.c_str(), S_IRWXU);
if (ret == -1)
{
switch (errno)
{
case EACCES:
printf("the parent directory does not allow write");
exit(EXIT_FAILURE);
case EEXIST:
printf("pathname already exists");
exit(EXIT_FAILURE);
case ENAMETOOLONG:
printf("pathname is too long");
exit(EXIT_FAILURE);
default:
perror("mkdir");
exit(EXIT_FAILURE);
}
}
}
#endif
}
// Carga los recursos
void Director::loadResources(section_t section)
{
@@ -1055,17 +1140,8 @@ bool Director::setFileList()
// Configuración
asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data);
#ifdef _WIN32
asset->add("\%APPDATA\%/jaildoctors_dilemma/config.txt", t_data, false);
asset->add("\%APPDATA\%/jaildoctors_dilemma/stats.txt", t_data, false);
#elif __APPLE__
asset->add("~/Library/Application Support/jaildoctors_dilemma/config.txt", t_data, false);
asset->add("~/Library/Application Support/jaildoctors_dilemma/stats.txt", t_data, false);
#elif __linux__
asset->add("~/.jaildoctors_dilemma/config.txt", t_data, false);
asset->add("~/.jaildoctors_dilemma/stats.txt", t_data, false);
#endif
asset->add(prefix + "/data/config/config.txt", t_data, false);
asset->add(systemFolder + "/stats.txt", t_data, false, true);
// Habitaciones
asset->add(prefix + "/data/room/01.room", t_room);
@@ -1582,4 +1658,4 @@ void Director::run()
break;
}
}
}
}