- add libbb function str_tolower to convert a string to lowercase.
- shrink wget a bit
This commit is contained in:
parent
3f3aa2a57d
commit
7e8a53a335
@ -77,6 +77,7 @@ lib-y += sha1.o
|
||||
lib-y += simplify_path.o
|
||||
lib-y += skip_whitespace.o
|
||||
lib-y += speed_table.o
|
||||
lib-y += str_tolower.o
|
||||
lib-y += trim.o
|
||||
lib-y += u_signal_names.o
|
||||
lib-y += udp_io.o
|
||||
|
13
libbb/str_tolower.c
Normal file
13
libbb/str_tolower.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* vi set: sw=4 ts=4: */
|
||||
/* Convert string str to lowercase, return str.
|
||||
*
|
||||
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
|
||||
*/
|
||||
#include "libbb.h"
|
||||
char* str_tolower(char *str)
|
||||
{
|
||||
char *c;
|
||||
for (c = str; *c; ++c)
|
||||
*c = tolower(*c);
|
||||
return str;
|
||||
}
|
@ -34,7 +34,7 @@ static off_t beg_range; /* Range at which continue begins */
|
||||
#if ENABLE_FEATURE_WGET_STATUSBAR
|
||||
static off_t transferred; /* Number of bytes transferred so far */
|
||||
#endif
|
||||
static int chunked; /* chunked transfer encoding */
|
||||
static bool chunked; /* chunked transfer encoding */
|
||||
#if ENABLE_FEATURE_WGET_STATUSBAR
|
||||
static void progressmeter(int flag);
|
||||
static const char *curfile; /* Name of current file being transferred */
|
||||
@ -76,9 +76,7 @@ static char *safe_fgets(char *s, int size, FILE *stream)
|
||||
}
|
||||
|
||||
#if ENABLE_FEATURE_WGET_AUTHENTICATION
|
||||
/*
|
||||
* Base64-encode character string and return the string.
|
||||
*/
|
||||
/* Base64-encode character string and return the string. */
|
||||
static char *base64enc(unsigned char *p, char *buf, int len)
|
||||
{
|
||||
bb_uuencode(p, buf, len, bb_uuenc_tbl_base64);
|
||||
@ -96,7 +94,7 @@ int wget_main(int argc, char **argv)
|
||||
int port;
|
||||
int try = 5;
|
||||
unsigned opt;
|
||||
char *s;
|
||||
char *str;
|
||||
char *proxy = 0;
|
||||
char *dir_prefix = NULL;
|
||||
#if ENABLE_FEATURE_WGET_LONG_OPTIONS
|
||||
@ -104,20 +102,20 @@ int wget_main(int argc, char **argv)
|
||||
llist_t *headers_llist = NULL;
|
||||
#endif
|
||||
|
||||
/* server.allocated = target.allocated = NULL; */
|
||||
|
||||
FILE *sfp = NULL; /* socket to web/ftp server */
|
||||
FILE *dfp = NULL; /* socket to ftp server (data) */
|
||||
char *fname_out = NULL; /* where to direct output (-O) */
|
||||
int got_clen = 0; /* got content-length: from server */
|
||||
bool got_clen = 0; /* got content-length: from server */
|
||||
int output_fd = -1;
|
||||
int use_proxy = 1; /* Use proxies if env vars are set */
|
||||
bool use_proxy = 1; /* Use proxies if env vars are set */
|
||||
const char *proxy_flag = "on"; /* Use proxies if env vars are set */
|
||||
const char *user_agent = "Wget";/* Content of the "User-Agent" header field */
|
||||
|
||||
/*
|
||||
* Crack command line.
|
||||
*/
|
||||
const char *user_agent = "Wget";/* "User-Agent" header field */
|
||||
static const char * const keywords[] = {
|
||||
"content-length", "transfer-encoding", "chunked", "location", NULL
|
||||
};
|
||||
enum {
|
||||
KEY_content_length = 1, KEY_transfer_encoding, KEY_chunked, KEY_location
|
||||
};
|
||||
enum {
|
||||
WGET_OPT_CONTINUE = 0x1,
|
||||
WGET_OPT_SPIDER = 0x2,
|
||||
@ -131,7 +129,7 @@ int wget_main(int argc, char **argv)
|
||||
};
|
||||
#if ENABLE_FEATURE_WGET_LONG_OPTIONS
|
||||
static const struct option wget_long_options[] = {
|
||||
// name, has_arg, flag, val
|
||||
/* name, has_arg, flag, val */
|
||||
{ "continue", no_argument, NULL, 'c' },
|
||||
{ "spider", no_argument, NULL, 's' },
|
||||
{ "quiet", no_argument, NULL, 'q' },
|
||||
@ -145,6 +143,7 @@ int wget_main(int argc, char **argv)
|
||||
};
|
||||
applet_long_options = wget_long_options;
|
||||
#endif
|
||||
/* server.allocated = target.allocated = NULL; */
|
||||
opt_complementary = "-1" USE_FEATURE_WGET_LONG_OPTIONS(":\xfe::");
|
||||
opt = getopt32(argc, argv, "csqO:P:Y:U:",
|
||||
&fname_out, &dir_prefix,
|
||||
@ -152,7 +151,7 @@ int wget_main(int argc, char **argv)
|
||||
USE_FEATURE_WGET_LONG_OPTIONS(, &headers_llist)
|
||||
);
|
||||
if (strcmp(proxy_flag, "off") == 0) {
|
||||
/* Use the proxy if necessary. */
|
||||
/* Use the proxy if necessary */
|
||||
use_proxy = 0;
|
||||
}
|
||||
#if ENABLE_FEATURE_WGET_LONG_OPTIONS
|
||||
@ -176,9 +175,7 @@ int wget_main(int argc, char **argv)
|
||||
server.host = target.host;
|
||||
server.port = target.port;
|
||||
|
||||
/*
|
||||
* Use the proxy if necessary.
|
||||
*/
|
||||
/* Use the proxy if necessary */
|
||||
if (use_proxy) {
|
||||
proxy = getenv(target.is_ftp ? "ftp_proxy" : "http_proxy");
|
||||
if (proxy && *proxy) {
|
||||
@ -217,9 +214,7 @@ int wget_main(int argc, char **argv)
|
||||
if ((opt & WGET_OPT_CONTINUE) && !fname_out)
|
||||
bb_error_msg_and_die("cannot specify continue (-c) without a filename (-O)"); */
|
||||
|
||||
/*
|
||||
* Determine where to start transfer.
|
||||
*/
|
||||
/* Determine where to start transfer */
|
||||
if (LONE_DASH(fname_out)) {
|
||||
output_fd = 1;
|
||||
opt &= ~WGET_OPT_CONTINUE;
|
||||
@ -253,15 +248,11 @@ int wget_main(int argc, char **argv)
|
||||
if (!--try)
|
||||
bb_error_msg_and_die("too many redirections");
|
||||
|
||||
/*
|
||||
* Open socket to http server
|
||||
*/
|
||||
/* Open socket to http server */
|
||||
if (sfp) fclose(sfp);
|
||||
sfp = open_socket(lsa);
|
||||
|
||||
/*
|
||||
* Send HTTP request.
|
||||
*/
|
||||
/* Send HTTP request. */
|
||||
if (use_proxy) {
|
||||
fprintf(sfp, "GET %stp://%s/%s HTTP/1.1\r\n",
|
||||
target.is_ftp ? "f" : "ht", target.host,
|
||||
@ -299,12 +290,12 @@ int wget_main(int argc, char **argv)
|
||||
if (fgets(buf, sizeof(buf), sfp) == NULL)
|
||||
bb_error_msg_and_die("no response from server");
|
||||
|
||||
s = buf;
|
||||
while (*s != '\0' && !isspace(*s)) ++s;
|
||||
s = skip_whitespace(s);
|
||||
str = buf;
|
||||
str = skip_non_whitespace(str);
|
||||
str = skip_whitespace(str);
|
||||
// FIXME: no error check
|
||||
// xatou wouldn't work: "200 OK"
|
||||
status = atoi(s);
|
||||
status = atoi(str);
|
||||
switch (status) {
|
||||
case 0:
|
||||
case 100:
|
||||
@ -331,26 +322,28 @@ int wget_main(int argc, char **argv)
|
||||
/*
|
||||
* Retrieve HTTP headers.
|
||||
*/
|
||||
while ((s = gethdr(buf, sizeof(buf), sfp, &n)) != NULL) {
|
||||
if (strcasecmp(buf, "content-length") == 0) {
|
||||
content_len = BB_STRTOOFF(s, NULL, 10);
|
||||
while ((str = gethdr(buf, sizeof(buf), sfp, &n)) != NULL) {
|
||||
/* gethdr did already convert the "FOO:" string to lowercase */
|
||||
smalluint key = index_in_str_array(keywords, *&buf) + 1;
|
||||
if (key == KEY_content_length) {
|
||||
content_len = BB_STRTOOFF(str, NULL, 10);
|
||||
if (errno || content_len < 0) {
|
||||
bb_error_msg_and_die("content-length %s is garbage", s);
|
||||
bb_error_msg_and_die("content-length %s is garbage", str);
|
||||
}
|
||||
got_clen = 1;
|
||||
continue;
|
||||
}
|
||||
if (strcasecmp(buf, "transfer-encoding") == 0) {
|
||||
if (strcasecmp(s, "chunked") != 0)
|
||||
bb_error_msg_and_die("server wants to do %s transfer encoding", s);
|
||||
if (key == KEY_transfer_encoding) {
|
||||
if (index_in_str_array(keywords, str_tolower(str)) + 1 != KEY_chunked)
|
||||
bb_error_msg_and_die("server wants to do %s transfer encoding", str);
|
||||
chunked = got_clen = 1;
|
||||
}
|
||||
if (strcasecmp(buf, "location") == 0) {
|
||||
if (s[0] == '/')
|
||||
if (key == KEY_location) {
|
||||
if (str[0] == '/')
|
||||
/* free(target.allocated); */
|
||||
target.path = /* target.allocated = */ xstrdup(s+1);
|
||||
target.path = /* target.allocated = */ xstrdup(str+1);
|
||||
else {
|
||||
parse_url(s, &target);
|
||||
parse_url(str, &target);
|
||||
if (use_proxy == 0) {
|
||||
server.host = target.host;
|
||||
server.port = target.port;
|
||||
@ -381,14 +374,14 @@ int wget_main(int argc, char **argv)
|
||||
* Splitting username:password pair,
|
||||
* trying to log in
|
||||
*/
|
||||
s = strchr(target.user, ':');
|
||||
if (s)
|
||||
*(s++) = '\0';
|
||||
str = strchr(target.user, ':');
|
||||
if (str)
|
||||
*(str++) = '\0';
|
||||
switch (ftpcmd("USER ", target.user, sfp, buf)) {
|
||||
case 230:
|
||||
break;
|
||||
case 331:
|
||||
if (ftpcmd("PASS ", s, sfp, buf) == 230)
|
||||
if (ftpcmd("PASS ", str, sfp, buf) == 230)
|
||||
break;
|
||||
/* FALLTHRU (failed login) */
|
||||
default:
|
||||
@ -418,15 +411,15 @@ int wget_main(int argc, char **argv)
|
||||
// Response is "227 garbageN1,N2,N3,N4,P1,P2[)garbage]
|
||||
// Server's IP is N1.N2.N3.N4 (we ignore it)
|
||||
// Server's port for data connection is P1*256+P2
|
||||
s = strrchr(buf, ')');
|
||||
if (s) s[0] = '\0';
|
||||
s = strrchr(buf, ',');
|
||||
if (!s) goto pasv_error;
|
||||
port = xatou_range(s+1, 0, 255);
|
||||
*s = '\0';
|
||||
s = strrchr(buf, ',');
|
||||
if (!s) goto pasv_error;
|
||||
port += xatou_range(s+1, 0, 255) * 256;
|
||||
str = strrchr(buf, ')');
|
||||
if (str) str[0] = '\0';
|
||||
str = strrchr(buf, ',');
|
||||
if (!str) goto pasv_error;
|
||||
port = xatou_range(str+1, 0, 255);
|
||||
*str = '\0';
|
||||
str = strrchr(buf, ',');
|
||||
if (!str) goto pasv_error;
|
||||
port += xatou_range(str+1, 0, 255) * 256;
|
||||
set_nport(lsa, htons(port));
|
||||
dfp = open_socket(lsa);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user