Учитывая путь к файлу или каталогу, как определить точку монтирования для этого файла? Например, если /tmp
смонтирован в качестве файловой системы tmpfs
, после чего задается имя файла /tmp/foo/bar
, я хочу знать, что он хранится на tmpfs
, внедренном в /tmp
.
Это будет в С++, и я бы хотел избежать вызова внешних команд через system()
. Код должен быть надежным - не обязательно против преднамеренного вмешательства, но определенно перед лицом вложенных точек монтирования, символических ссылок и т.д.
Мне не удалось найти простой системный вызов для этого. Похоже, мне придется самому написать чек. Вот грубая схема того, что я планирую.
- Канонизировать имя файла a la the
readlink
shell. Как? - Прочитайте
/etc/mtab
с помощьюgetmntent()
и co. - Определите соответствующую запись монтирования для файла. Как?
Для # 1 есть простой системный вызов или мне нужно прочитать каждый компонент каталога пути и разрешить их с помощью readlink(2)
, если они являются символическими ссылками? И ручкой .
и ..
себя? Кажется, боль.
Для # 3 у меня есть разные идеи о том, как это сделать. Не уверен, что лучше.
-
open()
файл, его родительский элемент, родительский родитель и т.д., используяopenat(fd, "..")
, пока не достигнет одной из записей/etc/mtab
. (Как узнать, когда я это сделаю?fstat()
и сравнить номера индексов?) - Найдите самое длинное имя каталога в таблице монтирования, которая является подстрокой имени моего файла.
Я склоняюсь к первому варианту, но перед тем, как закодировать его, я хочу убедиться, что я ничего не замечаю - в идеале это встроенная функция, которая делает это уже!