Этот элемент разбивается на два компонента, которые передаются встроенной функции symlink(). Создаются только символические ссылки, которые указывают на цели с относительным именем пути, и не предпринимаются попытки создать символические ссылки на цели с полным обозначением пути доступа (такие, как “/cpan”), поскольку они могут оказаться нечувствительными на локальном компьютере. Кроме того, ссылки с полным обозначением пути могут противоречить требованиям защиты.
Подпрограмма parse_listing(). Эта подпрограмма вызывается подпрограммой get_dir() для обработки одной строки листинга каталога, полученного с помощью метода Net::FTP->dir(). Подпрограмма parse_listing() необходима, поскольку серверы с наиболее примитивной реализацией протокола FTP не предоставляют иного способа определения типа режима доступа к элементу листинга каталога. Она интерпретирует строку листинга каталогов с использованием регулярного выражения, которое учитывает все распространенные разновидности форматов листинга каталога. Код типа файла определяется на основе первого символа поля режима (например, символа “d” в поле drwxr-xr-x), а его режим — из остальной части этого поля. Именем файла считается все, что следует за полем даты.
Значение типа, имени и режима возвращаются вызывающей процедуре после преобразования символьного обозначения режима доступа к файлу в его числовую форму.
Подпрограмма filemode (). Эта подпрограмма выполняет преобразование символьного обозначения режима доступа к файлу в его числовой эквивалент. Например, символьное обозначение режима rw-r--r-- — преобразуется в восьмеричное значение 0644. Биты seiuid или setgid рассматриваются так, как если бы они обозначали право на выполнение. Попытка создания локального файла с установленными битами setuid или setgid может явиться нарушением требований защиты.
При повторном выполнении этого сценария через несколько минут появляются сообщения с указанием, что основная часть файлов является актуальной и не требует обновления.
Самое слабое место этого сценария — процедура parse_listing(). Поскольку формат листинга каталога FTP не стандартизирован, на разных серверах применяются различные реализации. В процессе разработки этот сценарий проверялся на ряд демонов FTP UNIX, а также на FTP-сервере Microsoft US. Однако на других сервера выполнение этого сценария может закончиться аварийно. Кроме того, регулярное выражение, применяемое для интерпретации элементов листинга каталога, может неправильно обрабатывать имена файлов, которые начинаются с пробельного символа.