25 static int lock_sema = -1;
45 gethostbyname_res_pkt gethostbyname_res_pkt;
46 dns_setserver_pkt dns_setserver_pkt;
47 dns_getserver_res_pkt dns_getserver_res_pkt;
54 static ip_addr_t dns_servers[DNS_MAX_SERVERS];
61 extern void _ps2sdk_ps2ipc_init(
void);
62 extern void _ps2sdk_ps2ipc_deinit(
void);
75 if(sceSifBindRpc(&_ps2ip, PS2IP_IRX, 0) < 0)
78 if(_ps2ip.server != NULL)
86 sema.option = (u32)
"ps2ipc";
88 lock_sema = CreateSema(&sema);
90 _ps2sdk_ps2ipc_init();
95 void ps2ip_deinit(
void)
97 _ps2sdk_ps2ipc_deinit();
100 DeleteSema(lock_sema);
103 memset(&_ps2ip, 0,
sizeof(_ps2ip));
106 int ps2ipc_accept(
int s,
struct sockaddr *addr,
int *addrlen)
109 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
111 if(!_ps2ip.server)
return -1;
117 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_ACCEPT, 0, (
void*)pkt,
sizeof(s32), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
119 SignalSema(lock_sema);
125 if(pkt->len < *addrlen) *addrlen = pkt->len;
126 memcpy((
void *)addr, (
void *)&pkt->sockaddr, *addrlen);
129 result = pkt->socket;
131 SignalSema(lock_sema);
136 int ps2ipc_bind(
int s,
const struct sockaddr *name,
int namelen)
138 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
141 if(!_ps2ip.server)
return -1;
147 memcpy((
void *)&pkt->sockaddr, (
void *)name,
sizeof(
struct sockaddr));
149 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_BIND, 0, (
void*)pkt,
sizeof(
cmd_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
151 SignalSema(lock_sema);
155 result = _rpc_buffer.result;
157 SignalSema(lock_sema);
162 int ps2ipc_disconnect(
int s)
166 if(!_ps2ip.server)
return -1;
172 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_DISCONNECT, 0, (
void*)&_rpc_buffer.s,
sizeof(s32), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
174 SignalSema(lock_sema);
178 result = _rpc_buffer.result;
180 SignalSema(lock_sema);
185 int ps2ipc_connect(
int s,
const struct sockaddr *name,
int namelen)
188 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
190 if(!_ps2ip.server)
return -1;
196 memcpy((
void *)&pkt->sockaddr, (
void *)name,
sizeof(
struct sockaddr));
198 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_CONNECT, 0, (
void*)pkt,
sizeof(
cmd_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
200 SignalSema(lock_sema);
204 result = _rpc_buffer.result;
206 SignalSema(lock_sema);
211 int ps2ipc_listen(
int s,
int backlog)
216 if(!_ps2ip.server)
return -1;
221 pkt->backlog = backlog;
223 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_LISTEN, 0, (
void*)pkt,
sizeof(
listen_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
225 SignalSema(lock_sema);
229 result = _rpc_buffer.result;
231 SignalSema(lock_sema);
236 static void recv_intr(
void *data_raw)
238 rests_pkt *rests = UNCACHED_SEG(data_raw);
242 for(i = 0; i < rests->ssize; i++)
243 rests->sbuf[i] = rests->sbuffer[i];
246 for(i = 0; i < rests->esize; i++)
247 rests->ebuf[i] = rests->ebuffer[i];
251 int ps2ipc_recv(
int s,
void *mem,
int len,
unsigned int flags)
255 r_recv_pkt *recv_pkt = &_rpc_buffer.r_recv_pkt;
257 if(!_ps2ip.server)
return -1;
267 if( !IS_UNCACHED_SEG(mem))
268 sceSifWriteBackDCache(mem, len);
271 (
void*)recv_pkt,
sizeof(
r_recv_pkt), recv_intr, _intr_data) < 0)
273 SignalSema(lock_sema);
277 result = recv_pkt->ret;
279 SignalSema(lock_sema);
284 int ps2ipc_recvfrom(
int s,
void *mem,
int len,
unsigned int flags,
285 struct sockaddr *from,
int *fromlen)
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);
304 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_RECVFROM, 0, (
void*)
send_pkt,
sizeof(
s_recv_pkt),
305 (
void*)recv_pkt,
sizeof(
r_recv_pkt), recv_intr, _intr_data) < 0)
307 SignalSema(lock_sema);
311 memcpy((
void *)from, (
void *)&recv_pkt->sockaddr,
sizeof(
struct sockaddr));
314 result = recv_pkt->ret;
316 SignalSema(lock_sema);
321 int ps2ipc_send(
int s,
const void *dataptr,
int size,
unsigned int flags)
324 send_pkt *pkt = &_rpc_buffer.send_pkt;
332 pkt->ee_addr = (
void *)dataptr;
334 if((u32)dataptr & 0x3f)
336 miss = 64 - ((u32)dataptr & 0x3f);
337 if(miss > size) miss = size;
346 if( !IS_UNCACHED_SEG(dataptr))
347 sceSifWriteBackDCache((
void *)dataptr, size);
349 memcpy((
void *)pkt->
malign_buff, UNCACHED_SEG(dataptr), miss);
351 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SEND, 0, (
void*)pkt,
sizeof(
send_pkt),
352 (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
354 SignalSema(lock_sema);
358 result = _rpc_buffer.result;
360 SignalSema(lock_sema);
365 int ps2ipc_sendto(
int s,
const void *dataptr,
int size,
unsigned int flags,
366 const struct sockaddr *to,
int tolen)
369 send_pkt *pkt = &_rpc_buffer.send_pkt;
379 pkt->ee_addr = (
void *)dataptr;
380 memcpy((
void *)&pkt->sockaddr, (
void *)to,
sizeof(
struct sockaddr));
382 if((u32)dataptr & 0x3f)
384 miss = 64 - ((u32)dataptr & 0x3f);
385 if(miss > size) miss = size;
394 if( !IS_UNCACHED_SEG(dataptr))
395 sceSifWriteBackDCache((
void *)dataptr, size);
397 memcpy((
void *)pkt->
malign_buff, UNCACHED_SEG(dataptr), miss);
399 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SENDTO, 0, (
void*)pkt,
sizeof(
send_pkt),
400 (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
402 SignalSema(lock_sema);
406 result = _rpc_buffer.result;
408 SignalSema(lock_sema);
413 int ps2ipc_socket(
int domain,
int type,
int protocol)
418 if(!_ps2ip.server)
return -1;
422 pkt->domain = domain;
424 pkt->protocol = protocol;
426 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SOCKET, 0, (
void*)pkt,
sizeof(
socket_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
428 SignalSema(lock_sema);
432 result = _rpc_buffer.result;
434 SignalSema(lock_sema);
439 int ps2ipc_ps2ip_setconfig(
const t_ip_info *ip_info)
443 if(!_ps2ip.server)
return -1;
448 memcpy(&_rpc_buffer.ip_info, ip_info,
sizeof(
t_ip_info));
450 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)
452 SignalSema(lock_sema);
456 result = _rpc_buffer.result;
458 SignalSema(lock_sema);
463 int ps2ipc_ps2ip_getconfig(
char *netif_name,
t_ip_info *ip_info)
465 if(!_ps2ip.server)
return -1;
470 strncpy(_rpc_buffer.netif_name, netif_name,
sizeof(_rpc_buffer.netif_name));
471 _rpc_buffer.netif_name[
sizeof(_rpc_buffer.netif_name) - 1] =
'\0';
473 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)
475 SignalSema(lock_sema);
480 memcpy(ip_info, &_rpc_buffer.ip_info,
sizeof(
t_ip_info));
482 SignalSema(lock_sema);
494 memset(dst, 0,
sizeof(*dst));
495 if (src == NULL)
return;
496 if (maxfdp1 > (
int)(
sizeof(dst->fd_bits) * 8))
497 maxfdp1 = (int)(
sizeof(dst->fd_bits) * 8);
498 for (i = 0; i < maxfdp1; i++) {
499 if (FD_ISSET(i, src)) {
500 dst->fd_bits[i >> 3] |= (
unsigned char)(1U << (i & 7));
508 if (dst == NULL)
return;
510 if (maxfdp1 > (
int)(
sizeof(src->fd_bits) * 8))
511 maxfdp1 = (int)(
sizeof(src->fd_bits) * 8);
512 for (i = 0; i < maxfdp1; i++) {
513 if (src->fd_bits[i >> 3] & (1U << (i & 7))) {
519 int ps2ipc_select(
int maxfdp1,
struct fd_set *readset,
struct fd_set *writeset,
struct fd_set *exceptset,
struct timeval *timeout)
524 if(!_ps2ip.server)
return -1;
528 pkt->maxfdp1 = maxfdp1;
529 pkt->readset_p = (
void *)readset;
530 pkt->writeset_p = (
void *)writeset;
531 pkt->exceptset_p = (
void *)exceptset;
532 pkt->timeout_p = timeout;
535 pkt->timeout_sec = (s32)timeout->tv_sec;
536 pkt->timeout_usec = (s32)timeout->tv_usec;
539 ps2ipc_pack_fdset(&pkt->readset, readset, maxfdp1);
540 ps2ipc_pack_fdset(&pkt->writeset, writeset, maxfdp1);
541 ps2ipc_pack_fdset(&pkt->exceptset, exceptset, maxfdp1);
543 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SELECT, 0, (
void*)pkt,
sizeof(
select_pkt), (
void*)pkt,
sizeof(
select_pkt), NULL, NULL) < 0)
545 SignalSema(lock_sema);
551 timeout->tv_sec = pkt->timeout_sec;
552 timeout->tv_usec = pkt->timeout_usec;
555 ps2ipc_unpack_fdset(readset, &pkt->readset, maxfdp1);
556 ps2ipc_unpack_fdset(writeset, &pkt->writeset, maxfdp1);
557 ps2ipc_unpack_fdset(exceptset, &pkt->exceptset, maxfdp1);
559 result = pkt->result;
561 SignalSema(lock_sema);
566 int ps2ipc_ioctl(
int s,
long cmd,
void *argp)
571 if(!_ps2ip.server)
return -1;
579 pkt->value = *(s32*)argp;
581 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_IOCTL, 0, (
void*)pkt,
sizeof(
ioctl_pkt), (
void*)pkt,
sizeof(
ioctl_pkt), NULL, NULL) < 0)
583 SignalSema(lock_sema);
588 *(s32*)argp = pkt->value;
590 result = pkt->result;
592 SignalSema(lock_sema);
597 int ps2ipc_getsockname(
int s,
struct sockaddr *name,
int *namelen)
600 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
602 if(!_ps2ip.server)
return -1;
608 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKNAME, 0, (
void*)pkt,
sizeof(pkt->socket), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
610 SignalSema(lock_sema);
614 if(pkt->len < *namelen) *namelen = pkt->len;
615 memcpy((
void *)name, (
void *)&pkt->sockaddr, *namelen);
617 result = pkt->socket;
619 SignalSema(lock_sema);
624 int ps2ipc_getpeername(
int s,
struct sockaddr *name,
int *namelen)
627 cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
629 if(!_ps2ip.server)
return -1;
635 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETPEERNAME, 0, (
void*)pkt,
sizeof(pkt->socket), (
void*)pkt,
sizeof(
cmd_pkt), NULL, NULL) < 0)
637 SignalSema(lock_sema);
641 if(pkt->len < *namelen) *namelen = pkt->len;
642 memcpy((
void *)name, (
void *)&pkt->sockaddr, *namelen);
644 result = pkt->socket;
646 SignalSema(lock_sema);
651 int ps2ipc_getsockopt(
int s,
int level,
int optname,
void* optval, socklen_t* optlen)
657 if(!_ps2ip.server)
return -1;
663 pkt->optname = optname;
667 SignalSema(lock_sema);
671 if(res_pkt->optlen < *optlen) *optlen = res_pkt->optlen;
672 memcpy((
void*)optval, res_pkt->buffer, *optlen);
674 result = res_pkt->result;
676 SignalSema(lock_sema);
681 int ps2ipc_setsockopt(
int s,
int level,
int optname,
const void *optval, socklen_t optlen)
686 if(!_ps2ip.server)
return -1;
692 pkt->optname = optname;
693 pkt->optlen = optlen;
695 memcpy(pkt->buffer, optval, optlen);
697 if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SETSOCKOPT, 0, (
void*)pkt,
sizeof(
setsockopt_pkt), (
void*)&_rpc_buffer.result,
sizeof(s32), NULL, NULL) < 0)
699 SignalSema(lock_sema);
703 result = _rpc_buffer.result;
705 SignalSema(lock_sema);
711 struct hostent *ps2ipc_gethostbyname(
const char *name)
713 gethostbyname_res_pkt *res_pkt = &_rpc_buffer.gethostbyname_res_pkt;
719 if(!_ps2ip.server)
return NULL;
724 strncpy(_rpc_buffer.hostname, name,
sizeof(_rpc_buffer.hostname));
725 _rpc_buffer.hostname[
sizeof(_rpc_buffer.hostname) - 1] =
'\0';
726 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)
728 if(res_pkt->result == 0)
730 hostent.h_addrtype = res_pkt->hostent.h_addrtype;
731 hostent.h_length = res_pkt->hostent.h_length;
734 memcpy(&addr, &res_pkt->hostent.h_addr,
sizeof(addr));
735 addr_list[0] = &addr;
737 hostent.h_addr_list = (
char**)&addr_list;
742 SignalSema(lock_sema);
747 void ps2ipc_dns_setserver(u8 numdns,
const ip_addr_t *dnsserver)
749 dns_setserver_pkt *pkt = &_rpc_buffer.dns_setserver_pkt;
751 if(!_ps2ip.server)
return;
755 pkt->numdns = numdns;
756 pkt->dnsserver = (dnsserver != NULL) ? (*dnsserver) : *
IP4_ADDR_ANY;
758 sceSifCallRpc(&_ps2ip, PS2IPS_ID_DNS_SETSERVER, 0, (
void*)pkt,
sizeof(dns_setserver_pkt), NULL, 0, NULL, NULL);
760 if (numdns < DNS_MAX_SERVERS)
761 dns_servers[numdns] = (dnsserver != NULL) ? (*dnsserver) : *
IP4_ADDR_ANY;
763 SignalSema(lock_sema);
766 const ip_addr_t *ps2ipc_dns_getserver(u8 numdns)
768 dns_getserver_res_pkt *res_pkt = &_rpc_buffer.dns_getserver_res_pkt;
771 if ((!_ps2ip.server) || (numdns >= DNS_MAX_SERVERS))
776 _rpc_buffer.numdns = numdns;
777 dns = &dns_servers[numdns];
780 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)
781 ip_addr_copy(*dns, res_pkt->dnsserver);
783 SignalSema(lock_sema);