поиск приложения внутри среды PATH в c

Я пытаюсь выполнить приложения в c по имени, перед запуском я хочу узнать, является ли имя законным. Есть ли способ проверить c и узнать, существует ли приложение в среде PATH?

спасибо


person hillel_guy    schedule 21.05.2012    source источник
comment
FWIW, не все платформы используют только PATH для поиска исполняемых файлов.   -  person David Heffernan    schedule 21.05.2012
comment
Не проще ли (и безопаснее) вместо этого иметь белый список разрешенных исполняемых файлов?   -  person dirkgently    schedule 21.05.2012
comment
Посмотрите исходный код какой команды оболочки (Linux). Вы получите некоторую подсказку.   -  person Lunar Mushrooms    schedule 21.05.2012


Ответы (1)


Вероятно, лучший способ сделать это — имитировать поведение команды «what», как уже предложили Lunar Mushrooms.

Быстрый просмотр вывода следующей команды

$ strace which ls

показывает, что 'what' просто перебирает записи $PATH, объединяет их с именем команды ('ls' в приведенном выше примере) и вызывает для нее stat64. Цикл прерывается, если stat64 возвращает значение, отличное от -1 (это означает, что файл существует). Вот соответствующий фрагмент вывода проверенной команды:

...
stat64("/home/mz/bin/ls", 0xbfa84350)   = -1 ENOENT (No such file or directory)
stat64("/usr/local/sbin/ls", 0xbfa84350) = -1 ENOENT (No such file or directory)
stat64("/usr/local/bin/ls", 0xbfa84350) = -1 ENOENT (No such file or directory)
stat64("/usr/sbin/ls", 0xbfa84350)      = -1 ENOENT (No such file or directory)
stat64("/usr/bin/ls", 0xbfa84350)       = -1 ENOENT (No such file or directory)
stat64("/sbin/ls", 0xbfa84350)          = -1 ENOENT (No such file or directory)
stat64("/bin/ls", {st_mode=S_IFREG|0755, st_size=96324, ...}) = 0
stat64("/bin/ls", {st_mode=S_IFREG|0755, st_size=96324, ...}) = 0
geteuid32()                             = 1000
getgid32()                              = 1000
...
person mzet    schedule 21.05.2012