[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%~

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%

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.
..............

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%

Попробуй сейчас.
Я не буду делать .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) Правильно.

Дефолтные настройки - 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

PS: Просьба ко всем! Если есть возможность - предоставьте мне шелл на FreeBSD(желательно 5.3 с установленной libsmbclient). Только с целью отладки, обещаю ничего не портить.



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"?


ЗЫ. многие KDE не юзают. будет приятнее если есть возможность писать и smb:// и // и file://

Хотя нет. Именно в этом! Все, проблема решена Сейчас будет патч.Во, молодец, уже работает


smb://braindead.hackers/pub/nettools-0.1.1a.tar.gz
Все поправлено, добавлена возможность качать с //
а чё, z80 уже научился раздавать правильный ссылки для конквы?
а мыльцем?
Ага.
Куда тебе?
Скинул
ща поиграюсь

Тут в другом дело. Если ты посмотришь туда поглубже, то поймешь что это далеко не просто 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 люди по сети ходят? Это же неудобно.

ЗЫ. если память не изменяет, то 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