aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-02-06 15:02:16 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-02-06 15:02:16 +0100
commite999657f6da95b8a40e51978461d964b56189e92 (patch)
tree1e50e4462b775d961e141aba9eaa488e2d09672f
parent98066662aa15a21627ef8a3fb7318b6ee301df22 (diff)
downloadbusybox-w32-e999657f6da95b8a40e51978461d964b56189e92.tar.gz
busybox-w32-e999657f6da95b8a40e51978461d964b56189e92.tar.bz2
busybox-w32-e999657f6da95b8a40e51978461d964b56189e92.zip
wget: preparations for ftps:// support (block move, no code changes)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/wget.c162
1 files changed, 81 insertions, 81 deletions
diff --git a/networking/wget.c b/networking/wget.c
index d1d85230c..9300fa30b 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -602,87 +602,6 @@ static void reset_beg_range_to_zero(void)
602 /* ftruncate(G.output_fd, 0); */ 602 /* ftruncate(G.output_fd, 0); */
603} 603}
604 604
605static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
606{
607 FILE *sfp;
608 char *str;
609 int port;
610
611 if (!target->user)
612 target->user = xstrdup("anonymous:busybox@");
613
614 sfp = open_socket(lsa);
615 if (ftpcmd(NULL, NULL, sfp) != 220)
616 bb_error_msg_and_die("%s", sanitize_string(G.wget_buf + 4));
617
618 /*
619 * Splitting username:password pair,
620 * trying to log in
621 */
622 str = strchr(target->user, ':');
623 if (str)
624 *str++ = '\0';
625 switch (ftpcmd("USER ", target->user, sfp)) {
626 case 230:
627 break;
628 case 331:
629 if (ftpcmd("PASS ", str, sfp) == 230)
630 break;
631 /* fall through (failed login) */
632 default:
633 bb_error_msg_and_die("ftp login: %s", sanitize_string(G.wget_buf + 4));
634 }
635
636 ftpcmd("TYPE I", NULL, sfp);
637
638 /*
639 * Querying file size
640 */
641 if (ftpcmd("SIZE ", target->path, sfp) == 213) {
642 G.content_len = BB_STRTOOFF(G.wget_buf + 4, NULL, 10);
643 if (G.content_len < 0 || errno) {
644 bb_error_msg_and_die("SIZE value is garbage");
645 }
646 G.got_clen = 1;
647 }
648
649 /*
650 * Entering passive mode
651 */
652 if (ftpcmd("PASV", NULL, sfp) != 227) {
653 pasv_error:
654 bb_error_msg_and_die("bad response to %s: %s", "PASV", sanitize_string(G.wget_buf));
655 }
656 // Response is "227 garbageN1,N2,N3,N4,P1,P2[)garbage]
657 // Server's IP is N1.N2.N3.N4 (we ignore it)
658 // Server's port for data connection is P1*256+P2
659 str = strrchr(G.wget_buf, ')');
660 if (str) str[0] = '\0';
661 str = strrchr(G.wget_buf, ',');
662 if (!str) goto pasv_error;
663 port = xatou_range(str+1, 0, 255);
664 *str = '\0';
665 str = strrchr(G.wget_buf, ',');
666 if (!str) goto pasv_error;
667 port += xatou_range(str+1, 0, 255) * 256;
668 set_nport(&lsa->u.sa, htons(port));
669
670 *dfpp = open_socket(lsa);
671
672 if (G.beg_range != 0) {
673 sprintf(G.wget_buf, "REST %"OFF_FMT"u", G.beg_range);
674 if (ftpcmd(G.wget_buf, NULL, sfp) == 350)
675 G.content_len -= G.beg_range;
676 else
677 reset_beg_range_to_zero();
678 }
679
680 if (ftpcmd("RETR ", target->path, sfp) > 150)
681 bb_error_msg_and_die("bad response to %s: %s", "RETR", sanitize_string(G.wget_buf));
682
683 return sfp;
684}
685
686#if ENABLE_FEATURE_WGET_OPENSSL 605#if ENABLE_FEATURE_WGET_OPENSSL
687static int spawn_https_helper_openssl(const char *host, unsigned port) 606static int spawn_https_helper_openssl(const char *host, unsigned port)
688{ 607{
@@ -808,6 +727,87 @@ static void spawn_ssl_client(const char *host, int network_fd)
808} 727}
809#endif 728#endif
810 729
730static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
731{
732 FILE *sfp;
733 char *str;
734 int port;
735
736 if (!target->user)
737 target->user = xstrdup("anonymous:busybox@");
738
739 sfp = open_socket(lsa);
740 if (ftpcmd(NULL, NULL, sfp) != 220)
741 bb_error_msg_and_die("%s", sanitize_string(G.wget_buf + 4));
742
743 /*
744 * Splitting username:password pair,
745 * trying to log in
746 */
747 str = strchr(target->user, ':');
748 if (str)
749 *str++ = '\0';
750 switch (ftpcmd("USER ", target->user, sfp)) {
751 case 230:
752 break;
753 case 331:
754 if (ftpcmd("PASS ", str, sfp) == 230)
755 break;
756 /* fall through (failed login) */
757 default:
758 bb_error_msg_and_die("ftp login: %s", sanitize_string(G.wget_buf + 4));
759 }
760
761 ftpcmd("TYPE I", NULL, sfp);
762
763 /*
764 * Querying file size
765 */
766 if (ftpcmd("SIZE ", target->path, sfp) == 213) {
767 G.content_len = BB_STRTOOFF(G.wget_buf + 4, NULL, 10);
768 if (G.content_len < 0 || errno) {
769 bb_error_msg_and_die("SIZE value is garbage");
770 }
771 G.got_clen = 1;
772 }
773
774 /*
775 * Entering passive mode
776 */
777 if (ftpcmd("PASV", NULL, sfp) != 227) {
778 pasv_error:
779 bb_error_msg_and_die("bad response to %s: %s", "PASV", sanitize_string(G.wget_buf));
780 }
781 // Response is "227 garbageN1,N2,N3,N4,P1,P2[)garbage]
782 // Server's IP is N1.N2.N3.N4 (we ignore it)
783 // Server's port for data connection is P1*256+P2
784 str = strrchr(G.wget_buf, ')');
785 if (str) str[0] = '\0';
786 str = strrchr(G.wget_buf, ',');
787 if (!str) goto pasv_error;
788 port = xatou_range(str+1, 0, 255);
789 *str = '\0';
790 str = strrchr(G.wget_buf, ',');
791 if (!str) goto pasv_error;
792 port += xatou_range(str+1, 0, 255) * 256;
793 set_nport(&lsa->u.sa, htons(port));
794
795 *dfpp = open_socket(lsa);
796
797 if (G.beg_range != 0) {
798 sprintf(G.wget_buf, "REST %"OFF_FMT"u", G.beg_range);
799 if (ftpcmd(G.wget_buf, NULL, sfp) == 350)
800 G.content_len -= G.beg_range;
801 else
802 reset_beg_range_to_zero();
803 }
804
805 if (ftpcmd("RETR ", target->path, sfp) > 150)
806 bb_error_msg_and_die("bad response to %s: %s", "RETR", sanitize_string(G.wget_buf));
807
808 return sfp;
809}
810
811static void NOINLINE retrieve_file_data(FILE *dfp) 811static void NOINLINE retrieve_file_data(FILE *dfp)
812{ 812{
813#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT 813#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT