Понимание & quot; создать виртуальную файловую систему, которая позволяет отображать произвольные каталоги & quot; для проекта FTP-сервера

Отказ от ответственности: это домашнее задание; Я не хочу решения.

Кроме того, нет библиотек за пределами стандартных библиотек c / c ++.

Я ищу толчок в правильном направлении, чтобы понять, что эта часть работы из моего назначенного семестрового проекта (создание виртуального FTP-сервера) даже просит меня сделать:

Сервер позволяет создать виртуальную файловую систему. Под виртуальной файловой системой мы подразумеваем отображение обслуживаемого каталога в реальный каталог в файловой системе. Например, дерево клиента будет выглядеть так: / home / user1 сопоставляется с / mnt / x / home / user1 / www сопоставляется с / var / cache / www /home/user_list.txt сопоставляется с /var/ftpclient/user_list.txt Пользователь увидит каталог / home / user1 и каталог / www и файл /home/user_list.txt

Я задал этот вопрос своему лектору:

Являются /home/user1 -> /mnt/x/home/user1 , /www -> /var/cache/www , а также /var/cache/www/home/user_list.txt -> /var/ftpclient/user_list.txt единственные сопоставления каталогов, которые должны поддерживаться (таким образом, каждый пользователь будет иметь 2 каталога и 1 файл, как показано, автоматически созданный для них)?

на что был дан следующий ответ:

Эти сопоставления являются просто примерами настроек. Ваше решение должно быть в состоянии
сопоставить что-либо с чем-либо подобным образом.

Исходя из моего нынешнего понимания, мне нужно только разрешить пользователям моего FTP-сервера получать доступ к каталогам и файлам, которые явно сопоставлены (указывается в файле конфигурации). Это, вероятно, будет означать отображение чего-то вроде /home -> /home/users (так что все пользователи увидят, что они находятся в псевдо-корневом каталоге для вещей FTP, например, пользователь Боб видит /home/bob/,

Кроме того, с каким API мне нужно работать для поддержки таких команд FTP, как ls, cdи т. д. которые работают с реальной неподходящей файловой системой?

0

Решение

Вы создаете свой собственный FTP-сервер (или хотя бы его часть). Это нужно будет решить проблему /home/bob переводит на /home/users/bob, Я верю, что вы должны это сделать, если кто-то печатает cd /home/bobвы просто переводите переданное в file-location функцию, которая принимает предоставленный пользователем ответ (в этом случае/home/bob) в его «реальной» форме (/home/users/bobдо того, как оно будет передано chdir функция, которая на самом деле меняет каталог. Чтобы сделать вещи, как pwd а также ls показать правильный путь, вам нужно будет либо «вспомнить, где вы находитесь» (имея в виду, что кто-то может захотеть сделать cd ../joe, cd ../tom/.././mats/../joe, или же cd ..; cd joe перейти к /home/joe, который должен все [по модулю мои опечатки] перевести на /home/users/joe но отображать как /home/joe — другими словами, ваш cd нужно будет понять текущий каталог . и родительский каталог .. передвигаться), или иметь «обратный перевод», который занимает /home/users/joe и придумывает /home/joe, Это моя текущая мысль, что последнее проще, но я точно не решил эту проблему.

Вероятно, есть несколько решений, которым вы можете следовать, но «совпадение начала строки» и работа по абсолютным путям будут работать, если вы не хотите делать очень сложные вещи и не позволяете пользователям делать действительно сложные вещи, например, если у нас есть это отображение:

/home -> /mnt/x/home     (e.g /home/bob becomes /mnt/x/home/bob)
/www  -> /var/cache/www    (e.g /www/index.html becomes /var/cache/www/index.html)

Теперь, если пользователь должен был сделать:

cd /home/bob/../../www/    (could be worse with more . and .. mixed in)

тогда вам нужно на самом деле понять, где вы находитесь, и перевести исправить … / .. в / снова. [Конечно, похожие проблемы с использованием cd /home/bob затем cd .. а также cd www может создавать аналогичные проблемы.

Я бы уточнил, действительно ли этого требует ваш лектор.

Если это не требуется, сопоставьте начало чего-либо, начиная с / (все остальное, просто перейдите к chdir без изменений)

1

Другие решения

Последний вопрос самый простой: используйте библиотеку Boost Filesystem, в ней есть типы, которые вам понадобятся, например, пути к файлам.

По первому вопросу идея заключается в том, что GET /home/user_list.txt возвращает содержимое /var/ftpclient/user_list.txt, Это означает, что вам сначала нужно перевести виртуальное имя в реальное имя (здесь может быть некоторая причудливость, но в основном вы хотите проверить, появляется ли какой-либо префикс виртуального имени в таблице перевода. Причудливость включает в себя обращение со случаем имен, которые не найдены ). Во-вторых, с настоящим именем вы хотите открыть этот файл, прочитать его содержимое и вернуть его клиенту.

0

По вопросам рекламы [email protected]