web-dev-qa-db-fra.com

Récupérer le répertoire personnel sous Linux

J'ai besoin d'un moyen d'obtenir le répertoire personnel de l'utilisateur dans le programme C++ fonctionnant sous Linux. Si le même code fonctionne sous Unix, ce serait bien. Je ne veux pas utiliser la valeur d'environnement HOME.

AFAIK, le répertoire de base de root est/root. Est-il OK de créer des fichiers/dossiers dans ce répertoire, dans le cas où mon programme est exécuté par l'utilisateur root?

61
Alex F

Vous avez besoin de getuid pour obtenir l'ID utilisateur de l'utilisateur actuel, puis getpwuid pour obtenir l'entrée du mot de passe (qui inclut le répertoire personnel) de cet utilisateur:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

struct passwd *pw = getpwuid(getuid());

const char *homedir = pw->pw_dir;

Remarque: si vous en avez besoin dans une application filetée, vous voudrez utiliser getpwuid_r au lieu.

88

Vous devez d'abord vérifier la variable d'environnement $HOME, Et si elle n'existe pas, utilisez getpwuid.

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

const char *homedir;

if ((homedir = getenv("HOME")) == NULL) {
    homedir = getpwuid(getuid())->pw_dir;
}

Notez également que si vous souhaitez que le répertoire de base stocke les données de configuration ou de cache dans le cadre d'un programme que vous écrivez et que vous souhaitez distribuer aux utilisateurs, vous devez envisager de suivre XDG Base Directory Specification . Par exemple, si vous souhaitez créer un répertoire de configuration pour votre application, vous devez d'abord vérifier $XDG_CONFIG_HOME En utilisant getenv comme indiqué ci-dessus et ne retomber dans le code ci-dessus que si la variable n'est pas définie.

Si vous avez besoin d'une sécurité multi-thread, vous devez utiliser getpwuid_r Au lieu de getpwuid comme ceci (à partir de la page de manuel getpwnam(3)):

struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1)
    bufsize = 0x4000; // = all zeroes with the 14th bit set (1 << 14)
buf = malloc(bufsize);
if (buf == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}
s = getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
if (result == NULL) {
    if (s == 0)
        printf("Not found\n");
    else {
        errno = s;
        perror("getpwnam_r");
    }
    exit(EXIT_FAILURE);
}
char *homedir = result.pw_dir;
63
josch

Si vous exécutez le programme en tant que root, vous aurez un accès rwx à ce répertoire. Créer des trucs à l'intérieur c'est bien, je suppose.

0
Anthony