[unix] Downloader
Всем известно, что для установки программ используются команды apt-get install, installpkg, rpm или еще пара таких же.
Или Uninstall packagename-version
То есть, хуже, чем в программах, которые проверяют зависимости и всё такое, но тоже ничего. А вот просто make install - это ужас.
autoconf / automake
export SMBDIR='где у вас стоит самба'а второе через первое уже никак ?
export SMBDIR='где у вас стоит самба'Почему не ./configure --with-smb-includes=XXX --with-smb-libraries=YYY?
./configure --prefix=/usr (или куда вам удобно)
Еще можно сделать возможность автоматической проверки стандартных мест, где оно может быть найдено.
Не пизди и сделай .deb, .spec и прочее.
Оно конечно лучше, но в 6 утра вспоминать как пишется configure.in для такого случая? Увольте...
smb://braindead.hackers/pub/nettools-0.0.2.tar.gz
Сборка:
./configure --prefix="/usr" --with-smblibdir="/usr/progs/Samba/lib" --with-smbincdir="/usr/progs/Samba/include"
По просьбам трудящихся я поправил систему сборки. Новый пакет тут: Сборка:
./configure --prefix="/usr" --with-smblibdir="/usr/progs/Samba/lib" --with-smbincdir="/usr/progs/Samba/include"
Making all in src
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -I../lib/libnet -I../lib/libproto -I../l
ib/libauth -I../lib/libroom -I/usr/local/include/libxml2 -I/usr/local/include -D
_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -MT client.o -MD -MP -M
F ".deps/client.Tpo" -c -o client.o client.C; then mv -f ".deps/client.Tpo" ".d
eps/client.Po"; else rm -f ".deps/client.Tpo"; exit 1; fi
g++ -I../lib/libnet -I../lib/libproto -I../lib/libauth -I../lib/libroom -I/usr/l
ocal/include/libxml2 -I/usr/local/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_B
ITS=64 -D_GNU_SOURCE -o client -L../lib/libnet -L../lib/libproto -L../lib/lib
auth -L../lib/libroom client.o -lnet -lproto -lauth -L/usr/local/lib -lxml2 -lz
-liconv -lm
/usr/bin/ld: warning: libm.so.2, needed by /usr/local/lib/libxml2.so, may confli
ct with libm.so.3
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -I../lib/libnet -I../lib/libproto -I../l
ib/libauth -I../lib/libroom -I/usr/local/include/libxml2 -I/usr/local/include -D
_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -MT server.o -MD -MP -M
F ".deps/server.Tpo" -c -o server.o server.C; then mv -f ".deps/server.Tpo" ".d
eps/server.Po"; else rm -f ".deps/server.Tpo"; exit 1; fi
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -I../lib/libnet -I../lib/libproto -I../l
ib/libauth -I../lib/libroom -I/usr/local/include/libxml2 -I/usr/local/include -D
_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -MT ServerWorker.o -MD
-MP -MF ".deps/ServerWorker.Tpo" -c -o ServerWorker.o ServerWorker.C; then mv -
f ".deps/ServerWorker.Tpo" ".deps/ServerWorker.Po"; else rm -f ".deps/ServerWork
er.Tpo"; exit 1; fi
g++ -I../lib/libnet -I../lib/libproto -I../lib/libauth -I../lib/libroom -I/usr/l
ocal/include/libxml2 -I/usr/local/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_B
ITS=64 -D_GNU_SOURCE -o server -L../lib/libnet -L../lib/libproto -L../lib/lib
auth -L../lib/libroom server.o ServerWorker.o -lnet -lproto -lauth -L/usr/local/
lib -lxml2 -lz -liconv -lm
/usr/bin/ld: warning: libm.so.2, needed by /usr/local/lib/libxml2.so, may confli
ct with libm.so.3
../lib/libnet/libnet.a(Thread.o.gnu.linkonce.t._ZN7Private6Thread4waitEv+0x15)
: In function `Private::Thread::wait':
: undefined reference to `pthread_join'
../lib/libnet/libnet.a(Thread.o.gnu.linkonce.t._ZN7Private6Thread9terminateEv+
0x13): In function `Private::Thread::terminate':
: undefined reference to `pthread_kill'
*** Error code 1
Stop in /usr/home//nettools-0.0.2/src.
*** Error code 1
Stop in /usr/home//nettools-0.0.2.
*** Error code 1
Stop in /usr/home//nettools-0.0.2.
unix%pwd
/usr/home//nettools-0.0.2
unix%~
Попробуй сейчас скачать. У тебя почему-то не было -lpthread. Я их добавил вручную
Making all in downloader
gmake[2]: Entering directory `/tmp/nettools-0.0.2/downloader'
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -I../lib/libnet -I../lib/libproto -I../lib/libauth -I../lib/libroom -I../lib/libmisc -I/usr/local/include/libxml2 -I/usr/local/include -MT BlockFile.o -MD -MP -MF ".deps/BlockFile.Tpo" -c -o BlockFile.o BlockFile.C; \
then mv -f ".deps/BlockFile.Tpo" ".deps/BlockFile.Po"; else rm -f ".deps/BlockFile.Tpo"; exit 1; fi
BlockFile.C:12:20: alloca.h: No such file or directory
gmake[2]: *** [BlockFile.o] Error 1
gmake[2]: Leaving directory `/tmp/nettools-0.0.2/downloader'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/tmp/nettools-0.0.2'
gmake: *** [all] Error 2
unix%pwd
/tmp/nettools-0.0.2
unix%uname -a
FreeBSD unix.local 5.3-STABLE FreeBSD 5.3-STABLE Wed Jan 5 13:36:33 MSK 2005 unix.local:/mnt/music/Temp/obj/usr/src/sys/kernel i386
unix%
Блин. Ну я фигею На bsd нет alloca? Ладно, сейчас поправлю.
unix%man alloca
ALLOCA(3) FreeBSD Library Functions Manual ALLOCA(3)
NAME
alloca -- memory allocator
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <stdlib.h>
void *
alloca(size_t size);
DESCRIPTION
The alloca function allocates size bytes of space in the stack frame of
the caller. This temporary space is automatically freed on return.
..............
Поздно Я уже ликвидировал все alloca. Можешь забирать.
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -I../lib/libnet -I../lib/libproto -I../lib/libauth -I../lib/libroom -I../lib/libmisc -I/usr/local/include/libxml2 -I/usr/local/include -MT Job.o -MD -MP -MF ".deps/Job.Tpo" -c -o Job.o Job.C; \
then mv -f ".deps/Job.Tpo" ".deps/Job.Po"; else rm -f ".deps/Job.Tpo"; exit 1; fi
if g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -I../lib/libnet -I../lib/libproto -I../lib/libauth -I../lib/libroom -I../lib/libmisc -I/usr/local/include/libxml2 -I/usr/local/include -MT Download.o -MD -MP -MF ".deps/Download.Tpo" -c -o Download.o Download.C; \
then mv -f ".deps/Download.Tpo" ".deps/Download.Po"; else rm -f ".deps/Download.Tpo"; exit 1; fi
Download.C: In function `bool Download::downloadFile(char**, int*, size_t, const char*)':
Download.C:167: error: `sighandler_t' undeclared (first use this function)
Download.C:167: error: (Each undeclared identifier is reported only once for each function it appears in.)
Download.C:167: error: expected `;' before "u"
Download.C:168: error: expected `;' before "h"
Download.C:172: error: `u' undeclared (first use this function)
Download.C:173: error: `h' undeclared (first use this function)
Download.C:177: error: expected `;' before "last_a"
Download.C:178: error: expected `;' before "last_i"
Download.C:184: error: `last_a' undeclared (first use this function)
Download.C:185: error: `last_i' undeclared (first use this function)
In file included from Download.C:226:
DownloadDir.C: In function `void Download::download_dir(char*, int)':
DownloadDir.C:106: error: `sighandler_t' undeclared (first use this function)
DownloadDir.C:106: error: expected `;' before "last_a"
DownloadDir.C:112: error: `last_a' undeclared (first use this function)
Download.C: In function `bool Download::downloadDir(char*, int)':
Download.C:235: error: `sighandler_t' undeclared (first use this function)
Download.C:235: error: expected `;' before "h"
Download.C:239: error: `h' undeclared (first use this function)
Download.C:243: error: expected `;' before "last_i"
Download.C:248: error: `last_i' undeclared (first use this function)
gmake[2]: *** [Download.o] Error 1
gmake[2]: Leaving directory `/tmp/nettools-0.0.2/downloader'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/tmp/nettools-0.0.2'
gmake: *** [all] Error 2
unix%
А что говорит man signal? Формат запуска... Что она у вас возвращает?
Попробуй сейчас.
Я не буду делать .deb, .spec и прочее, я просто не буду компилировать что-то, а поищу готовый пакет.
Комментарий же означал следующее: такой метод установки плохой. Не для меня плохой, вообще плохой.
А "не пизди" говорить - это очень грубо.
А что говорит man signal? Формат запуска... Что она у вас возвращает?Перевожу, что хотел сказать Fj: signal(3) типа устарел, об этом даже в POSIX написано. Нужно юзать sigaction(2). А Стивенс рекомендует писать свой собственный signal реализованный через sigaction и его использовать, так будет типа портабельно. Если потребуются системнозависимые хачки, то их запихнуть в собственный signal.
Я вот даже нашел программку, которую писал так, что бы она и под Linux работала. В ней используется sigaction никаких ifdef __Linux__ в области работы с сигналами не потребовалось.
никаких ifdef __Linux__ в области работы с сигналами не потребовалось.Мне тоже. Просто в бсд нет typedef на тип возвращаемого значения signal. Я его определил сам, все замечательно, никаких ifdef.
signal(3) типа устарел, об этом даже в POSIX написано. Нужно юзать sigaction(2).Я знаю. И что? Все и так хорошо.
Мне тоже. Просто в бсд нет typedef на тип возвращаемого значения signal. Я его определил сам, все замечательно, никаких ifdef.А должен быть?
Я не буду спорить с тобой, ибо это бесполезно. Мы все помним спор про библиотеки vs cut'n'paste.signal(3) типа устарел, об этом даже в POSIX написано. Нужно юзать sigaction(2).Я знаю. И что? Все и так хорошо.
The use of sighandler_t is a GNU extension. Various versions of libc prede-
fine this type; libc4 and libc5 define SignalHandler, glibc defines sig_t and,
when _GNU_SOURCE is defined, also sighandler_t.
2) Правильно.
Вышла новая версия. Исправлен баг на FreeBSD системах. Программа пыталась выделить на стеке слишком много памяти(128 килобайт, видимо во FreeBSD стек так ограничен ). Большое спасибо за то что он попытался установить программу на своей машине а потом предоставил мне доступ для того чтобы я отыскал ошибку.
Дефолтные настройки - 65536 Кб.
Да я уже разобрался - я имел в виду что программа пыталась выделить 128к.
Упс... Я неправильно понял... 64 метра? Странно. Почему же тогда все валилось на строке char buf[128*1024]?
Вышла версия 0.1.0 программы Downloader. В основном небольшие изменения, касающиеся вывода на экран разнообразной статистики во время закачки, исправлена пара недочетов, несколько увеличена скорость работы. Забирать тут:
Глупый вопрос наверное: по каким протоколам она качает?
по самбе и фтп
mexmat.net Нет доступа к сетке ГЗ.
а можно намылить?
лови
например бесконечный url not found
или такое
<1> progress: 100,000000%, el.time: 0s
<1> url smb://10.1.3.21/Music (Pop)/_Oleg/Track13.mp3 started
<10> slave exited due signal, restarting
Unknown parameter encountered: "character set"
Ignoring unknown parameter "character set"
Unknown parameter encountered: "client code page"
Ignoring unknown parameter "client code page"
У тебя какая libsmbclient? И это наверное под BSD?
libsmbclient 3.0.7 FreeBSD 5.3
Блин. Если честно - то я знаю про эту ошибку. Как ее исправить - я не знаю. У меня нет доступа ни к одной BSD системе, так что отладить я не могу. Причем эта ошибка - ну очень странная. Она возникает после того как работа уже практически закончена. Вылетает ексепшн, после которого все и валится. Но этот ексепшн у меня стопудово ловится. Я даже не знаю кого винить Может это у бсд такое странное взаимодействие тредов и ексепшенов? В общем чтобы это починить мне нужен доступ к машине с БСД. Хотябы по ssh.
PS: Просьба ко всем! Если есть возможность - предоставьте мне шелл на FreeBSD(желательно 5.3 с установленной libsmbclient). Только с целью отладки, обещаю ничего не портить.
О, спасибо
done
Клева. Сейчас же займусь
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 3 (LWP 100055)]
0x08050c62 in Storage::cleanup (this=0x80a9080) at Storage.C:268
268 printf( "here\n" );
(gdb) bt
0x08050c62 in Storage::cleanup (this=0x80a9080) at Storage.C:268
0x080533b6 in Job::run (this=0x8070680) at Job.C:111
0x080571c2 in Thread::execute
0x080597af in ThreadQueued::execute
0x080575b8 in Private::Thread::slave
0x089f8f9b in pthread_create from /usr/lib/libpthread.so.1
0x08db6787 in _ctx_start from /lib/libc.so.5
Причем неважно что стоит вместо printf. Просто сегфолт на первом же операторе.
может опять 64 кило стека не хватает?
неа, у тебя руки-то хорошие - но только под Линуксом
Не смешно Не так там уж и много вызовов стоит... Да и я почистил уже все с этим связанное.
попробуй какие-нибудь другие треды
самое интересное, что оно все-таки работает, т.е. качает, а потом впадает в лажу
Сам, или посредством знаменитого libsmbclient
Если бы я нагадил в памяти, то отладчик мне бы сказал что вы сделали вызов черти чего черти куда. А так все в порядке. Да даже если бы я сделал Storage*0->cleanup это должно было бы отработать. printf не использует никаких локальных переменных.
Расклад такой: если я запускаю программу с одним тредом(по идее она ведет себя как вообще нетредовая то все валится. Если я ее немного переделываю до нетредовой, то все работает. Это как? Где я в памяти сру?
какой размер стека одного треда и какой у нетредового приложения?
в линухе такое поведение (SEGV в printf) может соответствовать переполнению стека у треда
Честно говоря я понятия не имею какой стек у одного треда. Как это можно узнать?
написать прогу, которая создаёт треды и печатает содержимое %esp
а дизассемблировать функцию и посмотреть, на какой инструкции fault, не поможет?
Я установил размер стэка в 4000000 байт. Думаю что проблема не в этом.
Хотя нет. Именно в этом! Все, проблема решена Сейчас будет патч.
хотя можешь и не делать - такое я и сам способен дописать
А зачем это? Я что-то не очень понимаю...
нет, или сделай просто //, зачем добавить "smb"?
А патамушта я обычно ссылки из konqueror'a копирую Ладно, сейчас сделаю
ЗЫ. многие KDE не юзают. будет приятнее если есть возможность писать и smb:// и // и file://
Хотя нет. Именно в этом! Все, проблема решена Сейчас будет патч.Во, молодец, уже работает
smb://braindead.hackers/pub/nettools-0.1.1a.tar.gz
Все поправлено, добавлена возможность качать с //
а чё, z80 уже научился раздавать правильный ссылки для конквы?
а мыльцем?
Ага.
Куда тебе?
Скинул
ща поиграюсь
еще один момент, зачем тебе libxml? только для парсинга двух-трех конфиг-файлов? Думаю простой текстовый конфиг-файл лучше.
Тут в другом дело. Если ты посмотришь туда поглубже, то поймешь что это далеко не просто downloader. На самом деле это моя библиотека для написания клиент-серверных приложений. Просто я использовал ее часть при написании downloader, а заставлять пользователей еще и библиотеку ставить - у меня рука не поднялась. Поэтому я просто включил ее в проект.
А че делать с Unknown parameter " client codepage', Не мешает особо, но некрасиво
dos charset = CP866
unix charset = utf-8
display charset = utf-8
(две последних зависят от твоей кодировки) и убери те cтрочки(client codepage = ...) на которые ругается libsmbclient.
самба 2.x и mc все еще юзал типа client codepage и character set.
Ага. Но раз у него ругается - значит уже самба 3.
для совместимости с mc, две эти строки обычно есть в конфиги самбы 3.x
Ааааааа.... Не знал... А оно нужно? Неужели через mc люди по сети ходят? Это же неудобно.
ЗЫ. если память не изменяет, то libsmbclient бывает только с самбой 3.x
но при этом стоит самба 2.х. И она не чуствует себя сухо и комфортно без этих строк
Ну тогда ничего нельзя сделать. Правда я могу посмотреть на предмет вывода варнингов...
Еще оно кроет матом на русские имена: cannot connect. Это тоже править конфиг самбы? Запости свой кусок
А это как раз из-за того что у тебя не стоит unix charset/display charset. Я уже кусок приводил.
я прежде чем написать, их убирал. ща попробую поставить третью самбу
Ну в общем я решил эту проблему. Сейчас вышлю новую версию.
у меня без строк
dos charset = cp866
unix charset = koi8-r
пишет такую лажу:
<1> can not connect: smb://10.1.3.21/Video/Классик/Классик.avi, restarting
<1> can not connect: smb://10.1.3.21/Video/Классик/Классик.avi, restarting
<1> can not connect: smb://10.1.3.21/Video/Классик/Классик.avi, restarting
<1> can not connect: smb://10.1.3.21/Video/Классик/Классик.avi, restarting
...
а с ними такую:
<10> slave exited due signal, restarting
<10> slave exited due signal, restarting
<10> slave exited due signal, restarting
<10> slave exited due signal, restarting
...
Я уже писал. Выше. Это все что у меня было связано с кодировками.
Как ты запускаешь прогу? Только точно.
а в этом могут быть проблемы?
Не могут. Но все же. В общем правильно запускаешь. Сейчас буду смотреть.
А файлы с английскими названиями он значит качает? Тогда я даже не знаю чем помочь. Это наверное что-то в libsmbclient. Попробуй все же кодировку правильно выставить.
<1> progress: 0,000000%, el.time: 0s°п╬я┌я▀п╩я▒п╨ [Papillon]/
<1> url smb://10.1.3.21/Video/kvn_final.avi started
Ща попробую разобраться с вон теми каракулями
Блин. Они тут плохо отображаются
Я так понял у вас там уже все работает, но все равно. Хочу напомнить, что libsmbclient не thread-safe. Причем разработчики это открыто заявляют. Я неоднократно наблюдал у себя как два качающих что-то разное треда засирали что-то друг другу. После долгих мучений и отладок я понял что заставить работать его в многопотчной среде невозможно, легче сделать fork. У вас эта проблема как решается?
Разве она не thread-safe? Ты каким интерфейсов пользуешься, старым или новым? В новом все данные хранятся в одной структуре, поэтому оно вроде thread-safe. Глобальных переменных(которые и пишут и читают) я у них в коде тоже не нашел...
У нового интерфейса есть какие-нибудь bindings к языкам типа Perl, Python?
PS: по поводу биндингов - понятия не имею
PPS: еще по поводу thread-safe: я уже скачал около терабайта инфы своим downloader. Еще ни разу не было проблем из-за thread-safe. Это о чем-нибудь говорит?
еще по поводу thread-safe: я уже скачал около терабайта инфы своим downloader. Еще ни разу не было проблем из-за thread-safe. Это о чем-нибудь говорит?Ни о чём.
Аххааа... Все мы знаем теорему о том что race condition обязательно случится... Понятное дело что теоретически это не говорит ни о чем. Но практически - говорит.
PS: понимаешь ли, я скорее практик, нежели теоретик. Даже если samba team скажет что libsmbclient - thread-safe, то это не будет значить ровным счетом ничего. Вдруг они случайно что-то забыли сделать и подвинтить? Всегда есть риск человеческой ошибки. Поэтому самым важным для меня критерием является практика. Если я скачал терабайт данных, и все было в порядке, значит для меня это достаточный повод считать libsmbclient thread-safe.
Аххааа... Все мы знаем теорему о том что race condition обязательно случится...Я не знаю такой теоремы.
Понятное дело что теоретически это не говорит ни о чем. Но практически - говорит.Ты уверен, что в той реализации тредов, на которой ты гонял свои терабайты точки преемпции случаются в любом месте кода? Перенесешь на другую реализацию и увидишь race condition.
Это еще не всё. Ты же гонял на однопроцессорной машине?
Если я скачал терабайт данных, и все было в порядке, значит для меня это достаточный повод считать libsmbclient thread-safe.Это повод считать, что при точном воспроизведении этих условий, она скачает еще один терабайт данных. Когда загрузка твоей машины будет другая, когда в сети появится PL, когда у процесса будет другой приоритет, когда будет другая реализация тредов, когда будет настоящий SMP, то программа может повести себя по-другому.
2) Посмотрим. Будут ошибки - буду править. Уже несколько человек пользуются программой под FreeBSD. Если у них будут проблемы - они обратятся ко мне.
3) На однопроцессорной. Послушай, я прекрасно знаю все эти аргументы. Я их принимаю. Да, я пока не могу быть уверен что у меня все работает правильно. Но пока я и не могу получить ничего лучше.
Это повод считать, что при точном воспроизведении этих условий, она скачает еще один терабайт данных.Пока мне и этого достаточно.
когда в сети появится PLА что это такое?
когда у процесса будет другой приоритетэто уже протестировано
когда будет другая реализация тредовэто уже проверяется
когда будет настоящий SMPЯ бы это с удовольствием проверил, но пока у меня нет такой возможности.
а есть возможность качать не анонимно?
Нет пока.
Не знаю, кто там еще будет юзать под БСД, но я пока сессия не закрыта, юзать не буду - потом буду сам встраивать перекодировки под мою кои8-р локаль. Та абракадабра, что я писал выше в кодировке utf-8, как оказалось при игре с iconv
Ничего никуда не нужно встраивать. Этим должна заниматься самба. Настрой smb.conf.
КАК? Все возможные кодировки перепробовал. Все равно вывод в ЮТФ. Попробую еще может быть
ChangeLog:
* возможность качать не анонимно.
* подготовка инфраструктуры для динамической нагрузки(если с какого-то url качается медленно, то заменяем его на url, с которого качается быстрее).
* всякая ерунда
Брать тут: smb://braindead.hackers/pub/nettools-0.1.5.tar.gz
* Чистка кода
* Добавлена возможность сборки для cygwin
src: smb://braindead.hackers/pub/nettools-0.2.0.tar.gz
сборка для виндов(cygwin):
Предупреждение: сборка для виндов носит экспериментальный характер. Возможны глюки. Пока работает только закачка по smb.
Оставить комментарий
mirt1971
Вышла новая версия программы downloader.ChangeLog:
* часть программы вынесена в библиотеку
* большая часть программы переписана с использованием моей же сетевой библиотеки
* autoconf / automake
* исправлены 2 бага, улучшена стабильность и скорость работы
* возможность закачки больших файлов
скачать: smb://braindead.hackers/pub/nettools-0.0.1.tar.gz
Установка:
export SMBDIR='где у вас стоит самба'
./configure --prefix=/usr (или куда вам удобно)
make
make install