mirror of
https://github.com/curl/curl.git
synced 2025-09-08 05:15:08 +03:00
parent
4a686ee6b0
commit
3b4e84c44f
|
@ -396,18 +396,12 @@ static CURLcode unix_filetype(const char c, curlfiletype *t)
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode parse_unix(struct Curl_easy *data,
|
static CURLcode parse_unix_totalsize(struct ftp_parselist_data *parser,
|
||||||
struct ftp_parselist_data *parser,
|
|
||||||
struct fileinfo *infop,
|
struct fileinfo *infop,
|
||||||
const char c)
|
const char c)
|
||||||
{
|
{
|
||||||
struct curl_fileinfo *finfo = &infop->info;
|
|
||||||
size_t len = curlx_dyn_len(&infop->buf);
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
char *mem = curlx_dyn_ptr(&infop->buf);
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
CURLcode result = CURLE_OK;
|
|
||||||
|
|
||||||
switch(parser->state.UNIX.main) {
|
|
||||||
case PL_UNIX_TOTALSIZE:
|
|
||||||
switch(parser->state.UNIX.sub.total_dirsize) {
|
switch(parser->state.UNIX.sub.total_dirsize) {
|
||||||
case PL_UNIX_TOTALSIZE_INIT:
|
case PL_UNIX_TOTALSIZE_INIT:
|
||||||
if(c == 't') {
|
if(c == 't') {
|
||||||
|
@ -447,18 +441,14 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(parser->state.UNIX.main != PL_UNIX_FILETYPE)
|
return CURLE_OK;
|
||||||
break;
|
}
|
||||||
FALLTHROUGH();
|
|
||||||
case PL_UNIX_FILETYPE:
|
static CURLcode parse_unix_permission(struct ftp_parselist_data *parser,
|
||||||
result = unix_filetype(c, &finfo->filetype);
|
struct fileinfo *infop,
|
||||||
if(result)
|
const char c)
|
||||||
return result;
|
{
|
||||||
parser->state.UNIX.main = PL_UNIX_PERMISSION;
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
parser->item_length = 0;
|
|
||||||
parser->item_offset = 1;
|
|
||||||
break;
|
|
||||||
case PL_UNIX_PERMISSION:
|
|
||||||
parser->item_length++;
|
parser->item_length++;
|
||||||
if((parser->item_length <= 9) && !strchr("rwx-tTsS", c))
|
if((parser->item_length <= 9) && !strchr("rwx-tTsS", c))
|
||||||
return CURLE_FTP_BAD_FILE_LIST;
|
return CURLE_FTP_BAD_FILE_LIST;
|
||||||
|
@ -481,8 +471,16 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
parser->state.UNIX.main = PL_UNIX_HLINKS;
|
parser->state.UNIX.main = PL_UNIX_HLINKS;
|
||||||
parser->state.UNIX.sub.hlinks = PL_UNIX_HLINKS_PRESPACE;
|
parser->state.UNIX.sub.hlinks = PL_UNIX_HLINKS_PRESPACE;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_HLINKS:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_hlinks(struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
|
|
||||||
switch(parser->state.UNIX.sub.hlinks) {
|
switch(parser->state.UNIX.sub.hlinks) {
|
||||||
case PL_UNIX_HLINKS_PRESPACE:
|
case PL_UNIX_HLINKS_PRESPACE:
|
||||||
if(c != ' ') {
|
if(c != ' ') {
|
||||||
|
@ -516,8 +514,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_USER:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_user(struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
switch(parser->state.UNIX.sub.user) {
|
switch(parser->state.UNIX.sub.user) {
|
||||||
case PL_UNIX_USER_PRESPACE:
|
case PL_UNIX_USER_PRESPACE:
|
||||||
if(c != ' ' && len) {
|
if(c != ' ' && len) {
|
||||||
|
@ -538,8 +543,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_GROUP:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_group(struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
switch(parser->state.UNIX.sub.group) {
|
switch(parser->state.UNIX.sub.group) {
|
||||||
case PL_UNIX_GROUP_PRESPACE:
|
case PL_UNIX_GROUP_PRESPACE:
|
||||||
if(c != ' ' && len) {
|
if(c != ' ' && len) {
|
||||||
|
@ -560,8 +572,15 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_SIZE:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_size(struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
switch(parser->state.UNIX.sub.size) {
|
switch(parser->state.UNIX.sub.size) {
|
||||||
case PL_UNIX_SIZE_PRESPACE:
|
case PL_UNIX_SIZE_PRESPACE:
|
||||||
if(c != ' ') {
|
if(c != ' ') {
|
||||||
|
@ -596,8 +615,17 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_TIME:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_time(struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
|
struct curl_fileinfo *finfo = &infop->info;
|
||||||
|
|
||||||
switch(parser->state.UNIX.sub.time) {
|
switch(parser->state.UNIX.sub.time) {
|
||||||
case PL_UNIX_TIME_PREPART1:
|
case PL_UNIX_TIME_PREPART1:
|
||||||
if(c != ' ') {
|
if(c != ' ') {
|
||||||
|
@ -662,8 +690,18 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
return CURLE_FTP_BAD_FILE_LIST;
|
return CURLE_FTP_BAD_FILE_LIST;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return CURLE_OK;
|
||||||
case PL_UNIX_FILENAME:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_filename(struct Curl_easy *data,
|
||||||
|
struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
|
||||||
switch(parser->state.UNIX.sub.filename) {
|
switch(parser->state.UNIX.sub.filename) {
|
||||||
case PL_UNIX_FILENAME_PRESPACE:
|
case PL_UNIX_FILENAME_PRESPACE:
|
||||||
if(c != ' ' && len) {
|
if(c != ' ' && len) {
|
||||||
|
@ -682,8 +720,6 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
parser->offsets.filename = parser->item_offset;
|
parser->offsets.filename = parser->item_offset;
|
||||||
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
||||||
result = ftp_pl_insert_finfo(data, infop);
|
result = ftp_pl_insert_finfo(data, infop);
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PL_UNIX_FILENAME_WINDOWSEOL:
|
case PL_UNIX_FILENAME_WINDOWSEOL:
|
||||||
|
@ -692,16 +728,23 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
parser->offsets.filename = parser->item_offset;
|
parser->offsets.filename = parser->item_offset;
|
||||||
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
||||||
result = ftp_pl_insert_finfo(data, infop);
|
result = ftp_pl_insert_finfo(data, infop);
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return CURLE_FTP_BAD_FILE_LIST;
|
result = CURLE_FTP_BAD_FILE_LIST;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
return result;
|
||||||
case PL_UNIX_SYMLINK:
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix_symlink(struct Curl_easy *data,
|
||||||
|
struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
size_t len = curlx_dyn_len(&infop->buf);
|
||||||
|
char *mem = curlx_dyn_ptr(&infop->buf);
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
|
||||||
switch(parser->state.UNIX.sub.symlink) {
|
switch(parser->state.UNIX.sub.symlink) {
|
||||||
case PL_UNIX_SYMLINK_PRESPACE:
|
case PL_UNIX_SYMLINK_PRESPACE:
|
||||||
if(c != ' ' && len) {
|
if(c != ' ' && len) {
|
||||||
|
@ -774,7 +817,7 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
parser->offsets.symlink_target = parser->item_offset;
|
parser->offsets.symlink_target = parser->item_offset;
|
||||||
result = ftp_pl_insert_finfo(data, infop);
|
result = ftp_pl_insert_finfo(data, infop);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
break;
|
||||||
|
|
||||||
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
||||||
}
|
}
|
||||||
|
@ -785,18 +828,68 @@ static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
parser->offsets.symlink_target = parser->item_offset;
|
parser->offsets.symlink_target = parser->item_offset;
|
||||||
result = ftp_pl_insert_finfo(data, infop);
|
result = ftp_pl_insert_finfo(data, infop);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
break;
|
||||||
|
|
||||||
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
parser->state.UNIX.main = PL_UNIX_FILETYPE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return CURLE_FTP_BAD_FILE_LIST;
|
result = CURLE_FTP_BAD_FILE_LIST;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode parse_unix(struct Curl_easy *data,
|
||||||
|
struct ftp_parselist_data *parser,
|
||||||
|
struct fileinfo *infop,
|
||||||
|
const char c)
|
||||||
|
{
|
||||||
|
struct curl_fileinfo *finfo = &infop->info;
|
||||||
|
CURLcode result = CURLE_OK;
|
||||||
|
|
||||||
|
switch(parser->state.UNIX.main) {
|
||||||
|
case PL_UNIX_TOTALSIZE:
|
||||||
|
result = parse_unix_totalsize(parser, infop, c);
|
||||||
|
if(result)
|
||||||
|
break;
|
||||||
|
if(parser->state.UNIX.main != PL_UNIX_FILETYPE)
|
||||||
|
break;
|
||||||
|
FALLTHROUGH();
|
||||||
|
case PL_UNIX_FILETYPE:
|
||||||
|
result = unix_filetype(c, &finfo->filetype);
|
||||||
|
if(!result) {
|
||||||
|
parser->state.UNIX.main = PL_UNIX_PERMISSION;
|
||||||
|
parser->item_length = 0;
|
||||||
|
parser->item_offset = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PL_UNIX_PERMISSION:
|
||||||
|
result = parse_unix_permission(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_HLINKS:
|
||||||
|
result = parse_unix_hlinks(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_USER:
|
||||||
|
result = parse_unix_user(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_GROUP:
|
||||||
|
result = parse_unix_group(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_SIZE:
|
||||||
|
result = parse_unix_size(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_TIME:
|
||||||
|
result = parse_unix_time(parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_FILENAME:
|
||||||
|
result = parse_unix_filename(data, parser, infop, c);
|
||||||
|
break;
|
||||||
|
case PL_UNIX_SYMLINK:
|
||||||
|
result = parse_unix_symlink(data, parser, infop, c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode parse_winnt(struct Curl_easy *data,
|
static CURLcode parse_winnt(struct Curl_easy *data,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user