pax_global_header00006660000000000000000000000064132114262160014510gustar00rootroot0000000000000052 comment=f73252ea68984dd6b05bd98982d73ce9696d22a0 axel-2.16.1/000077500000000000000000000000001321142621600125305ustar00rootroot00000000000000axel-2.16.1/.gitignore000066400000000000000000000004741321142621600145250ustar00rootroot00000000000000/autom4te.cache/ /m4/ /po/Makefile.in.in /po/Makevars.template /po/POTFILES /po/Rules-quot /po/axel.pot /po/remove-potcdate.sed /po/stamp-po /src/axel /aclocal.m4 /compile /config.* /configure /depcomp /install-sh /missing /stamp-h1 .deps/ Makefile !/man/Makefile Makefile.in TAGS *.gmo *.o *.tar.* .#* .*.swp \#*#* axel-2.16.1/.travis.yml000066400000000000000000000017711321142621600146470ustar00rootroot00000000000000dist: trusty language: c cache: ccache: true directories: - autom4te.cache - m4 addons: apt: packages: - linux-libc-dev - autopoint - libssl-dev - clang env: global: - G_CFLAGS="-O3 -fPIC -Werror" - MAKEFLAGS="-j4" - target=distcheck matrix: - CONF_FLAGS="--without-ssl" - CONF_FLAGS="--with-ssl" os: - linux - osx compiler: - gcc - clang matrix: exclude: - os: osx compiler: gcc install: - if [ "$TRAVIS_OS_NAME" = osx ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install gettext openssl; fi script: - if [ "${TRAVIS_OS_NAME}" = osx ]; then target=all GETTEXT="/usr/local/opt/gettext" OPENSSL="/usr/local/opt/openssl"; export LIBRARY_PATH="$GETTEXT/lib" CPATH="$OPENSSL/include:$GETTEXT/include" PATH="$GETTEXT/bin:$PATH"; fi - autoreconf -i && ./configure $CONF_FLAGS CFLAGS="$G_CFLAGS" && make DIST_TARGETS=dist-gzip GZIP_ENV=--fast $target axel-2.16.1/ABOUT-NLS000066400000000000000000002721551321142621600137730ustar00rootroot000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of May 2010. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar as ast az be be@latin bg bn_IN bs ca crh +---------------------------------------------------+ a2ps | [] [] | aegis | | ant-phone | | anubis | | aspell | [] [] | bash | | bfd | | bibshelf | [] | binutils | | bison | | bison-runtime | [] | bluez-pin | [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | | dfarc | | dialog | [] [] | dico | | diffutils | [] | dink | | doodle | | e2fsprogs | [] | enscript | [] | exif | | fetchmail | [] | findutils | [] | flex | [] | freedink | | gas | | gawk | [] [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] | gjay | | gliv | [] | glunarclock | [] [] | gnubiff | | gnucash | [] | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | | gold | | gpe-aerial | | gpe-beam | | gpe-bluetooth | | gpe-calendar | | gpe-clock | [] | gpe-conf | | gpe-contacts | | gpe-edit | | gpe-filemanager | | gpe-go | | gpe-login | | gpe-ownerinfo | [] | gpe-package | | gpe-sketchbook | | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | [] [] | gsasl | | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] [] [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] [] | gutenprint | | hello | [] | help2man | | hylafax | | idutils | | indent | [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | | iso_639 | [] [] [] [] [] | iso_639_3 | [] | jwhois | | kbd | | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | klavaro | [] | latrine | | ld | [] | leafpad | [] [] | libc | [] [] | libexif | () | libextractor | | libgnutls | | libgpewidget | | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | [] | libidn | | lifelines | | liferea | [] [] | lilypond | | linkdr | [] | lordsawar | | lprng | | lynx | [] | m4 | | mailfromd | | mailutils | | make | | man-db | | man-db-manpages | | minicom | | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | | psmisc | | pspp | [] | pwdutils | | radius | [] | recode | [] [] | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] [] | sed | [] [] | sharutils | [] [] | shishi | | skencil | | solfege | | solfege-manual | | soundtracker | | sp | | sysstat | | tar | [] | texinfo | | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] [] | wyslij-po | | xchat | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ af am ar as ast az be be@latin bg bn_IN bs ca crh 6 0 2 3 19 1 11 3 28 3 1 38 5 cs da de el en en_GB en_ZA eo es et eu fa fi +-------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] () | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] [] [] | bfd | [] [] | bibshelf | [] [] [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] | bombono-dvd | [] [] | buzztard | [] [] [] | cflow | [] [] [] | clisp | [] [] [] [] | coreutils | [] [] [] [] | cpio | [] | cppi | [] | cpplib | [] [] [] | cryptsetup | [] | dfarc | [] [] [] [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] | dink | [] [] [] | doodle | [] | e2fsprogs | [] [] [] | enscript | [] [] [] | exif | () [] [] [] | fetchmail | [] [] () [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | freedink | [] [] [] [] | gas | [] | gawk | [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gip | [] [] [] [] [] | gjay | [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] | gnubiff | () | gnucash | [] () () () () () | gnuedu | [] [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] [] | gpe-aerial | [] [] [] [] [] | gpe-beam | [] [] [] [] [] | gpe-bluetooth | [] [] [] | gpe-calendar | [] [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] [] | gpe-go | [] [] [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] [] [] [] | gpe-sketchbook | [] [] [] [] [] | gpe-su | [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] | gpe-today | [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] () [] [] [] [] | gprof | [] [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] [] | grub | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] | gtick | [] () [] [] | gtkam | [] [] () [] [] | gtkorphan | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] [] [] [] | hello | [] [] [] [] [] | help2man | [] [] | hylafax | [] [] | idutils | [] [] [] | indent | [] [] [] [] [] [] [] [] | iso_15924 | [] () [] [] [] | iso_3166 | [] [] [] () [] [] [] () [] | iso_3166_2 | () | iso_4217 | [] [] [] () [] [] [] | iso_639 | [] [] [] () [] [] [] | iso_639_3 | | jwhois | [] [] | kbd | [] [] [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] | klavaro | [] [] [] [] | latrine | [] () [] | ld | [] [] [] | leafpad | [] [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] [] () | libextractor | | libgnutls | [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] () | libgphoto2_port | [] () [] | libgsasl | [] | libiconv | [] [] [] [] [] [] | libidn | [] [] [] [] | lifelines | [] () | liferea | [] [] [] [] [] | lilypond | [] [] [] [] | linkdr | [] [] [] [] | lordsawar | [] | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] [] [] | man-db | | man-db-manpages | | minicom | [] [] [] [] [] | mkisofs | [] | myserver | | nano | [] [] [] [] | opcodes | [] [] [] | parted | [] [] | pies | | popt | [] [] [] [] [] [] | psmisc | [] [] [] [] | pspp | [] | pwdutils | [] | radius | [] | recode | [] [] [] [] [] [] [] | rosegarden | () () () () | rpm | [] [] [] | rush | | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] | shishi | | skencil | [] () [] | solfege | [] [] [] [] | solfege-manual | [] [] | soundtracker | [] [] [] | sp | [] | sysstat | [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | () () | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] [] | wget | [] [] [] [] | wyslij-po | [] | xchat | [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ cs da de el en en_GB en_ZA eo es et eu fa fi 64 105 117 18 1 8 0 28 89 18 19 0 104 fr ga gl gu he hi hr hu hy id is it ja ka kn +------------------------------------------------+ a2ps | [] [] [] | aegis | [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] | bash | [] [] [] | bfd | [] [] | bibshelf | [] [] [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] | bombono-dvd | | buzztard | [] | cflow | [] [] | clisp | [] | coreutils | [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] [] | cryptsetup | [] [] [] | dfarc | [] [] | dialog | [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] [] | dink | [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] | freedink | [] [] | gas | [] [] | gawk | [] [] [] [] () [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | () | glunarclock | [] [] [] | gnubiff | () [] () | gnucash | () () () () [] | gnuedu | [] [] | gnulib | [] [] [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] | gpe-aerial | [] [] | gpe-beam | [] [] [] | gpe-bluetooth | [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] [] [] | gpe-edit | [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] | gpe-su | [] [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | [] [] [] [] | gtick | [] [] [] [] | gtkam | [] [] [] [] [] | gtkorphan | [] [] [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] [] [] | hello | [] [] | help2man | [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | () [] [] | iso_3166 | () [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | () [] [] [] | iso_4217 | () [] [] [] [] | iso_639 | () [] [] [] [] [] [] [] | iso_639_3 | () [] [] | jwhois | [] [] [] [] | kbd | [] [] | keytouch | [] [] [] [] [] | keytouch-editor | [] [] [] [] | keytouch-keyboa... | [] [] [] [] | klavaro | [] [] | latrine | [] [] | ld | [] [] [] | leafpad | [] [] [] [] [] [] () | libc | [] [] [] [] | libexif | | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] [] | lifelines | () | liferea | [] [] [] [] | lilypond | [] | linkdr | [] [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] [] | man-db-manpages | [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] | pies | | popt | [] [] [] [] [] [] [] [] | psmisc | [] [] | pspp | | pwdutils | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rosegarden | () () () () | rpm | [] [] | rush | | sarg | [] | screem | [] [] | scrollkeeper | [] [] [] | sed | [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | [] | skencil | [] | solfege | [] [] [] | solfege-manual | [] [] | soundtracker | [] [] | sp | [] () | sysstat | [] [] [] [] | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux-ng | [] [] [] [] [] | vice | () () () | vmm | [] | vorbis-tools | [] | wastesedge | () () | wdiff | | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] | xchat | [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | +------------------------------------------------+ fr ga gl gu he hi hr hu hy id is it ja ka kn 121 53 20 4 8 2 5 53 2 120 5 83 66 0 4 ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne +-----------------------------------------------+ a2ps | [] | aegis | | ant-phone | | anubis | [] [] | aspell | [] | bash | | bfd | | bibshelf | [] [] | binutils | | bison | [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] | cpio | | cppi | | cpplib | | cryptsetup | | dfarc | [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] | dink | | doodle | | e2fsprogs | | enscript | | exif | [] | fetchmail | | findutils | | flex | | freedink | [] | gas | | gawk | | gcal | | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] | gettext-tools | [] | gip | [] [] | gjay | | gliv | | glunarclock | [] | gnubiff | | gnucash | () () () () | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | [] | gold | | gpe-aerial | [] | gpe-beam | [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] | gpe-timesheet | [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | | gtick | | gtkam | [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | | hello | [] [] [] | help2man | | hylafax | | idutils | | indent | | iso_15924 | [] [] | iso_3166 | [] [] () [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] | iso_639 | [] [] | iso_639_3 | [] | jwhois | [] | kbd | | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | klavaro | [] | latrine | [] | ld | | leafpad | [] [] [] | libc | [] | libexif | | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | | libidn | | lifelines | | liferea | | lilypond | | linkdr | | lordsawar | | lprng | | lynx | | m4 | | mailfromd | | mailutils | | make | [] | man-db | | man-db-manpages | | minicom | [] | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | [] [] [] | psmisc | | pspp | | pwdutils | | radius | | recode | | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] | sed | | sharutils | | shishi | | skencil | | solfege | [] | solfege-manual | | soundtracker | | sp | | sysstat | [] | tar | [] | texinfo | [] | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] | wyslij-po | | xchat | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +-----------------------------------------------+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne 20 5 10 1 12 48 4 2 2 4 24 10 19 3 1 nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +---------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] () | buzztard | [] [] | cflow | [] | clisp | [] [] | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] | cryptsetup | [] | dfarc | [] | dialog | [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] [] | dink | () | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | exif | [] [] [] () [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] | gas | | gawk | [] [] [] [] | gcal | | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | [] () | gnucash | [] () () () | gnuedu | [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gnutls | [] [] | gold | | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] [] | gphoto2 | [] [] [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | gutenprint | [] [] | hello | [] [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] [] [] [] | iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] [] | klavaro | [] [] | latrine | [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] | libgphoto2_port | [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] | lifelines | [] [] | liferea | [] [] [] [] [] () () [] | lilypond | [] | linkdr | [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | pies | [] | popt | [] [] [] [] | psmisc | [] [] [] | pspp | [] [] | pwdutils | [] | radius | [] [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () | rpm | [] [] [] | rush | [] [] | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] [] [] [] | solfege-manual | [] [] [] | soundtracker | [] | sp | | sysstat | [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | [] | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] | +---------------------------------------------------+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 135 10 4 7 105 1 29 61 47 91 3 55 47 8 37 sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW +---------------------------------------------------+ a2ps | [] [] [] [] [] | 27 aegis | [] | 9 ant-phone | [] [] [] [] | 9 anubis | [] [] [] [] | 15 aspell | [] [] [] | 20 bash | [] [] | 11 bfd | [] | 6 bibshelf | [] [] [] | 16 binutils | [] [] | 8 bison | [] [] | 12 bison-runtime | [] [] [] [] [] [] | 29 bluez-pin | [] [] [] [] [] [] [] [] | 37 bombono-dvd | [] | 4 buzztard | [] | 7 cflow | [] [] [] | 9 clisp | | 10 coreutils | [] [] [] [] | 22 cpio | [] [] [] [] [] [] | 13 cppi | [] [] | 5 cpplib | [] [] [] [] [] [] | 13 cryptsetup | [] [] | 7 dfarc | [] | 9 dialog | [] [] [] [] [] [] [] | 30 dico | [] | 2 diffutils | [] [] [] [] [] [] | 30 dink | | 4 doodle | [] [] | 7 e2fsprogs | [] [] [] | 11 enscript | [] [] [] [] | 17 exif | [] [] [] | 16 fetchmail | [] [] [] | 17 findutils | [] [] [] [] [] | 20 flex | [] [] [] [] | 15 freedink | [] | 10 gas | [] | 4 gawk | [] [] [] [] | 18 gcal | [] [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] [] | 34 gettext-runtime | [] [] [] [] [] [] [] | 30 gettext-tools | [] [] [] [] [] [] | 22 gip | [] [] [] [] | 22 gjay | [] | 3 gliv | [] [] [] | 14 glunarclock | [] [] [] [] [] | 19 gnubiff | [] [] | 4 gnucash | () [] () () | 9 gnuedu | [] [] | 7 gnulib | [] [] [] [] | 16 gnunet | [] | 1 gnunet-gtk | [] [] [] | 5 gnutls | [] [] [] | 10 gold | [] | 4 gpe-aerial | [] [] [] | 18 gpe-beam | [] [] [] | 19 gpe-bluetooth | [] [] [] | 13 gpe-calendar | [] [] [] [] | 12 gpe-clock | [] [] [] [] [] | 28 gpe-conf | [] [] [] [] | 20 gpe-contacts | [] [] [] | 17 gpe-edit | [] [] [] | 12 gpe-filemanager | [] [] [] [] | 16 gpe-go | [] [] [] [] [] | 25 gpe-login | [] [] [] | 11 gpe-ownerinfo | [] [] [] [] [] | 25 gpe-package | [] [] [] | 13 gpe-sketchbook | [] [] [] | 20 gpe-su | [] [] [] [] [] | 30 gpe-taskmanager | [] [] [] [] [] | 29 gpe-timesheet | [] [] [] [] [] | 25 gpe-today | [] [] [] [] [] [] | 30 gpe-todo | [] [] [] [] | 17 gphoto2 | [] [] [] [] [] | 24 gprof | [] [] [] | 15 gpsdrive | [] [] [] | 11 gramadoir | [] [] [] | 11 grep | [] [] [] | 10 grub | [] [] [] | 14 gsasl | [] [] [] [] | 14 gss | [] [] [] | 11 gst-plugins-bad | [] [] [] [] | 22 gst-plugins-base | [] [] [] [] [] | 24 gst-plugins-good | [] [] [] [] [] | 25 gst-plugins-ugly | [] [] [] [] [] | 29 gstreamer | [] [] [] [] | 22 gtick | [] [] [] | 13 gtkam | [] [] [] | 20 gtkorphan | [] [] [] | 14 gtkspell | [] [] [] [] [] [] [] [] [] | 45 gutenprint | [] | 10 hello | [] [] [] [] [] [] | 21 help2man | [] [] | 7 hylafax | [] | 5 idutils | [] [] [] [] | 17 indent | [] [] [] [] [] [] | 30 iso_15924 | () [] () [] [] | 16 iso_3166 | [] [] () [] [] () [] [] [] () | 53 iso_3166_2 | () [] () [] | 9 iso_4217 | [] () [] [] () [] [] | 26 iso_639 | [] [] [] () [] () [] [] [] [] | 38 iso_639_3 | [] () | 8 jwhois | [] [] [] [] [] | 16 kbd | [] [] [] [] [] | 15 keytouch | [] [] [] | 16 keytouch-editor | [] [] [] | 14 keytouch-keyboa... | [] [] [] | 14 klavaro | [] | 11 latrine | [] [] [] | 10 ld | [] [] [] [] | 11 leafpad | [] [] [] [] [] [] | 33 libc | [] [] [] [] [] | 21 libexif | [] () | 6 libextractor | [] | 1 libgnutls | [] [] [] | 9 libgpewidget | [] [] [] | 14 libgpg-error | [] [] [] | 9 libgphoto2 | [] [] | 8 libgphoto2_port | [] [] [] [] | 13 libgsasl | [] [] [] | 13 libiconv | [] [] [] [] | 21 libidn | () [] [] | 11 lifelines | [] | 4 liferea | [] [] [] | 21 lilypond | [] | 7 linkdr | [] [] [] [] [] | 17 lordsawar | | 1 lprng | [] | 3 lynx | [] [] [] [] | 17 m4 | [] [] [] [] | 19 mailfromd | [] [] | 3 mailutils | [] | 5 make | [] [] [] [] | 21 man-db | [] [] [] | 8 man-db-manpages | | 4 minicom | [] [] | 16 mkisofs | [] [] | 9 myserver | | 0 nano | [] [] [] [] | 21 opcodes | [] [] [] | 11 parted | [] [] [] [] [] | 15 pies | [] [] | 3 popt | [] [] [] [] [] [] | 27 psmisc | [] [] | 11 pspp | | 4 pwdutils | [] [] | 6 radius | [] [] | 9 recode | [] [] [] [] | 28 rosegarden | () | 0 rpm | [] [] [] | 11 rush | [] [] | 4 sarg | | 1 screem | [] | 3 scrollkeeper | [] [] [] [] [] | 27 sed | [] [] [] [] [] | 30 sharutils | [] [] [] [] [] | 22 shishi | [] | 3 skencil | [] [] | 7 solfege | [] [] [] [] | 16 solfege-manual | [] | 8 soundtracker | [] [] [] | 9 sp | [] | 3 sysstat | [] [] | 15 tar | [] [] [] [] [] [] | 23 texinfo | [] [] [] [] | 16 tin | | 4 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux-ng | [] [] [] [] | 20 vice | () () | 1 vmm | [] | 4 vorbis-tools | [] | 6 wastesedge | | 2 wdiff | [] [] | 7 wget | [] [] [] [] [] | 26 wyslij-po | [] [] | 8 xchat | [] [] [] [] [] [] | 36 xdg-user-dirs | [] [] [] [] [] [] [] [] [] | 60 xkeyboard-config | [] [] [] [] | 25 +---------------------------------------------------+ 84 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW 178 domains 119 1 3 2 0 10 66 50 155 17 97 7 41 2610 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If May 2010 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. axel-2.16.1/AUTHORS000066400000000000000000000005161321142621600136020ustar00rootroot00000000000000Wilmer van der Gaast Y Giridhar Appaji Nag Philipp Hagemeister Joao Eriberto Mota Filho Stephen Thirlwall Ismael Luceno Antonio Quartulli -- Updated by Eriberto, Sat, 26 Aug 2017 22:55:30 -0300 axel-2.16.1/CONTRIBUTING.md000066400000000000000000000030021321142621600147540ustar00rootroot00000000000000## HOW TO CONTRIBUTE TO AXEL DEVELOPMENT Axel is available at https://github.com/axel-download-accelerator/axel If you are interested in contribute to axel development, please, follow these steps: 1. Send a patch that fix an issue or that implement a new feature. Alternatively, you can do a 'pull request'[1] in GitHub. [1] https://help.github.com/articles/using-pull-requests 2. Ask for join to the Axel project in GitHub, if you want to work officially. Note that this second step is not compulsory. However, to accept you in project, is needed a minimum previous collaboration. To find issues and bugs to fix, you can check these addresses: - https://github.com/axel-download-accelerator/axel/issues - https://alioth.debian.org/tracker/?atid=413085&group_id=100070&func=browse (ALIOTH IS THE OLD HOMEPAGE, BUT HAS OPENED BUGS) - https://bugs.debian.org/cgi-bin/pkgreport.cgi?dist=unstable;package=axel - https://bugs.launchpad.net/ubuntu/+source/axel/+bugs - https://apps.fedoraproject.org/packages/axel/bugs - https://bugs.archlinux.org/?project=5&cat[]=33&string=axel - https://bugs.gentoo.org/buglist.cgi?quicksearch=net-misc%2Faxel If you want to join, please make a contact. There is a group here[2] to discuss and to coordinate the development. You can also find other developers in the #axel channel on freenode. [2] https://groups.google.com/forum/#!forum/axel-accelerator-dev -- Eriberto, Sun, 20 Mar 2016 16:27:53 -0300, updated on Sun, 08 Sep 2017 23:27:00 -0300. axel-2.16.1/COPYING000066400000000000000000000431031321142621600135640ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. axel-2.16.1/CREDITS000066400000000000000000000127101321142621600135510ustar00rootroot000000000000002.16.1 version: - Changes in source code by: * Ismael Luceno Read the ChangeLog to see the changes. 2.16 version: - Changes in source code by: * Ismael Luceno - Translations: * Ismael Luceno Spanish translation Updated Portuguese translation Read the ChangeLog to see the changes. 2.15 version: - Changes in source code by: * Antonio Quartulli * Ismael Luceno - Translations: * Nicol Dalla Longa Italian translation * Casa Taloyum Added some missing Simplified Chinese translation strings * Mahyuddin Indonesian translation Read the ChangeLog to see the changes. 2.14.1 version: - Changes in source code by: * Antonio Quartulli * Ismael Luceno * Joao Eriberto Mota Filho Read the ChangeLog to see the changes. 2.14 version: - Changes in source code by: * Antonio Quartulli * Ismael Luceno * Joao Eriberto Mota Filho * sumit agrawal Read the ChangeLog to see the changes. 2.13 and 2.13.1 versions: - Ismael Luceno is officially coordinating the Axel development. - Changes in source code by: * David Polverari * Ismael Luceno * Joao Eriberto Mota Filho * nemermollon * Stephen Thirlwall * Vlad Glagolev Read the ChangeLog to see the changes. 2.12 version: - Denis Denisov Made some adjustments in README.md file. - Joao Eriberto Mota Filho Using distclean-local instead of clean-local to be compliant with automake rules. https://www.gnu.org/software/automake/manual/html_node/Clean.html - Lion Yang Updated translation to ja. - Mingcong Bai Updated and fixed translation to zh_CN. - Phillip Berndt Added a feature to extract file sizes from the Content-Range header. More details here: https://github.com/axel-download-accelerator/axel/commit/bcc98626791eb082c992d578fe93be72cfedef51 - Stephen Thirlwall Fixed rpl_malloc not found when cross-compiling. Help to verify and approve some pull requests. 2.11 version: - Sjjad Hashemian Set SSL auto-retry mode. This fixes SSL WANT_READ error which causes 'Connection gone' error sometimes. 2.10 version: - Denis Denisov Implemented the reactivation of connections from state file, similar to 'dynamic segmentation', as explained at http://www.internetdownloadmanager.com/support/segmentation.html - Osamu Aoki Clarifyed the usage of multiple URLs in manpage. From Debian bug #621728. - Sjjad Hashemian Specify filename from http header Content-Disposition, according to https://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 - Stephen Thirlwall HTTPS/FTPS! A great work! 2.7 version: - Mridul Malpotra Fixed num_connections error when invalid values are given. - Stephen Thirlwall Removed generated files from source control. 2.6 version: - Ivan Gimenez commit dcce1f7 Fix compilation warnings. Patch sent by email on 2016-03-02 Thanks a lot! - Stephen Thirlwall Alterate display expands to terminal width. 2.5 version: - Barry deFreese Build over GNU/Hurd. - Mark Smith IPv6 support. - Osamu Aoki Added translation to Japanese. Honor noopt when buildind. Up to the 2.4 version: An not-quite-sorted list of people who helped somehow: - Philipp Hagemeister Bug triage and patches to fix bugs - bbbush RPM spec file - newhren Russian translation - Eli Yukelzon Custom Header Support - David Turnbull Large file support - Hermann J. Beckers German translation. - Martin Herrman Requested the human-readable time/size values. Advertising in the Dutch Linux User's Manual. (http://2mypage.cjb.net/) - Marten Klencke Early tester. - Danny Oude Bos For having an iMac with a very badly-behaving FTP server... - Ralph Slooten For creating the initial native RPM packages instead of my alienated .debs. - Robert For patching the program to make it work on FreeBSD and Darwin. For finding some very stupid bugs. - Sjoerd Hemminga For adding the finish_time feature. It's not yet in the user interface, though... For writing axelq. - Paul Evans For being a very good beta tester. For creating axel-kapt. (deprected in 2.5 version, see the CHANGES file) - Justin A For some testing and for the new (multi-URL) syntax idea. - Sebastian Ritterbusch For some interesting ideas for the new versions. For writing the alternate progress indicator. axel-2.16.1/ChangeLog000066400000000000000000000522431321142621600143100ustar00rootroot00000000000000Version: 2.16.1, 2017-12-05 [ Ismael Luceno ] * Fixed building against static OpenSSL Version: 2.16, 2017-11-25 [ Ismael Luceno ] * Buildsystem fixes and improvements * Fixed bug that produces empty files with -q/--quiet * Fixed build with --disable-nls * Fixed formatting of the version/copyright message * Header files reorganization * Spanish translation * Style fixes * Updated Portuguese translation Version: 2.15, 2017-10-11 [ Antonio Quartulli ] * Added a 65K limit on the number of connections * Fixed progress report when total size isn't available * Fixed size sanity check in HTTP Resp Header * Fixes to the usage/help text * Lots of security bugfixes * Made dependency on axel->conn in axel_close() explicit * Respect file size even when range request is not supported * Return error if socket can't be created [ Casa Taloyum ] * Added some missing Simplified Chinese translation strings [ Ismael Luceno ] * Added "Accept" HTTP header to the requests, required by some sites * Code cleanups and small bugfixes * Fixed User-Agent, now it's "Axel/{VERSION} ({ARCH})" * Fixed a race condition in the speed testing code * Implemented connection and I/O timeouts * Improvements to the buildsystem and scripts * Updates to the documentation [ Mahyuddin ] * Indonesian translation [Nicol Dalla Longa] * Italian translation Version 2.14.1, 2017-09-16 [ Antonio Quartulli ] * Avoid stall due to missing unlock. [ Ismael Luceno ] * Added some automation to help update the ChangeLog (mkchangelog). [ Joao Eriberto Mota Filho ] * Updated ChangeLog, CREDITS .po files and configure.ac. Version 2.14, 2017-09-10 [ Antonio Quartulli ] * Fixed redirection from HTTP to FTP. * Added Travis-CI support. * Added --no-clobber option. * Added port to Host HTTP header when different from service default. * Added option to choose between IPv4 and IPv6. * Alternate-output: use better representation. * Avoid bad-free when deallocating multiple URLs. * Avoid segfault when quiet and alternate behaviour are both specified. * Convert usleep to nanosleep. * Fixed compilation without SSL. * Fixed linking in macOS (don't link pthread). * Ensure alternate output can be setup and prevent crash. * Ensure 'progress' has space for null terminator. * Fixed several memory leaks. * Fixed a NULL dereference. * Fixed use-after-free of axel->conn member. * Implemented HTTP proxy authentication. * Improved code in option parsing routine. * Increased default number of max redirects to 20 and made it configurable. * Made axel thread safe. * Made SSL initialization race free. * Fixed race segfault upon connection to HTTPS server. * Fixed racy access to last_transfer. * Added mention to IRC channel in README and CONTRIBUTING files. * Reset 'enabled' attribute in conn_disconnect(). * Use boolean variables as such. * Some minor fixes and changes. * Fixed build warnings. [ Ismael Luceno ] * Simplified http_header. * Made HTTP the default protocol. * Report truncated state file properly. * Fixed linking against libintl in non-standard path. * Improved http_auth_token to avoid buffering. * Improved configuration parsing code. * Build system improvements. * Miscellaneous fixes and improvements. * Fixed several function prototypes. [ Joao Eriberto Mota Filho ] * Added i18n for new messages. * Updated general docs, as AUTHORS and ChangeLog files. * Updated project homepage in all files. * Updated the copyright notices in all headers. * Updated the manpage. * Updated the pt_BR translation. * Updated the README.md file. * Final tests, release and Debian packaging. [ Sumit Agrawal ] * Added guard to header files. Version 2.13.1, 2017-08-03 [ Joao Eriberto Mota Filho ] * Updated .po files. Version 2.13, 2017-08-02 [ David Polverari ] * Fixed URI encoding implementation. [ Ismael Luceno ] * Fixed NULL dereferences and buffer allocation (based on patch by: nemermollon ). * Fixed size of string[] buffer in text.c. * Implemented percent encoding/decoding primitives. * Improved axel_message to work under memory pressure. * Improved message_t queuing. * Made axel_close more robust. * Print messages instead of discarding them on axel_close. * Fixed a couple of NULL derefs when OOM. * Fixed various memory leaks and fd leaks. * Code cleanup and simplification. [ Joao Eriberto Mota Filho ] * Some updates in README file. * Updated the translation for Brazilian Portuguese. * Updated the manpage version and date. [ Stephen Thirlwall ] * Set TLS hostname in ssl_connect. [ Vlad Glagolev ] * Fixed '--with-openssl' flag in configure.ac file. Version 2.12, 2016-12-25 [ Denis Denisov ] * Made some adjustments in README.md file. [ Joao Eriberto Mota Filho ] * Little adjustment in Makefile.am. [ Lion Yang ] * Updated the translation to ja. [ Mingcong Bai ] * Updated and fixed translation to zh_CN. [ Phillip Berndt ] * Added a feature to extract file sizes from the Content-Range header. This fix Axel downloading the file one byte short. [ Stephen Thirlwall ] * Fixed 'rpl_malloc not found' when cross-compiling. * Implemented a test on SSL_new rather than OPENSSL_init_ssl to avoid a fail to build from source. Version 2.11, 2016-06-05 [ Sjjad Hashemian ] * Set SSL auto-retry mode. This fixes SSL WANT_READ error which causes 'Connection gone' error sometimes. Version 2.10, 2016-06-04 [ Joao Eriberto Mota Filho ] * Stephen implemented SSL/TLS. Consequently, the licensing for Axel from now on will be GPL-2+ with OpenSSL exception. All previous authors agree with that. For details, see https://github.com/axel-download-accelerator/axel/issues/15. * Downgraded gettext minimum version to 0.18 in configure.ac. It will produce a message 'AM_PROG_MKDIR_P macro is deprecated' when building, but that is normal. * Fixed some fuzzy translations. * New code for autogen.sh, now with clean to vanish the source code. * Updated manpage. [ Denis Denisov ] * Implemented the reactivation of connections from state file, similar to dynamic segmentation. [ Osamu Aoki ] * Clarified the usage of multiple URLs in manpage. [ Sjjad Hashemian ] * Specify filename from http header Content-Disposition (RFC 2616, Sec. 19.5.1). [ Stephen Thirlwall ] * HTTPS/FTPS support using OpenSSL. \o/ * Implemented the --without-openssl option to build without SSL/TLS. * Updated the manpage. Version 2.7, 2016-05-01 [ Joao Eriberto Mota Filho ] * Added new architectures to configure.ac. * Updated some points in configure.ac and Makefile.am. [ Mridul Malpotra ] * Fixed num_connections error when invalid values are given. [ Stephen Thirlwall ] * Add missing m4 path to configure.ac file. * Added the autogen.sh script. * Cleaned the source code, removing auto generated files. Version 2.6, 2016-03-20 [ Joao Eriberto Mota Filho ] * Added the Brazilian Portuguese translation. * Moved all .c and .h to new /src directory. * Moved all .po files to new /po directory. * Moved some files to doc/ directory. * Renamed README.to-contribute to CONTRIBUTING.md. * Switched the build and install system to autotools. * Updated all copyright notices. [ Ivan Gimenez ] * Fix several compilation warnings. [ Stephen Thirlwall ] * Alterate display expands to terminal width. Version 2.5, 2015-11-01 [ Joao Eriberto Mota Filho ] 2015-11-01 * Changed the homepage of the project in several files. * axel.h: bumped to 2.5 version. * configure: - Changed the default prefix to /usr. - Changed the default etc path to /etc. - Changed CFLAGS and LDFLAGS definition lines to allow external values, as GCC hardening sent by Debian. * gui/: removed. The binary axel-kapt depended on kaptain that is no longer available for QT5 (dead upstream development). For details, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=789819 * http.c: fix a possible buffer overflow. * Makefile: disabled the .po regeneration/merge actions to avoid changes in source code when building. I will try to fix it in future. * manpage: - Moved to man/ directory. - Using txt2man to generate the manpage. - Updated the manpage. - Removed some typos. - Dropped the Chinese manpage (outdated now). * README.md: added to be the main file for GitHub. * README.to-contribute: added to explain how to contribute. [ Barry deFreese ] 2009-06-11 * Added Hurd (GNU) to configure file. It will allow Axel to build over GNU/Hurd. This change was provided by Barry deFreese , as a patch to Debian project, on 11 Jun 2009. For details, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532793 [ Mark Smith ] 2010-07-03 * Added a support to IPv6. This change was provided by Mark Smith , as a patch to Debian project, on 03 Jul 2010. For details, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=525290 [ unknown person ] 2010-08-19 * Fixed incorrect unit of time in download summary. For details see https://alioth.debian.org/tracker/index.php?func=detail&aid=312669&group_id=100070&atid=413085 [ unknown person ] 2011-04-12 * Fixed an issue that produces a Bad HTTP Request when 302 redirected link is longer than 255 chars (like youtube). For details, see https://alioth.debian.org/tracker/index.php?func=detail&aid=313080&group_id=100070&atid=413085 [ Osamu Aoki ] 2012-03-10 * Added the translation to Japanese. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=663286 and https://alioth.debian.org/tracker/index.php?func=detail&aid=313565&group_id=100070&atid=413085 * Changed the configure file to honor the noopt when building. So, was removed the '-Os' option. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=645271 [ From original authors ] * Releasing this old block (written after 2.4 and before 2.5 versions): - Make axel build on HP-UX, thanks Ciro Iriarte - Fix Solaris support (Closes: #312092), thanks Sebastian Kayser - Add PO-Revision-Date header to ru.po Version 2.4 - Fix a buffer overflow caused by wrong size limits when copying strings (Closes: #311569), thanks Michael Schwendt and the Fedora project members - Fix thread hangups due to incorrect synchronization (Closes: #311469), thanks Yao Shi - Removed Fedora packaging file. axel will be available in the Fedora repositories soon. - Use /etc/ instead of /usr/etc/ as the default system-wide configuration location. - Respect environment CFLAGS in configure. - Allow special characters in arguments to configure. - Add MimeType and fix Categories in the desktop file. Version 2.3 - Wait for thread termination in axel.c:axel_do (Closes: #311255), thanks John Ripa - New Chinese translation and manpage, thanks Shuge Lee - Fix LFS support for FTP (Closes: #311320) - Fix LFS support (Closes: #311324), thanks Rodrigue Le Bayon Version 2.2: - Fix a buffer overflow in http.c:http_encode. Version 2.1: - Fix version string. 2.0 still reported 1.1, thanks Ajay R Ramjatan - Fix new MB/s display (was showing B/s). Thanks Philipp Hagemeister Version 2.0: - Large file support thanks thanks David Turnbull - Custom Header Support thanks Eli Yukelzon - New Russian translation thanks newhren - Fix segfault in -H option thanks Philipp Hagemeister - Honour http_proxy and prefer it over HTTP_PROXY - Add new RPM spec file thanks bbbush Finished Sep 12 2008 Version 1.1: - Compilation for GNU/kFreeBSD, thanks to Cyril Brulebois - Use simple pop-ups for Help and Bug Report buttons - Use strncpy instead of strcpy for length sensitive copies - Always compile with -g, disable -O3 - Translation updates: de.po thanks Hermann J. Beckers - Update manpages axel.1 and axel-kapt.1 - Prevent crash and raise error if FTP CWD fails - Prevent crash on long URLs and increase max length of URL to 1024 - Fix segfaults on HTTP404 and HTTP401 responses Finished Jan 18 2008 Version 1.0b: - Removed spaces between -S[x] in man-pages, etc. They mess things up. - Fixed configure for OpenBSD. - Fixed configuration bug: s/alternate_interface/alternate_output/ in axelrc.example, thanks to CLOTILDE Guy Daniel for the bug report! - Fixed weird behaviour when downloading from an unsupported server. - Fixed buffer overflow in conn.c. (CAN-2005-0390) Finished Apr 06 2005 Version 1.0a: - gstrip on Solaris/SPARC breaks the binary, so stripping is made optional (but enabled by default!) and /usr/ccs/bin/strip is used instead of gstrip. - Fixed a small (not harmful) errorcode interpretation bug in the ftp_size code. - Downloading from unsupported sites works better now. - Added support for downloading using more than one local network interface. - Fixed a potential SIGSEGV bug. Would only happen with about more than 64 connections usually. Still strange things can happen with too many connections when using Linux.. - Hopefully fixed the problem with downloading from forwarding URL's. - HTTP %-escapes are handled now. - Alternate progress indicator with estimation of remaining download time - Changed the return-code a bit, see man-page for details. Finished Feb 19 2002 Version 1.0: - Fixed a reconnect problem: Check for stalled connections was skipped by previous versions if there is no active connection. - Solaris does not have www in /etc/services which confused Axel. Fixed. - Created a new build system. - install utility not used anymore: Solaris' install does weird things. - Added support for Cygwin and Solaris. - Corrected a little problem in de.po. - Thrown out the packaging stuff. Finished Dec 6 2001 Version 0.99b brings you: - Debian package bugfix. - Restored i18n support. Finished Nov 16 2001 Version 0.99a brings you: - Small bugfix for dumb HTTP bug. Finished Nov 10 2001 Version 0.99 brings you: - Improved speed limiter. (For low speeds a smaller buffer works better, so the buffer is resized automatically for low speeds.) - Some FTP servers don't ask for a password which confused ftp.c. Fixed. - Some HTTP servers send chunked data when using HTTP/1.1. So I went back to HTTP/1.0.. (This also fixes the occasional filesearching.com problem) - Even more problems with FTP server reply codes, but they must be fixed now, Axel's RFC compliant. - For HTTP downloads a Range: header is not sent when downloading starting at byte 0. This is just a work-around for a problem with a weird webserver which sends corrupted data when a Range: header is sent. It's just a work-around for a rare problem, it does not really fix anything. - RPM package for axel-kapt added. Finished Nov 9 2001 Version 0.98 brings you: - Fixed the weird percentage indicator bug. (Was buggy for large files, did not affect the downloaded data.) - For single connection downloads from Apache: Apache returns a 200 result code when the specified file range is the complete file. Axel handles this correctly now. - Roxen FTP servers return the address and port number without brackets after a passive command. This is RFC-compliant but quite unique. But now handled correctly. - Fixed some things to make it work on Darwin again. - 'Upgraded' HTTP requests to HTTP/1.1. Tried this to fix a download corruption bug for downloads from archive.progeny.com, but it did not work. wget's resume has exactly the same problem. But using HTTP/1.1 is more compliant (because in fact HTTP/1.0 does not support Ranges) so I'll keep it this way.. - Previous version used to delete the statefile in some cases. Fixed. Finished Nov 3 2001 Version 0.97 (Bitcrusher) brings you: - Major redesign: Moved a lot of code from main() to separate functions, it should make it easier to create different interfaces for the program. - All those ifdefs were a mess, they don't exist anymore. Separate threads for setting up connections are used by default now. Version 0.96 will not disappear, by the way. - HTTP HEAD request not used anymore: Squid's headers are incorrect when using the HEAD request. - conn_disconnect did not work for FTP connections through HTTP proxies. - Documentation fix, sort of: The example configuration file still said proxies are unsupported. But they are supported for quite some time already. - Wrote a small (Small? Larger than any other doc.. :-) description of the Axel API. - Added finish_time code. (Credits to sjoerd@huiswerkservice.nl) - Calling conn_setup without calling conn_init first also works when using a proxy now. - A client for filesearching.com. You can use it to search for mirrors and download from more than mirror at once. - Fixed another segfault bug which did not show up on my own system... Also fixed by 0.96a. - Global error string is gone. Unusable in threaded programs. - The -V switch stopped working some time ago because I forgot to put it in the getopt string. Now it's back, alive and kickin'... - TYPE I should be done quite early. Some servers return weird file sizes when still in ASCII mode. - ftp.c (ftp_wait) sometimes resized conn->message to below MAX_STRING which is Not Good(tm). - I18N support is a bit broken at this time, it'll be fixed later. - Tidied up the man-page a bit. - Removed config.h file, -D flags used again. - Added axel-kapt interface. - Changed syntax: Local file must be specified using the -o option now. This allows the user to specify more than one URL and all of them will be used for the download. A local directory can be passed as well, the program will append the correct filename. - Fixed a bug which caused the program not to be able to download files for which only one byte has to be downloaded for one of the connections. - Why bitcrusher? Just because I liked to have a code name for this release... Bit crusher is a name of a musical group here in the Netherlands, and it's a nice name for a downloader as well, I hope... Finished Oct 25 2001 Version 0.96 brings you: - Fixed a terrible bug which caused any FTP download to corrupt. I promise I will test the program before any next release. :-(( HTTP did work in 0.95. Finished Aug 14 2001 (Why is this fix so late? Because the actual release of version 0.95 was only last Friday/Saturday...) And yes, I tested it now. It works now. HTTP and FTP. Version 0.95 brings you: - An important bugfix: When bringing up the connection failed, the program used to be unable to reconnect. :( - Small changes to make the program compile on FreeBSD and Darwin. - Support check for FTP servers is done only once now. - SIZE command is really used now. - Fixed a SIGINT-does-not-abort problem. Btw: Ctrl-\ (SIGQUIT) always works! - Connection status messages are not displayed by default. You can enable them with the verbose-option. Finished Aug 7 2001 Version 0.94 brings you: - 'make install' uses install instead of mkdir/cp now. - Added 'make uninstall' option. - Added more explanations to axelrc.example. - It uses the HTTP HEAD request now. Didn't know that one before. :) - Debian packaging stuff and RPM .spec file included by default. - select() problem now really understood... The real point was, that sometimes select() was called with an empty fd set. Now I solved the problem in a more 'useful' way. Finished Jun 26 2001 Version 0.93 brings you: - A compile-time option to remove all the multi-connection stuff. Program works without state files then, and it's a bit smaller, just in case you need a very small program and if you don't believe in acceleration. :) - The SIZE command is now used as long as the URL does not contain wildcards. Because FTP servers are just too different. :( - You can do FTP downloads through HTTP proxies now. - The weird initial 1-second delay which happened sometimes does not exist anymore: It was because of select(), which does not return immediately if there's data on a socket before the call starts. My first solution is using a lower timeout, I hope there's a better solution available... - Local file existence check. - Small bug fixed in conf.c. Finished May 22 2001 Version 0.92 brings you: - A credits file!! ;) - A German translation. Herrman J. Beckers: Thanks a lot! - ftp.c should understand weird Macintosh FTP servers too, now. - Connections are initialized in a different thread because then the program can go on downloading data from other connections while setting up. Quick hack, but it works. - config.h contains the configuration definitions now. - A URL - can be specified. The program will read a URL from stdin. Might be useful if you don't want other people to see the URL in the 'ps aux' output. (Think about passwords in URLs...) Finished May 11 2001 Version 0.91 brings you: - A man page. - A quiet mode. - A Debian package. (0.9 .deb exists too, but that was after the 'official' 0.9 release..) - Made the sizes/times displayed after downloading more human-readable. - Corrected some stupid things in the nl.po file. - No bug in ftp_wait anymore, (or at least one bug less ;) the program was a bit too late with the realloc() sometimes. I just hate those multi-line replies.. :( - HTTP proxy support. no_proxy configuration flag also in use. - Support for empty configuration strings. - URL parser understands wrongly formatted URLs like slashdot.org. (instead of the correct http://slashdot.org/) Finished Apr 30 2001 Version 0.9 brings you: - See the README for all the old features. - Internationalization support. - Clearer error messages. - Probably some bug fixes too. - A highly sophisticated Makefile.. ;) Finished Apr 22 2001 axel-2.16.1/INSTALL000066400000000000000000000366101321142621600135670ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. axel-2.16.1/Makefile.am000066400000000000000000000027471321142621600145760ustar00rootroot00000000000000AUTOMAKE_OPTIONS = dist-bzip2 dist-xz # XXX Fix disagreement between aclocal and make # (aclocal doesn't update based on mtime) ACLOCAL = touch $@; @ACLOCAL@ SUBDIRS = src po dist_man_MANS = man/axel.1 .txt.1: $(MAKE) -C $(@D) $(@F) EXTRA_DIST = \ CONTRIBUTING.md \ CREDITS \ doc/axelrc.example \ man/axel.txt \ man/Makefile distclean-local: -rm -rf autom4te.cache/ \ m4/ -rm -f *~ \ aclocal.m4 \ compile \ config.* \ configure \ depcomp \ install-sh \ Makefile.in \ missing \ po/*.gmo \ po/*.po~ \ po/Makefile.in.in \ po/Makevars.template \ po/Rules-quot \ po/axel.pot \ po/stamp-po \ src/Makefile.in remove_git_dep = sed -i -e \ '/^am__aclocal/,/[^\\]$$/ s:[$$](top_srcdir)/[.]git/[^ ]* *::g' dist-hook: rm -rf $(distdir)/.git read _ RELDATE _ < $(top_srcdir)/VERSION; \ TZ= find $(distdir) \ -name Makefile.in -exec $(remove_git_dep) '{}' ';' \ -exec touch -d "$$RELDATE" '{}' + \ -o -exec touch -d "$$RELDATE" '{}' + MSG = echo '==>' ERR = ! echo '!!! ERROR:' .PHONY: relcheck relcheck: @$(MSG) 'Checking for non-UTF8 translations...' @$(AWK) -f $(top_srcdir)/scripts/pocheck.awk $(top_srcdir)/po/*.po @$(MSG) 'Checking the state of the project...' @ m=`git status --porcelain=1 | wc -l`; \ test "$$m" = 0 \ && $(MSG) 'the working tree is clean' \ || $(ERR) "$$m" 'modified files in the working tree' @test -f "$(top_srcdir)/.git/refs/tags/v$(VERSION)" \ && $(MSG) 'v$(VERSION) tag found' \ || $(ERR) 'v$(VERSION) tag missing' @$(MSG) Everything OK axel-2.16.1/NEWS000066400000000000000000000001001321142621600132160ustar00rootroot00000000000000Since 2.10 version, Axel supports HTTPS/FTPS downloads. Enjoy! axel-2.16.1/README000077700000000000000000000000001321142621600146622README.mdustar00rootroot00000000000000axel-2.16.1/README.md000066400000000000000000000057361321142621600140220ustar00rootroot00000000000000# AXEL #### Axel — Light command line download accelerator for Linux and Unix * Help this project * What is Axel? * Building from source * Install on macOS with Homebrew * Building on macOS with Homebrew * Related projects * License ## 1. Help this project ## Axel needs your help. **If you are a programmer** and if you wants to help a nice project, this is your opportunity. Axel was imported from its old repository[1] to GitHub (the original homepage and developers are inactive). After this, all patches found in Debian project and other places for this program were applied. All initial work was registered in ChangeLog file (version 2.5 and later releases). Axel is being packaged in Debian[2]. If you are interested to help Axel, read the [CONTRIBUTING.md](CONTRIBUTING.md) file. Additionally, there is a group to discuss and to coordinate the development process[3]. You can also find other developers in the #axel channel on freenode. [1] https://alioth.debian.org/projects/axel [2] https://packages.qa.debian.org/a/axel.html [3] https://groups.google.com/forum/#!forum/axel-accelerator-dev ## 2. What is Axel? ## Axel tries to accelerate the downloading process by using multiple connections for one file, similar to DownThemAll and other famous programs. It can also use multiple mirrors for one download. Using Axel, you will get files faster from Internet. So, Axel can speed up a download up to 60% (approximately, according to some tests). Axel tries to be as light as possible, so it might be useful as a wget clone (and other console based programs) on byte-critical systems. Axel supports HTTP, HTTPS, FTP and FTPS protocols. Axel was originally developed by Wilmer van der Gaast. Thanks for your efforts. Over time, Axel got several contributions from people. Please, see AUTHORS and CREDITS files in source code. ## 3. Building from source ## Run `./autogen.sh` to create the configure script, then proceed with the instructions in [INSTALL](INSTALL). The basic actions for most users, after ./autogen.sh, is running ./configure, make and make install. To build without SSL/TLS support, use ./configure --without-ssl ## 4. Install on macOS with Homebrew ## brew install axel ## 5. Building on macOS with Homebrew ## Install the following homebrew packages: `brew install automake gettext openssl` You'll need to provide some extra options to `autogen.sh` and `configure` so they can find gettext and openssl. ```shell GETTEXT=/usr/local/opt/gettext OPENSSL=/usr/local/opt/openssl PATH="$GETTEXT/bin:$PATH" ./autogen.sh -I$GETTEXT/share/aclocal/ CFLAGS="-I$GETTEXT/include -I$OPENSSL/include" LDFLAGS=-L$GETTEXT/lib ./configure ``` You can just run `make` as usual after these steps. ## 6. Related projects ## * [aria2](https://github.com/aria2/aria2) * [hget](https://github.com/huydx/hget) * [lftp](https://github.com/lavv17/lftp) * [nugget](https://github.com/maxogden/nugget) * [pget](https://github.com/Code-Hex/pget) ## 7. License ## Axel is under GPL-2+ with OpenSSL exception. axel-2.16.1/VERSION000066400000000000000000000000341321142621600135750ustar00rootroot000000000000002.16.1 2017-12-05T05:16:05Z axel-2.16.1/acinclude.m4000066400000000000000000000035351321142621600147270ustar00rootroot00000000000000# TODO: we need a true replacement for AC_INIT... # _AXEL_READL(FILE, HARD-DEP?) # --------------------------------------------------------------------- m4_define([_AXEL_READL], [m4_bpatsubst(m4_quote(m4_if([$2],, [m4_sinclude([$1])], [m4_apply([m4_include], [[$1]])])), [ * ])]) # _AXEL_GIT_HEAD # --------------------------------------------------------------------- m4_define([_AXEL_GIT_HEAD], [m4_define([__HEAD], m4_quote(_AXEL_READL([.git/HEAD])))dnl m4_if(m4_substr(m4_quote(__HEAD), 0, 4), [ref:], [m4_quote(_AXEL_READL([.git/]m4_bpatsubst(__HEAD, [^ref: *])))], [m4_quote(__HEAD)])[]dnl m4_undefine([__HEAD])dnl ]) # _AXEL_GIT_TAG(TAG) # --------------------------------------------------------------------- m4_define([_AXEL_GIT_TAG], [m4_quote(_AXEL_READL([.git/refs/tags/$1]))]) # AXEL_VER_READ(FILE) # --------------------------------------------------------------------- AC_DEFUN_ONCE([AXEL_VER_READ], [_AC_INIT_LITERAL([$1]) m4_define([_AXEL_VERSION], m4_quote(m4_bpatsubst(m4_quote(_AXEL_READL([$1],1)), [ .*]))) m4_define([_AXEL_COMMIT], m4_quote(_AXEL_GIT_HEAD)) m4_define([_AXEL_VERSUF], [m4_if(m4_quote(_AXEL_COMMIT),,, [m4_if(m4_quote(_AXEL_COMMIT), m4_quote(_AXEL_GIT_TAG([v]_AXEL_VERSION)),, [[+g]m4_quote(m4_substr(_AXEL_COMMIT, 0, 6))])])]) m4_define([AC_PACKAGE_STRING], m4_quote(AC_PACKAGE_NAME AC_PACKAGE_VERSION)) m4_define([AC_PACKAGE_VERSION], m4_quote(_AXEL_VERSION[]_AXEL_VERSUF)) ]) # AXEL_PKG(PACKAGE-NAME, BUG-REPORT, [TAR-NAME]) # --------------------------------------------------------------------- AC_DEFUN_ONCE([AXEL_PKG], [_AC_INIT_LITERAL([$1]) _AC_INIT_LITERAL([$2]) AC_BEFORE([AXEL_VER_READ]) m4_define([AC_PACKAGE_NAME], [$1]) m4_define([AC_PACKAGE_TARNAME], m4_default([$3], [m4_bpatsubst(m4_tolower([$1]), [[^_abcdefghijklmnopqrstuvwxyz0123456789]], [-])])) m4_define([AC_PACKAGE_BUGREPORT], [$2]) ]) axel-2.16.1/autogen.sh000077500000000000000000000045431321142621600145370ustar00rootroot00000000000000#!/bin/sh # autogen.sh with clean option, v0.2 # Copyright 2016 Joao Eriberto Mota Filho # # This file is under BSD-3-Clause license. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the authors nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # Use clean option if [ "$1" = "clean" -a ! -e Makefile ] then echo "Vanishing the code" rm -rf aclocal.m4 autom4te.cache compile config.guess config.h.in \ config.rpath config.sub configure depcomp install-sh m4/ \ Makefile.in missing man/Makefile.in src/Makefile.in exit 0 fi # Do not use clean option if [ "$1" = "clean" -a -e Makefile ] then echo "I can not clean. Use '$ make distclean'." exit 0 fi # Do autoreconf autoreconf -i \ && { echo " "; \ echo "Done. You can use the 'clean' option to vanish the source code."; \ echo "Example of use: $ ./autogen.sh clean"; \ echo " "; \ echo "Now run ./configure, make, and make install."; \ } \ || { echo "We have a problem..."; exit 1; } axel-2.16.1/configure.ac000066400000000000000000000051471321142621600150250ustar00rootroot00000000000000# Autoconf for axel # Copyright 2016 Joao Eriberto Mota Filho # Copyright 2016 Stephen Thirlwall # Copyright 2017 Antonio Quartulli # Copyright 2017 Ismael Luceno # Copyright 2017 Vlad Glagolev # This file is under same license of Axel AC_PREREQ([2.69]) PKG_PREREQ([0.29]) AXEL_PKG([axel], [https://github.com/axel-download-accelerator/axel/issues]) AXEL_VER_READ([VERSION]) AC_INIT AC_CONFIG_SRCDIR([src/conf.h]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE PKG_PROG_PKG_CONFIG AM_SILENT_RULES([yes]) # Checks for programs. AC_PROG_CC AC_PROG_CC_C99 AS_IF([test "x$ac_cv_prog_cc_c99" = "xno"], [ AC_MSG_ERROR([C99 compiler required]) ]) AC_PROG_INSTALL # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([ \ arpa/inet.h \ fcntl.h \ libintl.h \ limits.h \ locale.h \ netdb.h \ netinet/in.h \ stdlib.h \ string.h \ sys/ioctl.h \ sys/socket.h \ sys/time.h \ unistd.h \ ]) # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL AC_C_INLINE AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT16_T # Checks for library functions. AC_CHECK_FUNCS([ \ getaddrinfo \ gettimeofday \ inet_ntoa \ malloc \ memset \ nanosleep \ realloc \ select \ setlocale \ socket \ strcasecmp \ strchr \ strerror \ strncasecmp \ strpbrk \ strrchr \ strstr \ strtoul \ ]) # Optional (but included-by-default) ssl support AC_ARG_WITH([ssl], AC_HELP_STRING([--without-ssl],[disable TLS support]), [], [with_ssl=yes]) AS_IF([test "x$with_ssl" != xno], [ PKG_CHECK_MODULES([SSL], [openssl]) AC_DEFINE([HAVE_SSL], [1], [SSL]) ], AC_MSG_NOTICE([SSL support disabled])) # Add Gettext AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.18]) # Large file support AC_SYS_LARGEFILE #### Definitions #### # OS arch=$(uname -s) AC_DEFINE_UNQUOTED([ARCH], ["$arch"], ["Define architecture"]) # Flags CFLAGS="$CFLAGS -Wall" LDFLAGS="$LDFLAGS $LIBINTL" case "$arch" in Darwin ) ;; SunOS ) LDFLAGS="$LDFLAGS -pthread -lsocket -lnsl" ;; HP-UX ) if [ -d /usr/local/lib/hpux32 ]; then AXEL_EXTRA_FLAGS="-L/usr/local/lib/hpux32" fi LDFLAGS="$LDFLAGS $AXEL_EXTRA_FLAGS -lpthread" ;; * ) LDFLAGS="$LDFLAGS -pthread" ;; esac # ---> WARNING: NetBSD not tested! Using OpenBSD settings. # etc path AC_DEFINE_UNQUOTED([ETCDIR], ["/etc"], ["Define /etc directory path"]) # Other AH_TEMPLATE([_REENTRANT], [Local definition]) AC_DEFINE_UNQUOTED([_REENTRANT]) AH_TEMPLATE([_THREAD_SAFE], [Local definition]) AC_DEFINE_UNQUOTED([_THREAD_SAFE]) ##################### AC_CONFIG_FILES([ Makefile src/Makefile po/Makefile.in ]) AC_OUTPUT axel-2.16.1/doc/000077500000000000000000000000001321142621600132755ustar00rootroot00000000000000axel-2.16.1/doc/API000066400000000000000000000220171321142621600136330ustar00rootroot00000000000000 /********************************************************************\ * Axel -- A lighter download accelerator for Linux and other Unices. * * * * Copyright 2001 Wilmer van der Gaast * \********************************************************************/ /* Short API description */ Until version 0.97, a lot of Axel downloading code was 'stuck' in main(). This made the development of alternate (ie graphical) interfaces to the program quite difficult. That's why Axel 0.97 is a major redesign: All the downloading code is out of main() now. Writing your own downloader which uses Axel should not be too difficult now. This document contains basic instructions on how to write a program which uses the Axel >=0.97 code to download data. Some work needs to be done before I can convert axel into a library. I don't know whether I'll do it at all.. So this API description is only useful if you want to create an alternate interface for the program, at the moment. Later on, I might change this. A Perl port of Axel would be nice too. :-) /* The structures */ If you want to use Axel, you should have all the *.[ch] files in your program's directory (or subdir, whatever you want...) and include the axel.h file into your program. Then, the following structures and functions will be available: typedef struct { conn_t *conn; conf_t conf[1]; char filename[MAX_STRING]; double start_time; int next_state, finish_time; int bytes_done, start_byte, size; int bytes_per_second; int delay_time; int outfd; int ready; message_t *message; url_t *url; } axel_t; This is probably the most important structure.. Each axel structure can handle a separate download, each with a variable amount of connections. There is no maximum amount of connections hard-coded into the program anymore, by the way. The way conn_t and conf_t structures work is not very important for most people, it's mainly important for internal use. You /can/ use those structures, if you want, they're not that complex... The filename string is set correctly by axel_new(). If you want data to be put into a different file, you can change the variable /after/ calling axel_new(), and /before/ calling axel_open(). The string can also include a full pathname. start_time contains the time at which the download started. Not very interesting for you, probably. Neither should next_state be very important, it just contains the time at which the next state file should be saved. (State files are important for resuming support, as described in the README file..) finish_time might be interesting, though. It contains the estimated time at which the download should be finished. bytes_done contains the number of bytes downloaded for this file, size contains the total file size. start_byte should be zero, usually, unless you're resuming a download. The code also calculates the average speed. This speed is put in the bytes_per_second variable. delay_time is not interesting at all. It's just used for the code which tries to slow down the download. You shouldn't really touch outfd either, it contains the file descriptor of the local file. ready is set to non-zero as soon as all data is downloaded, or as soon as something goes wrong. You shouldn't call axel_do() anymore, when ready is set. Last but not least, message. This is a linked list of messages to the user. You, as the programmer, may decide what to do with them. You can just destroy them (don't just ignore them, the messages do eat memory!) or you can log/display them. The structure is very simple, and I hope this is clear enough: typedef struct { void *next; char text[MAX_STRING]; } message_t; Just don't forget to free() the message structures after printing them, and set axel->message to NULL to prevent crashes. See the print_messages() function in text.c for an example. message used to be the last, but I added url. It's a linked list as well, and in fact url_t == message_t. Not really of any importance, though. This element contains a number of URL's that'll be used by Axel for the download. The program can use multiple mirrors at the same time. This structure is filled in by axel_new, you shouldn't touch it yourself. /* The functions */ int conf_init( conf_t *conf ); Axel needs some settings. Your program has to allocate a conf_t structure and initialize it using this function. It sets some defaults, and then it scans your environment variables for some settings, and it tries to read a system-wide and personal user configuration file. axel_t *axel_new( conf_t *conf, char count, char *url ); axel_t *axel_new( conf_t *conf, char count, search_t *urls ); axel_new() allocates a new axel_t structure. You should pass a configuration structure and an URL. A pointer to a new axel_t structure will be returned. axel->filename is set now. You can change it, if you want data to be stored to a different file. Changing axel->filename after calling axel_open does not make sense, so be quick. :-) If you want axel to download from more than one mirror at once, you can use the second syntax. A search_t structure can be generated by the search_* functions. If you use the second syntax, count should contain the number of mirrors to be used from the structure. If you just want to pass a string with one URL (first syntax), count should be zero. Please note that all the mirrors passed to axel_new() should support acceleration. The support check should be done before downloading, which isn't much of a problem because search_getspeeds does it automatically. The ready element of the returned structure is set to one if nothing goes wrong. If it's zero, you shouldn't use the returned structure for anything else than displaying the error message(s) and closing it. int axel_open( axel_t *axel ); axel_open() opens a local file to store downloaded data. Returns non-zero if nothing goes wrong. If anything goes wrong, you should still call axel_close() to clean things up. This is not done automatically, so that you can read any message still left in the structure. void axel_start( axel_t *axel ); axel_start() starts the actual downloading. Normally, nothing should go wrong during this call, so it does not return anything. void axel_do( axel_t *axel ); axel_do() should be called regularly (ie as often as possible...) to handle any incoming data. You don't have to do anything else, all data is stored in the local file automatically. You should stop calling this one as soon as axel->ready is set. Or you can stop calling it yourself, that's possible. Just don't forget to call axel_close()! void axel_close( axel_t *axel ); If you want to stop downloading (ie if the download is complete) you should deallocate the axel_t structure using this function. Any connection still open will be closed and deallocated, all messages in the structure are deleted. You should always call this one when you're ready, if you don't want to waste memory. double gettime(); This one is just a 'bonus'... I use it myself in text.c and axel.c, so I decided to make it global. It just returns the actual time, but with more precision. /* filesearcher.com interface */ If you want to search for a faster mirror to download your file, or if you want to download from more than one server at once, you can use this interface. It's quite simple. You should create an array of this type: typedef struct { char url[MAX_STRING]; double speed_start_time; int speed, size; pthread_t speed_thread[1]; conf_t *conf; } search_t; And it's wise to memset() it to zero before you start, btw. You also have to set the conf pointer for the first index of the array. Other fields will be filled in by these functions: int search_makelist( search_t *results, char *url ); This function checks your URL, fetches the file size (needed for the search) and queries the ftpsearcher.com server for any mirror of this file. This one is finished in a few seconds on my system. It returns the number of mirrors found. Please note that, after calling this function, the first index of your search_t array contains the URL you used as an argument to this function. The speed field is filled in already for that one. int search_getspeeds( search_t *results, int count ); This is quite time consuming. It tries all the URL's from the list, and checks the speed. URL's which do not exist, or URL's on non-supported servers are marked as bad, they can't be used. This is more time-consuming than a simple ping (it takes about twenty seconds on my system, but it heavily depends on the connection and your settings), but it makes sure only usable URL's are passed to the downloader. The function returns the number of not-bad servers. void search_sortlist( search_t *results, int count ); It's very wise to sort the list of mirrors using this function before passing it to axel_new(). The fastest URL will be put on top of the list, bad URL's will be put at the bottom. Please note that count has to be the total number of servers, returned by search_makelist(), and not just the number of not-bad servers returned by search_getspeed(). axel-2.16.1/doc/ROADMAP000066400000000000000000000114231321142621600143040ustar00rootroot00000000000000Roadmap for Axel v2 =================== * Check if strrstr is provided by environment * Use SI prefixes Roadmap for Axel v3 (by Philipp Hagemeister, 2008-2010) =================== Note: This document provides only a rough overview what to do next. Refer to the bugtracker ( https://github.com/axel-download-accelerator/axel/issues ) for detailled information. Pre-release version numbers of Axel 3 will start with 2.99. Starting with the 3.x series, the following version scheme will be adopted: x.y.z x: Complete overhaul of the code structure y: New features and/or speed/size improvements z: Bug fixed Features ======== * HTTP authentication (#310785) This is actually already implemented and should be documented. Using -H is possible, too. * Metalink (#310625) Basic Metalink support should not be that difficult. However, it will only be compiled if METALINK is defined. Metalink support will require libxml2. As libmetalink is currently unusable for us (private symbols), we'll implement the format ourselves. * .netrc (#310635) There are lots of GPLed implementations flying around. To minimize code size, it shouldn't be compiled in by default if the code exceeds a couple of bytes. Anyway, it's just one call from Axel's point of view. * Prevent connection to same server (#310638) See tcp.c below for the implementation (aside from a flag in the configuration and a cli flag). * Force overriding state file (#311022) Shouldn't be difficult and take more than a couple of bytes. * SSL protocols (HTTPS, FTPS) (#311163) * Parse Content-Disposition header (#311101) Look if the specific problem mentioned in the bug is fixed by this. Code structure ============== * conn.c needs cleanup, possibly even elimination. Most functions look like if (ftp && !proxy) { // ... do FTP stuff (15 lines) } else { // ... do HTTP stuff (20 lines) } We should at least abstract the switch between HTTP and FTP and look what can be done about simplifiying and documenting the functions here. Furthermore, redirecting should be cached somehow/done only once lest we reach the redirect limit because it's less than -n. * tcp.c should be checked. The functions look a little bit obscure to me. But maybe, that's just me. Before we implement #310638, we should include some round-robin trickery in here. * Removing MAX_STRING(#311085) and MAX_ADD_HEADERS. These are arbitrary restrictions and may hide a number of strange bugs. Furthermore, statically sized fields are a waste of memory. * Add die messages: Axel must not exit with != 0 without telling why. * Add debugging messages: When compiled with DEBUG, Axel could be more verbose. This won't harm anything and may serve as comments. * Some functions could use a little bit of documentation. * Remove all logic from text.c * Ensure correct synchronization of thread state (volatile?) * Cleanup AXEL_LEGACY * rewrite axel-kapt to be sane (probably sh, or even #!/usr/bin/env kaptain suffices) or remove it in favor of a sane GUI Bugs ==== We're gonna fix them all! #310979 seems pretty vague. Check spaces in FTP and HTTP URLs (User) Documentation ==================== * As previously mentioned, authentication should be documented. * Update API 3.1 === * Cookies (#310835) Can be implemented via -H. The bug called for reading the Netcape-style cookies.txt (Wget's --load--cokies option). Domain-specific cookies could be rather complex to implement. If the implementation of this feature costs more than 100B, it should be deselectable. * Rate-limit status messages (#TODO) * Don't discard first HTTP connection, but use it adaptively (start requests from the end, RST as soon as first task is fullfilled) * A -1 option: Just make one request, and only one. * IPv6 support 3.2 === * Write a macro ERROR_MESSAGE(msg) (msg), enclose all _("some long error message") and offer a compilation option for a single error message, see if that yields any size improvements * Check compilation with dietlibc(http://www.fefe.de/dietlibc/) and uclibc(http://www.uclibc.org/): · How to compile with these libraries · Does this actually improve the binary size? · Check warnings/suggestions * valgrind and friends * Test very large -n values. Check pthread thread stack size. Future/Ideas ============ * Real FTPS (AUTH)? * Allow downloading to /dev/null for debugging or speed test purposes (Statefile in memory or so) * Desktop integration, look who likes download accelerators * Check the syscalls we make. Check whether timing and read() calls can be optimized * Write automated tests to test all these nifty corner cases. Either a test webserver or LD_PRELOAD injection of all syscalls (see libfake*) * Write a helper script that displays the final binary size for different configurations to determine what a particular feature costs * Document and implement coding conventions, versioning scheme axel-2.16.1/doc/UPDATE-CHECK000066400000000000000000000005411321142621600150150ustar00rootroot00000000000000When updating, change these files (if needed): - VERSION [0] - ChangeLog [1] - AUTHORS - CREDITS - src/text.c (years in Copyright lines near EOF) - run: make man/axel.1 - run: make -C po update-po When done: - run: make relcheck - run: make distcheck - test Debian packaging - make a pull-request [0] $ scripts/mknextver [1] $ scripts/mkchangelog axel-2.16.1/doc/axelrc.example000066400000000000000000000106531321142621600161350ustar00rootroot00000000000000############################################################################ ## ## ## Example configuration file for Axel - A light download accelerator ## ## ## ############################################################################ # reconnect_delay sets the number of seconds before trying again to build # a new connection to the server. # # reconnect_delay = 20 # You can set a maximum speed (bytes per second) here, Axel will try to be # at most 5% faster or 5% slower. # # max_speed = 0 # You can set the maximum number of connections Axel will try to set up # here. There's a value precompiled in the program too, setting this too # high requires recompilation. PLEASE respect FTP server operators and other # users: Don't set this one too high!!! 4 is enough in most cases. # # num_connections = 4 # Set the maximum number of redirects that Axel is allowed to follow. The # default value is 20. # # max_redirect = 20 # If no data comes from a connection for this number of seconds, abort (and # resume) the connection. # # connection_timeout = 45 # Set proxies. no_proxy is a comma-separated list of domains which are # local, axel won't use any proxy for them. You don't have to specify full # hostnames there. # Choose the IP protocol to use among IPv4 and IPv6. When a protocol is # chosen, no connection attempt will be performed with the other. Possible # value are "ipv4" or "ipv6". By default anyone will be used based on # the address returned by the resolv library. # # use_protocol= ipv4 # # Note: If the HTTP_PROXY environment variable is set correctly already, # you don't have to set it again here. The setting should be in the same # format as the HTTP_PROXY var, like 'http://host.domain.com:8080/', # although a string like 'host.domain.com:8080' should work too.. # # Sometimes HTTP proxies support FTP downloads too, so the proxy you # configure here will be used for FTP downloads too. # # If you have to use a SOCKS server for some reason, the program should # work perfectly through socksify without even knowing about that server. # I haven't tried it myself, so I would love to hear from you about the # results. # # http_proxy = # no_proxy = # Keep CGI arguments in the local filename? # # strip_cgi_parameters = 1 # When downloading a HTTP directory/index page, (like http://localhost/~me/) # what local filename do we have to store it in? # # default_filename = default # Save state every x seconds. Set this to 0 to disable state saving during # download. State files will always be saved when the program terminates # (unless the download is finished, of course) so this is only useful to # protect yourself against sudden system crashes. # # save_state_interval = 10 # Buffer size: Maximum amount of bytes to read from a connection. One single # buffer is used for all the connections (no separate per-connection buffer). # A smaller buffer might improve the accuracy of the speed limiter, but a # larger buffer is a better choice for fast connections. # # buffer_size = 5120 # By default some status messages about the download are printed. You can # disable this by setting this one to zero. # # verbose = 1 # FTP searcher # # search_timeout - Maximum time (seconds) to wait for a speed test # search_threads - Maximum number of speed tests at once # search_amount - Number of URL's to request from filesearching.com # search_top - Number of different URL's to use for download # # search_timeout = 10 # search_threads = 3 # search_amount = 15 # search_top = 3 # If you have multiple interfaces to the Internet, you can make Axel use all # of them by listing them here (interface name or IP address). If one of the # interfaces is faster than the other(s), you can list it more than once and # it will be used more often. # # This option is blank by default, which means Axel uses the first match in # the routing table. # # interfaces = # If you don't like the wget-alike interface, you can set this to 1 to get # a scp-alike interface. # # alternate_output = 1 # # Set this to 1 to avoid axel to download a file if one with the same name # already exists in the current folder and no state file is found. # Normally, axel will add . to the name of the file in cases where # that file already exists. With the no_clobber option, axel will skip # downloading this file altogether. # # no_clobber = 1 axel-2.16.1/man/000077500000000000000000000000001321142621600133035ustar00rootroot00000000000000axel-2.16.1/man/Makefile000066400000000000000000000005231321142621600147430ustar00rootroot00000000000000P_DESC = "light command line download accelerator" .SUFFIXES: .txt .1 .txt.1: read P_VERSION P_DATE _ < ../VERSION && \ tmp=$$(mktemp tmpXXXXXX) && \ > "$$tmp" \ txt2man -d "$$(date -d"$$P_DATE" '+%B %_d, %Y')" \ -t "$(<:.txt=)" -r "$(<:.txt=)-$$P_VERSION" -s 1 \ -v $(P_DESC) $< && \ mv "$$tmp" $@ || { rm -f "$$tmp"; exit 1; } axel-2.16.1/man/axel.1000066400000000000000000000132721321142621600143230ustar00rootroot00000000000000.\" Text automatically generated by txt2man .TH axel 1 "October 9, 2017" "axel-2.15" "light command line download accelerator" .SH NAME \fBaxel \fP- light command line download accelerator \fB .SH SYNOPSIS .nf .fam C \fBaxel\fP [\fIOPTIONS\fP] \fIurl1\fP [\fIurl2\fP] [url\.\.\.] .fam T .fi .fam T .fi .SH DESCRIPTION Axel is a program that downloads a file from a FTP or HTTP server through multiple connection. Each connection downloads its own part of the file. .PP Unlike most other programs, Axel downloads all the data directly to the destination file. It saves some time at the end because the program does not have to concatenate all the downloaded parts. .PP Axel supports HTTP, HTTPS, FTP and FTPS protocols. .SH OPTIONS One argument is required, the URL to the file you want to download. When downloading from FTP, the filename may contain wildcards and the program will try to resolve the full filename. Multiple mirror URLs to an identical file can be specified as well and the program will use all those URLs for the download. .PP Please note that the program does not check whether the files are equal. .PP Other options: .TP .B \fB--max-speed\fP=x, \fB-s\fP x Specify a speed (bytes per second) to try to keep the average speed around this speed. This is useful if you do not want the program to suck up all of your bandwidth. .TP .B \fB--num-connections\fP=x, \fB-n\fP x Specify an alternative number of connections. .TP .B \fB--max-redirect\fP=x Specify an alternative number of redirections to follow when connecting to the server (default is 20). .TP .B \fB--output\fP=x, \fB-o\fP x Downloaded data will be put in a local file with the same name, unless you specify a different name using this option. You can specify a directory as well, the program will append the filename. .TP .B \fB--search\fP[=x], \fB-S\fP[x] Axel can do a search for mirrors using the filesearching.com search engine. This search will be done if you use this option. You can specify how many different mirrors should be used for the download as well. The search for mirrors can be time-consuming because the program tests every server's speed, and it checks whether the file's still available. .TP .B \fB--ipv6\fP, \fB-6\fP Use the IPv6 protocol only when connecting to the host. .TP .B \fB--ipv4\fP, \fB-4\fP Use the IPv4 protocol only when connecting to the host. .TP .B \fB--no-proxy\fP, \fB-N\fP Do not use any proxy server to download the file. Not possible when a transparent proxy is active somewhere, of course. .TP .B \fB--insecure\fP, \fB-k\fP Do not verify the SSL certificate. Only use this if you are getting certificate errors and you are sure of the sites authenticity. .PP \fB--no-clobber\fP, \fB-c\fP Skip download if a file with the same name already exists in the current folder and no state file is found. .TP .B \fB--verbose\fP, \fB-v\fP Show more status messages. Use it more than once to see more details. .TP .B \fB--quiet\fP, \fB-q\fP No output to stdout. .TP .B \fB--alternate\fP, \fB-a\fP This will show an alternate progress indicator. A bar displays the progress and status of the different threads, along with current speed and an estimate for the remaining download time. .TP .B \fB--header\fP=x, \fB-H\fP x Add an additional HTTP header. This option should be in the form "Header: Value". See RFC 2616 section 4.2 and 14 for details on the format and standardized headers. .TP .B \fB--user-agent\fP=x, \fB-U\fP x Set the HTTP user agent to use. Some websites serve different content based upon this parameter. The default value will include "Axel", its version and the platform. .TP .B \fB--help\fP, \fB-h\fP A brief summary of all the options. .TP .B \fB--timeout\fP=x, \fB-T\fP x Set I/O and connection timeout .TP .B \fB--version\fP, \fB-V\fP Get version information. .SH NOTE Long (double dash) options are supported only if your platform knows about the getopt_long call. If it does not (like *BSD), only the short options can be used. .SH RETURN VALUE The program returns 0 when the download was successful, 1 if something really went wrong and 2 if the download was interrupted. If something else comes back, it must be a bug. .SH EXAMPLES The trivial usage to download a file is similar to: .PP .nf .fam C $ axel http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.1.0-amd64-netinst.iso $ axel ftp://ftp.nl.kernel.org/pub/linux/kernel/v2.2/linux-2.2.20.tar.bz2 .fam T .fi This will use the Belgian, Dutch, English and German kernel.org mirrors to download a Linux 2.4.17 kernel image. .PP .nf .fam C $ axel ftp://ftp.{be,nl,uk,de}.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2 .fam T .fi This will do a search for the linux-2.4.17.tar.bz2 file on filesearching.com and it'll use the four (if possible) fastest mirrors for the download (possibly including ftp.kernel.org). .PP .nf .fam C $ axel -S4 ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2 .fam T .fi .SH FILES .TP .B /etc/axelrc System-wide configuration file. .TP .B ~/.axelrc Personal configuration file. .PP These files are not documented in a manpage, but the example file which comes with the program contains enough information. The position of the system-wide configuration file might be different. In source code this example file is at doc/ directory. It's generally installed under /usr/share/doc/\fBaxel\fP/examples/, or the equivalent for your system. .SH COPYRIGHT Axel was originally written by Wilmer van der Gaast and other authors over time. Please, see the AUTHORS and CREDITS files. .PP The project homepage is .SH HELP THIS PROJECT If you intent to help, please, read the CONTRIBUTING.md file. On Debian systems, this file will be available at /usr/share/doc/\fBaxel\fP/ directory. axel-2.16.1/man/axel.txt000066400000000000000000000126101321142621600147750ustar00rootroot00000000000000NAME axel - light command line download accelerator SYNOPSIS axel [OPTIONS] url1 [url2] [url...] DESCRIPTION Axel is a program that downloads a file from a FTP or HTTP server through multiple connection. Each connection downloads its own part of the file. Unlike most other programs, Axel downloads all the data directly to the destination file. It saves some time at the end because the program does not have to concatenate all the downloaded parts. Axel supports HTTP, HTTPS, FTP and FTPS protocols. OPTIONS One argument is required, the URL to the file you want to download. When downloading from FTP, the filename may contain wildcards and the program will try to resolve the full filename. Multiple mirror URLs to an identical file can be specified as well and the program will use all those URLs for the download. Please note that the program does not check whether the files are equal. Other options: --max-speed=x, -s x Specify a speed (bytes per second) to try to keep the average speed around this speed. This is useful if you do not want the program to suck up all of your bandwidth. --num-connections=x, -n x Specify an alternative number of connections. --max-redirect=x Specify an alternative number of redirections to follow when connecting to the server (default is 20). --output=x, -o x Downloaded data will be put in a local file with the same name, unless you specify a different name using this option. You can specify a directory as well, the program will append the filename. --search[=x], -S[x] Axel can do a search for mirrors using the filesearching.com search engine. This search will be done if you use this option. You can specify how many different mirrors should be used for the download as well. The search for mirrors can be time-consuming because the program tests every server's speed, and it checks whether the file's still available. --ipv6, -6 Use the IPv6 protocol only when connecting to the host. --ipv4, -4 Use the IPv4 protocol only when connecting to the host. --no-proxy, -N Do not use any proxy server to download the file. Not possible when a transparent proxy is active somewhere, of course. --insecure, -k Do not verify the SSL certificate. Only use this if you are getting certificate errors and you are sure of the sites authenticity. --no-clobber, -c Skip download if a file with the same name already exists in the current folder and no state file is found. --verbose, -v Show more status messages. Use it more than once to see more details. --quiet, -q No output to stdout. --alternate, -a This will show an alternate progress indicator. A bar displays the progress and status of the different threads, along with current speed and an estimate for the remaining download time. --header=x, -H x Add an additional HTTP header. This option should be in the form "Header: Value". See RFC 2616 section 4.2 and 14 for details on the format and standardized headers. --user-agent=x, -U x Set the HTTP user agent to use. Some websites serve different content based upon this parameter. The default value will include "Axel", its version and the platform. --help, -h A brief summary of all the options. --timeout=x, -T x Set I/O and connection timeout --version, -V Get version information. NOTE Long (double dash) options are supported only if your platform knows about the getopt_long call. If it does not (like *BSD), only the short options can be used. RETURN VALUE The program returns 0 when the download was successful, 1 if something really went wrong and 2 if the download was interrupted. If something else comes back, it must be a bug. EXAMPLES The trivial usage to download a file is similar to: $ axel http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.1.0-amd64-netinst.iso $ axel ftp://ftp.nl.kernel.org/pub/linux/kernel/v2.2/linux-2.2.20.tar.bz2 This will use the Belgian, Dutch, English and German kernel.org mirrors to download a Linux 2.4.17 kernel image. $ axel ftp://ftp.{be,nl,uk,de}.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2 This will do a search for the linux-2.4.17.tar.bz2 file on filesearching.com and it'll use the four (if possible) fastest mirrors for the download (possibly including ftp.kernel.org). $ axel -S4 ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.17.tar.bz2 FILES /etc/axelrc System-wide configuration file. ~/.axelrc Personal configuration file. These files are not documented in a manpage, but the example file which comes with the program contains enough information. The position of the system-wide configuration file might be different. In source code this example file is at doc/ directory. It's generally installed under /usr/share/doc/axel/examples/, or the equivalent for your system. COPYRIGHT Axel was originally written by Wilmer van der Gaast and other authors over time. Please, see the AUTHORS and CREDITS files. The project homepage is HELP THIS PROJECT If you intent to help, please, read the CONTRIBUTING.md file. On Debian systems, this file will be available at /usr/share/doc/axel/ directory. axel-2.16.1/po/000077500000000000000000000000001321142621600131465ustar00rootroot00000000000000axel-2.16.1/po/LINGUAS000066400000000000000000000000441321142621600141710ustar00rootroot00000000000000de es id_ID it ja nl pt_BR ru zh_CN axel-2.16.1/po/Makevars000066400000000000000000000034531321142621600146470ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --omit-header # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Joao Eriberto Mota Filho # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = axel-2.16.1/po/POTFILES.in000066400000000000000000000001251321142621600147210ustar00rootroot00000000000000src/axel.c src/conf.c src/conn.c src/ftp.c src/http.c src/text.c src/ssl.c src/tcp.c axel-2.16.1/po/README-to-translate000066400000000000000000000007431321142621600164450ustar00rootroot00000000000000To create a translation to a new language (e.g. pt_BR): $ ./autogen.sh $ ./configure $ cd po/ $ msginit -l pt_BR # change pt_BR to your new language $ edit pt_BR.po # likewise // Now, edit the empty strings started by msgstr, doing the translation. // Send me the translation! If you want activate the translation locally, add pt_BR to LINGUAS and run: $ make update-po Run the last command if you are updating a .po file. -- Eriberto, Wed, 30 Mar 2016 22:30:52 -0300 axel-2.16.1/po/boldquot.sed000066400000000000000000000003311321142621600154710ustar00rootroot00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g axel-2.16.1/po/de.po000066400000000000000000000251611321142621600141030ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Axel\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2008-09-15 22:08+0200\n" "Last-Translator: Hermann J. Beckers \n" "Language-Team: deutsch \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer für diese Geschwindigkeit angepasst." #: src/axel.c:108 msgid "Invalid URL" msgstr "" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Kann URL nicht parsen.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Dateigröße: %lld bytes" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Dateigröße: %lld bytes" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Öffne Ausgabedatei: %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Server versteht REST nicht, Neustart mit einer Verbindung." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Status-Datei gefunden: %lld bytes übertragen, %lld verbleiben." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Fehler beim Öffnen der lokalen Datei" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Schlechtes Datei-/Betriebssystem, Umgehung.." #: src/axel.c:346 #, fuzzy msgid "Error creating local file" msgstr "Fehler beim Öffnen der lokalen Datei" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" #: src/axel.c:408 msgid "Starting download" msgstr "Starte Abruf" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Verbindung %i: Abruf von %s:%i über Schnittstelle %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "pthread Fehler!!!" #: src/axel.c:474 #, fuzzy, c-format msgid "Error while waiting for connection: %s" msgstr "Fehler beim Schreiben des Befehls %s\n" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Time-out bei Verbindung %i" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Fehler bei Verbindung %i! Verbindung getrennt" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Verbindung %i unerwartet getrennt" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Verbindung %i beendet" #: src/axel.c:564 msgid "Write error!" msgstr "Schreibfehler!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Fehler in %s Zeile %i.\n" #: src/conf.c:262 #, fuzzy, c-format msgid "HOME env variable too long\n" msgstr "Dateiname zu lang!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Zu viele Weiterleitungen (redirects).\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Unbekannter HTTP-Fehler.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "Kann nicht in Verzeichnis %s wechseln\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Datei nicht gefunden.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Mehrere Treffer für diese URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Fehler beim Öffnen der Passiv-Verbindung.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Fehler beim Schreiben des Befehls %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Verbindung geschlossen.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "Ungültige Proxy-Angabe: %s\n" #: src/http.c:215 #, fuzzy, c-format msgid "Connection gone while writing.\n" msgstr "Verbindung geschlossen.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Kann Standardausgabe nicht nach /dev/null umleiten.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "Fehler beim Lesen der URL (Zu lang?).\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "Kann URLs mit mehr als %d Zeichen nicht nutzen\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Starte Abruf: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Suche gestartet...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Datei nicht gefunden\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Teste Geschwindigkeiten, das kann etwas dauern...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i benutzbare Server gefunden, werde diese URLs benutzen:\n" #: src/text.c:289 msgid "Speed" msgstr "" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "Dateiname zu lang!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Keine Status-Datei, Fortsetzung nicht möglich!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "Status-Datei gefunden, aber noch nichts übertragen. Neustart.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "%s abgerufen in %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobytes" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabytes" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabytes" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i Sekunde" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i Sekunden" #: src/text.c:519 #, fuzzy, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i Sekunden" #: src/text.c:521 #, fuzzy, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i Sekunden" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Aufruf: axel [Optionen] url1 [url2] [url...]\n" "\n" "-s x\tMaximale Geschwindigkeit (Bytes pro Sekunde)\n" "-n x\tmaximale gleichzeitige Verbindungen\n" "-o f\tlokale Ausgabe-Datei\n" "-S [x]\tSuche nach Spiegelservern und Abruf von x Servern\n" "-H x\tSende HTTP-Header\n" "-U x\tSetze Browser-Kennung\n" "-N\tkeinen Proxy-Server benutzen\n" "-q\tkeine Meldungen auf Standard-Ausgabe\n" "-v\tzusätzliche Status-Information\n" "-h\tdiese Information\n" "-V\tVersions-Information\n" "\n" "Fehler an lintux@lintux.cx melden.\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Aufruf: axel [Optionen] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tmaximale Geschwindigkeit (Bytes pro Sekunde)\n" "--num-connections=x\t-n x\tmaximale gleichzeitige Verbindungen\n" "--output=f\t\t-o f\tlokale Ausgabe-Datei\n" "--search=[x]\t\t-S [x] Suche nach Spiegelservern und Abruf von x Servern\n" "--header=x\t\t-H x\tSende HTTP-Header\n" "--user-agent=x\t\t-U x\tSetze Browser-Kennung\n" "--no-proxy\t\t-N\tkeinen Proxy-Server benutzen\n" "--quiet\t\t\t-q\tkeine Meldungen auf Standard-Ausgabe\n" "--verbose\t\t-v\tzusätzliche Status-Information\n" "--help\t\t\t-h\tdiese Information\n" "--version\t\t-V\tVersions-Information\n" "\n" "Fehler an lintux@lintux.cx melden.\n" #: src/text.c:701 #, fuzzy, c-format msgid "Axel version %s (%s)\n" msgstr "Axel Version %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "" #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "" #: src/tcp.c:54 #, fuzzy, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Keine Verbindung mit %s:%i möglich\n" axel-2.16.1/po/en@boldquot.header000066400000000000000000000024711321142621600166000ustar00rootroot00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # axel-2.16.1/po/en@quot.header000066400000000000000000000022631321142621600157360ustar00rootroot00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # axel-2.16.1/po/es.po000066400000000000000000000302501321142621600141150ustar00rootroot00000000000000# Spanish translations for axel package. # Copyright 2017 Ismael Luceno # This file is distributed under the same license as the axel package. # Ismael Luceno , 2017. # msgid "" msgstr "" "Project-Id-Version: axel 2.16\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "POT-Creation-Date: 2017-10-22 00:28-0300\n" "PO-Revision-Date: 2017-11-24 22:35-0300\n" "Last-Translator: Ismael Luceno \n" "Language-Team: Spanish\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer redimensionado para ésta velocidad." #: src/axel.c:108 msgid "Invalid URL" msgstr "URL inválida" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "No se puede analizar la URL.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "Descarga incompleta encontrada, ignorando opción no-clobber\n" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "Archivo '%s' ya existe; no recuperando.\n" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Tamaño de archivo: %lld bytes" #: src/axel.c:195 msgid "File size: unavailable" msgstr "Tamaño de archivo: no disponible" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Abriendo archivo de salida %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Servidor no soportado, comenzando desde cero con una conexión." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "%s.st: Error, archivo de estado truncado\n" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "Número incorrecto de conexiones almacenado en el archivo de estado\n" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "Archivo de estado en formato antiguo.\n" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Archivo de estado encontrado: %lld bytes descargados, %lld pendientes." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Error abriendo archivo local" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Sistema de archivos/SO horrible. Usando solución alternativa. :-(" #: src/axel.c:346 msgid "Error creating local file" msgstr "Error creando archivo local" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" "\n" "Reactivar conexión %d\n" #: src/axel.c:408 msgid "Starting download" msgstr "Comenzando descarga" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Conexión %i descargando desde %s:%i usando la interfaz %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "error de pthread!!!" #: src/axel.c:474 #, c-format msgid "Error while waiting for connection: %s" msgstr "Error al esperar por conexión: %s" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Conexión %i caducada" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Error en conexión %i! Conexión cerrada" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Conexión %i cerrada inesperadamente" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Conexión %i finalizada" #: src/axel.c:564 msgid "Write error!" msgstr "Error de escritura!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "Error al aplicar regulación: %s" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "Descargando %lld-%lld usando conn. %i\n" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "Error de E/S al leer archivo de configuración: %s\n" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "Protocolo %s desconocido\n" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "Demasiadas conexiones solicitadas, el máximo es %i\n" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Error en %s línea %i.\n" #: src/conf.c:262 #, c-format msgid "HOME env variable too long\n" msgstr "Variable de entorno HOME demasiado larga\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Demasiadas redirecciones.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Error HTTP desconocido.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "No se puede cambiar el directorio a %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Archivo no encontrado.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Múltiples coincidencias para ésta URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Error abriendo conexión de datos pasiva.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Error escribiendo el comando %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Conexión desaparecida.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "Cadena de proxy inválida: %s\n" #: src/http.c:215 #, c-format msgid "Connection gone while writing.\n" msgstr "Conexión desaparecida al escribir.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "No se puede redirigir stdout a /dev/null.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "Error al intentar leer la URL (¿demasiado larga?).\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "No se pueden manejar URLs de longitud mayor a %d\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Inicializando descarga: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Buscando...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Archivo no encontrado\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Probando velocidades, esto puede tomar un tiempo...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "Falló la prueba de velocidad\n" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i servidores usables encontrados, se utilizarán éstas URLs:\n" #: src/text.c:289 msgid "Speed" msgstr "Velocidad" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "¡Nombre de archivo demasiado largo!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "¡No hay archivo de estado, no se puede reanudar!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "" "Archivo de estado encontrado, pero no hay datos descargados. Comenzando " "desde cero.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "Descargado %s en %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobyte" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabyte" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabyte" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i segundo" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i segundos" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i minuto(s)" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i hora(s)" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "No se puede configurar la salida alternativa. Desactivando.\n" #: src/text.c:651 #, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Uso: axel [opciones] url1 [url2] [url...]\n" "\n" "-s x\tEspecifcar velocidad máxima (bytes por segundo)\n" "-n x\tEspecificar número máximo de conexiones\n" "-o f\tEspecificar archivo de salida local\n" "-S[n]\tBuscar por espejos y descargar desde n servidores\n" "-4\tUsar el protocolo IPv4\n" "-6\tUsar el protocolo IPv6\n" "-H x\tAgregar cabecera HTTP\n" "-U x\tEstablecer agente de usuario\n" "-N\tNo usar ningún servidor proxy\n" "-k\tNo verificar el certificado de SSL\n" "-c\tOmitir descarga si el archivo ya existe\n" "-q\tDejar en paz stdout\n" "-v\tMás información del estado\n" "-a\tIndicador de progreso alternativo\n" "-h\tEsta información\n" "-T x\tEstablecer tiempo de expiración de E/S y conexión\n" "-V\tInformación de versión\n" "\n" #: src/text.c:673 #, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Uso: axel [opciones] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tEspecifcar velocidad máxima (bytes por segundo)\n" "--num-connections=x\t-n x\tEspecificar número máximo de conexiones\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tEspecificar archivo de salida local\n" "--search[=n]\t\t-S[n]\tBuscar por espejos y descargar desde n servidores\n" "--ipv4\t\t\t-4\tUsar el protocolo IPv4\n" "--ipv6\t\t\t-6\tUsar el protocolo IPv6\n" "--header=x\t\t-H x\tAgregar cabecera HTTP\n" "--user-agent=x\t\t-U x\tEstablecer agente de usuario\n" "--no-proxy\t\t-N\tNo usar ningún servidor proxy\n" "--insecure\t\t-k\tNo verificar el certificado de SSL\n" "--no-clobber\t\t-c\tOmitir descarga si el archivo ya existe\n" "--quiet\t\t\t-q\tDejar en paz stdout\n" "--verbose\t\t-v\tMás información del estado\n" "--alternate\t\t-a\tIndicador de progreso alternativo\n" "--help\t\t\t-h\tEsta información\n" "--timeout=x\t\t-T x\tEstablecer tiempo de expiración de E/S y conexión\n" "--version\t\t-V\tInformación de versión\n" "\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel versión %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "y otros." #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" "Por favor, vea el archivo CREDITS.\n" "\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "Error de SSL: %s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Incapaz de conectarse al servidor %s:%i: %s\n" axel-2.16.1/po/id_ID.po000066400000000000000000000300101321142621600144500ustar00rootroot00000000000000# Indonesian translations for axel package. # Copyright (C) 2017 Mahyuddin # This file is distributed under the same license as the axel package. # Mahyuddin , 2017. # msgid "" msgstr "" "Project-Id-Version: axel 2.14.1\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2017-10-02 14:06+0700\n" "Last-Translator: Mahyuddin \n" "Language-Team: Indonesian (Indonesia) \n" "Language: id_ID\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.11\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer diubah ukurannya untuk kecepatan ini." #: src/axel.c:108 msgid "Invalid URL" msgstr "URL tidak valid" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Tidak bisa mengurai URL.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "Unduhan tidak lengkap ditemukan, mengabaikan opsi no-clobber\n" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "Berkas '%s' sudah ada; tidak mengambil.\n" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Ukuran berkas: %lld bytes" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Ukuran berkas: %lld bytes" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Membuka berkas keluaran %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Server tidak didukung, mulai dari dasar dengan satu koneksi." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "%s.st: Galat, bagian berkas terpotong\n" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "Jumlah koneksi palsu tersimpan dalam bagian berkas\n" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "Bagian berkas memiliki format lama..\n" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Bagian berkas ditemukan: %lld bytes diunduh, %lld untuk berjalan." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Galat saat membuka berkas lokal" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Filesystem/OS jelek.. Bekerja di sekitar. :-(" #: src/axel.c:346 msgid "Error creating local file" msgstr "Galat membuat berkas lokal" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" "\n" "Aktifkan kembali koneksi %d\n" #: src/axel.c:408 msgid "Starting download" msgstr "Mulai mengunduh" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Sambungan %i diunduh dari %s:%i menggunakan antarmuka %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "pthread galat!!!" #: src/axel.c:474 #, c-format msgid "Error while waiting for connection: %s" msgstr "Galat saat menunggu koneksi: %s" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Sambungan %i habis waktunya" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Galat pada koneksi %i! Sambungan putus" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Koneksi %i tiba-tiba putus" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Koneksi %i selesai" #: src/axel.c:564 msgid "Write error!" msgstr "Tulis galat!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "Galat saat menerapkan throttling: %s" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "Mengunduh %lld-%lld menggunakan conn. %i\n" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "Galat I/O saat membaca berkas konfigurasi: %s\n" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "Protokol tidak dikenal %s\n" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "Meminta terlalu banyak koneksi, max adalah %i\n" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Galat di %s baris %i.\n" #: src/conf.c:262 #, c-format msgid "HOME env variable too long\n" msgstr "HOME env variabel terlalu panjang!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Terlalu banyak pengalihan.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Galat HTTP tidak dikenal.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "Tidak dapat mengubah direktori menjadi %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Berkas tidak ditemukan.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Beberapa kecocokan untuk URL ini.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Galat saat membuka koneksi data pasif.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Galat menulis perintah %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Koneksi hilang.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "String proxy tidak valid: %s\n" #: src/http.c:215 #, c-format msgid "Connection gone while writing.\n" msgstr "Koneksi hilang saat menulis.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Tidak bisa mengalihkan stdout ke /dev/null.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "Galat saat mencoba membaca URL (Terlalu lama?).\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "Tidak dapat menangani URL dengan panjang di atas %d\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Menginisialisasi unduh: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Melakukan pencarian..\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Berkas tidak ditemukan\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Menguji kecepatan, ini bisa memakan waktu beberapa lama...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "Pengujian kecepatan gagal\n" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i server yang dapat digunakan ditemukan, akan menggunakan URL ini:\n" #: src/text.c:289 msgid "Speed" msgstr "Kecepatan" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "Nama berkas terlalu panjang!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Tidak ada bagian berkas, tidak bisa melanjutkan!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "Bagian berkas ditemukan, tapi data tidak diunduh. Mulai dari awal.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "Diunduh %s in %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobyte" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabyte" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabyte" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i secondo" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i detik" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i menit(s)" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i jam(s)" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "Tidak dapat menyiapkan keluaran alternatif. Menonaktifkan.\n" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Penggunaan: axel [opsi] url1 [url2] [url ...]\n" "\n" "-s x\tTentukan kecepatan maksimum (byte per detik)\n" "-n x\tTentukan jumlah koneksi maksimum\n" "-o f\tTentukan keluaran berkas lokal\n" "-S [n]\tCari mirror dan unduh dari n server\n" "-4\tGunakan protokol IPv4\n" "-6\tGunakan protokol IPv6\n" "-H x\tTambahkan string header HTTP\n" "-U x\tSetel agen pengguna\n" "-N\tJangan gunakan server proxy\n" "-k\tJangan memverifikasi sertifikat SSL\n" "-c\tLewati unduhan jika berkas sudah ada\n" "-q\tTinggalkan stdout sendirian\n" "-v\tInformasi status lebih banyak\n" "-a\tIndikator kemajuan alternatif\n" "-h\tInformasi ini\n" "-V\tVersi informasi\n" "\n" "Kunjungi https://github.com/axel-download-accelerator/axel/issues\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Penggunaan: axel [opsi] url1 [url2] [url ...]\n" "\n" "--max-speed=x\t\t-s x\tTentukan kecepatan maksimum (bytes per second)\n" "--num-connections=x\t -n x\tTentukan jumlah koneksi maksimum\n" "--max-redirect=x\t\tTentukan jumlah pengalihan maksimum\n" "--output=f\t\t-o f\tTentukan keluaran berkas lokal\n" "- pencarian[=n]\t\t-S [n]\tCari mirror dan unduh dari n server\n" "--ipv4\t\t\t-4\tGunakan protokol IPv4\n" "--ipv6\t\t\t-6\tGunakan protokol IPv6\n" "--header=x\t\t-H x\tTambahkan string header HTTP\n" "--user-agent=x\t\t-U x\tSetel agen pengguna\n" "--no-proxy\t\t-N\tJangan gunakan server proxy\n" "--insecure\t\t-k\tJangan memverifikasi sertifikat SSL\n" "--no-clobber\t\t-c\tLewati unduhan jika berkas sudah ada\n" "--quiet\t\t\t-q\tTinggalkan stdout sendirian\n" "--verbose\t\t-v\tInformasi lebih lanjut tentang status\n" "- alternatif\t\t-a\tIndikator kemajuan alternatif\n" "--help\t\t\t-h\tInformasi ini\n" "--version\t\t-V\tVersion information\n" "\n" "Kunjungi https://github.com/axel-download-accelerator/axel/issues untuk " "melaporkan kutu\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel versi %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "dan lainnya." #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" "Silakan, lihat berkas CREDITS.\n" "\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "SSL galat: %s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Tidak bisa terhubung ke server %s:%i: %s\n" axel-2.16.1/po/insert-header.sin000066400000000000000000000012401321142621600164100ustar00rootroot00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } axel-2.16.1/po/it.po000066400000000000000000000303131321142621600141220ustar00rootroot00000000000000# Italian translations for axel package. # Copyright (C) 2017 Nicol Dalla Longa # This file is distributed under the same license as the axel package. # Nicol Dalla Longa , 2017. # msgid "" msgstr "" "Project-Id-Version: axel 2.14.1\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2017-09-21 11:41+0800\n" "Last-Translator: Nicol Dalla Longa \n" "Language-Team: Italiano (Italia)\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.3\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer ridimensionato per questa velocità." #: src/axel.c:108 msgid "Invalid URL" msgstr "URL non valido" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Impossibile interpretare l'URL.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "Trovato download incompleto, ignoro l'opzione \"no-clobber\"\n" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "Il file '%s' è già presente; download non effettuato.\n" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Dimensione file: %lld byte" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Dimensione file: %lld byte" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Sto aprendo il file di output %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Server non supportato, sto ricominciando da zero con una connessione." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "%s.st: Errore, file di stato troncato\n" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "Il file di stato utilizza il vecchio formato.\n" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Trovato file di stato: %lld byte scaricati, %lld al termine." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Errore nell'apertura del file locale" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Filesystem/OS scadente.. Raggiro il problema. :-(" #: src/axel.c:346 msgid "Error creating local file" msgstr "Errore nella creazione del file locale" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" "\n" "Riattivando la connessione %d\n" #: src/axel.c:408 msgid "Starting download" msgstr "Inizio download" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "La connessione %i sta scaricando da %s:%i usando l'interfaccia %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "Errore pthread!!!" #: src/axel.c:474 #, c-format msgid "Error while waiting for connection: %s" msgstr "Errore durante l'attesa della connessione: %s" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Connessione %i scaduta" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Errore nella connessione %i! Connessione terminata" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Connessione %i terminata inaspettatamente" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Connessione %i terminata" #: src/axel.c:564 msgid "Write error!" msgstr "Errore di scrittura!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "Errore nell'applicazione del limite di velocità: %s" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "Scaricando %lld-%lld usando la conn. %i\n" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "Errore I/O nella lettura del file di configurazione: %s\n" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "Protocollo sconosciuto %s\n" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Errore in %s linea %i.\n" #: src/conf.c:262 #, fuzzy, c-format msgid "HOME env variable too long\n" msgstr "Nome del file troppo lungo!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Troppi reindirizzamenti.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Errore HTTP sconosciuto.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "Impossibile cambiare la directory in %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "File non trovato.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Più corrispondenze per questo URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Errore nella connessione passiva dati.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Errore nella scrittura del comando %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Connessione terminata.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "Stringa proxy non valida: %s\n" #: src/http.c:215 #, c-format msgid "Connection gone while writing.\n" msgstr "Connessione terminata durante la scrittura.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Impossibile reindirizzare stdout a /dev/null.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "Errore nella lettura dell'URL (Troppo lungo?).\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "Impossibile gestire URL con lunghezza superiore a %d\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Inizializzazione download: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Ricerca...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "File non trovato\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Testando le velocità, potrebbe volerci un po'...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "Test delle velocità fallito\n" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i server utilizzabili trovati, userò questi URL:\n" #: src/text.c:289 msgid "Speed" msgstr "Velocità" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "Nome del file troppo lungo!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Nessun file di stato, non posso riprendere!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "Trovato file di stato, ma dati non scaricati. Riparto da zero.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "Scaricato %s in %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobyte" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabyte" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabyte" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i secondo" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i secondi" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i minuto/i" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i ora/e" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "" "Impossibile impostare barra di progresso alternativo. Disattivazione.\n" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Utilizzo: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecifica la velocità massima (byte al secondo)\n" "-n x\tSpecifa il numero massimo di connessioni\n" "-o f\tSpecifica il file di output locale\n" "-S [n]\tRicerca i mirror e scarica da n server\n" "-4\tConnetti usando IPv4\n" "-6\tConnetti usando IPv6\n" "-H x\tAggiungi header HTTP\n" "-U x\tImposta user agent\n" "-N\tNon usare alcun server proxy\n" "-k\tNon verificare il certificato SSL\n" "-c\tSalta il download se il file esiste già\n" "-q\tNon stampare alcun messaggio su stdout\n" "-v\tStampa maggiori informazioni di stato\n" "-a\tUtilizza barra di progresso alternativa\n" "-h\tStampa queste informazioni\n" "-V\tStampa la versione\n" "\n" "Visita il sito https://github.com/axel-download-accelerator/axel/issues\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Utilizzo: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecifica la velocità massima (byte al secondo)\n" "--num-connections=x\t-n x\tSpecifa il numero massimo di connessioni\n" "--max-redirect=x\t\tSpecifica il numero massimo di reindirizzamenti\n" "--output=f\t\t-o f\tSpecifica il file di output locale\n" "--search[=x]\t\t-S [x]\tRicerca i mirror e scarica da x server\n" "--ipv4\t\t\t-4\tUtilizza il protocollo IPv4\n" "--ipv6\t\t\t-6\tUtilizza il protocollo IPv6\n" "--header=x\t\t-H x\tAggiungi header HTTP\n" "--user-agent=x\t\t-U x\tImposta user agent\n" "--no-proxy\t\t-N\tNon usare alcun server proxy\n" "--insecure\t\t-k\tNon verificare il certificato SSL\n" "--no-clobber\t\t-c\tSalta il download se il file esiste già\n" "--quiet\t\t\t-q\tNon stampare alcun messaggio su stdout\n" "--verbose\t\t-v\tStampa maggiori informazioni di stato\n" "--alternate\t\t-a\tUtilizza barra di progresso alternativa\n" "--help\t\t\t-h\\Stampa queste informazioni\n" "--version\t\t-V\tStampa la versione\n" "\n" "Visita il sito https://github.com/axel-download-accelerator/axel/issues per " "riportare bug\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel versione %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "e altri." #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" "Per favore, vedere il file CREDITS.\n" "\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "Errore SSL: %s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Impossibile connettersi al server %s:%i: %s\n" axel-2.16.1/po/ja.po000066400000000000000000000301701321142621600141010ustar00rootroot00000000000000# Japanese messages for axel # Copyright (C) 2012 Osamu Aoki # This file is distributed under the same license as the axel package. msgid "" msgstr "" "Project-Id-Version: Axel\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2016-08-21 01:20+0800\n" "Last-Translator: Lion Yang \n" "Language-Team: debian-japanese@lists.debian.org\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "このスピードに合わせバッファーをリサイズします。" #: src/axel.c:108 msgid "Invalid URL" msgstr "" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "URL を解析できません。\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "ファイルサイズ: %lld バイト" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "ファイルサイズ: %lld バイト" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "出力ファイル %s をオープンします" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "" "サポートされていないサーバーなので、単一コネクションを使い最初から始めます。" #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "状態ファイル発見: %lld バイトがダウンロード済み、あと %lld バイト。" #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "ローカルファイルをオープンする際にエラー発生しました" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "ファイルシステム/OSがイマイチ。回避します。 :-(" #: src/axel.c:346 #, fuzzy msgid "Error creating local file" msgstr "ローカルファイルをオープンする際にエラー発生しました" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" #: src/axel.c:408 msgid "Starting download" msgstr "ダウンロード開始します" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "接続 %i は %s:%i から、インターフェース %s でダウンロードします" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "pthread のエラー!!!" #: src/axel.c:474 #, fuzzy, c-format msgid "Error while waiting for connection: %s" msgstr "コマンド %s を書く際にエラー\n" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "接続 %i がタイムアウトしました" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "接続 %i でエラー! コネクションをクローズしました" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "接続 %i が不意にクローズされました" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "接続 %i が終了しました" #: src/axel.c:564 msgid "Write error!" msgstr "書き込みエラー!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "%s の %i 行目でエラー。\n" #: src/conf.c:262 #, fuzzy, c-format msgid "HOME env variable too long\n" msgstr "ファイル名が長すぎます!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "リディレクト回数が多すぎます。\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "未知の HTTP エラー。\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "ディレクトリーを %s に変更できません\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "ファイルが見つかりません。\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "この URL には複数のマッチがあります。\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "受動的データー接続の開始でエラー。\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "コマンド %s を書く際にエラー\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "接続が失われています。\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "無効なプロキシストリング: %s\n" #: src/http.c:215 #, fuzzy, c-format msgid "Connection gone while writing.\n" msgstr "接続が失われています。\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "標準出力を /dev/null にリディレクトできません。\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "URL を読もうとした際に(長すぎ?)エラー。\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "%d を超える長さの URL は取り扱えません\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "ダウンロードを初期化: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "サーチ中...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "ファイルが見つかりません\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "スピードをテスト中、時間がかかるかもしれません...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "" "使用可能なサーバーが %i つ見つかりましたので、以下の URL を使用します:\n" #: src/text.c:289 msgid "Speed" msgstr "" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "ファイル名が長すぎます!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "状態ファイルがありませんので、再開できません!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "" "状態ファイルが見つかったけれど、ダウンロードされたデーターが見つかりません。" "最初から始めます。\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "%s を %s にダウンロード。(%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld バイト" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f キロバイト" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f メガバイト" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f ギガバイト" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i 秒" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i 秒" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i 分 %02i 秒" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i 時 %02i 分 %02i 秒" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "使用法: axel [options] url1 [url2] [url...]\n" "\n" "-s x\t最大速度を指定 (毎秒のバイト数)\n" "-n x\t最大接続数を指定\n" "-o f\tローカルの出力ファイルを指定\n" "-S [x]\tミラーを探し x サーバーからダウンロード\n" "-H x\tヘッダーストリングを追加\n" "-U x\tユーザーエージェントを設定\n" "-N\tプロキシサーバーを一切使用しなくする\n" "-k\tSSL 証明書を検証しない\n" "-q\t標準出力を使用しない\n" "-v\t状態情報を増加させる\n" "-a\t代替のプログレスインディケーター\n" "-h\tこの情報\n" "-V\tバージョン情報\n" "\n" "https://github.com/axel-download-accelerator/axel/issues にバグ報告を行なって" "ください\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "使用法: axel [options] url1 [url2] [url...]\n" "\n" "-max-speed=x\t\t-s x\t最大速度を指定 (毎秒のバイト数)\n" "--num-connections=x\t\t-n x\t最大接続数を指定\n" "--output=f\t\t-o f\tローカルの出力ファイルを指定\n" "--search[=x]\t\t-S [x]\tミラーを探し x サーバーからダウンロード\n" "--header=x\t\t-H x\tヘッダーストリングを追加\n" "--user-agent=x\t\t-U x\tユーザーエージェントを設定\n" "--no-proxy\t\t-N\tプロキシサーバーを一切使用しなくする\n" "--insecure\t\t-k\tSSL 証明書を検証しない\n" "--quiet\t\t\t-q\t標準出力を使用しない\n" "--verbose\t\t-v\t状態情報を増加させる\n" "--alternate\t\t-a\t代替のプログレスインディケーター\n" "--help\t\t\t-h\tこの情報\n" "--version\t\t-V\tバージョン情報\n" "\n" "https://github.com/axel-download-accelerator/axel/issues にバグ報告を行なって" "ください\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel バージョン %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "" #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" "CREDITS というファイルを見てみましょう\n" "\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "SSL エラー: %s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "サーバー %s:%i に接続できません: %s\n" axel-2.16.1/po/nl.po000066400000000000000000000241501321142621600141210ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Axel\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2001-11-14 15:22+0200\n" "Last-Translator: Wilmer van der Gaast \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer verkleind voor deze snelheid." #: src/axel.c:108 msgid "Invalid URL" msgstr "" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Kan URL niet verwerken.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Bestandsgrootte: %lld bytes" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Bestandsgrootte: %lld bytes" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Openen uitvoerbestand %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Server niet ondersteund, opnieuw beginnen met 1 verbinding." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr ".st bestand gevonden: %lld bytes gedownload, %lld te gaan." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Fout bij openen lokaal bestand" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Niet-fatale fout in OS/bestandssysteem, omheen werken.." #: src/axel.c:346 #, fuzzy msgid "Error creating local file" msgstr "Fout bij openen lokaal bestand" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" #: src/axel.c:408 msgid "Starting download" msgstr "Begin download" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Verbinding %i gebruikt server %s:%i via interface %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "pthread fout!!!" #: src/axel.c:474 #, fuzzy, c-format msgid "Error while waiting for connection: %s" msgstr "Fout bij het schrijven van commando %s\n" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Time-out op verbinding %i" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Fout op verbinding %i! Verbinding gesloten" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Verbinding %i onverwachts gesloten" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Verbinding %i klaar" #: src/axel.c:564 msgid "Write error!" msgstr "Schrijffout!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Fout in %s regel %i.\n" #: src/conf.c:262 #, c-format msgid "HOME env variable too long\n" msgstr "" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Te veel redirects.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Onbekende HTTP fout.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Bestand niet gevonden.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Meerdere bestanden passen bij deze URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Fout bij het openen van een data verbinding.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Fout bij het schrijven van commando %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Verbinding gesloten.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "Ongeldige proxy string: %s\n" #: src/http.c:215 #, fuzzy, c-format msgid "Connection gone while writing.\n" msgstr "Verbinding gesloten.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Fout bij het afsluiten van stdout.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Begin download: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Zoeken...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Bestand niet gevonden\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Snelheden testen, dit kan even duren...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i bruikbare servers gevonden, de volgende worden gebruikt:\n" #: src/text.c:289 msgid "Speed" msgstr "" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Geen .st bestand, kan niet resumen!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr ".st bestand gevonden maar geen uitvoerbestand. Opnieuw beginnen.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "%s gedownload in %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobytes" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabytes" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabytes" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i seconde" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i seconden" #: src/text.c:519 #, fuzzy, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i seconden" #: src/text.c:521 #, fuzzy, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i seconden" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Gebruik: axel [opties] url1 [url2] [url...]\n" "\n" "-s x\tMaximale snelheid (bytes per seconde)\n" "-n x\tMaximale aantal verbindingen\n" "-o f\tLokaal uitvoerbestand\n" "-S [x]\tMirrors opzoeken en x mirrors gebruiken\n" "-N\tGeen proxy server gebruiken\n" "-q\tGeen uitvoer naar stdout\n" "-v\tMeer status informatie\n" "-a\tAlternatieve voortgangs indicator\n" "-h\tDeze informatie\n" "-V\tVersie informatie\n" "\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Gebruik: axel [opties] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tMaximale snelheid (bytes per seconde)\n" "--num-connections=x\t-n x\tMaximale aantal verbindingen\n" "--output=f\t\t-o f\tLokaal uitvoerbestand\n" "--search[=x]\t\t-S [x]\tMirrors opzoeken en x mirrors gebruiken\n" "--no-proxy\t\t-N\tGeen proxy server gebruiken\n" "--quiet\t\t\t-q\tGeen uitvoer naar stdout\n" "--verbose\t\t-v\tMeer status informatie\n" "--alternate\t\t-a\tAlternatieve voortgangs indicator\n" "--help\t\t\t-h\tDeze informatie\n" "--version\t\t-V\tVersie informatie\n" "\n" #: src/text.c:701 #, fuzzy, c-format msgid "Axel version %s (%s)\n" msgstr "Axel versie %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "" #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Kan niet verbinden met server %s:%i %s\n" axel-2.16.1/po/pt_BR.po000066400000000000000000000307201321142621600145160ustar00rootroot00000000000000# Portuguese translations for axel package. # Copyright (C) 2016-2017 Joao Eriberto Mota Filho # Copyright 2017 Ismael Luceno # This file is distributed under the same license as the axel package. # Eriberto Mota , 2016-2017. # Ismael Luceno , 2017. # msgid "" msgstr "" "Project-Id-Version: axel 2.16\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2017-11-24 22:43-0300\n" "Last-Translator: Joao Eriberto Mota Filho \n" "Language-Team: Brazilian Portuguese\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.11\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Buffer redimensionado para esta velocidade." #: src/axel.c:108 msgid "Invalid URL" msgstr "URL inválida" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Não posso analisar esta URL.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "Encontrado um download incompleto, ignorando opção no-clobber\n" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "Arquivo '%s' já existe; ignorando novo download do mesmo.\n" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Tamanho do arquivo: %lld bytes" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Tamanho do arquivo: %lld bytes" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Abrindo o arquivo de saída %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Servidor não suportado. Iniciando do zero com apenas uma conexão." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "%s.st: Erro, estado do arquivo alterado\n" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "Número incorrecto de conexões armazenado no arquivo de estado\n" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "Estado do arquivo foi alterado.\n" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Situação do arquivo: %lld bytes baixados, %lld restantes." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Erro ao abrir o arquivo local" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "Filesystem/SO ruim... Trabalhando em torno disso. :-(" #: src/axel.c:346 msgid "Error creating local file" msgstr "Erro ao criar o arquivo local" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" "\n" "Reativar conexão %d\n" #: src/axel.c:408 msgid "Starting download" msgstr "Iniciando o download" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Conexão %i baixando a partir de %s:%i, usando interface %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "erro de pthread!!!" #: src/axel.c:474 #, c-format msgid "Error while waiting for connection: %s" msgstr "Erro ao esperar por conexão: %s" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Tempo esgotado para a conexão %i" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Erro na conexão %i! Conexão fechada." #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Conexão %i fechada inesperadamente" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Conexão %i finalizada" #: src/axel.c:564 msgid "Write error!" msgstr "Erro de escrita!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "Erro ao aplicar regulagem de velocidade: %s" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "Baixando %lld-%lld usando conexão %i\n" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "Erro de I/O ao ler arquivo de configuração: %s\n" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "Protocolo desconhecido %s\n" #: src/conf.c:186 #, fuzzy, c-format msgid "Requested too may connections, max is %i\n" msgstr "Demasiadas conexões solicitadas, o máximo é %i\n" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Erro em %s linha %i.\n" #: src/conf.c:262 #, fuzzy, c-format msgid "HOME env variable too long\n" msgstr "Nome de arquivo muito longo!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Redirecionamentos excessivos.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Erro HTTP desconhecido.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "Não consigo ir para o diretório %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Arquivo não encontrado.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Muitas possibilidades (matches) para esta URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Erro ao abrir conexão passiva.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Erro ao escrever comando %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Conexão perdida.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "String de proxy inválida: %s\n" #: src/http.c:215 #, c-format msgid "Connection gone while writing.\n" msgstr "Conexão perdida enquanto escrevia no disco.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Não posso redirecionar a saída padrão para /dev/null.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "Erro ao tentar ler a URL (muito longa?).\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "Não posso manipular URLs com tamanho superior a %d\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Inicializando download: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Procurando...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Arquivo não encontrado\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Testando velocidades. Isso pode demorar um pouco...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "Falha no teste de velocidade\n" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "%i servidores possíveis encontrados. Serão utilizadas essas URLs:\n" #: src/text.c:289 msgid "Speed" msgstr "Velocidade" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "Nome de arquivo muito longo!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Estado do arquivo não encontrado. Não posso reiniciar!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "" "Estado do arquivo encontrado mas não há dados de download. Iniciando do " "zero.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "Baixados %s em %s. (%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld byte(s)" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f Kilobyte(s)" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f Megabyte(s)" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f Gigabyte(s)" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i segundo" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i segundos" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i minuto(s)" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i hora(s)" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "Não posso configurar uma saída alternativa. Desativando.\n" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Uso: axel [opções] url1 [url2] [url...]\n" "\n" "-s x\tEspecifica a velocidade máxima (bytes por segundo)\n" "-n x\tEspecifica o número máximo de conexões\n" "-o f\tEspecifica o arquivo de saída\n" "-S [x]\tProcura por mirrors e baixa a partir de x servidores\n" "-4\tConectar usando IPv4\n" "-6\tConectar usando IPv6\n" "-H x\tAdiciona uma entrada adicional de cabeçalho\n" "-U x\tConfigura um user agent\n" "-N\tNão utiliza qualquer servidor proxy\n" "-k\tNão verifica o certificado SSL\n" "-c\tIgnora download se o arquivo já existir\n" "-q\tEvita mensagens na tela\n" "-v\tAumenta o número de informações\n" "-a\tSubstitui o indicador de progresso\n" "-h\tMostra esta tela de ajuda\n" "-V\tInformação sobre a versão\n" "\n" "Visite https://github.com/axel-download-accelerator/axel/issues\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Uso: axel [opções] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tEspecifica a velocidade máxima (bytes por segundo)\n" "--num-connections=x\t-n x\tEspecifica o número máximo de conexões\n" "--max-redirect=x\t\tEspecifica a quantidade máxima de redirecionamentos\n" "--output=f\t\t-o f\tEspecifica o arquivo de saída\n" "--search[=x]\t\t-S [x]\tProcura por mirrors e baixa a partir de x " "servidores\n" "--ipv4\t\t\t-4\tUsar o protocolo IPv4\n" "--ipv6\t\t\t-6\tUsar o protocolo IPv6\n" "--header=x\t\t-H x\tAdiciona uma entrada adicional de cabeçalho\n" "--user-agent=x\t\t-U x\tConfigura um user agent\n" "--no-proxy\t\t-N\tNão utiliza qualquer servidor proxy\n" "--insecure\t\t-k\tNão verifica o certificado SSL\n" "--no-clobber\t\t-c\tIgnora o download se o arquivo já existir\n" "--quiet\t\t\t-q\tEvita mensagens na tela\n" "--verbose\t\t-v\tAumenta o número de informações\n" "--alternate\t\t-a\tSubstitui o indicador de progresso\n" "--help\t\t\t-h\tMostra esta tela de ajuda\n" "--version\t\t-V\tInformação sobre a versão\n" "\n" "Visite https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" #: src/text.c:701 #, fuzzy, c-format msgid "Axel version %s (%s)\n" msgstr "Axel versão %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "e outros." #: src/text.c:710 #, fuzzy msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "Por favor, veja o arquivo CREDITS.\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "Erro SSL: %s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Não consigo conectar o servidor %s:%i %s\n" axel-2.16.1/po/quot.sed000066400000000000000000000002311321142621600146270ustar00rootroot00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g axel-2.16.1/po/remove-potcdate.sin000066400000000000000000000006601321142621600167610ustar00rootroot00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } axel-2.16.1/po/ru.po000066400000000000000000000300101321142621600141260ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Axel\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2009-04-02 00:05+0200\n" "Last-Translator: newhren \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "Размер буфера изменен для этой скорости." #: src/axel.c:108 msgid "Invalid URL" msgstr "" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "Невозможно обработать URL.\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "Размер файла: %lld байта(ов)" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "Размер файла: %lld байта(ов)" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "Открывается выходной файл %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "Сервер не поддерживается, начинаем заново с одним соединением." #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "Найден файл состояния: %lld байта(ов) скачано, %lld осталось." #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "Ошибка при открытии локального файла" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "" "Ошибки в файловой системе или операционной системе.. Пробуем исправить :-(" #: src/axel.c:346 #, fuzzy msgid "Error creating local file" msgstr "Ошибка при открытии локального файла" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" #: src/axel.c:408 msgid "Starting download" msgstr "Начинаем скачивание" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "Соединение %i скачивает с %s:%i через интерфейс %s" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "ошибка pthread!!!" #: src/axel.c:474 #, fuzzy, c-format msgid "Error while waiting for connection: %s" msgstr "Ошибка записи команды %s\n" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "Время соединения %i вышло" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "Ошибка в соединении %i! Соединение закрыто" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "Соединение %i неожиданно закрылось" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "Соединение %i закончилось" #: src/axel.c:564 msgid "Write error!" msgstr "Ошибка записи!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "Ошибка в файле %s линия %i.\n" #: src/conf.c:262 #, c-format msgid "HOME env variable too long\n" msgstr "" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "Слишком много перенаправлений.\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "Неизвестная ошибка HTTP.\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "Невозможно сменить директорию на %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "Файл не найден.\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "Несколько совпадений для этого URL.\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "Ошибка открытия пассивного соединения.\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "Ошибка записи команды %s\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "Соединение пропало.\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "Некорректная стока прокси: %s\n" #: src/http.c:215 #, fuzzy, c-format msgid "Connection gone while writing.\n" msgstr "Соединение пропало.\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "Невозможно перенаправить stdout в /dev/null.\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "URLs длинной больше %d не поддерживаются\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "Начинаю скачивание: %s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "Ищем...\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "Файл не найден\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "Пробуем скорости, это может занять некоторое время...\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "Найдено %i полезных серверов, будут использованы следующие URLs:\n" #: src/text.c:289 msgid "Speed" msgstr "" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "Файл состояния не найден, возобновление невозможно!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "" "Файл состояния найден, но предварительно скачанные данные отсутствуют. " "Начинаем заново.\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "%s скачано за %s. (%.2f КБ/с)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld байт" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f килобайта(ов)" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f мегабайта(ов)" #: src/text.c:504 #, fuzzy, c-format msgid "%.1f Gigabyte" msgstr "%.1f мегабайта(ов)" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i секунда" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i секунд(ы)" #: src/text.c:519 #, fuzzy, c-format msgid "%i:%02i minute(s)" msgstr "%i:%02i секунд(ы)" #: src/text.c:521 #, fuzzy, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i:%02i:%02i секунд(ы)" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "Использование: axel [опции] url1 [url2] [url...]\n" "\n" "-s x\tМаксимальная скорость (байт в секунду)\n" "-n x\tМаксимальное число соединений\n" "-o f\tЛокальный выходной файл\n" "-S [x]\tПоискать зеркала и скачивать с x серверов\n" "-N\tНе использовать прокси-сервера\n" "-q\tНичего не выводить на stdout\n" "-v\tБольше информации о статусе\n" "-a\tАльтернативный индикатор прогресса\n" "-h\tЭта информация\n" "-V\tИнформация о версии\n" "\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "Использование: axel [опции] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tМаксимальная скорость (байт в секунду)\n" "--num-connections=x\t-n x\tМаксимальное число соединений\n" "--output=f\t\t-o f\tЛокальный выходной файл\n" "--search[=x]\t\t-S [x]\tПоискать зеркала и скачивать с x серверов\n" "--no-proxy\t\t-N\tНе использовать прокси-сервера\n" "--quiet\t\t\t-q\tНичего не выводить на stdout\n" "--verbose\t\t-v\tБольше информации о статусе\n" "--alternate\t\t-a\tАльтернативный индикатор прогресса\n" "--help\t\t\t-h\tЭта информация\n" "--version\t\t-V\tИнформация о версии\n" "\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel, версия %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "" #: src/text.c:710 msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "Невозможно подсоединиться к серверу %s:%i %s\n" axel-2.16.1/po/zh_CN.po000066400000000000000000000261331321142621600145140ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Axel\n" "Report-Msgid-Bugs-To: https://github.com/axel-download-accelerator/axel/" "issues\n" "PO-Revision-Date: 2016-08-10 10:52+0800\n" "Last-Translator: Jeff Bai \n" "Language-Team: Simplified Chinese \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Revision: Li Jin \n" "X-Generator: Poedit 1.8.8\n" #: src/axel.c:90 msgid "Buffer resized for this speed." msgstr "为这个速率调整缓冲区大小。" #: src/axel.c:108 msgid "Invalid URL" msgstr "不可用的URL。" #: src/axel.c:136 msgid "Could not parse URL.\n" msgstr "无法解析 URL。\n" #: src/axel.c:158 #, c-format msgid "Incomplete download found, ignoring no-clobber option\n" msgstr "发现不完整的下载,忽略no-clobber选项\n" #: src/axel.c:161 #, c-format msgid "File '%s' already there; not retrieving.\n" msgstr "文件'%s' 已存在\n" #: src/axel.c:192 #, c-format msgid "File size: %lld bytes" msgstr "文件大小:%lld 字节" #: src/axel.c:195 #, fuzzy msgid "File size: unavailable" msgstr "文件大小:%lld 字节" #: src/axel.c:224 #, c-format msgid "Opening output file %s" msgstr "正在打开输出文件 %s" #: src/axel.c:232 msgid "Server unsupported, starting from scratch with one connection." msgstr "服务器不支持,使用单个连接从头下载。" #: src/axel.c:249 #, c-format msgid "%s.st: Error, truncated state file\n" msgstr "%s.st: 错误,已清空的状态文件\n" #: src/axel.c:257 #, c-format msgid "Bogus number of connections stored in state file\n" msgstr "" #: src/axel.c:269 #, c-format msgid "State file has old format.\n" msgstr "状态文件版本陈旧\n" #: src/axel.c:302 #, c-format msgid "State file found: %lld bytes downloaded, %lld to go." msgstr "找到状态文件:已下载 %lld 字节,剩余 %lld 字节。" #: src/axel.c:308 src/axel.c:319 msgid "Error opening local file" msgstr "无法打开本地文件" #: src/axel.c:332 msgid "Crappy filesystem/OS.. Working around. :-(" msgstr "文件系统/操作系统不讨喜…… 正在寻求解决方法(不开心)。" #: src/axel.c:346 msgid "Error creating local file" msgstr "无法创建本地文件" #: src/axel.c:378 #, c-format msgid "" "\n" "Reactivate connection %d\n" msgstr "" "\n" "重新激活链接:%d \n" #: src/axel.c:408 msgid "Starting download" msgstr "正在开始下载" #: src/axel.c:419 src/axel.c:602 #, c-format msgid "Connection %i downloading from %s:%i using interface %s" msgstr "连接 %1$i 正通过接口 %4$s 从 %2$s:%3$i 下载" #: src/axel.c:429 src/axel.c:614 msgid "pthread error!!!" msgstr "pthread 出错啦!!!" #: src/axel.c:474 #, fuzzy, c-format msgid "Error while waiting for connection: %s" msgstr "写命令 %s 出错" #: src/axel.c:506 #, c-format msgid "Connection %i timed out" msgstr "连接 %i 超时" #: src/axel.c:519 #, c-format msgid "Error on connection %i! Connection closed" msgstr "连接 %i 出错!连接中断" #: src/axel.c:533 #, c-format msgid "Connection %i unexpectedly closed" msgstr "连接 %i 被异常中断" #: src/axel.c:537 src/axel.c:554 #, c-format msgid "Connection %i finished" msgstr "连接 %i 完成下载" #: src/axel.c:564 msgid "Write error!" msgstr "写错误!" #: src/axel.c:664 #, c-format msgid "Error while enforcing throttling: %s" msgstr "强制调整流量时出错:%s" #: src/axel.c:840 src/axel.c:851 #, c-format msgid "Downloading %lld-%lld using conn. %i\n" msgstr "使用链接下载 %lld-%lld [%i]\n" #: src/conf.c:65 #, c-format msgid "I/O error while reading config file: %s\n" msgstr "配置文件I/O错误:%s\n" #: src/conf.c:80 #, c-format msgid "Unknown protocol %s\n" msgstr "未知的协议 %s\n" #: src/conf.c:186 #, c-format msgid "Requested too may connections, max is %i\n" msgstr "" #: src/conf.c:197 #, c-format msgid "Error in %s line %i.\n" msgstr "%s 中第 %i 行出错。\n" #: src/conf.c:262 #, fuzzy, c-format msgid "HOME env variable too long\n" msgstr "文件名太长!\n" #: src/conn.c:369 src/ftp.c:131 #, c-format msgid "Too many redirects.\n" msgstr "太多重定向。\n" #: src/conn.c:399 #, c-format msgid "Unknown HTTP error.\n" msgstr "未知 HTTP 错误。\n" #: src/ftp.c:102 #, c-format msgid "Can't change directory to %s\n" msgstr "无法变更目录到 %s\n" #: src/ftp.c:125 src/ftp.c:186 #, c-format msgid "File not found.\n" msgstr "找不到文件。\n" #: src/ftp.c:189 #, c-format msgid "Multiple matches for this URL.\n" msgstr "此 URL 有多个匹配。\n" #: src/ftp.c:259 #, c-format msgid "Error opening passive data connection.\n" msgstr "无法打开被动数据连接。\n" #: src/ftp.c:293 #, c-format msgid "Error writing command %s\n" msgstr "写命令 %s 出错\n" #: src/ftp.c:318 src/http.c:227 #, c-format msgid "Connection gone.\n" msgstr "连接丢失。\n" #: src/http.c:105 #, c-format msgid "Invalid proxy string: %s\n" msgstr "代理字符串无效:%s\n" #: src/http.c:215 #, c-format msgid "Connection gone while writing.\n" msgstr "写入时连接丢失。\n" #: src/text.c:204 #, c-format msgid "Can't redirect stdout to /dev/null.\n" msgstr "不能将 stdout 重定向到 /dev/null。\n" #: src/text.c:247 #, c-format msgid "Error when trying to read URL (Too long?).\n" msgstr "尝试读取 URL 时出错(URL 太长?)。\n" #: src/text.c:255 #, c-format msgid "Can't handle URLs of length over %d\n" msgstr "不能处理长度超过 %d 的 URL\n" #: src/text.c:261 #, c-format msgid "Initializing download: %s\n" msgstr "正在初始化下载:%s\n" #: src/text.c:270 #, c-format msgid "Doing search...\n" msgstr "正在搜索…\n" #: src/text.c:273 #, c-format msgid "File not found\n" msgstr "找不到文件\n" #: src/text.c:277 #, c-format msgid "Testing speeds, this can take a while...\n" msgstr "正在测试速度,可能需要一些时间…\n" #: src/text.c:280 #, c-format msgid "Speed testing failed\n" msgstr "速度测试失败\n" #: src/text.c:286 #, c-format msgid "%i usable servers found, will use these URLs:\n" msgstr "找到 %i 个可用的服务器,将使用这些 URL:\n" #: src/text.c:289 msgid "Speed" msgstr "速度" #: src/text.c:338 #, c-format msgid "Filename too long!\n" msgstr "文件名太长!\n" #: src/text.c:350 #, c-format msgid "No state file, cannot resume!\n" msgstr "没有状态文件,无法继续下载!\n" #: src/text.c:354 #, c-format msgid "State file found, but no downloaded data. Starting from scratch.\n" msgstr "找到状态文件,但未有下载数据。重新开始下载。\n" #: src/text.c:469 #, c-format msgid "" "\n" "Downloaded %s in %s. (%.2f KB/s)\n" msgstr "" "\n" "已下载 %s,用时 %s。(%.2f KB/s)\n" #: src/text.c:497 #, c-format msgid "%lld byte" msgstr "%lld 字节" #: src/text.c:499 #, c-format msgid "%.1f Kilobyte" msgstr "%.1f 千字节" #: src/text.c:501 #, c-format msgid "%.1f Megabyte" msgstr "%.1f 兆字节" #: src/text.c:504 #, c-format msgid "%.1f Gigabyte" msgstr "%.1f 吉字节" #: src/text.c:515 #, c-format msgid "%i second" msgstr "%i 秒" #: src/text.c:517 #, c-format msgid "%i seconds" msgstr "%i 秒" #: src/text.c:519 #, c-format msgid "%i:%02i minute(s)" msgstr "%i 分 %02i 秒" #: src/text.c:521 #, c-format msgid "%i:%02i:%02i hour(s)" msgstr "%i 时 %02i 分 %02i 秒" #: src/text.c:587 #, c-format msgid "Can't setup alternate output. Deactivating.\n" msgstr "无法设置备用输出,挂起.\n" #: src/text.c:651 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n" msgstr "" "用法: axel [选项] 地址 1 [地址 2] [地址…]\n" "\n" "-s x\t指定最大速率(字节/秒)\n" "-n x\t指定最大连接数\n" "-o f\t指定本地输出文件\n" "-S [x]\t搜索镜像并从 x 个服务器下载\n" "-H x\t添加报头字符串\n" "-U x\t设置用户代理\n" "-N\t不使用任何代理服务器\n" "-k\t不校验 SSL 证书\n" "-q\t使用输出简单信息模式\n" "-v\t更多状态信息\n" "-a\t另一种进度指示器\n" "-h\t帮助信息\n" "-V\t版本信息\n" "\n" "请前往 https://github.com/axel-download-accelerator/axel/issues 报告问题\n" #: src/text.c:673 #, fuzzy, c-format msgid "" "Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report " "bugs\n" msgstr "" "用法: axel [选项] 地址 1 [地址 2] [地址…]\n" "\n" "--max-speed=x\t\t-s x\t指定最大速率(字节/秒)\n" "--num-connections=x\t-n x\t指定最大连接数\n" "--output=f\t\t-o f\t指定本地输出文件\n" "--search[=x]\t\t-S [x]\t搜索镜像并从 X 服务器下载\n" "--header=x\t\t-H x\t添加报头字符串\n" "--user-agent=x\t\t-U x\t设置用户代理\n" "--no-proxy\t\t-N\t不使用任何代理服务器\n" "--insecure\t\t-k\t不校验 SSL 证书\n" "--quiet\t\t\t-q\t使用输出简单信息模式\n" "--verbose\t\t-v\t更多状态信息\n" "--alternate\t\t-a\t另一种进度指示器\n" "--help\t\t\t-h\t帮助信息\n" "--version\t\t-V\t版本信息\n" "\n" "请前往 https://github.com/axel-download-accelerator/axel/issues 报告问题\n" #: src/text.c:701 #, c-format msgid "Axel version %s (%s)\n" msgstr "Axel 版本 %s (%s)\n" #: src/text.c:709 msgid "and others." msgstr "及其他人。" #: src/text.c:710 #, fuzzy msgid "" "Please, see the CREDITS file.\n" "\n" msgstr "" "请阅读 CREDITS 文件。\n" "\n" #: src/ssl.c:92 #, c-format msgid "SSL error: %s\n" msgstr "SSL 错误:%s\n" #: src/tcp.c:54 #, c-format msgid "Unable to connect to server %s:%i: %s\n" msgstr "无法连接到服务器 %s:%i:%s\n" axel-2.16.1/scripts/000077500000000000000000000000001321142621600142175ustar00rootroot00000000000000axel-2.16.1/scripts/mkchangelog000077500000000000000000000011701321142621600164230ustar00rootroot00000000000000#!/bin/sh # This script creates a template to update the ChangeLog. get_ver() { git describe --abbrev=0 --tags --match 'v*' "$@" } if [ "$1" = -h ]; then cat >/dev/stderr <<-! Usage: $0 [commit] ! exit 0 fi set -- "$@" HEAD prev="$(get_ver "$1")" git shortlog --format='* %s' -w80,0 "$prev".."$1" | awk ' !/^\*/ && /:$/ { $NF="" author = $0 next } !/^$/ { print author, ">", $0 } ' | sort | awk ' BEGIN { getline < "VERSION" sub(/T.*/, "", $2) printf "Version: %s, %s\n", $1, $2 FS=" > " } END { print "\n\n" } author != $1 { print "\n [", $1, "]\n" author = $1 } { sub(/^[^>]*> /, "") print } ' axel-2.16.1/scripts/mknextver000077500000000000000000000002101321142621600161610ustar00rootroot00000000000000#!/bin/sh if [ $# = 0 ]; then set -- "$(awk -F'[^0-9]' '{print $1"."$2+1}' VERSION)" fi echo "${1#v} $(date -u '+%Y-%m-%dT%H:%M:%SZ')" axel-2.16.1/scripts/pocheck.awk000066400000000000000000000002251321142621600163360ustar00rootroot00000000000000END { exit broken } BEGIN { OFS=":" } /^$/ || /^"Content-Type:/ { if (!/charset=(UTF|utf)-8/) { print FILENAME, FNR, $0 ++broken } nextfile } axel-2.16.1/src/000077500000000000000000000000001321142621600133175ustar00rootroot00000000000000axel-2.16.1/src/Makefile.am000066400000000000000000000005151321142621600153540ustar00rootroot00000000000000bin_PROGRAMS = axel axel_SOURCES = \ axel.c \ axel.h \ sleep.h \ conf.c \ conf.h \ conn.c \ conn.h \ ftp.c \ ftp.h \ http.c \ http.h \ search.c \ search.h \ ssl.c \ ssl.h \ tcp.c \ tcp.h \ text.c axel_LDADD = $(SSL_LIBS) AM_CPPFLAGS = -DLOCALEDIR=\""$(localedir)"\" AM_CPPFLAGS += -D_BSD_SOURCE -D_DEFAULT_SOURCE axel-2.16.1/src/axel.c000066400000000000000000000554151321142621600144260ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2007-2009 Y Giridhar Appaji Nag Copyright 2008-2009 Philipp Hagemeister Copyright 2015-2017 Joao Eriberto Mota Filho Copyright 2016 Denis Denisov Copyright 2016 Ivan Gimenez Copyright 2016 Sjjad Hashemian Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno Copyright 2017 nemermollon This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Main control */ #include "axel.h" #include "assert.h" #include "sleep.h" /* Axel */ static void save_state(axel_t *axel); static void *setup_thread(void *); static void axel_message(axel_t *axel, char *format, ...); static void axel_divide(axel_t *axel); static char *buffer = NULL; /* Create a new axel_t structure */ axel_t * axel_new(conf_t *conf, int count, const void *url) { const search_t *res; axel_t *axel; int status; long delay; url_t *u; char *s; int i; axel = malloc(sizeof(axel_t)); if (!axel) goto nomem; memset(axel, 0, sizeof(axel_t)); axel->conf = conf; axel->conn = malloc(sizeof(conn_t) * axel->conf->num_connections); if (!axel->conn) goto nomem; memset(axel->conn, 0, sizeof(conn_t) * axel->conf->num_connections); for (i = 0; i < axel->conf->num_connections; i++) pthread_mutex_init(&axel->conn[i].lock, NULL); if (axel->conf->max_speed > 0) { if ((float)axel->conf->max_speed / axel->conf->buffer_size < 0.5) { if (axel->conf->verbose >= 2) axel_message(axel, _("Buffer resized for this speed.")); axel->conf->buffer_size = axel->conf->max_speed; } delay = (int)((float)1000000000 / axel->conf->max_speed * axel->conf->buffer_size * axel->conf->num_connections); axel->delay_time.tv_sec = delay / 1000000000; axel->delay_time.tv_nsec = delay % 1000000000; } if (buffer == NULL) { /* reserve 4 additional bytes for file extension ".st" */ buffer = malloc(max(MAX_STRING + 4, axel->conf->buffer_size)); if (!buffer) goto nomem; } if (!url) { axel_message(axel, _("Invalid URL")); axel_close(axel); return NULL; } if (count == 0) { axel->url = malloc(sizeof(url_t)); if (!axel->url) goto nomem; axel->url->next = axel->url; strncpy(axel->url->text, url, sizeof(axel->url->text) - 1); } else { res = url; u = malloc(sizeof(url_t) * count); if (!u) goto nomem; axel->url = u; for (i = 0; i < count; i++) { strncpy(u[i].text, res[i].url, sizeof(u[i].text) - 1); u[i].next = &u[i + 1]; } u[count - 1].next = u; } axel->conn[0].conf = axel->conf; if (!conn_set(&axel->conn[0], axel->url->text)) { axel_message(axel, _("Could not parse URL.\n")); axel->ready = -1; return axel; } axel->conn[0].local_if = axel->conf->interfaces->text; axel->conf->interfaces = axel->conf->interfaces->next; strncpy(axel->filename, axel->conn[0].file, sizeof(axel->filename) - 1); http_decode(axel->filename); if (*axel->filename == 0) /* Index page == no fn */ strncpy(axel->filename, axel->conf->default_filename, sizeof(axel->filename) - 1); if ((s = strchr(axel->filename, '?')) != NULL && axel->conf->strip_cgi_parameters) *s = 0; /* Get rid of CGI parameters */ if (axel->conf->no_clobber && access(axel->filename, F_OK) == 0) { char stfile[MAX_STRING + 3]; sprintf(stfile, "%s.st", axel->filename); if (access(stfile, F_OK) == 0) { printf(_("Incomplete download found, ignoring " "no-clobber option\n")); } else { printf(_("File '%s' already there; not retrieving.\n"), axel->filename); axel->ready = -1; return axel; } } do { if (!conn_init(&axel->conn[0])) { axel_message(axel, axel->conn[0].message); axel->ready = -1; return axel; } /* This does more than just checking the file size, it all * depends on the protocol used. */ status = conn_info(&axel->conn[0]); if (!status) { axel_message(axel, axel->conn[0].message); axel->ready = -1; return axel; } } while (status == -1); /* re-init in case of protocol change. This can * happen only once because the FTP protocol * can't redirect back to HTTP */ s = conn_url(axel->conn); strncpy(axel->url->text, s, sizeof(axel->url->text) - 1); axel->size = axel->conn[0].size; if (axel->conf->verbose > 0) { if (axel->size != LLONG_MAX) { axel_message(axel, _("File size: %lld bytes"), axel->size); } else { axel_message(axel, _("File size: unavailable")); } } /* Wildcards in URL --> Get complete filename */ if (strchr(axel->filename, '*') || strchr(axel->filename, '?')) strncpy(axel->filename, axel->conn[0].file, sizeof(axel->filename) - 1); if (*axel->conn[0].output_filename != 0) { strncpy(axel->filename, axel->conn[0].output_filename, sizeof(axel->filename) - 1); } return axel; nomem: axel_close(axel); printf("%s\n", strerror(errno)); return NULL; } /* Open a local file to store the downloaded data */ int axel_open(axel_t *axel) { int i, fd; ssize_t nread; if (axel->conf->verbose > 0) axel_message(axel, _("Opening output file %s"), axel->filename); snprintf(buffer, MAX_STRING + 4, "%s.st", axel->filename); axel->outfd = -1; /* Check whether server knows about RESTart and switch back to single connection download if necessary */ if (!axel->conn[0].supported) { axel_message(axel, _("Server unsupported, " "starting from scratch with one connection.")); axel->conf->num_connections = 1; void *new_conn = realloc(axel->conn, sizeof(conn_t)); if (!new_conn) return 0; axel->conn = new_conn; axel_divide(axel); } else if ((fd = open(buffer, O_RDONLY)) != -1) { int old_format = 0; off_t stsize = lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); nread = read(fd, &axel->conf->num_connections, sizeof(axel->conf->num_connections)); if (nread != sizeof(axel->conf->num_connections)) { printf(_("%s.st: Error, truncated state file\n"), axel->filename); close(fd); return 0; } if (axel->conf->num_connections < 1) { fprintf(stderr, _("Bogus number of connections stored in state file\n")); close(fd); return 0; } if (stsize < (sizeof(axel->conf->num_connections) + sizeof(axel->bytes_done) + 2 * axel->conf->num_connections * sizeof(axel->conn[0].currentbyte))) { /* FIXME this might be wrong, the file may have been * truncated, we need another way to check. */ #ifdef DEBUG printf(_("State file has old format.\n")); #endif old_format = 1; } void *new_conn = realloc(axel->conn, sizeof(conn_t) * axel->conf->num_connections); if (!new_conn) { close(fd); return 0; } axel->conn = new_conn; memset(axel->conn + 1, 0, sizeof(conn_t) * (axel->conf->num_connections - 1)); if (old_format) axel_divide(axel); nread = read(fd, &axel->bytes_done, sizeof(axel->bytes_done)); assert(nread == sizeof(axel->bytes_done)); for (i = 0; i < axel->conf->num_connections; i++) { nread = read(fd, &axel->conn[i].currentbyte, sizeof(axel->conn[i].currentbyte)); assert(nread == sizeof(axel->conn[i].currentbyte)); if (!old_format) { nread = read(fd, &axel->conn[i].lastbyte, sizeof(axel->conn[i].lastbyte)); assert(nread == sizeof(axel->conn[i].lastbyte)); } } axel_message(axel, _("State file found: %lld bytes downloaded, %lld to go."), axel->bytes_done, axel->size - axel->bytes_done); close(fd); if ((axel->outfd = open(axel->filename, O_WRONLY, 0666)) == -1) { axel_message(axel, _("Error opening local file")); return 0; } } /* If outfd == -1 we have to start from scrath now */ if (axel->outfd == -1) { axel_divide(axel); if ((axel->outfd = open(axel->filename, O_CREAT | O_WRONLY, 0666)) == -1) { axel_message(axel, _("Error opening local file")); return 0; } /* And check whether the filesystem can handle seeks to past-EOF areas.. Speeds things up. :) AFAIK this should just not happen: */ if (lseek(axel->outfd, axel->size, SEEK_SET) == -1 && axel->conf->num_connections > 1) { /* But if the OS/fs does not allow to seek behind EOF, we have to fill the file with zeroes before starting. Slow.. */ axel_message(axel, _("Crappy filesystem/OS.. Working around. :-(")); lseek(axel->outfd, 0, SEEK_SET); memset(buffer, 0, axel->conf->buffer_size); long long int j = axel->size; while (j > 0) { ssize_t nwrite; if ((nwrite = write(axel->outfd, buffer, min(j, axel->conf->buffer_size))) < 0) { if (errno == EINTR || errno == EAGAIN) continue; axel_message(axel, _("Error creating local file")); return 0; } j -= nwrite; } } } return 1; } void reactivate_connection(axel_t *axel, int thread) { long long int max_remaining = 0; int idx = -1; if (axel->conn[thread].enabled || axel->conn[thread].currentbyte <= axel->conn[thread].lastbyte) return; /* find some more work to do */ for (int j = 0; j < axel->conf->num_connections; j++) { long long int remaining = axel->conn[j].lastbyte - axel->conn[j].currentbyte + 1; if (remaining > max_remaining) { max_remaining = remaining; idx = j; } } /* do not reactivate for less than 100KB */ if (max_remaining >= 100 * 1024 && idx != -1) { #ifdef DEBUG printf(_("\nReactivate connection %d\n"), thread); #endif axel->conn[thread].lastbyte = axel->conn[idx].lastbyte; axel->conn[idx].lastbyte = axel->conn[idx].currentbyte + max_remaining / 2; axel->conn[thread].currentbyte = axel->conn[idx].lastbyte + 1; } } /* Start downloading */ void axel_start(axel_t *axel) { int i; url_t *url_ptr; /* HTTP might've redirected and FTP handles wildcards, so re-scan the URL for every conn */ url_ptr = axel->url; for (i = 0; i < axel->conf->num_connections; i++) { conn_set(&axel->conn[i], url_ptr->text); url_ptr = url_ptr->next; axel->conn[i].local_if = axel->conf->interfaces->text; axel->conf->interfaces = axel->conf->interfaces->next; axel->conn[i].conf = axel->conf; if (i) axel->conn[i].supported = true; } if (axel->conf->verbose > 0) axel_message(axel, _("Starting download")); for (i = 0; i < axel->conf->num_connections; i++) if (axel->conn[i].currentbyte > axel->conn[i].lastbyte) { reactivate_connection(axel, i); } for (i = 0; i < axel->conf->num_connections; i++) if (axel->conn[i].currentbyte <= axel->conn[i].lastbyte) { if (axel->conf->verbose >= 2) { axel_message(axel, _("Connection %i downloading from %s:%i using interface %s"), i, axel->conn[i].host, axel->conn[i].port, axel->conn[i].local_if); } axel->conn[i].state = true; if (pthread_create (axel->conn[i].setup_thread, NULL, setup_thread, &axel->conn[i]) != 0) { axel_message(axel, _("pthread error!!!")); axel->ready = -1; } } /* The real downloading will start now, so let's start counting */ axel->start_time = gettime(); axel->ready = 0; } /* Main 'loop' */ void axel_do(axel_t *axel) { fd_set fds[1]; int hifd, i; long long int remaining, size; struct timeval timeval[1]; url_t *url_ptr; struct timespec delay = {.tv_sec = 0, .tv_nsec = 100000000}; float max_speed_ratio; /* Create statefile if necessary */ if (gettime() > axel->next_state) { save_state(axel); axel->next_state = gettime() + axel->conf->save_state_interval; } /* Wait for data on (one of) the connections */ FD_ZERO(fds); hifd = 0; for (i = 0; i < axel->conf->num_connections; i++) { /* skip connection if setup thread hasn't released the lock yet */ if (!pthread_mutex_trylock(&axel->conn[i].lock)) { if (axel->conn[i].enabled) { FD_SET(axel->conn[i].tcp->fd, fds); hifd = max(hifd, axel->conn[i].tcp->fd); } pthread_mutex_unlock(&axel->conn[i].lock); } } if (hifd == 0) { /* No connections yet. Wait... */ if (axel_sleep(delay) < 0) { axel_message(axel, _("Error while waiting for connection: %s"), strerror(errno)); axel->ready = -1; return; } goto conn_check; } timeval->tv_sec = 0; timeval->tv_usec = 100000; if (select(hifd + 1, fds, NULL, NULL, timeval) == -1) { /* A select() error probably means it was interrupted * by a signal, or that something else's very wrong... */ axel->ready = -1; return; } /* Handle connections which need attention */ for (i = 0; i < axel->conf->num_connections; i++) { /* skip connection if setup thread hasn't released the lock yet */ if (pthread_mutex_trylock(&axel->conn[i].lock)) continue; if (!axel->conn[i].enabled) goto next_conn; if (!FD_ISSET(axel->conn[i].tcp->fd, fds)) { time_t timeout = axel->conn[i].last_transfer + axel->conf->connection_timeout; if (gettime() > timeout) { if (axel->conf->verbose) axel_message(axel, _("Connection %i timed out"), i); conn_disconnect(&axel->conn[i]); } goto next_conn; } axel->conn[i].last_transfer = gettime(); size = tcp_read(axel->conn[i].tcp, buffer, axel->conf->buffer_size); if (size == -1) { if (axel->conf->verbose) { axel_message(axel, _("Error on connection %i! " "Connection closed"), i); } conn_disconnect(&axel->conn[i]); goto next_conn; } if (size == 0) { if (axel->conf->verbose) { /* Only abnormal behaviour if: */ if (axel->conn[i].currentbyte < axel->conn[i].lastbyte && axel->size != LLONG_MAX) { axel_message(axel, _("Connection %i unexpectedly closed"), i); } else { axel_message(axel, _("Connection %i finished"), i); } } if (!axel->conn[0].supported) { axel->ready = 1; } conn_disconnect(&axel->conn[i]); reactivate_connection(axel, i); goto next_conn; } /* remaining == Bytes to go */ remaining = axel->conn[i].lastbyte - axel->conn[i].currentbyte + 1; if (remaining < size) { if (axel->conf->verbose) { axel_message(axel, _("Connection %i finished"), i); } conn_disconnect(&axel->conn[i]); size = remaining; /* Don't terminate, still stuff to write! */ } /* This should always succeed.. */ lseek(axel->outfd, axel->conn[i].currentbyte, SEEK_SET); if (write(axel->outfd, buffer, size) != size) { axel_message(axel, _("Write error!")); axel->ready = -1; pthread_mutex_unlock(&axel->conn[i].lock); return; } axel->conn[i].currentbyte += size; axel->bytes_done += size; if (remaining == size) reactivate_connection(axel, i); next_conn: pthread_mutex_unlock(&axel->conn[i].lock); } if (axel->ready) return; conn_check: /* Look for aborted connections and attempt to restart them. */ url_ptr = axel->url; for (i = 0; i < axel->conf->num_connections; i++) { /* skip connection if setup thread hasn't released the lock yet */ if (pthread_mutex_trylock(&axel->conn[i].lock)) continue; if (!axel->conn[i].enabled && axel->conn[i].currentbyte < axel->conn[i].lastbyte) { if (!axel->conn[i].state) { // Wait for termination of this thread pthread_join(*(axel->conn[i].setup_thread), NULL); conn_set(&axel->conn[i], url_ptr->text); url_ptr = url_ptr->next; /* axel->conn[i].local_if = axel->conf->interfaces->text; axel->conf->interfaces = axel->conf->interfaces->next; */ if (axel->conf->verbose >= 2) axel_message(axel, _("Connection %i downloading from %s:%i using interface %s"), i, axel->conn[i].host, axel->conn[i].port, axel->conn[i].local_if); axel->conn[i].state = true; if (pthread_create (axel->conn[i].setup_thread, NULL, setup_thread, &axel->conn[i]) == 0) { axel->conn[i].last_transfer = gettime(); } else { axel_message(axel, _("pthread error!!!")); axel->ready = -1; } } else { if (gettime() > (axel->conn[i].last_transfer + axel->conf->reconnect_delay)) { pthread_cancel(*axel->conn[i].setup_thread); axel->conn[i].state = false; pthread_join(*axel->conn[i]. setup_thread, NULL); } } } pthread_mutex_unlock(&axel->conn[i].lock); } /* Calculate current average speed and finish_time */ axel->bytes_per_second = (int)((double)(axel->bytes_done - axel->start_byte) / (gettime() - axel->start_time)); if (axel->bytes_per_second != 0) axel->finish_time = (int)(axel->start_time + (double)(axel->size - axel->start_byte) / axel->bytes_per_second); else axel->finish_time = INT_MAX; /* Check speed. If too high, delay for some time to slow things down a bit. I think a 5% deviation should be acceptable. */ if (axel->conf->max_speed > 0) { max_speed_ratio = (float)axel->bytes_per_second / axel->conf->max_speed; if (max_speed_ratio > 1.05) axel->delay_time.tv_nsec += 10000000; else if ((max_speed_ratio < 0.95) && (axel->delay_time.tv_nsec >= 10000000)) axel->delay_time.tv_nsec -= 10000000; else if ((max_speed_ratio < 0.95) && (axel->delay_time.tv_sec > 0)) { axel->delay_time.tv_sec--; axel->delay_time.tv_nsec += 999000000; } else if (((float)axel->bytes_per_second / axel->conf->max_speed < 0.95)) { axel->delay_time.tv_sec = 0; axel->delay_time.tv_nsec = 0; } if (axel_sleep(axel->delay_time) < 0) { axel_message(axel, _("Error while enforcing throttling: %s"), strerror(errno)); axel->ready = -1; return; } } /* Ready? */ if (axel->bytes_done == axel->size) axel->ready = 1; } /* Close an axel connection */ void axel_close(axel_t *axel) { if (!axel) return; /* this function can't be called with a partly initialized axel */ assert(axel->conn); /* Terminate threads and close connections */ for (int i = 0; i < axel->conf->num_connections; i++) { /* don't try to kill non existing thread */ if (*axel->conn[i].setup_thread != 0) { pthread_cancel(*axel->conn[i].setup_thread); pthread_join(*axel->conn[i].setup_thread, NULL); } conn_disconnect(&axel->conn[i]); } free(axel->url); /* Delete state file if necessary */ if (axel->ready == 1) { snprintf(buffer, MAX_STRING + 4, "%s.st", axel->filename); unlink(buffer); } /* Else: Create it.. */ else if (axel->bytes_done > 0) { save_state(axel); } print_messages(axel); close(axel->outfd); free(axel->conn); free(axel); free(buffer); } /* time() with more precision */ double gettime() { struct timeval time[1]; gettimeofday(time, 0); return (double)time->tv_sec + (double)time->tv_usec / 1000000; } /* Save the state of the current download */ void save_state(axel_t *axel) { int fd, i; char fn[MAX_STRING + 4]; ssize_t nwrite; /* No use for such a file if the server doesn't support resuming anyway.. */ if (!axel->conn[0].supported) return; snprintf(fn, sizeof(fn), "%s.st", axel->filename); if ((fd = open(fn, O_CREAT | O_TRUNC | O_WRONLY, 0666)) == -1) { return; /* Not 100% fatal.. */ } nwrite = write(fd, &axel->conf->num_connections, sizeof(axel->conf->num_connections)); assert(nwrite == sizeof(axel->conf->num_connections)); nwrite = write(fd, &axel->bytes_done, sizeof(axel->bytes_done)); assert(nwrite == sizeof(axel->bytes_done)); for (i = 0; i < axel->conf->num_connections; i++) { nwrite = write(fd, &axel->conn[i].currentbyte, sizeof(axel->conn[i].currentbyte)); assert(nwrite == sizeof(axel->conn[i].currentbyte)); nwrite = write(fd, &axel->conn[i].lastbyte, sizeof(axel->conn[i].lastbyte)); assert(nwrite == sizeof(axel->conn[i].lastbyte)); } close(fd); } /* Thread used to set up a connection */ void * setup_thread(void *c) { conn_t *conn = c; int oldstate; /* Allow this thread to be killed at any time. */ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldstate); pthread_mutex_lock(&conn->lock); if (conn_setup(conn)) { conn->last_transfer = gettime(); if (conn_exec(conn)) { conn->last_transfer = gettime(); conn->enabled = true; goto out; } } conn_disconnect(conn); out: conn->state = false; pthread_mutex_unlock(&conn->lock); return NULL; } /* Add a message to the axel->message structure */ static void axel_message(axel_t *axel, char *format, ...) { message_t *m; va_list params; if (!axel) goto nomem; m = malloc(sizeof(message_t)); if (!m) goto nomem; memset(m, 0, sizeof(message_t)); va_start(params, format); vsnprintf(m->text, MAX_STRING, format, params); va_end(params); if (axel->message == NULL) { axel->message = axel->last_message = m; } else { axel->last_message->next = m; axel->last_message = m; } return; nomem: /* Flush previous messages */ print_messages(axel); va_start(params, format); vprintf(format, params); va_end(params); } /* Divide the file and set the locations for each connection */ static void axel_divide(axel_t *axel) { int i; axel->conn[0].currentbyte = 0; axel->conn[0].lastbyte = axel->size / axel->conf->num_connections - 1; for (i = 1; i < axel->conf->num_connections; i++) { #ifdef DEBUG printf(_("Downloading %lld-%lld using conn. %i\n"), axel->conn[i - 1].currentbyte, axel->conn[i - 1].lastbyte, i - 1); #endif axel->conn[i].currentbyte = axel->conn[i - 1].lastbyte + 1; axel->conn[i].lastbyte = axel->conn[i].currentbyte + axel->size / axel->conf->num_connections; } axel->conn[axel->conf->num_connections - 1].lastbyte = axel->size - 1; #ifdef DEBUG printf(_("Downloading %lld-%lld using conn. %i\n"), axel->conn[i - 1].currentbyte, axel->conn[i - 1].lastbyte, i - 1); #endif } axel-2.16.1/src/axel.h000066400000000000000000000070301321142621600144210ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2008-2009 Philipp Hagemeister Copyright 2015-2017 Joao Eriberto Mota Filho Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Main include file */ #ifndef AXEL_AXEL_H #define AXEL_AXEL_H #include "config.h" #include #include #include #include #include #ifndef NOGETOPTLONG #define _GNU_SOURCE #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Internationalization */ #ifdef ENABLE_NLS #define _(x) gettext(x) #include #include #else #define _(x) (x) #endif /* Compiled-in settings */ #define MAX_STRING 1024 #define MAX_ADD_HEADERS 10 #define MAX_REDIRECT 20 #define DEFAULT_IO_TIMEOUT 120 #define DEFAULT_USER_AGENT "Axel/" VERSION " (" ARCH ")" typedef struct { void *next; char text[MAX_STRING]; } message_t; typedef message_t url_t; typedef message_t if_t; #include "conf.h" #include "tcp.h" #include "ftp.h" #include "http.h" #include "conn.h" #include "ssl.h" #include "search.h" #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) typedef struct { conn_t *conn; conf_t *conf; char filename[MAX_STRING]; double start_time; int next_state, finish_time; long long bytes_done, start_byte, size; int bytes_per_second; struct timespec delay_time; int outfd; int ready; message_t *message, *last_message; url_t *url; } axel_t; axel_t *axel_new(conf_t *conf, int count, const void *url); int axel_open(axel_t *axel); void axel_start(axel_t *axel); void axel_do(axel_t *axel); void axel_close(axel_t *axel); void print_messages(axel_t *axel); double gettime(); #endif /* AXEL_AXEL_H */ axel-2.16.1/src/conf.c000066400000000000000000000172461321142621600144220ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Philipp Hagemeister Copyright 2008 Y Giridhar Appaji Nag Copyright 2016 Ivan Gimenez Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Configuration handling file */ #include "axel.h" /* Some nifty macro's.. */ #define MATCH if (0); #define KEY(name) \ else if (!strcmp(key, #name)) \ dst = &conf->name; int parse_interfaces(conf_t *conf, char *s); static int axel_fscanf(FILE *fp, const char *format, ...) { va_list params; int ret; va_start(params, format); ret = vfscanf(fp, format, params); va_end(params); ret = !(ret == EOF && ferror(fp)); if (!ret) { fprintf(stderr, _("I/O error while reading config file: %s\n"), strerror(errno)); } return ret; } static int parse_protocol(conf_t *conf, const char *value) { if (strcasecmp(value, "ipv4") == 0) conf->ai_family = AF_INET; else if (strcasecmp(value, "ipv6") == 0) conf->ai_family = AF_INET6; else { fprintf(stderr, _("Unknown protocol %s\n"), value); return 0; } return 1; } int conf_loadfile(conf_t *conf, char *file) { int line = 0, ret = 1; FILE *fp; char s[MAX_STRING], key[MAX_STRING]; fp = fopen(file, "r"); if (fp == NULL) return 1; /* Not a real failure */ while (!feof(fp)) { char *tmp, *value = NULL; void *dst; line++; *s = 0; if (!(ret = axel_fscanf(fp, "%100[^\n#]s", s))) break; if (!(ret = axel_fscanf(fp, "%*[^\n]s"))) break; if ((fgetc(fp) != '\n') && !feof(fp)) { /* Skip newline */ fprintf(stderr, "Expected newline\n"); goto error; } tmp = strchr(s, '='); if (tmp == NULL) continue; /* Probably empty? */ sscanf(s, "%[^= \t]s", key); /* Skip the "=" and any spaces following it */ while (isspace(*++tmp)); /* XXX isspace('\0') is false */ value = tmp; /* Get to the end of the value string */ while (*tmp && !isspace(*tmp)) tmp++; *tmp = '\0'; /* String options */ MATCH KEY(default_filename) KEY(http_proxy) KEY(no_proxy) KEY(user_agent) else goto num_keys; /* Save string option */ strncpy(dst, value, MAX_STRING - 1); ((char *)dst)[MAX_STRING - 1] = '\0'; continue; /* Numeric options */ num_keys: MATCH KEY(strip_cgi_parameters) KEY(save_state_interval) KEY(connection_timeout) KEY(reconnect_delay) KEY(max_redirect) KEY(buffer_size) KEY(max_speed) KEY(verbose) KEY(alternate_output) KEY(insecure) KEY(no_clobber) KEY(search_timeout) KEY(search_threads) KEY(search_amount) KEY(search_top) else goto other_keys; /* Save numeric option */ *((int *)dst) = atoi(value); continue; other_keys: /* Option defunct but shouldn't be an error */ if (strcmp(key, "speed_type") == 0) continue; else if (strcmp(key, "interfaces") == 0) { if (parse_interfaces(conf, value)) continue; } else if (strcmp(key, "use_protocol") == 0) { if (parse_protocol(conf, value)) continue; } else if (strcmp(key, "num_connections") == 0) { int num = atoi(value); if (num <= USHRT_MAX) { conf->num_connections = num; continue; } fprintf(stderr, _("Requested too may connections, max is %i\n"), USHRT_MAX); } #if 0 /* FIXME broken code */ get_config_number(add_header_count); for (int i = 0; i < conf->add_header_count; i++) get_config_string(add_header[i]); #endif error: fprintf(stderr, _("Error in %s line %i.\n"), file, line); ret = 0; break; } fclose(fp); return ret; } int conf_init(conf_t *conf) { char *s2; int i; /* Set defaults */ memset(conf, 0, sizeof(conf_t)); strcpy(conf->default_filename, "default"); *conf->http_proxy = 0; *conf->no_proxy = 0; conf->strip_cgi_parameters = 1; conf->save_state_interval = 10; conf->connection_timeout = 45; conf->reconnect_delay = 20; conf->num_connections = 4; conf->max_redirect = MAX_REDIRECT; conf->io_timeout = DEFAULT_IO_TIMEOUT; conf->buffer_size = 5120; conf->max_speed = 0; conf->verbose = 1; conf->alternate_output = 0; conf->insecure = 0; conf->no_clobber = 0; conf->search_timeout = 10; conf->search_threads = 3; conf->search_amount = 15; conf->search_top = 3; conf->add_header_count = 0; conf->ai_family = AF_UNSPEC; strncpy(conf->user_agent, DEFAULT_USER_AGENT, MAX_STRING); conf->interfaces = malloc(sizeof(if_t)); if (!conf->interfaces) return 0; memset(conf->interfaces, 0, sizeof(if_t)); conf->interfaces->next = conf->interfaces; if ((s2 = getenv("http_proxy")) != NULL) strncpy(conf->http_proxy, s2, sizeof(conf->http_proxy) - 1); else if ((s2 = getenv("HTTP_PROXY")) != NULL) strncpy(conf->http_proxy, s2, sizeof(conf->http_proxy) - 1); if (!conf_loadfile(conf, ETCDIR "/axelrc")) return 0; if ((s2 = getenv("HOME")) != NULL) { char s[MAX_STRING]; int ret; ret = snprintf(s, sizeof(s), "%s/.axelrc", s2); if (ret >= sizeof(s)) { fprintf(stderr, _("HOME env variable too long\n") ); return 0; } if (!conf_loadfile(conf, s)) return 0; } /* Convert no_proxy to a 0-separated-and-00-terminated list.. */ for (i = 0; conf->no_proxy[i]; i++) if (conf->no_proxy[i] == ',') conf->no_proxy[i] = 0; conf->no_proxy[i + 1] = 0; return 1; } /* release resources allocated by conf_init() */ void conf_free(conf_t *conf) { free(conf->interfaces); } int parse_interfaces(conf_t *conf, char *s) { char *s2; if_t *iface; iface = conf->interfaces->next; while (iface != conf->interfaces) { if_t *i; i = iface->next; free(iface); iface = i; } free(conf->interfaces); if (!*s) { conf->interfaces = malloc(sizeof(if_t)); if (!conf->interfaces) return 0; memset(conf->interfaces, 0, sizeof(if_t)); conf->interfaces->next = conf->interfaces; return 1; } s[strlen(s) + 1] = 0; conf->interfaces = iface = malloc(sizeof(if_t)); if (!conf->interfaces) return 0; while (1) { while ((*s == ' ' || *s == '\t') && *s) s++; for (s2 = s; *s2 != ' ' && *s2 != '\t' && *s2; s2++) ; *s2 = 0; if (*s < '0' || *s > '9') get_if_ip(s, iface->text); else strcpy(iface->text, s); s = s2 + 1; if (*s) { iface->next = malloc(sizeof(if_t)); if (!iface->next) return 0; iface = iface->next; } else { iface->next = conf->interfaces; break; } } return 1; } axel-2.16.1/src/conf.h000066400000000000000000000050351321142621600144200ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Philipp Hagemeister Copyright 2008 Y Giridhar Appaji Nag Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Configuration handling include file */ #ifndef AXEL_CONF_H #define AXEL_CONF_H typedef struct { char default_filename[MAX_STRING]; char http_proxy[MAX_STRING]; char no_proxy[MAX_STRING]; uint16_t num_connections; int strip_cgi_parameters; int save_state_interval; int connection_timeout; int reconnect_delay; int max_redirect; int buffer_size; int max_speed; int verbose; int alternate_output; int insecure; int no_clobber; if_t *interfaces; sa_family_t ai_family; int search_timeout; int search_threads; int search_amount; int search_top; unsigned io_timeout; int add_header_count; char add_header[MAX_ADD_HEADERS][MAX_STRING]; char user_agent[MAX_STRING]; } conf_t; int conf_loadfile(conf_t *conf, char *file); int conf_init(conf_t *conf); void conf_free(conf_t *conf); #endif /* AXEL_CONF_H */ axel-2.16.1/src/conn.c000066400000000000000000000251211321142621600144210ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2007-2008 Y Giridhar Appaji Nag Copyright 2008 Philipp Hagemeister Copyright 2015 Joao Eriberto Mota Filho Copyright 2016 Phillip Berndt Copyright 2016 Sjjad Hashemian Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Connection stuff */ #include "axel.h" char string[MAX_STRING]; /** * Convert an URL to a conn_t structure. */ int conn_set(conn_t *conn, const char *set_url) { char url[MAX_STRING]; char *i, *j; /* protocol:// */ if ((i = strstr(set_url, "://")) == NULL) { conn->proto = PROTO_DEFAULT; conn->port = PROTO_DEFAULT_PORT; strncpy(url, set_url, sizeof(url) - 1); url[sizeof(url) - 1] = '\0'; } else { int proto_len = i - set_url; if (strncmp(set_url, "ftp", proto_len) == 0) { conn->proto = PROTO_FTP; conn->port = PROTO_FTP_PORT; } else if (strncmp(set_url, "http", proto_len) == 0) { conn->proto = PROTO_HTTP; conn->port = PROTO_HTTP_PORT; } #ifdef HAVE_SSL else if (strncmp(set_url, "ftps", proto_len) == 0) { conn->proto = PROTO_FTPS; conn->port = PROTO_FTPS_PORT; } else if (strncmp(set_url, "https", proto_len) == 0) { conn->proto = PROTO_HTTPS; conn->port = PROTO_HTTPS_PORT; } #endif /* HAVE_SSL */ else { return 0; } strncpy(url, i + 3, sizeof(url) - 1); url[sizeof(url) - 1] = '\0'; } /* Split */ if ((i = strchr(url, '/')) == NULL) { strcpy(conn->dir, "/"); } else { *i = 0; snprintf(conn->dir, MAX_STRING, "/%s", i + 1); if (conn->proto == PROTO_HTTP || conn->proto == PROTO_HTTPS) http_encode(conn->dir); } strncpy(conn->host, url, sizeof(conn->host) - 1); j = strchr(conn->dir, '?'); if (j != NULL) *j = 0; i = strrchr(conn->dir, '/'); if (i != NULL) *i = 0; if (j != NULL) *j = '?'; if (i == NULL) { strncpy(conn->file, conn->dir, sizeof(conn->file) - 1); strcpy(conn->dir, "/"); } else { strncpy(conn->file, i + 1, sizeof(conn->file) - 1); strcat(conn->dir, "/"); } /* Check for username in host field */ if (strrchr(conn->host, '@') != NULL) { strncpy(conn->user, conn->host, sizeof(conn->user) - 1); i = strrchr(conn->user, '@'); *i = 0; strncpy(conn->host, i + 1, sizeof(conn->host) - 1); *conn->pass = 0; } else { /* If not: Fill in defaults */ if (PROTO_IS_FTP(conn->proto)) { /* Dash the password: Save traffic by trying to avoid multi-line responses */ strcpy(conn->user, "anonymous"); strcpy(conn->pass, "mailto:axel@axel.project"); } else { *conn->user = *conn->pass = 0; } } /* Password? */ if ((i = strchr(conn->user, ':')) != NULL) { *i = 0; strncpy(conn->pass, i + 1, sizeof(conn->pass) - 1); } /* Port number? */ if ((i = strchr(conn->host, ':')) != NULL) { *i = 0; sscanf(i + 1, "%i", &conn->port); } return conn->port > 0; } const char * scheme_from_proto(int proto) { switch (proto) { case PROTO_FTP: return "ftp://"; case PROTO_FTPS: return "ftps://"; default: case PROTO_HTTP: return "http://"; case PROTO_HTTPS: return "https://"; } } /* Generate a nice URL string. */ char * conn_url(conn_t *conn) { strcpy(string, scheme_from_proto(conn->proto)); if (*conn->user != 0 && strcmp(conn->user, "anonymous") != 0) sprintf(string + strlen(string), "%s:%s@", conn->user, conn->pass); sprintf(string + strlen(string), "%s:%i%s%s", conn->host, conn->port, conn->dir, conn->file); return string; } /* Simple... */ void conn_disconnect(conn_t *conn) { if (PROTO_IS_FTP(conn->proto) && !conn->proxy) ftp_disconnect(conn->ftp); else http_disconnect(conn->http); conn->tcp = NULL; conn->enabled = false; } int conn_init(conn_t *conn) { char *proxy = conn->conf->http_proxy, *host = conn->conf->no_proxy; int i; if (*conn->conf->http_proxy == 0) { proxy = NULL; } else if (*conn->conf->no_proxy != 0) { for (i = 0;; i++) if (conn->conf->no_proxy[i] == 0) { if (strstr(conn->host, host) != NULL) proxy = NULL; host = &conn->conf->no_proxy[i + 1]; if (conn->conf->no_proxy[i + 1] == 0) break; } } conn->proxy = proxy != NULL; if (PROTO_IS_FTP(conn->proto) && !conn->proxy) { conn->ftp->local_if = conn->local_if; conn->ftp->ftp_mode = FTP_PASSIVE; conn->ftp->tcp.ai_family = conn->conf->ai_family; if (!ftp_connect(conn->ftp, conn->proto, conn->host, conn->port, conn->user, conn->pass, conn->conf->io_timeout)) { conn->message = conn->ftp->message; conn_disconnect(conn); return 0; } conn->message = conn->ftp->message; if (!ftp_cwd(conn->ftp, conn->dir)) { conn_disconnect(conn); return 0; } } else { conn->http->local_if = conn->local_if; conn->http->tcp.ai_family = conn->conf->ai_family; if (!http_connect(conn->http, conn->proto, proxy, conn->host, conn->port, conn->user, conn->pass, conn->conf->io_timeout)) { conn->message = conn->http->headers; conn_disconnect(conn); return 0; } conn->message = conn->http->headers; conn->tcp = &conn->http->tcp; } return 1; } int conn_setup(conn_t *conn) { if (conn->ftp->tcp.fd <= 0 && conn->http->tcp.fd <= 0) if (!conn_init(conn)) return 0; if (PROTO_IS_FTP(conn->proto) && !conn->proxy) { /* Set up data connnection */ if (!ftp_data(conn->ftp, conn->conf->io_timeout)) return 0; conn->tcp = &conn->ftp->data_tcp; if (conn->currentbyte) { ftp_command(conn->ftp, "REST %lld", conn->currentbyte); if (ftp_wait(conn->ftp) / 100 != 3 && conn->ftp->status / 100 != 2) return 0; } } else { char s[MAX_STRING * 2]; int i; snprintf(s, sizeof(s), "%s%s", conn->dir, conn->file); conn->http->firstbyte = conn->currentbyte; conn->http->lastbyte = conn->lastbyte; http_get(conn->http, s); http_addheader(conn->http, "User-Agent: %s", conn->conf->user_agent); for (i = 0; i < conn->conf->add_header_count; i++) http_addheader(conn->http, "%s", conn->conf->add_header[i]); } return 1; } int conn_exec(conn_t *conn) { if (PROTO_IS_FTP(conn->proto) && !conn->proxy) { if (!ftp_command(conn->ftp, "RETR %s", conn->file)) return 0; return ftp_wait(conn->ftp) / 100 == 1; } else { if (!http_exec(conn->http)) return 0; return conn->http->status / 100 == 2; } } /* Get file size and other information */ int conn_info(conn_t *conn) { /* It's all a bit messed up.. But it works. */ if (PROTO_IS_FTP(conn->proto) && !conn->proxy) { ftp_command(conn->ftp, "REST %lld", 1); if (ftp_wait(conn->ftp) / 100 == 3 || conn->ftp->status / 100 == 2) { conn->supported = true; ftp_command(conn->ftp, "REST %lld", 0); ftp_wait(conn->ftp); } else { conn->supported = false; } if (!ftp_cwd(conn->ftp, conn->dir)) return 0; conn->size = ftp_size(conn->ftp, conn->file, conn->conf->max_redirect, conn->conf->io_timeout); if (conn->size < 0) conn->supported = false; if (conn->size == -1) return 0; else if (conn->size == -2) conn->size = LLONG_MAX; } else { char s[MAX_STRING]; long long int i = 0; do { const char *t; conn->currentbyte = 1; if (!conn_setup(conn)) return 0; conn_exec(conn); conn_disconnect(conn); http_filename(conn->http, conn->output_filename); /* Code 3xx == redirect */ if (conn->http->status / 100 != 3) break; if ((t = http_header(conn->http, "location:")) == NULL) return 0; sscanf(t, "%1000s", s); if (strstr(s, "://") == NULL) { sprintf(conn->http->headers, "%s%s", conn_url(conn), s); strncpy(s, conn->http->headers, sizeof(s) - 1); s[sizeof(s) - 1] = '\0'; } else if (s[0] == '/') { sprintf(conn->http->headers, "http://%s:%i%s", conn->host, conn->port, s); strncpy(s, conn->http->headers, sizeof(s) - 1); s[sizeof(s) - 1] = '\0'; } conn_set(conn, s); /* check if the download has been redirected to FTP and * report it back to the caller */ if (PROTO_IS_FTP(conn->proto) && !conn->proxy) { return -1; } i++; } while (conn->http->status / 100 == 3 && i < conn->conf->max_redirect); if (i == conn->conf->max_redirect) { sprintf(conn->message, _("Too many redirects.\n")); return 0; } conn->size = http_size(conn->http); i = http_size_from_range(conn->http); if (i > 0 && conn->size + 1 != i) { /* This means that the server has a bug. This version currently uses the larger of the reported sizes, but it would be an alternative to set supported = false. */ conn->supported = true; conn->size = max(i, conn->size + 1); } else if (conn->http->status == 206 && conn->size >= 0) { /* 206: range request supported */ conn->supported = true; conn->size++; } else if (conn->http->status == 200 || conn->http->status == 206) { /* something is not supported - fallback */ conn->supported = false; /* if we have an invalid size, set it to the max so that * the transfer will finish when the server closes the * connection. Otherwise keep the reported size. */ if (conn->size <= 0) conn->size = LLONG_MAX; } else { char *t = strchr(conn->message, '\n'); if (t == NULL) sprintf(conn->message, _("Unknown HTTP error.\n")); else *t = 0; return 0; } } return 1; } axel-2.16.1/src/conn.h000066400000000000000000000066651321142621600144420ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2016 Sjjad Hashemian Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Connection stuff */ #ifndef AXEL_CONN_H #define AXEL_CONN_H #define PROTO_SECURE_MASK (1<<0) /* bit 0 - 0 = insecure, 1 = secure */ #define PROTO_PROTO_MASK (1<<1) /* bit 1 = 0 = ftp, 1 = http */ #define PROTO_INSECURE (0<<0) #define PROTO_SECURE (1<<0) #define PROTO_PROTO_FTP (0<<1) #define PROTO_PROTO_HTTP (1<<1) #define PROTO_IS_FTP(proto) \ (((proto) & PROTO_PROTO_MASK) == PROTO_PROTO_FTP) #define PROTO_IS_SECURE(proto) \ (((proto) & PROTO_SECURE_MASK) == PROTO_SECURE) #define PROTO_FTP (PROTO_PROTO_FTP|PROTO_INSECURE) #define PROTO_FTP_PORT 21 #define PROTO_FTPS (PROTO_PROTO_FTP|PROTO_SECURE) #define PROTO_FTPS_PORT 990 #define PROTO_HTTP (PROTO_PROTO_HTTP|PROTO_INSECURE) #define PROTO_HTTP_PORT 80 #define PROTO_HTTPS (PROTO_PROTO_HTTP|PROTO_SECURE) #define PROTO_HTTPS_PORT 443 #define PROTO_DEFAULT PROTO_HTTP #define PROTO_DEFAULT_PORT PROTO_HTTP_PORT typedef struct { conf_t *conf; int proto; int port; int proxy; char host[MAX_STRING]; char dir[MAX_STRING]; char file[MAX_STRING]; char user[MAX_STRING]; char pass[MAX_STRING]; char output_filename[MAX_STRING]; ftp_t ftp[1]; http_t http[1]; long long int size; /* File size, not 'connection size'.. */ long long int currentbyte; long long int lastbyte; tcp_t *tcp; bool enabled; bool supported; int last_transfer; char *message; char *local_if; bool state; pthread_t setup_thread[1]; pthread_mutex_t lock; } conn_t; int conn_set(conn_t *conn, const char *set_url); char *conn_url(conn_t *conn); void conn_disconnect(conn_t *conn); int conn_init(conn_t *conn); int conn_setup(conn_t *conn); int conn_exec(conn_t *conn); int conn_info(conn_t *conn); const char *scheme_from_proto(int proto); #endif /* AXEL_CONN_H */ axel-2.16.1/src/ftp.c000066400000000000000000000207131321142621600142570ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2007-2008 Y Giridhar Appaji Nag Copyright 2016 Stephen Thirlwall Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* FTP control file */ #include "axel.h" int ftp_connect(ftp_t *conn, int proto, char *host, int port, char *user, char *pass, unsigned io_timeout) { conn->data_tcp.fd = -1; conn->message = malloc(MAX_STRING); if (!conn->message) return 0; conn->proto = proto; if (tcp_connect(&conn->tcp, host, port, PROTO_IS_SECURE(conn->proto), conn->local_if, conn->message, io_timeout) == -1) return 0; if (ftp_wait(conn) / 100 != 2) return 0; ftp_command(conn, "USER %s", user); if (ftp_wait(conn) / 100 != 2) { if (conn->status / 100 == 3) { ftp_command(conn, "PASS %s", pass); if (ftp_wait(conn) / 100 != 2) return 0; } else { return 0; } } /* ASCII mode sucks. Just use Binary.. */ ftp_command(conn, "TYPE I"); if (ftp_wait(conn) / 100 != 2) return 0; return 1; } void ftp_disconnect(ftp_t *conn) { tcp_close(&conn->tcp); tcp_close(&conn->data_tcp); if (conn->message) { free(conn->message); conn->message = NULL; } *conn->cwd = 0; } /* Change current working directory */ int ftp_cwd(ftp_t *conn, char *cwd) { /* Necessary at all? */ if (strncmp(conn->cwd, cwd, MAX_STRING) == 0) return 1; ftp_command(conn, "CWD %s", cwd); if (ftp_wait(conn) / 100 != 2) { fprintf(stderr, _("Can't change directory to %s\n"), cwd); return 0; } strncpy(conn->cwd, cwd, sizeof(conn->cwd) - 1); return 1; } /* Get file size. Should work with all reasonable servers now */ long long int ftp_size(ftp_t *conn, char *file, int maxredir, unsigned io_timeout) { long long int i, j, size = MAX_STRING; char *reply, *s, fn[MAX_STRING]; /* Try the SIZE command first, if possible */ if (!strchr(file, '*') && !strchr(file, '?')) { ftp_command(conn, "SIZE %s", file); if (ftp_wait(conn) / 100 == 2) { sscanf(conn->message, "%*i %lld", &i); return i; } else if (conn->status / 10 != 50) { sprintf(conn->message, _("File not found.\n")); return -1; } } if (maxredir == 0) { sprintf(conn->message, _("Too many redirects.\n")); return -1; } if (!ftp_data(conn, io_timeout)) return -1; ftp_command(conn, "LIST %s", file); if (ftp_wait(conn) / 100 != 1) return -1; /* Read reply from the server. */ reply = malloc(size); if (!reply) return -1; memset(reply, 0, size); *reply = '\n'; i = 1; while ((j = tcp_read(&conn->data_tcp, reply + i, size - i - 3)) > 0) { i += j; reply[i] = 0; if (size - i <= 10) { size *= 2; char *tmp = realloc(reply, size); if (!tmp) { free(reply); return -1; } reply = tmp; memset(reply + size / 2, 0, size / 2); } } tcp_close(&conn->data_tcp); if (ftp_wait(conn) / 100 != 2) { free(reply); return -1; } #ifdef DEBUG fprintf(stderr, reply); #endif /* Count the number of probably legal matches: Files&Links only */ j = 0; for (i = 1; reply[i] && reply[i + 1]; i++) if (reply[i] == '-' || reply[i] == 'l') j++; else while (reply[i] != '\n' && reply[i]) i++; /* No match or more than one match */ if (j != 1) { if (j == 0) sprintf(conn->message, _("File not found.\n")); else sprintf(conn->message, _("Multiple matches for this URL.\n")); free(reply); return -1; } /* Symlink handling */ if ((s = strstr(reply, "\nl")) != NULL) { /* Get the real filename */ sscanf(s, "%*s %*i %*s %*s %*i %*s %*i %*s %100s", fn); strcpy(file, fn); /* Get size of the file linked to */ strncpy(fn, strstr(s, "->") + 3, sizeof(fn) - 1); fn[sizeof(fn) - 1] = '\0'; free(reply); if ((reply = strchr(fn, '\r')) != NULL) *reply = 0; if ((reply = strchr(fn, '\n')) != NULL) *reply = 0; return ftp_size(conn, fn, maxredir - 1, io_timeout); } /* Normal file, so read the size! And read filename because of possible wildcards. */ else { s = strstr(reply, "\n-"); i = sscanf(s, "%*s %*i %*s %*s %lld %*s %*i %*s %100s", &size, fn); if (i < 2) { i = sscanf(s, "%*s %*i %lld %*i %*s %*i %*i %100s", &size, fn); if (i < 2) { return -2; } } strcpy(file, fn); free(reply); return size; } } /* Open a data connection. Only Passive mode supported yet, easier.. */ int ftp_data(ftp_t *conn, unsigned io_timeout) { int i, info[6]; char host[MAX_STRING]; /* Already done? */ if (conn->data_tcp.fd > 0) return 0; /* if (conn->ftp_mode == FTP_PASSIVE) { */ ftp_command(conn, "PASV"); if (ftp_wait(conn) / 100 != 2) return 0; *host = 0; for (i = 0; conn->message[i]; i++) { if (sscanf(&conn->message[i], "%i,%i,%i,%i,%i,%i", &info[0], &info[1], &info[2], &info[3], &info[4], &info[5]) == 6) { sprintf(host, "%i.%i.%i.%i", info[0], info[1], info[2], info[3]); break; } } if (!*host) { sprintf(conn->message, _("Error opening passive data connection.\n")); return 0; } if (tcp_connect(&conn->data_tcp, host, info[4] * 256 + info[5], PROTO_IS_SECURE(conn->proto), conn->local_if, conn->message, io_timeout) == -1) return 0; return 1; /* } else { sprintf(conn->message, _("Active FTP not implemented yet.\n")); return 0; } */ } /* Send a command to the server */ int ftp_command(ftp_t *conn, char *format, ...) { va_list params; char cmd[MAX_STRING]; va_start(params, format); vsnprintf(cmd, sizeof(cmd) - 3, format, params); strcat(cmd, "\r\n"); va_end(params); #ifdef DEBUG fprintf(stderr, "fd(%i)<--%s", conn->fd, cmd); #endif if (tcp_write(&conn->tcp, cmd, strlen(cmd)) != strlen(cmd)) { sprintf(conn->message, _("Error writing command %s\n"), format); return 0; } else { return 1; } } /* Read status from server. Should handle multi-line replies correctly. Multi-line replies suck... */ int ftp_wait(ftp_t *conn) { int size = MAX_STRING, r = 0, complete, i, j; char *s; void *new_msg; new_msg = realloc(conn->message, size); if (!new_msg) return -1; conn->message = new_msg; do { do { r += i = tcp_read(&conn->tcp, conn->message + r, 1); if (i <= 0) { sprintf(conn->message, _("Connection gone.\n")); return -1; } if ((r + 10) >= size) { size += MAX_STRING; void *new_msg = realloc(conn->message, size); if (!new_msg) return -1; conn->message = new_msg; } } while (conn->message[r - 1] != '\n'); conn->message[r] = 0; sscanf(conn->message, "%i", &conn->status); if (conn->message[3] == ' ') complete = 1; else complete = 0; for (i = 0; conn->message[i]; i++) if (conn->message[i] == '\n') { if (complete == 1) { complete = 2; break; } if (conn->message[i + 4] == ' ') { j = -1; sscanf(&conn->message[i + 1], "%3i", &j); if (j == conn->status) complete = 1; } } } while (complete != 2); #ifdef DEBUG fprintf(stderr, "fd(%i)-->%s", conn->fd, conn->message); #endif if ((s = strchr(conn->message, '\n')) != NULL) *s = 0; if ((s = strchr(conn->message, '\r')) != NULL) *s = 0; conn->message = realloc(conn->message, max(strlen(conn->message) + 1, MAX_STRING)); return conn->status; } axel-2.16.1/src/ftp.h000066400000000000000000000044571321142621600142730ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2016 Stephen Thirlwall Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* FTP control include file */ #ifndef AXEL_FTP_H #define AXEL_FTP_H #define FTP_PASSIVE 1 #define FTP_PORT 2 typedef struct { char cwd[MAX_STRING]; char *message; int status; tcp_t tcp; tcp_t data_tcp; int proto; int ftp_mode; char *local_if; } ftp_t; int ftp_connect(ftp_t *conn, int proto, char *host, int port, char *user, char *pass, unsigned io_timeout); void ftp_disconnect(ftp_t *conn); int ftp_wait(ftp_t *conn); int ftp_command(ftp_t *conn, char *format, ...); int ftp_cwd(ftp_t *conn, char *cwd); int ftp_data(ftp_t *conn, unsigned io_timeout); long long int ftp_size(ftp_t *conn, char *file, int maxredir, unsigned io_timeout); #endif /* AXEL_FTP_H */ axel-2.16.1/src/http.c000066400000000000000000000214501321142621600144440ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2008-2009 Philipp Hagemeister Copyright 2015 Joao Eriberto Mota Filho Copyright 2016 Ivan Gimenez Copyright 2016 Phillip Berndt Copyright 2016 Sjjad Hashemian Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 David Polverari Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* HTTP control file */ #include "axel.h" inline static char chain_next(const char ***p) { while (**p && !***p) ++(*p); return **p ? *(**p)++ : 0; } static void http_auth_token(char *token, const char *user, const char *pass) { const char base64_encode[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; const char *auth[] = { user, ":", pass, NULL }; const char **p = auth; while (*p && **p) { char a = chain_next(&p); *token++ = base64_encode[a >> 2]; char b = chain_next(&p); *token++ = base64_encode[((a & 3) << 4) | (b >> 4)]; if (!b) { *token++ = '='; *token++ = '='; break; } else { char c = chain_next(&p); *token++ = base64_encode[((b & 15) << 2) | (c >> 6)]; if (!c) { *token++ = '='; break; } else *token++ = base64_encode[c & 63]; } } } int http_connect(http_t *conn, int proto, char *proxy, char *host, int port, char *user, char *pass, unsigned io_timeout) { char *puser = NULL, *ppass = ""; conn_t tconn[1]; strncpy(conn->host, host, sizeof(conn->host) - 1); conn->port = port; conn->proto = proto; if (proxy != NULL) { if (*proxy != 0) { sprintf(conn->host, "%s:%i", host, port); if (!conn_set(tconn, proxy)) { /* We'll put the message in conn->headers, not in request */ sprintf(conn->headers, _("Invalid proxy string: %s\n"), proxy); return 0; } host = tconn->host; port = tconn->port; proto = tconn->proto; puser = tconn->user; ppass = tconn->pass; conn->proxy = 1; } else { conn->proxy = 0; } } if (tcp_connect(&conn->tcp, host, port, PROTO_IS_SECURE(proto), conn->local_if, conn->headers, io_timeout) == -1) return 0; if (*user == 0) { *conn->auth = 0; } else { http_auth_token(conn->auth, user, pass); } if (!conn->proxy || !puser || *puser == 0) { *conn->proxy_auth = 0; } else { http_auth_token(conn->proxy_auth, puser, ppass); } return 1; } void http_disconnect(http_t *conn) { tcp_close(&conn->tcp); } void http_get(http_t *conn, char *lurl) { *conn->request = 0; if (conn->proxy) { const char *proto = scheme_from_proto(conn->proto); http_addheader(conn, "GET %s%s%s HTTP/1.0", proto, conn->host, lurl); } else { http_addheader(conn, "GET %s HTTP/1.0", lurl); if ((conn->proto == PROTO_HTTP && conn->port != PROTO_HTTP_PORT) || (conn->proto == PROTO_HTTPS && conn->port != PROTO_HTTPS_PORT)) http_addheader(conn, "Host: %s:%i", conn->host, conn->port); else http_addheader(conn, "Host: %s", conn->host); } if (*conn->auth) http_addheader(conn, "Authorization: Basic %s", conn->auth); if (*conn->proxy_auth) http_addheader(conn, "Proxy-Authorization: Basic %s", conn->proxy_auth); http_addheader(conn, "Accept: */*"); if (conn->firstbyte) { if (conn->lastbyte) http_addheader(conn, "Range: bytes=%lld-%lld", conn->firstbyte, conn->lastbyte); else http_addheader(conn, "Range: bytes=%lld-", conn->firstbyte); } } void http_addheader(http_t *conn, char *format, ...) { char s[MAX_STRING]; va_list params; va_start(params, format); vsnprintf(s, sizeof(s) - 3, format, params); strcat(s, "\r\n"); va_end(params); strncat(conn->request, s, MAX_QUERY - strlen(conn->request) - 1); } int http_exec(http_t *conn) { int i = 0; ssize_t nwrite = 0; char s[2] = {0}, *s2; #ifdef DEBUG fprintf(stderr, "--- Sending request ---\n%s--- End of request ---\n", conn->request); #endif http_addheader(conn, ""); while (nwrite < strlen(conn->request)) { if ((i = tcp_write(&conn->tcp, conn->request + nwrite, strlen(conn->request) - nwrite)) < 0) { if (errno == EINTR || errno == EAGAIN) continue; /* We'll put the message in conn->headers, not in request */ sprintf(conn->headers, _("Connection gone while writing.\n")); return 0; } nwrite += i; } *conn->headers = 0; /* Read the headers byte by byte to make sure we don't touch the actual data */ while (1) { if (tcp_read(&conn->tcp, s, 1) <= 0) { /* We'll put the message in conn->headers, not in request */ sprintf(conn->headers, _("Connection gone.\n")); return 0; } if (*s == '\r') { continue; } else if (*s == '\n') { if (i == 0) break; i = 0; } else { i++; } strncat(conn->headers, s, MAX_QUERY - strlen(conn->headers) - 1); } #ifdef DEBUG fprintf(stderr, "--- Reply headers ---\n%s--- End of headers ---\n", conn->headers); #endif sscanf(conn->headers, "%*s %3i", &conn->status); s2 = strchr(conn->headers, '\n'); *s2 = 0; strcpy(conn->request, conn->headers); *s2 = '\n'; return 1; } const char * http_header(const http_t *conn, const char *header) { const char *p = conn->headers; size_t hlen = strlen(header); do { if (strncasecmp(p, header, hlen) == 0) return p + hlen; while (*p != '\n' && *p) p++; if (*p == '\n') p++; } while (*p); return NULL; } long long int http_size(http_t *conn) { const char *i; long long int j; if ((i = http_header(conn, "Content-Length:")) == NULL) return -2; sscanf(i, "%lld", &j); return j; } long long int http_size_from_range(http_t *conn) { const char *i; long long int j; if ((i = http_header(conn, "Content-Range:")) == NULL) return -2; i = strchr(i, '/'); if (i == NULL) return -2; if (sscanf(i + 1, "%lld", &j) != 1) return -3; return j; } void http_filename(const http_t *conn, char *filename) { const char *h; if ((h = http_header(conn, "Content-Disposition:")) != NULL) { sscanf(h, "%*s%*[ \t]filename%*[ \t=\"\']%254[^\n\"\' ]", filename); http_decode(filename); /* Replace common invalid characters in filename https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words */ char *i = filename; const char *invalid_characters = "/\\?%*:|<>"; const char replacement = '_'; while ((i = strpbrk(i, invalid_characters)) != NULL) { *i = replacement; i++; } } } inline static char decode_nibble(char n) { if (n <= '9') return n - '0'; if (n >= 'a') n -= 'a' - 'A'; return n - 'A' + 10; } inline static char encode_nibble(char n) { return n > 9 ? n + 'a' - 10 : n + '0'; } inline static void encode_byte(char dst[3], char n) { *dst++ = '%'; *dst++ = encode_nibble(n >> 4); *dst = encode_nibble(n & 15); } /* Decode%20a%20file%20name */ void http_decode(char *s) { for (; *s && *s != '%'; s++) ; if (!*s) return; char *p = s; do { if (!s[1] || !s[2]) break; *p++ = (decode_nibble(s[1]) << 4) | decode_nibble(s[2]); s += 3; while (*s && *s != '%') *p++ = *s++; } while (*s == '%'); *p = 0; } void http_encode(char *s) { char t[MAX_STRING]; int i, j; for (i = j = 0; s[i]; i++, j++) { /* Fix buffer overflow */ if (j >= MAX_STRING - 1) { break; } t[j] = s[i]; if (s[i] <= 0x20 || s[i] >= 0x7f) { /* Fix buffer overflow */ if (j >= MAX_STRING - 3) { break; } encode_byte(t + j, s[i]); j += 2; } } t[j] = 0; strcpy(s, t); } axel-2.16.1/src/http.h000066400000000000000000000053721321142621600144560ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2016 Phillip Berndt Copyright 2016 Sjjad Hashemian Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* HTTP control include file */ #ifndef AXEL_HTTP_H #define AXEL_HTTP_H #define MAX_QUERY 2048 /* Should not grow larger.. */ typedef struct { char host[MAX_STRING]; char auth[MAX_STRING]; char request[MAX_QUERY]; char headers[MAX_QUERY]; int port; int proto; /* FTP through HTTP proxies */ int proxy; char proxy_auth[MAX_STRING]; long long int firstbyte; long long int lastbyte; int status; tcp_t tcp; char *local_if; } http_t; int http_connect(http_t *conn, int proto, char *proxy, char *host, int port, char *user, char *pass, unsigned io_timeout); void http_disconnect(http_t *conn); void http_get(http_t *conn, char *lurl); void http_addheader(http_t *conn, char *format, ...); int http_exec(http_t *conn); const char *http_header(const http_t *conn, const char *header); void http_filename(const http_t *conn, char *filename); long long int http_size(http_t *conn); long long int http_size_from_range(http_t *conn); void http_encode(char *s); void http_decode(char *s); #endif /* AXEL_HTTP_H */ axel-2.16.1/src/search.c000066400000000000000000000173261321142621600147410ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2010 Philipp Hagemeister Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno Copyright 2017 Joao Eriberto Mota Filho This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* filesearching.com searcher */ #include "axel.h" #include "sleep.h" static char *axel_strrstr(char *haystack, char *needle); static void *search_speedtest(void *r); static int search_sortlist_qsort(const void *a, const void *b); #ifdef STANDALONE int main(int argc, char *argv[]) { conf_t conf[1]; search_t *res; int i, j, num_mirrors, ret = 1; if (argc != 2) { fprintf(stderr, _("Incorrect amount of arguments\n")); return 1; } conf_init(conf); ssl_init(conf); res = malloc(sizeof(search_t) * (conf->search_amount + 1)); if (!res) goto out; memset(res, 0, sizeof(search_t) * (conf->search_amount + 1)); res->conf = conf; i = search_makelist(res, argv[1]); if (i == -1) { fprintf(stderr, _("File not found\n")); goto out; } num_mirrors = search_getspeeds(res, i); if (num_mirrors < 0) { fprintf(stderr, _("Speed testing failed\n")); goto out; } printf(_("%i usable mirrors:\n"), num_mirrors); search_sortlist(res, i); for (j = 0; j < i; j++) printf("%-70.70s %5i\n", res[j].url, res[j].speed); ret = 0; out: free(res); return ret; } #endif int search_makelist(search_t *results, char *url) { int i, size = 8192, j = 0; char *s, *s1, *s3; conn_t conn[1]; double t; memset(conn, 0, sizeof(conn_t)); conn->conf = results->conf; t = gettime(); if (!conn_set(conn, url) || !conn_init(conn) || !conn_info(conn)) return -1; strncpy(results[0].url, url, sizeof(results[0].url) - 1); results[0].url[sizeof(results[0].url) - 1] = '\0'; results[0].speed = 1 + 1000 * (gettime() - t); results[0].size = conn->size; s = malloc(size); if (!s) return -1; sprintf(s, "http://www.filesearching.com/cgi-bin/s?q=%s&w=a&l=en&" "t=f&e=on&m=%i&o=n&s1=%lld&s2=%lld&x=15&y=15", conn->file, results->conf->search_amount, conn->size, conn->size); conn_disconnect(conn); memset(conn, 0, sizeof(conn_t)); conn->conf = results->conf; if (!conn_set(conn, s) || !conn_setup(conn) || !conn_exec(conn)) { free(s); return 1; } while ((i = tcp_read(conn->tcp, s + j, size - j)) > 0) { j += i; if (j + 10 >= size) { size *= 2; char *tmp = realloc(s, size); if (!tmp) { free(s); return 1; } s = tmp; memset(s + size / 2, 0, size / 2); } } s[j] = '\0'; conn_disconnect(conn); s1 = strstr(s, "
") == NULL) {
		/* Incomplete list */
		free(s);
		return 1;
	}
	for (i = 1;
	     strncmp(s1, "
", 6) && i < results->conf->search_amount && *s1; i++) { s3 = strchr(s1, '\n'); *s3 = 0; char *s2 = axel_strrstr(s1, " static pthread_mutex_t ssl_lock; static bool ssl_inited = false; static conf_t *conf = NULL; void ssl_init(conf_t *global_conf) { pthread_mutex_init(&ssl_lock, NULL); conf = global_conf; } void ssl_startup(void) { pthread_mutex_lock(&ssl_lock); if (!ssl_inited) { SSL_library_init(); SSL_load_error_strings(); ssl_inited = true; } pthread_mutex_unlock(&ssl_lock); } SSL * ssl_connect(int fd, char *hostname, char *message) { SSL_CTX *ssl_ctx; SSL *ssl; ssl_startup(); ssl_ctx = SSL_CTX_new(SSLv23_client_method()); if (!conf->insecure) { SSL_CTX_set_default_verify_paths(ssl_ctx); SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL); } SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY); ssl = SSL_new(ssl_ctx); SSL_set_fd(ssl, fd); SSL_set_tlsext_host_name(ssl, hostname); int err = SSL_connect(ssl); if (err <= 0) { sprintf(message, _("SSL error: %s\n"), ERR_reason_error_string(ERR_get_error())); return NULL; } return ssl; } void ssl_disconnect(SSL *ssl) { SSL_shutdown(ssl); SSL_free(ssl); } #endif /* HAVE_SSL */ axel-2.16.1/src/ssl.h000066400000000000000000000035301321142621600142720ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2016-2017 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* SSL interface */ #if !defined(AXEL_SSL_H) && defined(HAVE_SSL) #define AXEL_SSL_H #include void ssl_init(conf_t *conf); SSL *ssl_connect(int fd, char *hostname, char *message); void ssl_disconnect(SSL *ssl); #endif /* AXEL_SSL_H */ axel-2.16.1/src/tcp.c000066400000000000000000000133541321142621600142570ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2010 Mark Smith Copyright 2016-2017 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* TCP control file */ #define _POSIX_C_SOURCE 200112L #include "axel.h" #include #include #include #include static void tcp_error(char *buffer, char *hostname, int port, const char *reason) { sprintf(buffer, _("Unable to connect to server %s:%i: %s\n"), hostname, port, reason); } /* Get a TCP connection */ int tcp_connect(tcp_t *tcp, char *hostname, int port, int secure, char *local_if, char *message, unsigned io_timeout) { struct sockaddr_in local_addr; const int portstr_len = 10; char portstr[portstr_len]; struct addrinfo ai_hints; struct addrinfo *gai_results, *gai_result; int ret; int sock_fd = -1; memset(&local_addr, 0, sizeof(local_addr)); if (tcp->ai_family == AF_INET && local_if && *local_if) { local_addr.sin_family = AF_INET; local_addr.sin_port = 0; local_addr.sin_addr.s_addr = inet_addr(local_if); } snprintf(portstr, portstr_len, "%d", port); memset(&ai_hints, 0, sizeof(ai_hints)); ai_hints.ai_family = tcp->ai_family; ai_hints.ai_socktype = SOCK_STREAM; ai_hints.ai_flags = AI_ADDRCONFIG; ai_hints.ai_protocol = 0; ret = getaddrinfo(hostname, portstr, &ai_hints, &gai_results); if (ret != 0) { tcp_error(message, hostname, port, gai_strerror(ret)); return -1; } gai_result = gai_results; sock_fd = -1; while ((sock_fd == -1) && (gai_result != NULL)) { sock_fd = socket(gai_result->ai_family, gai_result->ai_socktype, gai_result->ai_protocol); if (sock_fd != -1) { if (gai_result->ai_family == AF_INET) { if (local_if && *local_if) { ret = bind(sock_fd, (struct sockaddr *) &local_addr, sizeof(local_addr)); if (ret == -1) { close(sock_fd); sock_fd = -1; gai_result = gai_result->ai_next; } } } if (sock_fd != -1) { struct timeval tout = { .tv_sec = io_timeout }; /* Set O_NONBLOCK so we can timeout */ if (io_timeout) fcntl(sock_fd, F_SETFL, O_NONBLOCK); ret = connect(sock_fd, gai_result->ai_addr, gai_result->ai_addrlen); /* Wait for the connection */ if (ret == -1 && errno == EINPROGRESS) { fd_set fdset; FD_ZERO(&fdset); FD_SET(sock_fd, &fdset); ret = select(sock_fd + 1, NULL, &fdset, NULL, &tout); } if (ret == -1) { close(sock_fd); sock_fd = -1; gai_result = gai_result->ai_next; } else { fcntl(sock_fd, F_SETFL, 0); } } } } freeaddrinfo(gai_results); if (sock_fd == -1) { tcp_error(message, hostname, port, strerror(errno)); return -1; } #ifdef HAVE_SSL if (secure) { tcp->ssl = ssl_connect(sock_fd, hostname, message); if (tcp->ssl == NULL) { close(sock_fd); return -1; } } #endif /* HAVE_SSL */ tcp->fd = sock_fd; /* Set I/O timeout */ struct timeval tout = { .tv_sec = io_timeout }; setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &tout, sizeof(tout)); setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &tout, sizeof(tout)); return 1; } int tcp_read(tcp_t *tcp, void *buffer, int size) { #ifdef HAVE_SSL if (tcp->ssl != NULL) return SSL_read(tcp->ssl, buffer, size); else #endif /* HAVE_SSL */ return read(tcp->fd, buffer, size); } int tcp_write(tcp_t *tcp, void *buffer, int size) { #ifdef HAVE_SSL if (tcp->ssl != NULL) return SSL_write(tcp->ssl, buffer, size); else #endif /* HAVE_SSL */ return write(tcp->fd, buffer, size); } void tcp_close(tcp_t *tcp) { if (tcp->fd > 0) { #ifdef HAVE_SSL if (tcp->ssl != NULL) { ssl_disconnect(tcp->ssl); tcp->ssl = NULL; } else #endif /* HAVE_SSL */ close(tcp->fd); tcp->fd = -1; } } int get_if_ip(char *iface, char *ip) { struct ifreq ifr; int ret, fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); if (fd < 0) return 0; memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name) - 1); ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; ifr.ifr_addr.sa_family = AF_INET; ret = !ioctl(fd, SIOCGIFADDR, &ifr); if (ret) { struct sockaddr_in *x = (struct sockaddr_in *)&ifr.ifr_addr; strcpy(ip, inet_ntoa(x->sin_addr)); } close(fd); return ret; } axel-2.16.1/src/tcp.h000066400000000000000000000042251321142621600142610ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* TCP control include file */ #ifndef AXEL_TCP_H #define AXEL_TCP_H #ifdef HAVE_SSL #include #endif typedef struct { int fd; sa_family_t ai_family; #ifdef HAVE_SSL SSL *ssl; #endif } tcp_t; int tcp_connect(tcp_t *tcp, char *hostname, int port, int secure, char *local_if, char *message, unsigned io_timeout); void tcp_close(tcp_t *tcp); int tcp_read(tcp_t *tcp, void *buffer, int size); int tcp_write(tcp_t *tcp, void *buffer, int size); int get_if_ip(char *iface, char *ip); #endif /* AXEL_TCP_H */ axel-2.16.1/src/text.c000066400000000000000000000433261321142621600144570ustar00rootroot00000000000000/* Axel -- A lighter download accelerator for Linux and other Unices Copyright 2001-2007 Wilmer van der Gaast Copyright 2008 Y Giridhar Appaji Nag Copyright 2008-2010 Philipp Hagemeister Copyright 2015-2017 Joao Eriberto Mota Filho Copyright 2016 Denis Denisov Copyright 2016 Mridul Malpotra Copyright 2016 Stephen Thirlwall Copyright 2017 Antonio Quartulli Copyright 2017 Ismael Luceno This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library under certain conditions as described in each individual source file, and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify file(s) with this exception, you may extend this exception to your version of the file(s), but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Text interface */ #include "axel.h" #include static void stop(int signal); static char *size_human(long long int value); static char *time_human(int value); static void print_commas(long long int bytes_done); static void print_alternate_output(axel_t *axel); static void print_help(); static void print_version(); static int get_term_width(); int run = 1; #define MAX_REDIR_OPT 256 #ifdef NOGETOPTLONG #define getopt_long(a, b, c, d, e) getopt(a, b, c) #else static struct option axel_options[] = { /* name has_arg flag val */ {"max-speed", 1, NULL, 's'}, {"num-connections", 1, NULL, 'n'}, {"max-redirect", 1, NULL, MAX_REDIR_OPT}, {"output", 1, NULL, 'o'}, {"search", 2, NULL, 'S'}, {"ipv4", 0, NULL, '4'}, {"ipv6", 0, NULL, '6'}, {"no-proxy", 0, NULL, 'N'}, {"quiet", 0, NULL, 'q'}, {"verbose", 0, NULL, 'v'}, {"help", 0, NULL, 'h'}, {"version", 0, NULL, 'V'}, {"alternate", 0, NULL, 'a'}, {"insecure", 0, NULL, 'k'}, {"no-clobber", 0, NULL, 'c'}, {"header", 1, NULL, 'H'}, {"user-agent", 1, NULL, 'U'}, {"timeout", 1, NULL, 'T'}, {NULL, 0, NULL, 0} }; #endif /* For returning string values from functions */ static char string[MAX_STRING + 3]; int main(int argc, char *argv[]) { char fn[MAX_STRING] = ""; int do_search = 0; search_t *search; conf_t conf[1]; axel_t *axel; int i, j, cur_head = 0, ret = 1; char *s; /* Set up internationalization (i18n) */ #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif if (!conf_init(conf)) { return 1; } opterr = 0; j = -1; while (1) { int option; option = getopt_long(argc, argv, "s:n:o:S::46NqvhVakcH:U:T:", axel_options, NULL); if (option == -1) break; switch (option) { case 'U': strncpy(conf->user_agent, optarg, sizeof(conf->user_agent) - 1); break; case 'H': strncpy(conf->add_header[cur_head++], optarg, sizeof(conf->add_header[cur_head - 1]) - 1); break; case 's': if (!sscanf(optarg, "%i", &conf->max_speed)) { print_help(); goto free_conf; } break; case 'n': if (!sscanf(optarg, "%hu", &conf->num_connections)) { print_help(); goto free_conf; } break; case MAX_REDIR_OPT: if (!sscanf(optarg, "%i", &conf->max_redirect)) { print_help(); return 1; } break; case 'o': strncpy(fn, optarg, sizeof(fn) - 1); fn[sizeof(fn) - 1] = '\0'; break; case 'S': do_search = 1; if (optarg) { if (!sscanf(optarg, "%i", &conf->search_top)) { print_help(); goto free_conf; } } break; case '6': conf->ai_family = AF_INET6; break; case '4': conf->ai_family = AF_INET; break; case 'a': conf->alternate_output = 1; break; case 'k': conf->insecure = 1; break; case 'c': conf->no_clobber = 1; break; case 'N': *conf->http_proxy = 0; break; case 'h': print_help(); ret = 0; goto free_conf; case 'v': if (j == -1) j = 1; else j++; break; case 'V': print_version(); ret = 0; goto free_conf; case 'q': close(1); conf->verbose = -1; if (open("/dev/null", O_WRONLY) != 1) { fprintf(stderr, _("Can't redirect stdout to /dev/null.\n")); goto free_conf; } break; case 'T': conf->io_timeout = strtoul(optarg, NULL, 0); break; default: print_help(); goto free_conf; } } conf->add_header_count = cur_head; /* disable alternate output and verbosity when quiet is specified */ if (conf->verbose < 0) conf->alternate_output = 0; else if (j > -1) conf->verbose = j; if (conf->num_connections < 1) { print_help(); goto free_conf; } if (conf->max_redirect < 0) { print_help(); return 1; } #ifdef HAVE_SSL ssl_init(conf); #endif /* HAVE_SSL */ if (argc - optind == 0) { print_help(); goto free_conf; } else if (strcmp(argv[optind], "-") == 0) { s = malloc(MAX_STRING); if (!s) goto free_conf; if (scanf("%1024[^\n]s", s) != 1) { fprintf(stderr, _("Error when trying to read URL (Too long?).\n")); free(s); goto free_conf; } } else { s = argv[optind]; if (strlen(s) > MAX_STRING) { fprintf(stderr, _("Can't handle URLs of length over %d\n"), MAX_STRING); goto free_conf; } } printf(_("Initializing download: %s\n"), s); if (do_search) { search = malloc(sizeof(search_t) * (conf->search_amount + 1)); if (!search) goto free_conf; memset(search, 0, sizeof(search_t) * (conf->search_amount + 1)); search[0].conf = conf; if (conf->verbose) printf(_("Doing search...\n")); i = search_makelist(search, s); if (i < 0) { fprintf(stderr, _("File not found\n")); goto free_conf; } if (conf->verbose) printf(_("Testing speeds, this can take a while...\n")); j = search_getspeeds(search, i); if (j < 0) { fprintf(stderr, _("Speed testing failed\n")); return 1; } search_sortlist(search, i); if (conf->verbose) { printf(_("%i usable servers found, will use these URLs:\n"), j); j = min(j, conf->search_top); printf("%-60s %15s\n", "URL", _("Speed")); for (i = 0; i < j; i++) printf("%-70.70s %5i\n", search[i].url, search[i].speed); printf("\n"); } axel = axel_new(conf, j, search); free(search); if (!axel || axel->ready == -1) { print_messages(axel); goto close_axel; } } else if (argc - optind == 1) { axel = axel_new(conf, 0, s); if (!axel || axel->ready == -1) { print_messages(axel); goto close_axel; } } else { search = malloc(sizeof(search_t) * (argc - optind)); if (!search) goto free_conf; memset(search, 0, sizeof(search_t) * (argc - optind)); for (i = 0; i < (argc - optind); i++) strncpy(search[i].url, argv[optind + i], sizeof(search[i].url) - 1); axel = axel_new(conf, argc - optind, search); free(search); if (!axel || axel->ready == -1) { print_messages(axel); goto close_axel; } } print_messages(axel); if (s != argv[optind]) { free(s); } if (*fn) { struct stat buf; if (stat(fn, &buf) == 0) { if (S_ISDIR(buf.st_mode)) { size_t fnlen = strlen(fn); size_t axelfnlen = strlen(axel->filename); if (fnlen + 1 + axelfnlen + 1 > MAX_STRING) { fprintf(stderr, _("Filename too long!\n")); goto close_axel; } fn[fnlen] = '/'; memcpy(fn + fnlen + 1, axel->filename, axelfnlen); fn[fnlen + 1 + axelfnlen] = '\0'; } } sprintf(string, "%s.st", fn); if (access(fn, F_OK) == 0 && access(string, F_OK) != 0) { fprintf(stderr, _("No state file, cannot resume!\n")); goto close_axel; } if (access(string, F_OK) == 0 && access(fn, F_OK) != 0) { printf(_("State file found, but no downloaded data. Starting from scratch.\n")); unlink(string); } strcpy(axel->filename, fn); } else { /* Local file existence check */ i = 0; s = axel->filename + strlen(axel->filename); while (1) { sprintf(string, "%s.st", axel->filename); if (access(axel->filename, F_OK) == 0) { if (axel->conn[0].supported) { if (access(string, F_OK) == 0) break; } } else { if (access(string, F_OK)) break; } sprintf(s, ".%i", i); i++; } } if (!axel_open(axel)) { print_messages(axel); goto close_axel; } print_messages(axel); axel_start(axel); print_messages(axel); if (conf->alternate_output) { putchar('\n'); } else { if (axel->bytes_done > 0) { /* Print first dots if resuming */ putchar('\n'); print_commas(axel->bytes_done); } } axel->start_byte = axel->bytes_done; /* Install save_state signal handler for resuming support */ signal(SIGINT, stop); signal(SIGTERM, stop); while (!axel->ready && run) { long long int prev; prev = axel->bytes_done; axel_do(axel); if (conf->alternate_output) { if (!axel->message && prev != axel->bytes_done) print_alternate_output(axel); } else { /* The infamous wget-like 'interface'.. ;) */ long long int done = (axel->bytes_done / 1024) - (prev / 1024); if (done && conf->verbose > -1) { for (i = 0; i < done; i++) { i += (prev / 1024); if ((i % 50) == 0) { if (prev >= 1024) printf(" [%6.1fKB/s]", (double)axel->bytes_per_second / 1024); if (axel->size == LLONG_MAX) printf("\n[ N/A] "); else if (axel->size < 10240000) printf("\n[%3lld%%] ", min(100, 102400 * i / axel->size)); else printf("\n[%3lld%%] ", min(100, i / (axel->size / 102400))); } else if ((i % 10) == 0) { putchar(' '); } putchar('.'); i -= (prev / 1024); } fflush(stdout); } } if (axel->message) { if (conf->alternate_output == 1) { /* clreol-simulation */ putchar('\r'); for (i = get_term_width(); i > 0; i--) putchar(' '); putchar('\r'); } else { putchar('\n'); } print_messages(axel); if (!axel->ready) { if (conf->alternate_output != 1) print_commas(axel->bytes_done); else print_alternate_output(axel); } } else if (axel->ready) { putchar('\n'); } } strcpy(string + MAX_STRING / 2, size_human(axel->bytes_done - axel->start_byte)); printf(_("\nDownloaded %s in %s. (%.2f KB/s)\n"), string + MAX_STRING / 2, time_human(gettime() - axel->start_time), (double)axel->bytes_per_second / 1024); ret = axel->ready ? 0 : 2; close_axel: axel_close(axel); free_conf: conf_free(conf); return ret; } /* SIGINT/SIGTERM handler */ void stop(int signal) { (void)signal; run = 0; } /* Convert a number of bytes to a human-readable form */ char * size_human(long long int value) { if (value < 1024) sprintf(string, _("%lld byte"), value); else if (value < 1024 * 1024) sprintf(string, _("%.1f Kilobyte"), (float)value / 1024); else if (value < 1024 * 1024 * 1024) sprintf(string, _("%.1f Megabyte"), (float)value / (1024 * 1024)); else sprintf(string, _("%.1f Gigabyte"), (float)value / (1024 * 1024 * 1024)); return string; } /* Convert a number of seconds to a human-readable form */ char * time_human(int value) { if (value == 1) sprintf(string, _("%i second"), value); else if (value < 60) sprintf(string, _("%i seconds"), value); else if (value < 3600) sprintf(string, _("%i:%02i minute(s)"), value / 60, value % 60); else sprintf(string, _("%i:%02i:%02i hour(s)"), value / 3600, (value / 60) % 60, value % 60); return string; } /* Part of the infamous wget-like interface. Just put it in a function because I need it quite often.. */ void print_commas(long long int bytes_done) { int i, j; printf(" "); j = (bytes_done / 1024) % 50; if (j == 0) j = 50; for (i = 0; i < j; i++) { if ((i % 10) == 0) putchar(' '); putchar(','); } fflush(stdout); } static void print_alternate_output_progress(axel_t *axel, char *progress, int width, long long int done, long long int total, double now) { for (int i = 0; i < axel->conf->num_connections; i++) { int offset = ((double)(axel->conn[i].currentbyte) / (total + 1) * (width + 1)); if (axel->conn[i].currentbyte < axel->conn[i].lastbyte) { if (now <= axel->conn[i].last_transfer + axel->conf->connection_timeout / 2) { if (i < 10) progress[offset] = i + '0'; else progress[offset] = i - 10 + 'A'; } else progress[offset] = '#'; } int end = ((double)(axel->conn[i].lastbyte) / (total + 1) * (width + 1)); for (int j = offset + 1; j < end; j++) progress[j] = ' '; } progress[width] = '\0'; printf("\r[%3ld%%] [%s", min(100, (long)(done * 100. / total + .5)), progress); } static void print_alternate_output(axel_t *axel) { long long int done = axel->bytes_done; long long int total = axel->size; double now = gettime(); int width = get_term_width(); char *progress; if (width < 40) { fprintf(stderr, _("Can't setup alternate output. Deactivating.\n")); axel->conf->alternate_output = 0; return; } width -= 30; progress = malloc(width + 1); if (!progress) return; memset(progress, '.', width); if (total != LLONG_MAX) { print_alternate_output_progress(axel, progress, width, done, total, now); } else { progress[width] = '\0'; printf("\r[ N/A] [%s", progress); } if (axel->bytes_per_second > 1048576) printf("] [%6.1fMB/s]", (double)axel->bytes_per_second / (1024 * 1024)); else if (axel->bytes_per_second > 1024) printf("] [%6.1fKB/s]", (double)axel->bytes_per_second / 1024); else printf("] [%6.1fB/s]", (double)axel->bytes_per_second); if (total != LLONG_MAX && done < total) { int seconds, minutes, hours, days; seconds = axel->finish_time - now; minutes = seconds / 60; seconds -= minutes * 60; hours = minutes / 60; minutes -= hours * 60; days = hours / 24; hours -= days * 24; if (days) printf(" [%2dd%2d]", days, hours); else if (hours) printf(" [%2dh%02d]", hours, minutes); else printf(" [%02d:%02d]", minutes, seconds); } fflush(stdout); free(progress); } static int get_term_width() { struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); return w.ws_col; } void print_help() { #ifdef NOGETOPTLONG printf(_("Usage: axel [options] url1 [url2] [url...]\n" "\n" "-s x\tSpecify maximum speed (bytes per second)\n" "-n x\tSpecify maximum number of connections\n" "-o f\tSpecify local output file\n" "-S[n]\tSearch for mirrors and download from n servers\n" "-4\tUse the IPv4 protocol\n" "-6\tUse the IPv6 protocol\n" "-H x\tAdd HTTP header string\n" "-U x\tSet user agent\n" "-N\tJust don't use any proxy server\n" "-k\tDon't verify the SSL certificate\n" "-c\tSkip download if file already exists\n" "-q\tLeave stdout alone\n" "-v\tMore status information\n" "-a\tAlternate progress indicator\n" "-h\tThis information\n" "-T x\tSet I/O and connection timeout\n" "-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues\n")); #else printf(_("Usage: axel [options] url1 [url2] [url...]\n" "\n" "--max-speed=x\t\t-s x\tSpecify maximum speed (bytes per second)\n" "--num-connections=x\t-n x\tSpecify maximum number of connections\n" "--max-redirect=x\t\tSpecify maximum number of redirections\n" "--output=f\t\t-o f\tSpecify local output file\n" "--search[=n]\t\t-S[n]\tSearch for mirrors and download from n servers\n" "--ipv4\t\t\t-4\tUse the IPv4 protocol\n" "--ipv6\t\t\t-6\tUse the IPv6 protocol\n" "--header=x\t\t-H x\tAdd HTTP header string\n" "--user-agent=x\t\t-U x\tSet user agent\n" "--no-proxy\t\t-N\tJust don't use any proxy server\n" "--insecure\t\t-k\tDon't verify the SSL certificate\n" "--no-clobber\t\t-c\tSkip download if file already exists\n" "--quiet\t\t\t-q\tLeave stdout alone\n" "--verbose\t\t-v\tMore status information\n" "--alternate\t\t-a\tAlternate progress indicator\n" "--help\t\t\t-h\tThis information\n" "--timeout=x\t\t-T x\tSet I/O and connection timeout\n" "--version\t\t-V\tVersion information\n" "\n" "Visit https://github.com/axel-download-accelerator/axel/issues to report bugs\n")); #endif } void print_version() { printf(_("Axel version %s (%s)\n"), VERSION, ARCH); printf("\nCopyright 2001-2007 Wilmer van der Gaast,\n" "\t 2007-2009 Giridhar Appaji Nag,\n" "\t 2008-2010 Philipp Hagemeister,\n" "\t 2015-2017 Joao Eriberto Mota Filho,\n" "\t 2016-2017 Stephen Thirlwall,\n" "\t 2017 Ismael Luceno,\n" "\t 2017 Antonio Quartulli,\n" "\t\t %s\n%s\n\n", _("and others."), _("Please, see the CREDITS file.\n\n")); } /* Print any message in the axel structure */ void print_messages(axel_t *axel) { message_t *m; if (!axel) return; while ((m = axel->message)) { printf("%s\n", m->text); axel->message = m->next; free(m); } }