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

0

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

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

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

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

Я продолжил этот вопрос моему лектору:

Are /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, например, пользователь Bob видит /home/bob/.

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

Теги:
vfs
ftp-server

2 ответа

1

Вы создаете свой собственный FTP-сервер (или, по крайней мере, его часть). Он должен будет решить проблему /home/bob translates to /home/users/bob. Я полагаю, что так, как вы должны это сделать, так это то, что если кто-то набирает cd/home/bob, вы просто переводите переданное в файл-местоположение функцию, которая использует по умолчанию пользовательский (в данном случае /home/bob) это "реальная" форма (/home/users/bob), прежде чем она chdir функции chdir которая фактически изменяет каталог. Чтобы вещи вроде pwd и ls отображали правильный путь, вам нужно либо "запомнить, где вы" (имея в виду, что кто-то может захотеть сделать cd../joe, cd../tom/.././mats/../joe или cd..; cd joe для перехода в /home/joe, который должен [modulo my typos] переводить в /home/users/joe но отображаться как /home/joe - другими словами, ваш cd - . .. /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 без изменений)

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню