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