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