LINUX.ORG.RU

История изменений

Исправление 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