LINUX.ORG.RU

Добавить ./ в $XDG_DATA_DIRS не помогает?

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

Так?

#include <unistd.h> // For realpath
#include <libgen.h> // For dirname
#include <string.h> // For strncpy
#include <stdio.h>  // For perror
#include <stdlib.h> // For free

int main(int argc, char **argv)
{
    char exepath[PATH_MAX];
    char *resolvedPath = realpath(argv[0], NULL);
    if (resolvedPath == NULL) {
        perror("Error resolving path");
        return  1;
    }

    strncpy(exepath, resolvedPath, sizeof(exepath));
    free(resolvedPath); // Don't forget to free the memory allocated by realpath

    // Use dirname to get the directory of the actual executable
    char *dir = dirname(exepath);
    if (dir == NULL) {
        perror("Error getting directory name");
        return  1;
    }

    // Construct the data directory path using the directory of the actual executable
    char datadir[PATH_MAX];
    snprintf(datadir, sizeof(datadir), "%s/../share/program_name", dir);

    // ...

    return  0;
}

damix9 ★★★
() автор топика

Чтобы бинарник искал что-то в XDG_DATA_DIRS, в нём должен быть явный код, реализующий данный поиск. Вот его и правь.

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

Ещё встречал софт, где можно через флаг компилятора изменить директорию с конфигами, что-то вроде -Dsysconfdir.

Как написал выше firkax, зависит от конкретного софта. Если разработчик предусмотрел чтение из XDG_DATA_DIRS, тогда будет работать, в противном случае пользователи делают символические ссылки.

IIIypuk ★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от firkax

Я-то думал, есть какая-то стандартная функция для получения пути к данным, и то что она возвращает, можно вшить при компиляции. А это оказывается каждый по-своему реализует.

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

Если под стандартами понимать то, что под ними обычно понимается в контексте Си (то есть всякие ISO C, POSIX, SUS и что там ещё) - то такого и быть не могло, потому что XDG само по себе стандартным не является. Если речь про какие-нить гуи-тулкиты, то в них возможно и есть такие функции, но тулкиты стандартами не являются, их много и опять приходим к тому что каждый сам выбирает.

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

argv[0] могут передать при запуске твоей программы любой. Лучше прочитать симлинк /proc/self/exe.

iliyap ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.