mirror of
https://github.com/wiiu-env/ftpiiu.git
synced 2024-11-25 19:16:59 +01:00
fix handling of errno and timeouts with that
This commit is contained in:
parent
f02ced383a
commit
4f6a1a8e58
@ -39,6 +39,8 @@ EXPORT_DECL(int, sendto, int s, const void *buffer, int size, int flags, const s
|
|||||||
EXPORT_DECL(int, setsockopt, int s, int level, int optname, void *optval, int optlen);
|
EXPORT_DECL(int, setsockopt, int s, int level, int optname, void *optval, int optlen);
|
||||||
EXPORT_DECL(char *, inet_ntoa, struct in_addr in);
|
EXPORT_DECL(char *, inet_ntoa, struct in_addr in);
|
||||||
EXPORT_DECL(int, inet_aton, const char *cp, struct in_addr *inp);
|
EXPORT_DECL(int, inet_aton, const char *cp, struct in_addr *inp);
|
||||||
|
EXPORT_DECL(int*, get_h_errno, void);
|
||||||
|
EXPORT_DECL(const char*, gai_strerror, int);
|
||||||
|
|
||||||
void InitSocketFunctionPointers(void)
|
void InitSocketFunctionPointers(void)
|
||||||
{
|
{
|
||||||
@ -70,6 +72,8 @@ void InitSocketFunctionPointers(void)
|
|||||||
OS_FIND_EXPORT(nsysnet_handle, setsockopt);
|
OS_FIND_EXPORT(nsysnet_handle, setsockopt);
|
||||||
OS_FIND_EXPORT(nsysnet_handle, inet_ntoa);
|
OS_FIND_EXPORT(nsysnet_handle, inet_ntoa);
|
||||||
OS_FIND_EXPORT(nsysnet_handle, inet_aton);
|
OS_FIND_EXPORT(nsysnet_handle, inet_aton);
|
||||||
|
OS_FIND_EXPORT(nsysnet_handle, get_h_errno);
|
||||||
|
OS_FIND_EXPORT(nsysnet_handle, gai_strerror);
|
||||||
|
|
||||||
unsigned int nn_startupid;
|
unsigned int nn_startupid;
|
||||||
ACInitialize();
|
ACInitialize();
|
||||||
|
@ -48,6 +48,15 @@ extern "C" {
|
|||||||
#define SO_NONBLOCK 0x1016
|
#define SO_NONBLOCK 0x1016
|
||||||
#define SO_MYADDR 0x1013
|
#define SO_MYADDR 0x1013
|
||||||
|
|
||||||
|
#define ENODATA 1
|
||||||
|
#define EISCONN 3
|
||||||
|
#define EWOULDBLOCK 6
|
||||||
|
#define EALREADY 10
|
||||||
|
#define EAGAIN EWOULDBLOCK
|
||||||
|
#define EINVAL 11
|
||||||
|
#define ENOMEM 18
|
||||||
|
#define EINPROGRESS 22
|
||||||
|
|
||||||
#define htonl(x) x
|
#define htonl(x) x
|
||||||
#define htons(x) x
|
#define htons(x) x
|
||||||
#define ntohl(x) x
|
#define ntohl(x) x
|
||||||
@ -88,6 +97,11 @@ extern int (*setsockopt)(int s, int level, int optname, void *optval, int optlen
|
|||||||
extern char * (*inet_ntoa)(struct in_addr in);
|
extern char * (*inet_ntoa)(struct in_addr in);
|
||||||
extern int (*inet_aton)(const char *cp, struct in_addr *inp);
|
extern int (*inet_aton)(const char *cp, struct in_addr *inp);
|
||||||
|
|
||||||
|
extern int *(*get_h_errno)(void);
|
||||||
|
extern const char *(*gai_strerror)(int errno); // huh, gai o.O
|
||||||
|
|
||||||
|
#define geterrno() (*(get_h_errno()))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
11
src/ftp.c
11
src/ftp.c
@ -23,7 +23,6 @@ misrepresented as being the original software.
|
|||||||
3.This notice may not be removed or altered from any source distribution.
|
3.This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include <errno.h>
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -32,11 +31,9 @@ misrepresented as being the original software.
|
|||||||
#include "dynamic_libs/os_functions.h"
|
#include "dynamic_libs/os_functions.h"
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include "dynamic_libs/socket_functions.h"
|
||||||
|
|
||||||
#undef EAGAIN
|
|
||||||
#define EAGAIN 1
|
|
||||||
|
|
||||||
//! TODO: fix those function
|
//! TODO: fix those function
|
||||||
#define gettime() OSGetTick()
|
#define gettime() OSGetTick()
|
||||||
|
#define errno geterrno()
|
||||||
|
|
||||||
#include "ftp.h"
|
#include "ftp.h"
|
||||||
#include "virtualpath.h"
|
#include "virtualpath.h"
|
||||||
@ -391,7 +388,7 @@ static s32 prepare_data_connection(client_t *client, void *callback, void *arg,
|
|||||||
client->data_callback = callback;
|
client->data_callback = callback;
|
||||||
client->data_connection_callback_arg = arg;
|
client->data_connection_callback_arg = arg;
|
||||||
client->data_connection_cleanup = cleanup;
|
client->data_connection_cleanup = cleanup;
|
||||||
client->data_connection_timer = gettime() + SECS_TO_TICKS(30);
|
client->data_connection_timer = gettime() + SECS_TO_TICKS(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -824,8 +821,8 @@ static void process_data_events(client_t *client) {
|
|||||||
} else {
|
} else {
|
||||||
result = client->data_callback(client->data_socket, client->data_connection_callback_arg);
|
result = client->data_callback(client->data_socket, client->data_connection_callback_arg);
|
||||||
}
|
}
|
||||||
// stupid mess up in nintys code EAGAIN is sometimes -1 (recv, should be -11) and sometimes -11 (send)
|
|
||||||
if (result <= 0 && result != -EAGAIN && result != -11) {
|
if (result <= 0 && result != -EAGAIN) {
|
||||||
cleanup_data_resources(client);
|
cleanup_data_resources(client);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
result = write_reply(client, 520, "Closing data connection, error occurred during transfer.");
|
result = write_reply(client, 520, "Closing data connection, error occurred during transfer.");
|
||||||
|
46
src/net.c
46
src/net.c
@ -21,7 +21,6 @@ misrepresented as being the original software.
|
|||||||
3.This notice may not be removed or altered from any source distribution.
|
3.This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include <errno.h>
|
|
||||||
#include <gctypes.h>
|
#include <gctypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -69,32 +68,62 @@ void initialise_network() {
|
|||||||
|
|
||||||
s32 network_socket(u32 domain,u32 type,u32 protocol)
|
s32 network_socket(u32 domain,u32 type,u32 protocol)
|
||||||
{
|
{
|
||||||
return socket(domain, type, protocol);
|
int sock = socket(domain, type, protocol);
|
||||||
|
if(sock < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return sock;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 network_bind(s32 s,struct sockaddr *name,s32 namelen)
|
s32 network_bind(s32 s,struct sockaddr *name,s32 namelen)
|
||||||
{
|
{
|
||||||
return bind(s, name, namelen);
|
int res = bind(s, name, namelen);
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 network_listen(s32 s,u32 backlog)
|
s32 network_listen(s32 s,u32 backlog)
|
||||||
{
|
{
|
||||||
return listen(s, backlog);
|
int res = listen(s, backlog);
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 network_accept(s32 s,struct sockaddr *addr,s32 *addrlen)
|
s32 network_accept(s32 s,struct sockaddr *addr,s32 *addrlen)
|
||||||
{
|
{
|
||||||
return accept(s, addr, addrlen);
|
int res = accept(s, addr, addrlen);
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 network_connect(s32 s,struct sockaddr *addr, s32 addrlen)
|
s32 network_connect(s32 s,struct sockaddr *addr, s32 addrlen)
|
||||||
{
|
{
|
||||||
return connect(s, addr, addrlen);
|
int res = connect(s, addr, addrlen);
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 network_read(s32 s,void *mem,s32 len)
|
s32 network_read(s32 s,void *mem,s32 len)
|
||||||
{
|
{
|
||||||
return recv(s, mem, len, 0);
|
int res = recv(s, mem, len, 0);
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
return -geterrno();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 network_gethostip()
|
u32 network_gethostip()
|
||||||
@ -111,7 +140,7 @@ s32 network_write(s32 s, const void *mem,s32 len)
|
|||||||
int ret = send(s, mem, len, 0);
|
int ret = send(s, mem, len, 0);
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
{
|
{
|
||||||
transfered = ret;
|
transfered = -geterrno();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +161,6 @@ s32 network_close(s32 s)
|
|||||||
|
|
||||||
s32 set_blocking(s32 s, bool blocking) {
|
s32 set_blocking(s32 s, bool blocking) {
|
||||||
s32 block = !blocking;
|
s32 block = !blocking;
|
||||||
|
|
||||||
setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &block, sizeof(block));
|
setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &block, sizeof(block));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
|
||||||
#include "common/common.h"
|
#include "common/common.h"
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include "dynamic_libs/os_functions.h"
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include "dynamic_libs/socket_functions.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user