,
const char* line);
143(
"[FTP; %s] Error closing data connection: %s",
148(
"[FTP; %s] Incomplete data transfer: " 152xxx->
size, &
"s"[xxx->
size== 1]));
156 static const char* kWarningFmt[] =
157{
"[FTP; %s] Server reports restarted download" 159 "[FTP; %s] Restart parse error prevents download" 166(
"[FTP; %s] Premature EOF in data: " 174 CORE_TRACEF((
"[FTP; %s] Transfer size verified (" 183(
"[FTP%s%s] Data connection transfer aborted",
184xxx->
what?
": ":
"", xxx->
what? xxx->
what:
""));
207(
"[FTP%s%s] Lost connection to %s:%hu (%s)",
222 char* line,
size_tmaxlinelen,
241? eIO_Closed : rdstat;
244 if(
len==
sizeof(
buf)) {
250 if(sscanf(
buf,
"%d%n", &c, &m) < 1 || m != 3 || !c
251|| (
buf[m] &&
buf[m] !=
' '&&
buf[m] !=
'-')
257 if(
buf[m] ==
'-')
263 msg+= strspn(
msg,
" \t");
284 char* line,
size_tmaxlinelen,
300 else if(c == 332 || c == 532)
302 else if(c == 110 && (xxx->
data|| xxx->
send))
304sprintf(reason,
"code %d", c);
307 if(status == eIO_Closed || c == 221)
328 if(c == 450 && xxx->
abor) {
333 if((quit && quit == c) || (cXX && c / 100 == cXX))
340 #define s_FTPCommand(x, c, a) s_FTPCommandEx(x, c, a, 0) 350 size_tcmdlen, arglen, linelen;
355cmdlen = strlen(
cmd);
356linelen = cmdlen + 2;
358arglen = *arg ? strlen(arg) : 0;
359linelen += 1 + arglen;
362line = linelen <
sizeof(x_buf) ? x_buf : (
char*)
malloc(linelen + 1);
366memcpy(line,
cmd, cmdlen);
368line[cmdlen++] =
' ';
369memcpy(line + cmdlen, arg, arglen);
372line[cmdlen++] =
'\r';
373line[cmdlen++] =
'\n';
374line[cmdlen] =
'\0';
375 assert(cmdlen == linelen);
382(
"Sending FTP %.*s command (%s)",
383(
int) strcspn(line,
" \t"), line,
396 static const char*
x_4Word(
const char* line,
const charword[4+1])
398 const char* s = strstr(line, word);
399 returns && ((s == line ||
isspace((
unsigned char) s[-1]))
400&& !
isalpha((
unsigned char) s[4])) ? s : 0;
405 size_t lineno,
const char* line)
412 if((s =
x_4Word(line,
"NOOP")) != 0) {
413 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
418 if((s =
x_4Word(line,
"SYST")) != 0) {
419 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
424 if((s =
x_4Word(line,
"SITE")) != 0) {
425 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
430 if((s =
x_4Word(line,
"FEAT")) != 0) {
431 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
436 if((s =
x_4Word(line,
"MDTM")) != 0) {
437 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
442 if((s =
x_4Word(line,
"SIZE")) != 0) {
443 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
448 if((s =
x_4Word(line,
"REST")) != 0) {
449 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
454 if((s =
x_4Word(line,
"MLST")) != 0) {
455 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
460 if((s =
x_4Word(line,
"MLSD")) != 0) {
461 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
466 if((s =
x_4Word(line,
"EPRT")) != 0) {
467 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
472 if((s =
x_4Word(line,
"EPSV")) != 0) {
473 if(s[4 + strspn(s + 4,
" \t")] !=
'*')
497 CORE_TRACEF((
"FTP features parsed from HELP: 0x%04hX", xxx->
feat));
504 size_t lineno,
const char* line)
508 if(
code&& strlen(line) >= 4
510||
isspace((
unsigned char) line[3])
511||
isspace((
unsigned char) line[4]))) {
551 CORE_TRACEF((
"FTP features parsed from FEAT: 0x%04hX", xxx->
feat));
625(
"[FTP; %s:%hu] Server ready, features = 0x%02X",
678 size_t l= strcspn(s,
"\"");
683*
len= (size_t)(s -
str);
686 memmove(s, s + 1, strlen(s + 1) + 1);
698 static const charkCwd[] =
"CWD";
717 else if(
toupper((
unsigned char)(*
cmd)) ==
'X')
719 else if(
toupper((
unsigned char)
cmd[2]) ==
'U')
733}
else if(
toupper((
unsigned char)(*
cmd)) ==
'X')
735 if(
toupper((
unsigned char)(*
cmd)) ==
'R') {
738}
else if(
toupper((
unsigned char)(*
cmd)) ==
'C') {
742 if(
toupper((
unsigned char)
cmd[1]) !=
'W') {
757dir =
buf+ strspn(
buf,
" ");
802dst->
sec+= src->
usec/ 1000000;
824time_t deadline = time(0);
833deadline += (time_t)(timeout->
sec+ (timeout->
usec+ 500000) / 1000000);
838 if(time(0) >= deadline)
862 if(!xxx->
data&& how != 2)
864 if(!xxx->
cntl|| how == 1)
887 intsync = xxx->
sync;
895xxx->
sync= sync ? 1 : 0;
903 unsigned short* port)
914status =
s_FTPCommand(xxx,
"EPSV", port ? 0 :
"ALL");
924 if(!(s = strchr(
buf,
'(')) || !(d = *++s) || *++s != d || *++s != d
925|| sscanf(++s,
"%u%c%n", &p,
buf, &
n) < 2 || p > 0xFFFF
926|| *
buf!= d || s[
n] !=
')') {
930*port = (
unsignedshort) p;
939 unsigned short* port)
957q = c >
buf? c[-1] :
'\0';
958 for(
i= 0;
i< (
unsigned int)(
sizeof(o) /
sizeof(o[0])); ++
i) {
959 if(sscanf(c, &
",%d%n"[!
i], &o[
i], &
code) < 1)
964 if(
i>= (
unsigned int)(
sizeof(o) /
sizeof(o[0]))) {
965 if(!q || q !=
'('|| *c ==
')')
972 assert(
i== (
unsigned int)(
sizeof(o) /
sizeof(o[0])));
974 if(o[
i] < 0 || o[
i] > 255)
977 if(!(
i= (
unsigned int)((((((o[0]<<8) | o[1])<<8) | o[2])<<8) | o[3])))
979 if(
i== (
unsigned int)(-1))
982 if(!(
i= (
unsigned int)((o[4]<<8) | o[5])))
985*port = (
unsignedshort)
i;
1036(
"[FTP; %s] Cannot open data connection to %s:%hu (%s)",
1048 unsigned shortport)
1056memcpy(
buf,
"|1|", 3);
1058sprintf((
buf+ 3) + strlen(
buf+ 3),
"|%hu|", port);
1077 unsigned shortport)
1079 unsigned charoctet[
sizeof(host) +
sizeof(port)];
1080 char buf[80], *s =
buf;
1086memcpy(octet, &host,
sizeof(host));
1087memcpy(octet +
sizeof(host), &port,
sizeof(port));
1088 for(
n= 0;
n<
sizeof(octet); ++
n)
1089s += sprintf(s, &
",%u"[!
n], octet[
n]);
1107 unsigned shortport;
1199(
"[FTP; %s] Cannot accept data connection" 1200 " at :%hu (%s)", xxx->
what,
1224}
else if(
code== 450 ||
code== 550) {
1226status = eIO_Closed;
1275 const char*src, *dst;
1276 size_t len= strcspn(arg,
" \t");
1282 if(*
tmp!=
'"') {
1290 tmp+= strspn(
tmp,
" \t");
1291 if(*
tmp!=
'"') {
1292 len= strcspn(
tmp,
" \t");
1303src && *src && dst && *dst && !
tmp[strspn(
tmp,
" \t")]
1341 size_t lineno,
const char* line)
1370 if(!
n||
n!= strlen(
size))
1408 static const intkDay[12] = {31, 0, 31, 30, 31, 30,
140931, 31, 30, 31, 30, 31};
1410 char* frac = strchr(timestamp,
'.');
1422 if(strlen(frac) != strspn(frac,
kDigits))
1425 len= strlen(timestamp);
1426 if(
len== 15 &&
strncmp(timestamp++,
"191", 3) == 0) {
1428timestamp[0] =
'2';
1429timestamp[1] =
'0';
1430}
else if(
len!= 14)
1437 for(
n= 0;
n< (
int)(
sizeof(field)/
sizeof(field[0])); ++
n) {
1443field[
n] = atoi(
buf);
1446memset(&tm, 0,
sizeof(tm));
1447 if(field[0] < 1970)
1449tm.tm_year = field[0] - 1900;
1450 if(field[1] < 1 || field[1] > 12)
1452tm.tm_mon = field[1] - 1;
1453 if(field[2] < 1 || field[2] > (field[1] != 2
1458|| !(field[0] % 400))))) {
1461tm.tm_mday = field[2];
1462 if(field[3] < 0 || field[3] > 23)
1464tm.tm_hour = field[3];
1465 if(field[4] < 0 || field[4] > 59)
1467tm.tm_min = field[4];
1468 if(field[5] < 0 || field[5] > 60)
1470tm.tm_sec = field[5];
1473 if((
t= timegm(&tm)) == (time_t)(-1))
1478 if((
t= mktime(&tm)) == (time_t)(-1))
1485 if(tm.tm_isdst > 0 &&
n== tm.tm_hour)
1489 n= sprintf(
buf,
"%lu%s%-.9s", (
unsigned long)
t,
1490&
"."[!frac || !*frac], frac ? frac :
"");
1552 size_t lineno,
const char* line)
1556 const char* comment = strrchr(line,
'(');
1558 if(comment && strchr(++comment,
')')
1559&& (
n= strspn(comment,
kDigits)) > 0
1560&& (m = strspn(comment +
n,
" \t")) > 0
1565&
size, &k) < 1 && k != (
int)
n) {
1566 CORE_TRACEF((
"[FTP; %s] Error reading size from \"%.*s\"",
1567xxx->
what, (
int)
n, comment));
1625 size_t lineno,
const char* line)
1634 size_t lineno,
const char* line)
1657 if(
cmd[3] ==
'T') {
1673 size_t lineno,
const char* line)
1697 if(*
cmd==
'F') {
1699status = eIO_Closed;
1703 else if(
code!= 200)
1704status = eIO_Closed;
1717 intabor = xxx->
abor;
1724 if(wait == eIO_Closed) {
1725status = eIO_Closed;
1737 if(
code== 450 && abor) {
1743(
"[FTP%s%s] %spurious response %d from server%s%s",
1744xxx->
what?
"; ":
"", xxx->
what? xxx->
what:
"",
1745xxx->
data?
"Aborting upload due to a s":
"S",
code,
1746*
buf?
": ":
"",
buf));
1750status = eIO_Closed;
1752}
else if(!xxx->
cntl)
1753status = eIO_Closed;
1754 if(status == eIO_Closed)
1757xxx->
abor= abor ? 1 : 0;
1807 if(
size&& s[
size- 1] ==
'\r')
1812 if(!(c = (
const char*) memchr(s,
' ',
size)))
1815 size= (size_t)(c - s);
1816 assert(*c ==
' '|| !*c);
1824status =
s_FTPRename(xxx, c + strspn(c,
" \t"));
1825}
else if((
size== 3 ||
toupper((
unsigned char) c[-4]) ==
'X')
1830status =
s_FTPDir(xxx, s, *c ? c + 1 : c);
1833status =
s_FTPDir(xxx, s, *c ? c + 1 : c);
1973 unsigned shortntry = 0;
2012}
while(++ntry < xxx->
info->max_try);
2015(
"[FTP; %s:%hu] Too many failed attempts (%hu), giving up" 2088xxx->
size+= *n_written;
2089 if(status == eIO_Closed) {
2091(
"[FTP; %s] Data connection lost", xxx->
what));
2099 const char* run = (
const char*) memchr(
buf,
'\n',
size);
2101 if(run && run < (
const char*)
buf+ --
size) {
2111 static const charkIAC[] = {
'\377',
'\377'};
2112 const char* s = (
const char*)
buf;
2124 if(!(p = (
const char*) memchr(s, kIAC[0],
size-
count)))
2127part = (size_t)(p - s);
2136*n_written =
count;
2143 if(status == eIO_Closed && !xxx->
cntl)
2217 if(status == eIO_Closed) {
2224status = eIO_Closed;
2235status = eIO_Closed;
2298 if(status == eIO_Closed &&
code== 221)
2303status = eIO_Closed;
2353 unsigned shortport,
2365 if((host && strlen(host) >=
sizeof(xinfo->
host)) ||
2366(user && strlen(user) >=
sizeof(xinfo->
user)) ||
2367(pass && strlen(pass) >=
sizeof(xinfo->
pass)) ||
2368(path && strlen(path) >=
sizeof(xinfo->
path)) ||
2381 if(!(xxx->
info= xinfo)) {
2391strcpy(xinfo->
host, host);
2392xinfo->
port= port;
2393strcpy(xinfo->
user, user && *user ? user :
"ftp");
2394strcpy(xinfo->
pass, pass ? pass :
"-none@");
2395strcpy(xinfo->
path, path ? path :
"");
2427xxx->
cmcb= cmcb ? *cmcb : kNoCmcb;
2451 unsigned shortport,
std::ofstream out("events_result.xml")
main entry point for tests
static const char * str(char *buf, int n)
int BUF_Write(BUF *pBuf, const void *data, size_t size)
size_t BUF_Read(BUF buf, void *data, size_t size)
void BUF_Destroy(BUF buf)
CONNECTOR FTP_CreateConnectorSimple(const char *host, unsigned short port, const char *user, const char *pass, const char *path, TFTP_Flags flag, const SFTP_Callback *cmcb)
FSetupVTable setup
init meta, may not be NULL
#define CONN_SET_METHOD(meta, method, function, connector)
#define CONN_SET_DEFAULT_TIMEOUT(meta, timeout)
CONNECTOR next
linked list
CONNECTOR FTP_CreateConnector(const SConnNetInfo *info, TFTP_Flags flag, const SFTP_Callback *cmcb)
FDestroy destroy
destroys handle, can be NULL
void * handle
data handle of the connector
SMetaConnector * meta
back link to original meta
char * SOCK_GetPeerAddressStringEx(SOCK sock, char *buf, size_t bufsize, ESOCK_AddressFormat format)
Get textual representation of the socket's peer.
EIO_Status SOCK_SetTimeout(SOCK sock, EIO_Event event, const STimeout *timeout)
Specify timeout for the connection I/O (see SOCK_[Read|Write|Close]()).
void SOCK_DisableOSSendDelay(SOCK sock, int on_off)
Control OS-defined send strategy by disabling/enabling the TCP Nagle algorithm (which is on by defaul...
unsigned int SOCK_HostToNetLong(unsigned int value)
See man for the BSDisms, htonl() and htons().
EIO_Status SOCK_Close(SOCK sock)
Close the SOCK handle, and destroy all relevant internal data.
EIO_Status SOCK_Read(SOCK sock, void *buf, size_t size, size_t *n_read, EIO_ReadMethod how)
Read/peek up to "size" bytes from "sock" to a buffer pointed to by "buf".
EIO_Status SOCK_Status(SOCK sock, EIO_Event direction)
Return low-level socket I/O status of *last* socket operation.
void SOCK_SetCork(SOCK sock, int on_off)
Control OS-defined send strategy by disabling/enabling the TCP layer to send incomplete network frame...
unsigned short SOCK_HostToNetShort(unsigned short value)
See man for the BSDisms, htonl() and htons().
EIO_Status SOCK_Wait(SOCK sock, EIO_Event event, const STimeout *timeout)
Block on the socket until either the specified "event" is available or "timeout" expires (if "timeout...
EIO_Status SOCK_CreateEx(const char *host, unsigned short port, const STimeout *timeout, SOCK *sock, const void *data, size_t size, TSOCK_Flags flags)
[CLIENT-side] Connect client to another(server-side, listening) socket (socket() + connect() [+ selec...
ESwitch SOCK_SetDataLoggingAPI(ESwitch log)
By default data are not logged.
EIO_Status SOCK_Abort(SOCK sock)
If there is outstanding connection or output data pending, cancel it.
EIO_Status LSOCK_AcceptEx(LSOCK lsock, const STimeout *timeout, SOCK *sock, TSOCK_Flags flags)
[SERVER-side] Accept connection from a client.
int SOCK_ntoa(unsigned int addr, char *buf, size_t bufsize)
Convert IP address to a string in dotted notation.
unsigned int SOCK_GetLocalHostAddress(ESwitch reget)
Same as SOCK_GetLocalHostAddress6() only strictly for IPv4.
EIO_Status SOCK_ReadLine(SOCK sock, char *line, size_t size, size_t *n_read)
Read a line from SOCK.
EIO_Status SOCK_Write(SOCK sock, const void *data, size_t size, size_t *n_written, EIO_WriteMethod how)
Write "size" bytes of "data" to "sock".
EIO_Status LSOCK_CreateEx(unsigned short port, unsigned short backlog, LSOCK *lsock, TSOCK_Flags flags)
Same as LSOCK_CreateEx6(,,,, eOff)
ESwitch SOCK_SetDataLogging(SOCK sock, ESwitch log)
Control the data logging for socket "sock" individually.
unsigned short LSOCK_GetPort(LSOCK lsock, ENH_ByteOrder byte_order)
Get socket port number, which it listens on.
EIO_Status LSOCK_Close(LSOCK lsock)
[SERVER-side] Close the listening socket, destroy relevant internal data.
TNCBI_BigCount SOCK_GetCount(SOCK sock, EIO_Event direction)
Get counts of read or written bytes.
const STimeout * SOCK_GetTimeout(SOCK sock, EIO_Event event)
Get the connection's i/o timeout (or NULL, if the timeout is infinite).
@ eSAF_IP
only numeric IP if INET socket, empty otherwise
@ fSOCK_KeepAlive
keep socket alive (if supported by OS)
char http_proxy_host[255+1]
enum ENcbiSwitch ESwitch
Aux.
time_t UTIL_Timezone(void)
Return timezone offset (in seconds West of UTC) for the current time zone.
char http_proxy_user[63+1]
unsigned short http_proxy_port
int ConnNetInfo_SetArgs(SConnNetInfo *net_info, const char *args)
SConnNetInfo * ConnNetInfo_Clone(const SConnNetInfo *net_info)
LOG CORE_GetLOG(void)
Get the log handle that is to be used by the core internals (CORE LOG).
unsigned int usec
microseconds (modulo 1,000,000)
char http_proxy_pass[63+1]
const char * IO_StatusStr(EIO_Status status)
Get the text form of an enum status value.
int ConnNetInfo_SetUserHeader(SConnNetInfo *net_info, const char *header)
void ConnNetInfo_Log(const SConnNetInfo *net_info, ELOG_Level sev, LOG log)
EBProxyType http_proxy_mask
EIO_Event
I/O event (or direction).
#define NCBI_BIGCOUNT_FORMAT_SPEC
EBDebugPrintout debug_printout
const char * http_referer
void ConnNetInfo_Destroy(SConnNetInfo *net_info)
uint64_t TNCBI_BigCount
Big unsigned integer for file size and position.
@ eIO_Timeout
timeout expired before any I/O succeeded
@ eIO_NotSupported
operation is not supported or is not available
@ eIO_Success
everything is fine, no error occurred
@ eIO_Unknown
unknown I/O error (likely fatal but can retry)
@ eIO_InvalidArg
bad argument / parameter value(s) supplied
@ fProxy_Http
$http_proxy used
@ eIO_ReadPlain
read readily available data only, wait if none
@ eIO_WritePlain
write as much as possible, report back how much
@ eIO_WriteOutOfBand
write out-of-band chunk of urgent data (if supp)
@ eIO_WritePersist
write exactly as much as specified, w/waits
@ eIO_ReadWrite
eIO_Read | eIO_Write (also, eCONN_OnFlush)
@ eIO_Open
also serves as no-event indicator in SOCK_Poll
@ eIO_Close
also serves as an error indicator in SOCK_Poll
unsigned int
A callback function used to compare two keys in a database.
if(yy_accept[yy_current_state])
static void text(MDB_val *v)
const struct ncbi::grid::netcache::search::fields::SIZE size
int strncmp(const char *str1, const char *str2, size_t count)
char * strncpy0(char *s1, const char *s2, size_t n)
Copy not more than "n" characters from string "s2" into "s1", and return the result,...
SConnNetInfo * ConnNetInfo_CreateInternal(const char *service)
static EIO_Status x_FTPParseSize(SFTPConnector *xxx, const char *size)
static EIO_Status x_FTPParseReply(SFTPConnector *xxx, int *code, char *line, size_t maxlinelen, FFTPReplyCB replycb)
static EIO_Status s_FTPSyst(SFTPConnector *xxx, const char *cmd)
static EIO_Status x_FTPFeat(SFTPConnector *xxx)
static EIO_Status s_FTPExecute(SFTPConnector *xxx, const STimeout *timeout)
static const STimeout kFailsafeTimeout
static EIO_Status x_FTPRename(SFTPConnector *xxx, const char *src, const char *dst)
static EIO_Status x_FTPNegotiateCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static EIO_Status x_FTPSyncCntl(SFTPConnector *xxx, const STimeout *timeout)
static EIO_Status x_FTPHelpCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static int x_IsLongerTimeout(const STimeout *p1, const STimeout *p2)
EIO_Status(* FFTPReplyCB)(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static EIO_Status x_FTPFeatCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static char * s_VT_Descr(CONNECTOR connector)
static EIO_Status s_VT_Status(CONNECTOR connector, EIO_Event direction)
static EIO_Status x_FTPCompleteUpload(SFTPConnector *xxx, const STimeout *timeout)
static EIO_Status x_FTPRetrieveCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static EIO_Status s_FTPDele(SFTPConnector *xxx, const char *cmd)
static char * x_FTPUnquote(char *str, size_t *len)
static EIO_Status s_VT_Write(CONNECTOR connector, const void *buf, size_t size, size_t *n_written, const STimeout *timeout)
static EIO_Status x_FTPBinary(SFTPConnector *xxx)
static EIO_Status s_VT_Read(CONNECTOR connector, void *buf, size_t size, size_t *n_read, const STimeout *timeout)
static EIO_Status x_FTPNoop(SFTPConnector *xxx)
static EIO_Status s_FTPCommandEx(SFTPConnector *xxx, const char *cmd, const char *arg, int off)
#define s_FTPCommand(x, c, a)
static EIO_Status x_FTPStatCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static EIO_Status x_FTPRest(SFTPConnector *xxx, const char *arg, int out)
static const char * s_VT_GetType(CONNECTOR connector)
static EIO_Status x_FTPDrainReply(SFTPConnector *xxx, int *code, int cXX)
static EIO_Status x_FTPDir(SFTPConnector *xxx, const char *cmd, const char *arg)
static EIO_Status s_FTPRestart(SFTPConnector *xxx, const char *arg)
static EIO_Status s_FTPMlsX(SFTPConnector *xxx, const char *cmd, const STimeout *timeout)
static EIO_Status s_FTPStat(SFTPConnector *xxx, const char *cmd)
static EIO_Status x_FTPActive(SFTPConnector *xxx, LSOCK *lsock, const STimeout *timeout)
static EIO_Status x_FTPFeatures(SFTPConnector *xxx)
static EIO_Status x_FTPOpenData(SFTPConnector *xxx, LSOCK *lsock, const STimeout *timeout)
static EIO_Status s_VT_Close(CONNECTOR connector, const STimeout *timeout)
static EIO_Status x_FTPMlsdCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static EIO_Status x_FTPPort(SFTPConnector *xxx, unsigned int host, unsigned short port)
static EIO_Status x_FTPHelp(SFTPConnector *xxx)
static EIO_Status s_VT_Flush(CONNECTOR connector, const STimeout *timeout)
static EIO_Status s_FTPReply(SFTPConnector *xxx, int *code, char *line, size_t maxlinelen, FFTPReplyCB replycb)
static EIO_Status s_FTPRename(SFTPConnector *xxx, const char *arg)
static EIO_Status x_FTPXfer(SFTPConnector *xxx, const char *cmd, const STimeout *timeout, FFTPReplyCB replycb)
static EIO_Status s_VT_Open(CONNECTOR connector, const STimeout *timeout)
CONNECTOR s_CreateConnector(const SConnNetInfo *info, const char *host, unsigned short port, const char *user, const char *pass, const char *path, TFTP_Flags flag, const SFTP_Callback *cmcb)
static EIO_Status s_FTPMdtm(SFTPConnector *xxx, const char *cmd)
static EIO_Status s_FTPSize(SFTPConnector *xxx, const char *cmd)
static EIO_Status s_FTPNegotiate(SFTPConnector *xxx, const char *cmd)
static EIO_Status x_FTPPassive(SFTPConnector *xxx, const STimeout *timeout)
static EIO_Status x_FTPCloseData(SFTPConnector *xxx, EIO_Event how, const STimeout *timeout)
static EIO_Status x_FTPPasv(SFTPConnector *xxx, unsigned int *host, unsigned short *port)
static void x_FTPCloseCntl(SFTPConnector *xxx, const char *abort)
static void s_Setup(CONNECTOR connector)
static EIO_Status x_FTPAbort(SFTPConnector *xxx, int how, const STimeout *timeout)
static EIO_Status x_DrainData(SFTPConnector *xxx, const STimeout *timeout)
static EIO_Status x_FTPEprt(SFTPConnector *xxx, unsigned int host, unsigned short port)
static EIO_Status x_FTPTelnetSynch(SFTPConnector *xxx)
static EIO_Status s_FTPStore(SFTPConnector *xxx, const char *cmd, const STimeout *timeout)
static EIO_Status s_FTPRetrieve(SFTPConnector *xxx, const char *cmd, const STimeout *timeout)
static EIO_Status s_VT_Wait(CONNECTOR connector, EIO_Event event, const STimeout *timeout)
static EIO_Status x_FTPPollCntl(SFTPConnector *xxx, const STimeout *timeout)
static EIO_Status x_FTPParseMdtm(SFTPConnector *xxx, char *timestamp)
static void x_StoreTimeoutNormalized(STimeout *dst, const STimeout *src)
static EIO_Status x_FTPMlstCB(SFTPConnector *xxx, int code, size_t lineno, const char *line)
static const char kDigits[]
static EIO_Status s_FTPDir(SFTPConnector *xxx, const char *cmd, const char *arg)
static void s_Destroy(CONNECTOR connector)
unsigned short TFTP_Features
static const char * x_4Word(const char *line, const char word[4+1])
static const STimeout kZeroTimeout
static EIO_Status x_FTPEpsv(SFTPConnector *xxx, unsigned int *host, unsigned short *port)
static EIO_Status x_FTPLogin(SFTPConnector *xxx)
#define CORE_LOGF_X(subcode, level, fmt_args)
#define CORE_TRACEF(fmt_args)
#define CORE_LOG(level, message)
static SLJIT_INLINE sljit_ins l(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
static SLJIT_INLINE sljit_ins msg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
const SConnNetInfo * info
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4