40 #ifndef CURL_DISABLE_FTP 56 #define FTP_BUFFER_ALLOCSIZE 160 73 PL_UNIX_TOTALSIZE_INIT = 0,
74 PL_UNIX_TOTALSIZE_READING
78 PL_UNIX_HLINKS_PRESPACE = 0,
83 PL_UNIX_USER_PRESPACE = 0,
88 PL_UNIX_GROUP_PRESPACE = 0,
93 PL_UNIX_SIZE_PRESPACE = 0,
98 PL_UNIX_TIME_PREPART1 = 0,
107 PL_UNIX_FILENAME_PRESPACE = 0,
109 PL_UNIX_FILENAME_WINDOWSEOL
113 PL_UNIX_SYMLINK_PRESPACE = 0,
120 PL_UNIX_SYMLINK_WINDOWSEOL
133 PL_WINNT_TIME_PRESPACE = 0,
137 PL_WINNT_DIRORSIZE_PRESPACE = 0,
138 PL_WINNT_DIRORSIZE_CONTENT
141 PL_WINNT_FILENAME_PRESPACE = 0,
143 PL_WINNT_FILENAME_WINEOL
196 return pl_data->
error;
200 #define FTP_LP_MALFORMATED_PERM 0x01000000 207 permissions |= 1 << 8;
208 else if(str[0] !=
'-')
211 permissions |= 1 << 7;
212 else if(str[1] !=
'-')
216 permissions |= 1 << 6;
217 else if(str[2] ==
's') {
218 permissions |= 1 << 6;
219 permissions |= 1 << 11;
221 else if(str[2] ==
'S')
222 permissions |= 1 << 11;
223 else if(str[2] !=
'-')
227 permissions |= 1 << 5;
228 else if(str[3] !=
'-')
231 permissions |= 1 << 4;
232 else if(str[4] !=
'-')
235 permissions |= 1 << 3;
236 else if(str[5] ==
's') {
237 permissions |= 1 << 3;
238 permissions |= 1 << 10;
240 else if(str[5] ==
'S')
241 permissions |= 1 << 10;
242 else if(str[5] !=
'-')
246 permissions |= 1 << 2;
247 else if(str[6] !=
'-')
250 permissions |= 1 << 1;
251 else if(str[7] !=
'-')
255 else if(str[8] ==
't') {
257 permissions |= 1 << 9;
259 else if(str[8] ==
'T')
260 permissions |= 1 << 9;
261 else if(str[8] !=
'-')
333 size_t bufflen = size*nmemb;
352 if(parser->
os_type == OS_TYPE_UNKNOWN && bufflen > 0) {
354 parser->
os_type = (buffer[0] >=
'0' && buffer[0] <=
'9') ?
355 OS_TYPE_WIN_NT : OS_TYPE_UNIX;
378 finfo = &infop->
info;
402 switch(parser->
state.
UNIX.sub.total_dirsize) {
403 case PL_UNIX_TOTALSIZE_INIT:
405 parser->
state.
UNIX.sub.total_dirsize = PL_UNIX_TOTALSIZE_READING;
415 case PL_UNIX_TOTALSIZE_READING:
423 if(strncmp(
"total ", finfo->
b_data, 6) == 0) {
424 char *endptr = finfo->
b_data + 6;
483 if(!strchr(
"rwx-tTsS", c)) {
506 parser->
state.
UNIX.sub.hlinks = PL_UNIX_HLINKS_PRESPACE;
511 case PL_UNIX_HLINKS_PRESPACE:
513 if(c >=
'0' && c <=
'9') {
516 parser->
state.
UNIX.sub.hlinks = PL_UNIX_HLINKS_NUMBER;
524 case PL_UNIX_HLINKS_NUMBER:
531 if(p[0] ==
'\0' && hlinks != LONG_MAX && hlinks != LONG_MIN) {
538 parser->
state.
UNIX.sub.user = PL_UNIX_USER_PRESPACE;
540 else if(c < '0' || c >
'9') {
549 case PL_UNIX_USER_PRESPACE:
553 parser->
state.
UNIX.sub.user = PL_UNIX_USER_PARSING;
556 case PL_UNIX_USER_PARSING:
562 parser->
state.
UNIX.sub.group = PL_UNIX_GROUP_PRESPACE;
571 case PL_UNIX_GROUP_PRESPACE:
575 parser->
state.
UNIX.sub.group = PL_UNIX_GROUP_NAME;
578 case PL_UNIX_GROUP_NAME:
584 parser->
state.
UNIX.sub.size = PL_UNIX_SIZE_PRESPACE;
593 case PL_UNIX_SIZE_PRESPACE:
595 if(c >=
'0' && c <=
'9') {
598 parser->
state.
UNIX.sub.size = PL_UNIX_SIZE_NUMBER;
606 case PL_UNIX_SIZE_NUMBER:
622 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PREPART1;
634 case PL_UNIX_TIME_PREPART1:
639 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PART1;
647 case PL_UNIX_TIME_PART1:
650 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PREPART2;
652 else if(!
ISALNUM(c) && c !=
'.') {
657 case PL_UNIX_TIME_PREPART2:
661 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PART2;
669 case PL_UNIX_TIME_PART2:
672 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PREPART3;
674 else if(!
ISALNUM(c) && c !=
'.') {
679 case PL_UNIX_TIME_PREPART3:
683 parser->
state.
UNIX.sub.time = PL_UNIX_TIME_PART3;
691 case PL_UNIX_TIME_PART3:
703 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_PRESPACE;
707 parser->
state.
UNIX.sub.filename = PL_UNIX_FILENAME_PRESPACE;
710 else if(!
ISALNUM(c) && c !=
'.' && c !=
':') {
718 switch(parser->
state.
UNIX.sub.filename) {
719 case PL_UNIX_FILENAME_PRESPACE:
723 parser->
state.
UNIX.sub.filename = PL_UNIX_FILENAME_NAME;
726 case PL_UNIX_FILENAME_NAME:
729 parser->
state.
UNIX.sub.filename = PL_UNIX_FILENAME_WINDOWSEOL;
742 case PL_UNIX_FILENAME_WINDOWSEOL:
762 case PL_UNIX_SYMLINK_PRESPACE:
766 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
769 case PL_UNIX_SYMLINK_NAME:
772 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET1;
774 else if(c ==
'\r' || c ==
'\n') {
779 case PL_UNIX_SYMLINK_PRETARGET1:
782 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET2;
784 else if(c ==
'\r' || c ==
'\n') {
789 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
792 case PL_UNIX_SYMLINK_PRETARGET2:
795 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET3;
797 else if(c ==
'\r' || c ==
'\n') {
802 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
805 case PL_UNIX_SYMLINK_PRETARGET3:
808 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_PRETARGET4;
815 else if(c ==
'\r' || c ==
'\n') {
820 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_NAME;
823 case PL_UNIX_SYMLINK_PRETARGET4:
824 if(c !=
'\r' && c !=
'\n') {
825 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_TARGET;
834 case PL_UNIX_SYMLINK_TARGET:
837 parser->
state.
UNIX.sub.symlink = PL_UNIX_SYMLINK_WINDOWSEOL;
850 case PL_UNIX_SYMLINK_WINDOWSEOL:
871 switch(parser->
state.
NT.main) {
875 if(!strchr(
"0123456789-", c)) {
883 parser->
state.
NT.sub.time = PL_WINNT_TIME_PRESPACE;
897 switch(parser->
state.
NT.sub.time) {
898 case PL_WINNT_TIME_PRESPACE:
900 parser->
state.
NT.sub.time = PL_WINNT_TIME_TIME;
903 case PL_WINNT_TIME_TIME:
908 parser->
state.
NT.sub.dirorsize = PL_WINNT_DIRORSIZE_PRESPACE;
911 else if(!strchr(
"APM0123456789:", c)) {
919 switch(parser->
state.
NT.sub.dirorsize) {
920 case PL_WINNT_DIRORSIZE_PRESPACE:
927 parser->
state.
NT.sub.dirorsize = PL_WINNT_DIRORSIZE_CONTENT;
930 case PL_WINNT_DIRORSIZE_CONTENT:
942 &endptr, 10, &finfo->
size)) {
953 parser->
state.
NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
959 switch(parser->
state.
NT.sub.filename) {
960 case PL_WINNT_FILENAME_PRESPACE:
964 parser->
state.
NT.sub.filename = PL_WINNT_FILENAME_CONTENT;
967 case PL_WINNT_FILENAME_CONTENT:
970 parser->
state.
NT.sub.filename = PL_WINNT_FILENAME_WINEOL;
983 parser->
state.
NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
986 case PL_WINNT_FILENAME_WINEOL:
995 parser->
state.
NT.sub.filename = PL_WINNT_FILENAME_PRESPACE;
struct ftp_parselist_data::@24 offsets
int(* curl_fnmatch_callback)(void *ptr, const char *pattern, const char *string)
struct ftp_parselist_data * parser
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT
#define CURLFINFOFLAG_KNOWN_PERM
void Curl_ftp_parselist_data_free(struct ftp_parselist_data **pl_data)
struct curl_fileinfo::@5 strings
static void PL_ERROR(struct connectdata *conn, CURLcode err)
struct curl_llist_element * tail
struct ftp_parselist_data::@23::@25 UNIX
int Curl_fnmatch(void *ptr, const char *pattern, const char *string)
struct fileinfo * file_data
#define CURLFINFOFLAG_KNOWN_SIZE
#define realloc(ptr, size)
curl_fnmatch_callback fnmatch
bool add(const actionlib::TwoIntsGoal &req, actionlib::TwoIntsResult &res)
struct fileinfo * Curl_fileinfo_alloc(void)
UNITTEST_START int result
static int ftp_pl_get_permission(const char *str)
CURLofft curlx_strtoofft(const char *str, char **endp, int base, curl_off_t *num)
struct curl_llist filelist
CURL_TYPEOF_CURL_OFF_T curl_off_t
size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, void *connptr)
struct curl_llist_element list
static CURLcode ftp_pl_insert_finfo(struct connectdata *conn, struct fileinfo *infop)
union ftp_parselist_data::@23 state
#define FTP_LP_MALFORMATED_PERM
static struct curl_llist llist
testing Curl_llist_insert_next case 1: list is empty : 1: list size will be 1 2: list head will hold ...
CURLcode Curl_ftp_parselist_geterror(struct ftp_parselist_data *pl_data)
#define FTP_BUFFER_ALLOCSIZE
Now implemented:
void Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e, const void *p, struct curl_llist_element *ne)
struct ftp_parselist_data::@23::@26 NT
enum ftp_parselist_data::@22 os_type
struct WildcardData wildcard
void Curl_fileinfo_dtor(void *user, void *element)
struct curl_fileinfo info
#define calloc(nbelem, size)
struct ftp_parselist_data * Curl_ftp_parselist_data_alloc(void)