Skip to content

Commit 2baae75

Browse files
committed
getsockopt/setsockopt
1 parent 36ea2bc commit 2baae75

6 files changed

Lines changed: 57 additions & 5 deletions

File tree

gc/network.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ s32 net_recvfrom(s32 s,void *mem,s32 len,u32 flags,struct sockaddr *from,socklen
175175
s32 net_read(s32 s,void *mem,s32 len);
176176
s32 net_close(s32 s);
177177
s32 net_select(s32 maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,struct timeval *timeout);
178-
s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optlen);
178+
s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t *optlen);
179179
s32 net_setsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optlen);
180180
s32 net_getsockname(s32 s, struct sockaddr *addr, socklen_t *addrlen);
181181
s32 net_ioctl(s32 s, u32 cmd, void *argp);

libogc/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ add_library(ogc STATIC
2020
ogc_sockets/soc_poll.c
2121
ogc_sockets/soc_getsockname.c
2222
ogc_sockets/soc_fcntl.c
23+
ogc_sockets/soc_getsockopt.c
24+
ogc_sockets/soc_setsockopt.c
2325

2426
console.c
2527
lwp_queue.c

libogc/network_wii.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,12 @@ s32 net_select(s32 maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset
10321032
return ret;
10331033
}
10341034

1035+
s32 net_getsockopt(s32 s, u32 level, u32 optname, const void *optval, socklen_t *optlen)
1036+
{
1037+
// not yet implemented
1038+
return -EINVAL;
1039+
}
1040+
10351041
s32 net_setsockopt(s32 s, u32 level, u32 optname, const void *optval, socklen_t optlen)
10361042
{
10371043
s32 ret;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "soc_common.h"
2+
#include <errno.h>
3+
#include <sys/socket.h>
4+
5+
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
6+
{
7+
sockfd = soc_get_fd(sockfd);
8+
if(sockfd < 0) {
9+
errno = -sockfd;
10+
return -1;
11+
}
12+
13+
14+
int ret = net_getsockopt(sockfd, level, optname, optval, optlen);
15+
16+
if (ret<0) {
17+
errno = -ret;
18+
return -1;
19+
}
20+
return 0;
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "soc_common.h"
2+
#include <errno.h>
3+
#include <sys/socket.h>
4+
5+
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen)
6+
{
7+
sockfd = soc_get_fd(sockfd);
8+
if(sockfd < 0) {
9+
errno = -sockfd;
10+
return -1;
11+
}
12+
13+
14+
int ret = net_setsockopt(sockfd, level, optname, optval, optlen);
15+
16+
if (ret<0) {
17+
errno = -ret;
18+
return -1;
19+
}
20+
return 0;
21+
}

lwip/network.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,10 +2102,12 @@ s32 net_select(s32 maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,st
21022102
return nready;
21032103
}
21042104

2105-
s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optlen)
2105+
s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t *optlen)
21062106
{
21072107
s32 err = 0;
21082108
struct netsocket *sock;
2109+
socklen_t optval_len=0;
2110+
if(optlen) optval_len = *optlen;
21092111

21102112
sock = get_socket(s);
21112113
if(sock==NULL) return -ENOTSOCK;
@@ -2120,7 +2122,7 @@ s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optl
21202122
case SO_KEEPALIVE:
21212123
case SO_REUSEADDR:
21222124
case SO_REUSEPORT:
2123-
if(optlen<sizeof(u32)) err = EINVAL;
2125+
if(optval_len<sizeof(u32)) err = EINVAL;
21242126
break;
21252127
default:
21262128
LWIP_DEBUGF(SOCKETS_DEBUG, ("net_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));
@@ -2134,7 +2136,7 @@ s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optl
21342136
switch(optname) {
21352137
case IP_TTL:
21362138
case IP_TOS:
2137-
if(optlen<sizeof(u32)) err = EINVAL;
2139+
if(optval_len<sizeof(u32)) err = EINVAL;
21382140
break;
21392141
default:
21402142
LWIP_DEBUGF(SOCKETS_DEBUG, ("net_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname));
@@ -2145,7 +2147,7 @@ s32 net_getsockopt(s32 s,u32 level,u32 optname,const void *optval,socklen_t optl
21452147

21462148
case IPPROTO_TCP:
21472149
{
2148-
if(optlen<sizeof(u32)) {
2150+
if(optval_len<sizeof(u32)) {
21492151
err = EINVAL;
21502152
break;
21512153
}

0 commit comments

Comments
 (0)