LINUX.ORG.RU

zen@debian:~/Coding/setenv$ cat main.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main (int argc, char**argv)
{
        extern char*environ;

        printf ("%s\n", getenv("HOME"));

        return 0;
}

zen@debian:~/Coding/setenv$ make main
cc     main.c   -o main
zen@debian:~/Coding/setenv$ ./main
/home/zen
zen@debian:~/Coding/setenv$  
Punk
()

Кроссплатформенно? Если нет, то:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
  printf ("Your home directory is %s.\n", getenv("HOME"));
  return 0;
}

rival ★★
()

Если в glib, то g_get_home_dir

ttnl ★★★★★
()
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define PATH_LEN 256

int main(void)
{
    char path[PATH_LEN];
    FILE *pipe;
    if(!(pipe = popen("clisp --silent -norc -x \"(progn (princ (user-homedir-pathname)) (quit))\"", "r")))
    {
        fprintf(stderr, "Error\n");
        exit(1);
    }
    memset(path, 0, PATH_LEN);
    fgets(path, PATH_LEN-1, pipe);
    printf("User directory: %s\n", path);
    pclose(pipe);
    return 0;
}

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

Я не понял, что не устраивает?
Узнаем из Си? Да. Домашнюю директорию? Да.

В общем же случае, и кроссплатформенно, этого не сделать без жирных фреймворков или кучи ifdef - в сях просто нет такого понятия как «домашняя папка/директория»

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

Ух-ты, сишная программа генерирует и исполняет лисповый код!

mv ★★★★★
()

>Как в си узнать домашнюю папку?

У C нет «домашней папки». «Папки» есть в венде, но есть ли в венде «домашние папки» - не знаю.

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

Еще бы! У меня оно так тоже не работает:

D:\> $ ./foo

"$" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом

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

Есть. Переменная окружения называется APPDATA, там хорошо воспитанные программы хранят данные текущего юзера.

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

Неверно. Там есть именно «домашний каталог», но раньше по умолчанию не был определён. Как сейчас — без понятия.

GotF ★★★★★
()
Ответ на: комментарий от Love5an

> if(!(pipe = popen(«clisp --silent -norc -x \»(progn (princ (user-homedir-pathname)) (quit))\"", «r»))) { fprintf(stderr, «Error\n»); exit(1); }

Гланды тоже через анальное отверстие предпочитаете удалять?

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

«Гланды через жопу» это подключать gtk или какое-нибудь подобное говно.

А тут - и просто, и предельно кроссплатформенно.

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

Кроссплатформенно? На маке не работает. На винде не работает. И на федоре не работает. Лисп не всюду стоит, не?

Я другого не пойму, зачем подключать? Тут нет какого-нить подобия NSSearchPathForDirectoriesInDomains? Т.е., чтобы не пришлось подключать кучу библиотек, а обойтись одной, типа некстстепа?

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

Работает, т.к. clisp работает практически везде.


Впрочем, для любителей - никто не запрещает потанцевать с бубном и наворотить кучу ifdef.

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

> D:\

Казалось бы, причём тут Linux.

Во-первых, ТС спрашивает как ему узнать домашнюю директорию пользователя от которого запущен процесс. Во-вторых, он пишет на си. В-третьих, его «/home/xxxx/» намекает, что речь идёт о POSIX-compatible системе.

Вы предлагаете ему потянуть для этой цели clisp (а чёй не python, который и так не випилить теперь из половины дистрибутивов; а может сразу JVM?). Почему-то nginx, к примеру, clisp за собой не тянет, но прекрасно работает почти на всех системах.

Так что `man 3 getenv` +1.

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

> и наворотить кучу ifdef

Вроде как всего один - винда/невинда, не?

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

> Работает, т.к. clisp работает практически везде.

Нет, СЛисп должен не толко работать, но и стоять везде. Пока не стоит, говорить, что оно кроссплатформенно не имеет смысла, т.к. его еще надо тянуть и ставить. Именно по этой причине я не предложил автору подключить тот же NextStep и не сделать библиотечку на обжективе дял поиска домашней директории, хотя оно и то было бы портабельнее, чем лисп, т.к. все-таки бинарный код, тягаемый за приложением, а не лисп, который требует отдельной пляски с бубном.

trimm
()

getenv(«HOME»); Вот за это всем спасибо, большое.

mordovorot
() автор топика
Ответ на: комментарий от Love5an

Ну вы просто образец тролля. Снимаю шляпу перед вашим величием, сударь.

anonymous
()
Ответ на: комментарий от rival
  printf ("Your home directory is %s.\n", getenv("HOME"));

А проверять возвращаемое значение на NULL кто будет?

Кроме того, так как все переменные окружения управляются пользователем, то с полученным от getenv() значением нужно быть очень аккуратным.

(Лично я бы предпочёл использовать getuid() + getpwuid())

php-coder ★★★★★
()
Ответ на: комментарий от php-coder

> А проверять возвращаемое значение на NULL кто будет?

Очевидно, ТС, если ему это нужно будет.

rival ★★
()
Ответ на: комментарий от Love5an

if(!(pipe = popen(«clisp --silent -norc -x \»(progn (princ (user-homedir-pathname)) (quit))\"", «r»)))

спасибо, посмеялсо.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define PATH_LEN 256

int main(void)
{
    char path[PATH_LEN];
    FILE *pipe;
    if(!(pipe = popen("./main", "r")))
    {
        fprintf(stderr, "Error\n");
        exit(1);
    }
    fgets(path, PATH_LEN-1, pipe);
    printf(path);
    pclose(pipe);
    return 0;
}

nanoo_linux
()
#include <stdio.h>
#include <readline/readline.h>

char * get_home_directory(void)
{
    return
        readline("Enter your home directory: ");
}

int main(int argc, char *argv[])
{
    printf("Your home directory: [ %s ] \n", get_home_directory());
    return 0;
}
vasily_pupkin ★★★★★
()
Ответ на: комментарий от trimm

clisp не требует никакой пляски с бубном, он просто работает, и портабелен практически настолько, насколько портабельна сишная стандартная библиотека.

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

он просто работает

Да-да, конечно работает. С тобой никто и не спорит.

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