26static SifRpcClientData_t _ps2ip;
45 gethostbyname_res_pkt gethostbyname_res_pkt;
46 dns_setserver_pkt dns_setserver_pkt;
47 dns_getserver_res_pkt dns_getserver_res_pkt;
61#ifndef DNS_MAX_SERVERS
62#define DNS_MAX_SERVERS 2
65#define IPADDR_ANY ((u32)0x00000000UL)
68#define IPADDR4_INIT(u32val) { u32val }
71#define ip_addr_copy(dest, src) ((dest).addr = (src).addr)
74#ifndef LWIP_DNS_API_DECLARE_STRUCTS
85static ip_addr_t dns_servers[DNS_MAX_SERVERS];
89const ip_addr_t ip_addr_any = IPADDR4_INIT(
IPADDR_ANY);
91#define IP4_ADDR_ANY (&ip_addr_any)
95extern void _ps2sdk_ps2ipc_init(
void);
96extern void _ps2sdk_ps2ipc_deinit(
void);
101 if (HasIopRebootedSinceLastCall())
109 if(sceSifBindRpc(&_ps2ip, PS2IP_IRX, 0) < 0)
112 if(_ps2ip.server != NULL)
120 sema.option = (u32)
"ps2ipc";
122 lock_sema = CreateSema(&sema);
124 _ps2sdk_ps2ipc_init();
129void ps2ip_deinit(
void)
131 _ps2sdk_ps2ipc_deinit();
134 DeleteSema(lock_sema);
137 memset(&_ps2ip, 0,
sizeof(_ps2ip));
140int ps2ipc_accept(
int s,
struct sockaddr *addr, socklen_t *addrlen)
143 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
145 if(!_ps2ip.server)
return -1;
151 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_ACCEPT, 0, (
void*)pkt,
sizeof(s32), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
153 SignalSema(lock_sema);
159 if((socklen_t)pkt->len < *addrlen) *addrlen = (socklen_t)pkt->len;
160 memcpy((
void *)addr, (
void *)&pkt->sockaddr, *addrlen);
163 result = pkt->socket;
165 SignalSema(lock_sema);
170int ps2ipc_bind(
int s,
const struct sockaddr *name, socklen_t namelen)
172 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
175 if(!_ps2ip.server)
return -1;
181 memcpy((
void *)&pkt->sockaddr, (
void *)name,
sizeof(
struct sockaddr));
183 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_BIND, 0, (
void*)pkt,
sizeof(
cmd_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
185 SignalSema(lock_sema);
189 result = _rpc_buffer.result;
191 SignalSema(lock_sema);
196int ps2ipc_disconnect(
int s)
200 if(!_ps2ip.server)
return -1;
206 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_DISCONNECT, 0, (
void*)&_rpc_buffer.s,
sizeof(s32), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
208 SignalSema(lock_sema);
212 result = _rpc_buffer.result;
214 SignalSema(lock_sema);
219int ps2ipc_connect(
int s,
const struct sockaddr *name, socklen_t namelen)
222 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
224 if(!_ps2ip.server)
return -1;
230 memcpy((
void *)&pkt->sockaddr, (
void *)name,
sizeof(
struct sockaddr));
232 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_CONNECT, 0, (
void*)pkt,
sizeof(
cmd_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
234 SignalSema(lock_sema);
238 result = _rpc_buffer.result;
240 SignalSema(lock_sema);
245int ps2ipc_listen(
int s,
int backlog)
250 if(!_ps2ip.server)
return -1;
255 pkt->backlog = backlog;
257 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_LISTEN, 0, (
void*)pkt,
sizeof(
listen_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
259 SignalSema(lock_sema);
263 result = _rpc_buffer.result;
265 SignalSema(lock_sema);
270static void recv_intr(
void *data_raw)
272 rests_pkt *rests = UNCACHED_SEG(data_raw);
276 for(i = 0; i < rests->ssize; i++)
277 rests->sbuf[i] = rests->sbuffer[i];
280 for(i = 0; i < rests->esize; i++)
281 rests->ebuf[i] = rests->ebuffer[i];
285int ps2ipc_recv(
int s,
void *
mem,
int len,
unsigned int flags)
289 r_recv_pkt *recv_pkt = &_rpc_buffer.r_recv_pkt;
291 if(!_ps2ip.server)
return -1;
301 if( !IS_UNCACHED_SEG(
mem))
302 sceSifWriteBackDCache(
mem, len);
305 (
void*)recv_pkt,
sizeof(
r_recv_pkt), recv_intr, _intr_data) < 0)
307 SignalSema(lock_sema);
311 result = recv_pkt->ret;
313 SignalSema(lock_sema);
318int ps2ipc_recvfrom(
int s,
void *
mem,
int len,
unsigned int flags,
319 struct sockaddr *from, socklen_t *fromlen)
323 r_recv_pkt *recv_pkt = &_rpc_buffer.r_recv_pkt;
325 if(!_ps2ip.server)
return -1;
335 if( !IS_UNCACHED_SEG(
mem))
336 sceSifWriteBackDCache(
mem, len);
338 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_RECVFROM, 0, (
void*)
send_pkt,
sizeof(
s_recv_pkt),
339 (
void*)recv_pkt,
sizeof(
r_recv_pkt), recv_intr, _intr_data) < 0)
341 SignalSema(lock_sema);
345 memcpy((
void *)from, (
void *)&recv_pkt->sockaddr,
sizeof(
struct sockaddr));
348 result = recv_pkt->ret;
350 SignalSema(lock_sema);
355int ps2ipc_send(
int s,
const void *dataptr,
int size,
unsigned int flags)
358 send_pkt *pkt = &_rpc_buffer.send_pkt;
366 pkt->ee_addr = (
void *)dataptr;
368 if((u32)dataptr & 0x3f)
370 miss = 64 - ((u32)dataptr & 0x3f);
371 if(miss > size) miss = size;
380 if( !IS_UNCACHED_SEG(dataptr))
381 sceSifWriteBackDCache((
void *)dataptr, size);
383 memcpy((
void *)pkt->
malign_buff, UNCACHED_SEG(dataptr), miss);
385 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SEND, 0, (
void*)pkt,
sizeof(
send_pkt),
386 (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
388 SignalSema(lock_sema);
392 result = _rpc_buffer.result;
394 SignalSema(lock_sema);
399int ps2ipc_sendto(
int s,
const void *dataptr,
int size,
unsigned int flags,
400 const struct sockaddr *to, socklen_t tolen)
403 send_pkt *pkt = &_rpc_buffer.send_pkt;
413 pkt->ee_addr = (
void *)dataptr;
414 memcpy((
void *)&pkt->sockaddr, (
void *)to,
sizeof(
struct sockaddr));
416 if((u32)dataptr & 0x3f)
418 miss = 64 - ((u32)dataptr & 0x3f);
419 if(miss > size) miss = size;
428 if( !IS_UNCACHED_SEG(dataptr))
429 sceSifWriteBackDCache((
void *)dataptr, size);
431 memcpy((
void *)pkt->
malign_buff, UNCACHED_SEG(dataptr), miss);
433 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SENDTO, 0, (
void*)pkt,
sizeof(
send_pkt),
434 (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
436 SignalSema(lock_sema);
440 result = _rpc_buffer.result;
442 SignalSema(lock_sema);
447int ps2ipc_socket(
int domain,
int type,
int protocol)
452 if(!_ps2ip.server)
return -1;
456 pkt->domain = domain;
458 pkt->protocol = protocol;
460 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SOCKET, 0, (
void*)pkt,
sizeof(
socket_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
462 SignalSema(lock_sema);
466 result = _rpc_buffer.result;
468 SignalSema(lock_sema);
473int ps2ipc_ps2ip_setconfig(
const t_ip_info *ip_info)
477 if(!_ps2ip.server)
return -1;
482 memcpy(&_rpc_buffer.ip_info, ip_info,
sizeof(
t_ip_info));
484 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SETCONFIG, 0, (
void*)&_rpc_buffer.ip_info,
sizeof(
t_ip_info), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
486 SignalSema(lock_sema);
490 result = _rpc_buffer.result;
492 SignalSema(lock_sema);
497int ps2ipc_ps2ip_getconfig(
char *netif_name,
t_ip_info *ip_info)
499 if(!_ps2ip.server)
return -1;
504 strlcpy(_rpc_buffer.netif_name, netif_name,
sizeof(_rpc_buffer.netif_name));
506 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETCONFIG, 0, (
void*)_rpc_buffer.netif_name,
sizeof(_rpc_buffer.netif_name), (
void*)&_rpc_buffer.ip_info,
sizeof(
t_ip_info), NULL, NULL) < 0)
508 SignalSema(lock_sema);
513 memcpy(ip_info, &_rpc_buffer.ip_info,
sizeof(
t_ip_info));
515 SignalSema(lock_sema);
527 memset(dst, 0,
sizeof(*dst));
528 if (src == NULL)
return;
529 if (maxfdp1 > (
int)(
sizeof(dst->fd_bits) * 8))
530 maxfdp1 = (int)(
sizeof(dst->fd_bits) * 8);
531 for (i = 0; i < maxfdp1; i++) {
532 if (FD_ISSET(i, src)) {
533 dst->fd_bits[i >> 3] |= (
unsigned char)(1U << (i & 7));
541 if (dst == NULL)
return;
543 if (maxfdp1 > (
int)(
sizeof(src->fd_bits) * 8))
544 maxfdp1 = (int)(
sizeof(src->fd_bits) * 8);
545 for (i = 0; i < maxfdp1; i++) {
546 if (src->fd_bits[i >> 3] & (1U << (i & 7))) {
552int ps2ipc_select(
int maxfdp1,
struct fd_set *readset,
struct fd_set *writeset,
struct fd_set *exceptset,
struct timeval *timeout)
557 if(!_ps2ip.server)
return -1;
561 pkt->maxfdp1 = maxfdp1;
562 pkt->readset_p = (
void *)readset;
563 pkt->writeset_p = (
void *)writeset;
564 pkt->exceptset_p = (
void *)exceptset;
565 pkt->timeout_p = timeout;
568 pkt->timeout_sec = (s32)timeout->tv_sec;
569 pkt->timeout_usec = (s32)timeout->tv_usec;
572 ps2ipc_pack_fdset(&pkt->readset, readset, maxfdp1);
573 ps2ipc_pack_fdset(&pkt->writeset, writeset, maxfdp1);
574 ps2ipc_pack_fdset(&pkt->exceptset, exceptset, maxfdp1);
576 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SELECT, 0, (
void*)pkt,
sizeof(
select_pkt), (
void*)pkt,
sizeof(
select_pkt), NULL, NULL) < 0)
578 SignalSema(lock_sema);
584 timeout->tv_sec = pkt->timeout_sec;
585 timeout->tv_usec = pkt->timeout_usec;
588 ps2ipc_unpack_fdset(readset, &pkt->readset, maxfdp1);
589 ps2ipc_unpack_fdset(writeset, &pkt->writeset, maxfdp1);
590 ps2ipc_unpack_fdset(exceptset, &pkt->exceptset, maxfdp1);
592 result = pkt->result;
594 SignalSema(lock_sema);
599int ps2ipc_ioctl(
int s,
long cmd,
void *argp)
604 if(!_ps2ip.server)
return -1;
612 pkt->value = *(s32*)argp;
614 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_IOCTL, 0, (
void*)pkt,
sizeof(
ioctl_pkt), (
void*)pkt,
sizeof(
ioctl_pkt), NULL, NULL) < 0)
616 SignalSema(lock_sema);
621 *(s32*)argp = pkt->value;
623 result = pkt->result;
625 SignalSema(lock_sema);
630int ps2ipc_getsockname(
int s,
struct sockaddr *name, socklen_t *namelen)
633 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
635 if(!_ps2ip.server)
return -1;
641 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKNAME, 0, (
void*)pkt,
sizeof(pkt->socket), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
643 SignalSema(lock_sema);
647 if((socklen_t)pkt->len < *namelen) *namelen = (socklen_t)pkt->len;
648 memcpy((
void *)name, (
void *)&pkt->sockaddr, *namelen);
650 result = pkt->socket;
652 SignalSema(lock_sema);
657int ps2ipc_getpeername(
int s,
struct sockaddr *name, socklen_t *namelen)
660 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
662 if(!_ps2ip.server)
return -1;
668 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETPEERNAME, 0, (
void*)pkt,
sizeof(pkt->socket), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
670 SignalSema(lock_sema);
674 if((socklen_t)pkt->len < *namelen) *namelen = (socklen_t)pkt->len;
675 memcpy((
void *)name, (
void *)&pkt->sockaddr, *namelen);
677 result = pkt->socket;
679 SignalSema(lock_sema);
684int ps2ipc_getsockopt(
int s,
int level,
int optname,
void* optval, socklen_t* optlen)
690 if(!_ps2ip.server)
return -1;
696 pkt->optname = optname;
700 SignalSema(lock_sema);
704 if(res_pkt->optlen < *optlen) *optlen = res_pkt->optlen;
705 memcpy((
void*)optval, res_pkt->buffer, *optlen);
707 result = res_pkt->result;
709 SignalSema(lock_sema);
714int ps2ipc_setsockopt(
int s,
int level,
int optname,
const void *optval, socklen_t optlen)
719 if(!_ps2ip.server)
return -1;
725 pkt->optname = optname;
726 pkt->optlen = optlen;
728 memcpy(pkt->buffer, optval, optlen);
730 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SETSOCKOPT, 0, (
void*)pkt,
sizeof(
setsockopt_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
732 SignalSema(lock_sema);
736 result = _rpc_buffer.result;
738 SignalSema(lock_sema);
744struct hostent *ps2ipc_gethostbyname(
const char *name)
746 gethostbyname_res_pkt *res_pkt = &_rpc_buffer.gethostbyname_res_pkt;
748 static ip_addr_t addr;
749 static ip_addr_t *addr_list[2];
752 if(!_ps2ip.server)
return NULL;
757 strlcpy(_rpc_buffer.hostname, name,
sizeof(_rpc_buffer.hostname));
758 if(sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETHOSTBYNAME, 0, (
void*)_rpc_buffer.hostname,
sizeof(_rpc_buffer.hostname), (
void*)res_pkt,
sizeof(gethostbyname_res_pkt), NULL, NULL) >=0)
760 if(res_pkt->result == 0)
762 hostent.h_addrtype = res_pkt->hostent.h_addrtype;
763 hostent.h_length = res_pkt->hostent.h_length;
766 memcpy(&addr, &res_pkt->hostent.h_addr,
sizeof(addr));
767 addr_list[0] = &addr;
769 hostent.h_addr_list = (
char**)&addr_list;
774 SignalSema(lock_sema);
779void ps2ipc_dns_setserver(u8 numdns,
const ip_addr_t *dnsserver)
781 dns_setserver_pkt *pkt = &_rpc_buffer.dns_setserver_pkt;
783 if(!_ps2ip.server)
return;
787 pkt->numdns = numdns;
788 pkt->dnsserver = (dnsserver != NULL) ? (*dnsserver) : *
IP4_ADDR_ANY;
790 sceSifCallRpc(&_ps2ip, PS2IPS_ID_DNS_SETSERVER, 0, (
void*)pkt,
sizeof(dns_setserver_pkt), NULL, 0, NULL, NULL);
792 if (numdns < DNS_MAX_SERVERS)
793 dns_servers[numdns] = (dnsserver != NULL) ? (*dnsserver) : *
IP4_ADDR_ANY;
795 SignalSema(lock_sema);
798const ip_addr_t *ps2ipc_dns_getserver(u8 numdns)
800 dns_getserver_res_pkt *res_pkt = &_rpc_buffer.dns_getserver_res_pkt;
803 if ((!_ps2ip.server) || (numdns >= DNS_MAX_SERVERS))
808 _rpc_buffer.numdns = numdns;
809 dns = &dns_servers[numdns];
812 if(sceSifCallRpc(&_ps2ip, PS2IPS_ID_DNS_GETSERVER, 0, (
void*)&_rpc_buffer.numdns,
sizeof(u8), (
void*)res_pkt,
sizeof(dns_getserver_res_pkt), NULL, NULL) >=0)
813 ip_addr_copy(*dns, res_pkt->dnsserver);
815 SignalSema(lock_sema);