C snprintf указывает домашний каталог пользователя

Я использую snprintf записать отформатированные данные на диск, но у меня есть одна проблема, как мне сохранить их в домашнем каталоге пользователя?

 snprintf(filename, sizeof(filename), "%s_%s.sho", client, id);

3 ответа

Решение

В системах Linux и POSIX домашний каталог часто находится в HOME переменная окружения. Таким образом, вы могли бы код

snprintf(filename, sizeof(filename), "%s/%s_%s.sho", 
         getenv("HOME"), client, id);

Педантически getenv (3) может потерпеть неудачу (или ошибаться). Но это случается редко. Смотрите окружающую среду (7).

(Вы можете проверить и / или использовать getpwuid (3) с getuid (2)...)

С исполняемыми файлами setuid все может стать интересно сложным. Вам нужно будет более точно определить, что такое дом, и соответствующим образом кодировать (это оставлено в качестве упражнения).

Пользователь контролирует свою среду - так HOME Переменная окружения может быть неправильной или даже не установлена.

использование getuid() а также getpwuid() чтобы получить домашний каталог пользователя, указанный вашей системой:

#include <unistd.h>
#include <pwd.h>

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

/* need to duplicate the string - we don't know
   what pw_dir points to */
const char *homeDir = strdup( pwd->pw_dir );

Проверка ошибок оставлена ​​в качестве упражнения...

Использование getenv(3) запросить значение HOME переменная окружения. Например, это печатает мой домашний каталог:

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    printf("%s\n", getenv("HOME"));
    return 0;
}

Вы можете установить свою переменную filename к возвращаемому значению, а затем напишите все данные, которые вы хотите там.

Это должно работать на любой Unix-подобной системе, включая Linux, macOS, BSD и, возможно, многие другие.

Другие вопросы по тегам