LINUX.ORG.RU

man getpwent

anonymous
()
Ответ на: комментарий от koTuk

ivan@localhost ~/home $ gcc home.c && ./a.out
Ошибка сегментирования

А всё от того, что вы забыли #include <stdlib.h>. Плюс этот метод
работает не совсем правильно, если на исполнимом файле стоит SUID-бит
и запускается он от имени совсем другого пользователя.

Deleted
()
Ответ на: комментарий от Deleted

>А всё от того, что вы забыли #include <stdlib.h>.

bash-3.2$ bash-3.2$ cat home.c
#include <stdio.h>

int main (void)
{
printf("%s\n", getenv("HOME"));
return 0;
}
bash-3.2$ gcc home.c && ./a.out
/home/sasa
bash-3.2$ gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.2.4/configure --prefix=/usr --libexecdir=/usr/lib --enable-languages=c,c++,objc --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-shared --disable-nls --with-x=no
Thread model: posix
gcc version 4.2.4 (CRUX)

>Re: [C[++]] Как узнать домашний каталог текущего пользователя?
>Плюс этот метод
>работает не совсем правильно, если на исполнимом файле стоит SUID-бит
>и запускается он от имени совсем другого пользователя.

bash-3.2$ ls -l
total 12
-rwsr-sr-x 1 root root 5549 2008-08-22 22:20 a.out
-rw-r--r-- 1 sasa users 90 2008-08-22 22:12 home.c
bash-3.2$ whoami
sasa
bash-3.2$ ./a.out
/home/sasa

koTuk
()
Ответ на: комментарий от koTuk

Он как раз покажет домашний каталог текущего пользователя а не пользователя с чьими правами запущена программа как в предыдущем примере.

koTuk
()
Ответ на: комментарий от koTuk

Единственный нюанс - плюс или минус хз :)
bash-3.2$ HOME="/хрен знает что за путь" ./a.out
/хрен знает что за путь

koTuk
()
Ответ на: комментарий от koTuk

> bash-3.2$ gcc home.c && ./a.out > /home/sasa

Хе-хе =). Вот так и появляются ошибки =). Функция getenv находяится в stdlib.h и в вашем случае при вызове она не описана. Компилятор молча делает implicit declaration как int getenv(const char *). У вас на x86 это действительно работает, так как sizeof(int)==sizeof(char *)==4. А у меня amd64: sizeof(int)==4, а sizeof(char *)==8, поэтому у меня указатель на строку при передаче в printf урезается до 4-х байт и случается жопа.

Deleted
()
Ответ на: комментарий от koTuk

>> Он как раз покажет домашний каталог текущего пользователя а не пользователя с чьими правами запущена программа как в предыдущем примере.

Тут зависит от того, что конкретно нужно топик-стартеру. И кстати переменная HOME устанавливается шеллом и поэтому она есть только если в дереве процессов где-то выше есть шелл.

Deleted
()
Ответ на: комментарий от Deleted

>Функция getenv находяится в stdlib.h
Все правильно, мое упущение. У меня сработало я даже не стал заморачиваться, где объявлена эта ф-ия. В любом случае в настоящей программе -Wall сразу бы сказал об этом.
>Тут зависит от того, что конкретно нужно топик-стартеру.
Просто привел один из вариантов. Я же не говорю что это самый правильный метод :)

koTuk
()

(user-homedir-pathname)

anonymous
()
Ответ на: комментарий от Deleted

>И кстати переменная HOME устанавливается шеллом и поэтому она есть только если в дереве процессов где-то выше есть шелл.

И что тоже довольно важно: $HOME и другие переменные окружения может изменять пользователь:

$ HOME=/root myprog

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.