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 и, возможно, многие другие.