Отказ от ответственности: это домашнее задание; Я не хочу решения.
Кроме того, нет библиотек вне стандартных библиотек 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?
Вы создаете свой собственный 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
без изменений)
Последний вопрос самый простой: используйте библиотеку Boost Filesystem, у вас есть типы, которые вам понадобятся, например пути к файлам.
Для первого вопроса идея состоит в том, что GET/home/user_list.txt
возвращает содержимое /var/ftpclient/user_list.txt
. Это означает, что вам сначала нужно перевести виртуальное имя в настоящее имя (здесь может быть какая-то причудливость, но в основном вы хотите проверить, не появляется ли в таблице переводов какой-либо префикс виртуального имени.Фанкильность включает в себя рассмотрение случая, когда имена не найдены). Во-вторых, с настоящим именем вы хотите открыть этот файл, прочитать его содержимое и вернуть его клиенту.