PDA

Показать полную графическую версию : Как заставить tcopy в 32-разрядной системе копировать с ленты на диск файл более 2Gb?


Im27th
26-01-2010, 11:15
В общем, поскольку не программирую уже больше 10 лет, трудно понять что именно надобно сотворить.
В исходнике tcopy
http://src.opensolaris.org/source/xref/netvirt/usr/src/cmd/tcopy/tcopy.c
нет тех функций, к примеру D_FILE_OFFSET_BITS, которые требуют отредактировать в этих документах
http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#Value-too-large-for-defined-data-type
http://www.sun.com/software/whitepapers/wp-largefiles/largefiles.pdf

И вообще не смотря на то, что проблема типа стара, я не нашёл ни в одном форуме или блоге, чтобы хоть кто-то описывал, что решил эту проблему. Я думаю за эти годы уже саму tcopy можно было переделать 300 раз.

В общем-то хочется понять что же требуется?
- либо отредактировать функции как для 64-разрядной системы, но ссылки оставить на 32-разрядные библиотеки;
- либо наоборот отредактировать оставить функции, но ссылки сделать на 64-разрядные библиотеки и установить эти бибилиотеки;
Потому что если редактировать всё, то не проще ли взять и скопировать tcopy из 64-разрядной системы?

Заранее благодарен!
Пните в нужном направлении, а то ваще туплю.

ruslandh
31-01-2010, 18:04
Как я понимаю, проблема в sys/types.h или его аналога

Setting _FILE_OFFSET_BITS to 64 before including any system headers
enables 64-bit interfaces.

Not defining this macro or setting it as to 32 will result in the regular
compilation environment as discussed above.


IMHO проблема в 32-х разрядной системе неразрешима.

Im27th
15-02-2010, 15:22
Да, всё получилось!

В исходнике поменял в двух местах open() на open64() и откомпилировал:
gcc -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 tcopy2.c -o tcopy2

И на CentOS 5.2. и на Solaris 8 всё откомпилировалось без ошибок.

Но долго не удавалось проверить - не было доступа к ленточным устройствам.

Сегодня получил доступ на Solaris 8 и удалось скопировать с ленты на диск 10-гигабайтный файл.
Правда он всё равно что-то в конце гадостливое сказал на прощание:

file 1: records 223462 to 223463: size 512
file 1: records 223464 to 223523: size 64512
file 1: record 223524: size 52992
file 1: record 223525: size 4
file 1: record 223526: size 512
file 1: records 223527 to 223529: size 64512
file 1: record 223530: size 49824
file 1: record 223531: size 4
file 1: records 223532 to 223635: size 512
file 1: eof after 223635 records: 10195176924 bytes
Write EOF: Inappropriate ioctl for device




© OSzone.net 2001-2012