void ftp_flush_reply(void) { fd_set ready; struct timeval poll; if(!ftp_connected()) return; #ifdef HAVE_LIBSSH if (ftp->session) return; #endif /* ftp_set_signal(SIGINT, SIG_IGN);*/ fprintf(stderr, "flushing replies...\r"); /* ftp_reply_timeout(10);*/ while(ftp_connected()) { poll.tv_sec = 1; poll.tv_usec = 0; FD_ZERO(&ready); int handle = sock_handle(ftp->ctrl); FD_SET(handle, &ready); if(select(handle+1, &ready, 0, 0, &poll) == 1) ftp_read_reply(); else break; } #if 0 if(ftp_loggedin()) ftp_chdir(ftp->curdir); #endif ftp_set_close_handler(); }
bool socket_stream::get_tcp_nodelay() { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return false; } return acl_get_tcp_nodelay(sock) == 0 ? false : true; }
int socket_stream::get_tcp_recvbuf() { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return -1; } return acl_tcp_get_rcvbuf(sock); }
bool socket_stream::get_tcp_non_blocking() { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return false; } return acl_is_blocking(sock) == 0 ? true : false; }
socket_stream& socket_stream::set_tcp_recvbuf(int size) { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return *this; } acl_tcp_set_rcvbuf(sock, size); return *this; }
socket_stream& socket_stream::set_tcp_solinger(bool on, int linger) { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return *this; } acl_tcp_so_linger(sock, on ? 1 : 0, linger); return *this; }
socket_stream& socket_stream::set_tcp_nodelay(bool on) { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return *this; } acl_tcp_nodelay(sock, on ? 1 : 0); return *this; }
socket_stream& socket_stream::set_tcp_non_blocking(bool on) { ACL_SOCKET sock = sock_handle(); if (sock == ACL_SOCKET_INVALID) { logger_error("invalid socket handle"); return *this; } (void) acl_non_blocking(sock, on ? ACL_NON_BLOCKING : ACL_BLOCKING); return *this; }
int main ( int argc, char* argv[] ) { /* Usage */ if ( argc != 2 ) { fprintf ( stderr, "Usage: %s <Server Name or IPaddress>\n", argv[0] ); return 0; } /* address information */ int listenfd; struct sigaction sa; struct addrinfo servaddr, *rcv; int reuseaddr = 1; // true /* Get the address info */ memset( &servaddr, 0, sizeof( struct addrinfo ) ); servaddr.ai_family = AF_INET; servaddr.ai_socktype = SOCK_STREAM; if ( getaddrinfo( argv[1], PORT, &servaddr, &rcv ) != 0 ) err_handle( "getaddrinfo" ); /* Create the socket */ listenfd = socket( rcv->ai_family, rcv->ai_socktype, rcv->ai_protocol ); if ( listenfd == -1 ) err_handle( "socket" ); /* Enable the socket to reuse the address immediately */ if ( setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof( int ) ) == -1 ) err_handle( "setsockopt" ); /* Bind to the address */ if ( bind( listenfd, rcv->ai_addr, rcv->ai_addrlen ) == -1 ) err_handle( "bind" ); /* Listen */ if ( listen( listenfd, LISTENQ ) == -1 ) err_handle( "listen" ); freeaddrinfo( rcv ); /* Set up the signal handler */ sa.sa_handler = wait_for_child; sigemptyset( &sa.sa_mask ); sa.sa_flags = SA_RESTART; if ( sigaction( SIGCHLD, &sa, NULL) == -1 ) err_handle ( "sigaction" ); /* Main loop */ while (1) { struct sockaddr_in comming_addr; size_t size = sizeof( struct sockaddr_in ); int confd = accept( listenfd, (struct sockaddr*)&comming_addr, &size ); pid_t pid; if ( confd == -1 ) err_handle( "accept" ); printf("Comming connection from %s on port %d \r\n", inet_ntoa(comming_addr.sin_addr), htons(comming_addr.sin_port)); pid = fork(); if ( pid == 0 ) { /* Child process */ close( listenfd ); sock_handle( confd ); close( confd ); return 1; } else { /* Parent process */ if ( pid == -1 ) err_handle( "fork" ); close( confd ); } } close( listenfd ); return 1; }
/* abort routine originally from Cftp by Dieter Baron */ int ftp_abort(FILE *fp) { char buf[4096]; fd_set ready; struct timeval poll; #ifdef HAVE_LIBSSH if(ftp->session) /* FIXME: what? */ return 0; #endif if(!ftp_connected()) return -1; ftp_set_close_handler(); poll.tv_sec = poll.tv_usec = 0; FD_ZERO(&ready); int handle = sock_handle(ftp->ctrl); FD_SET(handle, &ready); if(select(handle+1, &ready, 0, 0, &poll) == 1) { ftp_trace("There is data on the control channel, won't send ABOR\n"); /* read remaining bytes from connection */ while(fp && fread(buf, 1, 4096, fp) > 0) /* LOOP */ ; return 0; } ftp->ti.interrupted = true; ftp_err(_("Waiting for remote to finish abort...\n")); ftp_trace("--> telnet interrupt\n"); if(sock_telnet_interrupt(ftp->ctrl) != 0) ftp_err("telnet interrupt: %s\n", strerror(errno)); /* ftp_cmd("ABOR") won't work here, * we must flush data between the ABOR command and ftp_read_reply() */ sock_krb_printf(ftp->ctrl, "ABOR"); sock_printf(ftp->ctrl, "\r\n"); sock_flush(ftp->ctrl); if(ftp_get_verbosity() == vbDebug) ftp_err("--> [%s] ABOR\n", ftp->url->hostname); else ftp_trace("--> [%s] ABOR\n", ftp->url->hostname); /* read remaining bytes from connection */ while(fp && fread(buf, 1, 4096, fp) > 0) /* LOOP */ ; /* we expect a 426 or 226 reply here... */ ftp_read_reply(); if(ftp->fullcode != 426 && ftp->fullcode != 226) ftp_trace("Huh!? Expected a 426 or 226 reply\n"); /* ... and a 226 or 225 reply here, respectively */ /* FIXME: should skip this reply if prev. reply wasn't 426 or 226 ? */ ftp_read_reply(); if(ftp->fullcode != 226 && ftp->fullcode != 225) ftp_trace("Huh!? Expected a 226 or 225 reply\n"); return -1; }