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