Скопировать символическую ссылку по сети - PullRequest
1 голос
/ 05 февраля 2011

Я пишу приложение для контроля версий.Теперь я хочу скопировать файлы с одного компьютера на другой по сети, используя сокеты BSD.Я также хочу НЕ следовать по символическим ссылкам, но скопировать саму ссылку на другой компьютер.Я немного застрял на этом.

Один из вариантов, о котором я думал, - это использование команды readlink(), отправка данных на другую сторону машины и запись полученного содержимого в файл.Я даже не знаю, сработает ли это, потому что я не знаю, имеют ли различные операционные системы (в моем случае, Ubuntu и Mac OS X) одинаковую структуру файлов в символических ссылках.И я даже не знаю, сделает ли запись полученного содержимого в файл автоматически символической ссылкой.Честно говоря, я вряд ли сомневаюсь в этом.Может быть, команда open() с флагом O_SYMLINK будет работать для создания символической ссылки и записи в нее?

Другой вариант, о котором я подумал, - дать другому компьютеру понять, что мы обрабатываем ссылку, и сделатьэта ссылка на этой машине с symlink(), но здесь у меня есть две проблемы.Прежде всего, как получить абсолютное имя файла, на которое указывает символическая ссылка в файловой системе.И вторая проблема в том, что я не знаю, сработает ли вызов symlink() с несуществующим файлом?

Буду признателен, если кто-нибудь сможет это объяснить, т.е. f2

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Вы должны использовать readlink в исходной системе и symlink в целевой системе. символические ссылки на самом деле не имеют «файловой структуры в символических ссылках»; символическая ссылка содержит только путь к файлу (абсолютный или относительный).

Вы должны скопировать символическую ссылку как есть, т.е. не пытайтесь настроить его в целевой системе. Прекрасно иметь символические ссылки там, где целевой файл не существует (они называются «битые символические ссылки»). Пользователи должны будут устанавливать ссылки, которые имеют смысл (которые могут быть абсолютными, но, как правило, будут относительными); если они этого не сделают, то все произойдет непредсказуемым образом.

1 голос
/ 05 февраля 2011

Почему бы просто не сделать что-то вроде: tar cvfp -.|ssh user @ remote "cd targettdir; tar xfp -"?

...