История изменений
Исправление beastie, (текущая версия) :
Тут вот в чём фишка:
запустившего программу пользователя
Т.ч. getenv
даст неправильный ответ. Но ты прав – у меня там ошибка. Надо брать из getpwuid
:
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
int
main()
{
struct passwd *uid = getpwuid(getuid()); // geteuid?
printf("getpwuid: %s\n", uid->pw_dir); // correct result
struct passwd *nam = getpwnam(getlogin());
printf("getpwnam: %s\n", nam->pw_dir); // wrong result
printf("getenv: %s\n", getenv("HOME")); // wrong result
return 0;
}
tmp % ./h
getpwuid: /Users/dima
getpwnam: /Users/dima
getenv: /Users/dima
tmp % sudo ./h
getpwuid: /var/root
getpwnam: /Users/dima
getenv: /Users/dima
PS: я уже забыл в чём конкретно разница между getuid
и geteuid
. Оба дают правильный ответ под sudo
.
Исходная версия beastie, :
Тут вот в чём фишка:
запустившего программу пользователя
Т.ч. getenv
даст неправильный ответ. Но ты прав – у меня там ошибка. Надо брать из getpwuid
:
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
int
main()
{
struct passwd *uid = getpwuid(getuid()); // geteuid?
printf("getpwuid: %s\n", uid->pw_dir); // correct result
struct passwd *nam = getpwnam(getlogin());
printf("getpwnam: %s\n", nam->pw_dir); // wrong result
printf("getenv: %s\n", getenv("HOME")); // wrong result
return 0;
}
tmp % ./h
getpwuid: /Users/dima
getpwnam: /Users/dima
getenv: /Users/dima
tmp % sudo ./h
getpwuid: /var/root
getpwnam: /Users/dima
getenv: /Users/dima