diff --git a/src/nsmd.cpp b/src/nsmd.cpp index 1e2ed66..1cc9338 100644 --- a/src/nsmd.cpp +++ b/src/nsmd.cpp @@ -2732,14 +2732,36 @@ int main(int argc, char *argv[]) } - //Get the XDG runtime directory for lockfiles - //https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html - //Unlike $XDG_DATA_HOME the runtime env var must be set, usually to /run/user/1000/ + /*Get the XDG runtime directory for lockfiles + * https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + * /Unlike $XDG_DATA_HOME the runtime env var must be set, usually to /run/user// + * + * If the system is not XDG compliant (var not set) we fall back to /run/user/ directly + * This is in accordance with https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard 3.0 + */ struct stat rundir_check; lockfile_directory = getenv( "XDG_RUNTIME_DIR" ); - if ( stat( lockfile_directory, &rundir_check ) != 0 && S_ISDIR(rundir_check.st_mode)) { - FATAL( "Failed to access $XDG_RUNTIME_DIR directory %s with error: %s", lockfile_directory, strerror( errno ) ); + + //Env var is not set + if ( !lockfile_directory || !lockfile_directory[0] ) { + + //manpage "These functions are always successful and never modify errno." + //uid_t id = getuid(); + uid_t uid_for_rundir = geteuid(); // if the user was changed for this process. Usually just 1000, for the first user + asprintf( &lockfile_directory, "/run/user/%d/", uid_for_rundir); + WARNING( "$XDG_RUNTIME_DIR not set. You could set that manually. Now trying to fall back to %s", lockfile_directory); + } + //Now we have a directory path and need to test it. + + //Is set but no access + if ( stat( lockfile_directory, &rundir_check ) != 0 ) { + FATAL( "Failed to access FHS run-dir directory %s with error: %s", lockfile_directory, strerror( errno ) ); + } + //Is set but not a directory + else if ( !S_ISDIR(rundir_check.st_mode) ) { + FATAL( "FHS run-dir is %s which is not a directory", lockfile_directory ); } + //A-Ok else { asprintf( &lockfile_directory, "%s/%s", lockfile_directory, "nsm");