Posix: Follow XDG basedir spec for config dir · milkytracker/MilkyTracker@eb487c5

Original file line numberDiff line numberDiff line change

@@ -34,6 +34,8 @@

3434

#include <string.h>

3535

#include <unistd.h>

3636

#include <limits.h>

37+

#include <sys/stat.h>

38+

#include <sys/types.h>

3739
3840

#ifdef __PSP__

3941

#include <pspkernel.h>

@@ -97,14 +99,32 @@ const SYSCHAR* System::getConfigFileName()

9799

return buffer;

98100

#endif

99101

char *home = getenv("HOME");

100-

if(home)

102+

if(!home)

101103

{

102-

strcpy(buffer, home);

103-

strcat(buffer, "/.milkytracker_config");

104+

// If $HOME isn't set, save in the current dir

105+

strncpy(buffer, "milkytracker_config", PATH_MAX);

106+

return buffer;

104107

}

108+

// Old location was in the home directory

109+

char oldLoc[PATH_MAX];

110+

strncpy(oldLoc, home, PATH_MAX);

111+

strncat(oldLoc, "/.milkytracker_config", PATH_MAX);

112+

// New location based on xdg basedir spec

113+

char *xdg_config_home = getenv("XDG_CONFIG_HOME");

114+

if(xdg_config_home)

115+

strncpy(buffer, xdg_config_home, PATH_MAX);

105116

else

106-

strcpy(buffer, "milkytracker_config");

107-
117+

{

118+

strncpy(buffer, home, PATH_MAX);

119+

strncat(buffer, "/.config", PATH_MAX);

120+

}

121+

mkdir(buffer, S_IRWXU);

122+

strncat(buffer, "/milkytracker", PATH_MAX);

123+

mkdir(buffer, S_IRWXU);

124+

strncat(buffer, "/config", PATH_MAX);

125+

// Move possible existing config into new location if not already present

126+

if(home && access(oldLoc, F_OK) == 0 && access(buffer, F_OK) != 0)

127+

rename(oldLoc, buffer);

108128

return buffer;

109129

}

110130