PS2SDK
PS2 Homebrew Libraries
ps2ipc.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
16 #include <tamtypes.h>
17 #include <string.h>
18 #include <kernel.h>
19 #include <sifrpc.h>
20 #include <iopcontrol.h>
21 
22 #include <ps2ips.h>
23 #include <ps2ip_rpc.h>
24 
25 static int lock_sema;
26 static SifRpcClientData_t _ps2ip;
27 static struct {
28  union {
29  s32 result;
30  s32 s; //Generic socket parameter.
31  cmd_pkt cmd_pkt; //Generic command packet, used by multiple functions.
37  t_ip_info ip_info;
38  char netif_name[8];
44  char hostname[256];
45  gethostbyname_res_pkt gethostbyname_res_pkt;
46  dns_setserver_pkt dns_setserver_pkt;
47  dns_getserver_res_pkt dns_getserver_res_pkt;
48  u8 numdns;
49  u8 buffer[512];
50  };
51 } _rpc_buffer __attribute__((aligned(64)));
52 static int _intr_data[32] __attribute__((aligned(64)));
53 
54 static ip_addr_t dns_servers[DNS_MAX_SERVERS];
55 
56 //Copied from LWIP, to be independent of the full LWIP source.
57 /* used by IP4_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */
58 const ip_addr_t ip_addr_any = IPADDR4_INIT(IPADDR_ANY);
59 
60 /* The following are defined in ps2ipc_ps2sdk.c */
61 extern void _ps2sdk_ps2ipc_init(void);
62 extern void _ps2sdk_ps2ipc_deinit(void);
63 
64 int ps2ip_init(void)
65 {
66  ee_sema_t sema;
68  ps2ip_deinit();
69 
70  if (_ps2ip.server)
71  return 0;
72 
73  while(1)
74  {
75  if(sceSifBindRpc(&_ps2ip, PS2IP_IRX, 0) < 0)
76  return -1;
77 
78  if(_ps2ip.server != NULL)
79  break;
80 
81  nopdelay();
82  }
83 
84  sema.init_count = 1;
85  sema.max_count = 1;
86  sema.option = (u32)"ps2ipc";
87  sema.attr = 0;
88  lock_sema = CreateSema(&sema);
89 
90  _ps2sdk_ps2ipc_init();
91 
92  return 0;
93 }
94 
95 void ps2ip_deinit(void)
96 {
97  _ps2sdk_ps2ipc_deinit();
98 
99  if (lock_sema > 0)
100  DeleteSema(lock_sema);
101  lock_sema = 0;
102 
103  memset(&_ps2ip, 0, sizeof(_ps2ip));
104 }
105 
106 int ps2ipc_accept(int s, struct sockaddr *addr, int *addrlen)
107 {
108  int result;
109  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
110 
111  if(!_ps2ip.server) return -1;
112 
113  WaitSema(lock_sema);
114 
115  pkt->socket = s;
116 
117  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_ACCEPT, 0, (void*)pkt, sizeof(s32), (void*)pkt, sizeof(cmd_pkt), NULL, NULL) < 0)
118  {
119  SignalSema(lock_sema);
120  return -1;
121  }
122 
123  if(addr != NULL)
124  {
125  if(pkt->len < *addrlen) *addrlen = pkt->len;
126  memcpy((void *)addr, (void *)&pkt->sockaddr, *addrlen);
127  }
128 
129  result = pkt->socket;
130 
131  SignalSema(lock_sema);
132 
133  return result;
134 }
135 
136 int ps2ipc_bind(int s, const struct sockaddr *name, int namelen)
137 {
138  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
139  int result;
140 
141  if(!_ps2ip.server) return -1;
142 
143  WaitSema(lock_sema);
144 
145  pkt->socket = s;
146  pkt->len = namelen;
147  memcpy((void *)&pkt->sockaddr, (void *)name, sizeof(struct sockaddr));
148 
149  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_BIND, 0, (void*)pkt, sizeof(cmd_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
150  {
151  SignalSema(lock_sema);
152  return -1;
153  }
154 
155  result = _rpc_buffer.result;
156 
157  SignalSema(lock_sema);
158 
159  return result;
160 }
161 
162 int ps2ipc_disconnect(int s)
163 {
164  int result;
165 
166  if(!_ps2ip.server) return -1;
167 
168  WaitSema(lock_sema);
169 
170  _rpc_buffer.s = s;
171 
172  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_DISCONNECT, 0, (void*)&_rpc_buffer.s, sizeof(s32), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
173  {
174  SignalSema(lock_sema);
175  return -1;
176  }
177 
178  result = _rpc_buffer.result;
179 
180  SignalSema(lock_sema);
181 
182  return result;
183 }
184 
185 int ps2ipc_connect(int s, const struct sockaddr *name, int namelen)
186 {
187  int result;
188  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
189 
190  if(!_ps2ip.server) return -1;
191 
192  WaitSema(lock_sema);
193 
194  pkt->socket = s;
195  pkt->len = namelen;
196  memcpy((void *)&pkt->sockaddr, (void *)name, sizeof(struct sockaddr));
197 
198  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_CONNECT, 0, (void*)pkt, sizeof(cmd_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
199  {
200  SignalSema(lock_sema);
201  return -1;
202  }
203 
204  result = _rpc_buffer.result;
205 
206  SignalSema(lock_sema);
207 
208  return result;
209 }
210 
211 int ps2ipc_listen(int s, int backlog)
212 {
213  int result;
214  listen_pkt *pkt = &_rpc_buffer.listen_pkt;
215 
216  if(!_ps2ip.server) return -1;
217 
218  WaitSema(lock_sema);
219 
220  pkt->s = s;
221  pkt->backlog = backlog;
222 
223  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_LISTEN, 0, (void*)pkt, sizeof(listen_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
224  {
225  SignalSema(lock_sema);
226  return -1;
227  }
228 
229  result = _rpc_buffer.result;
230 
231  SignalSema(lock_sema);
232 
233  return result;
234 }
235 
236 static void recv_intr(void *data_raw)
237 {
238  rests_pkt *rests = UNCACHED_SEG(data_raw);
239  int i;
240 
241  if(rests->ssize)
242  for(i = 0; i < rests->ssize; i++)
243  rests->sbuf[i] = rests->sbuffer[i];
244 
245  if(rests->esize)
246  for(i = 0; i < rests->esize; i++)
247  rests->ebuf[i] = rests->ebuffer[i];
248 }
249 
250 
251 int ps2ipc_recv(int s, void *mem, int len, unsigned int flags)
252 {
253  int result;
254  s_recv_pkt *send_pkt = &_rpc_buffer.s_recv_pkt;
255  r_recv_pkt *recv_pkt = &_rpc_buffer.r_recv_pkt;
256 
257  if(!_ps2ip.server) return -1;
258 
259  WaitSema(lock_sema);
260 
261  send_pkt->socket = s;
262  send_pkt->length = len;
263  send_pkt->flags = flags;
264  send_pkt->ee_addr = mem;
265  send_pkt->intr_data = _intr_data;
266 
267  if( !IS_UNCACHED_SEG(mem))
268  sceSifWriteBackDCache(mem, len);
269 
270  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_RECV, 0, (void*)send_pkt, sizeof(s_recv_pkt),
271  (void*)recv_pkt, sizeof(r_recv_pkt), recv_intr, _intr_data) < 0)
272  {
273  SignalSema(lock_sema);
274  return -1;
275  }
276 
277  result = recv_pkt->ret;
278 
279  SignalSema(lock_sema);
280 
281  return result;
282 }
283 
284 int ps2ipc_recvfrom(int s, void *mem, int len, unsigned int flags,
285  struct sockaddr *from, int *fromlen)
286 {
287  int result;
288  s_recv_pkt *send_pkt = &_rpc_buffer.s_recv_pkt;
289  r_recv_pkt *recv_pkt = &_rpc_buffer.r_recv_pkt;
290 
291  if(!_ps2ip.server) return -1;
292 
293  WaitSema(lock_sema);
294 
295  send_pkt->socket = s;
296  send_pkt->length = len;
297  send_pkt->flags = flags;
298  send_pkt->ee_addr = mem;
299  send_pkt->intr_data = _intr_data;
300 
301  if( !IS_UNCACHED_SEG(mem))
302  sceSifWriteBackDCache(mem, len);
303 
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)
306  {
307  SignalSema(lock_sema);
308  return -1;
309  }
310 
311  memcpy((void *)from, (void *)&recv_pkt->sockaddr, sizeof(struct sockaddr));
312  *fromlen = sizeof(struct sockaddr);
313 
314  result = recv_pkt->ret;
315 
316  SignalSema(lock_sema);
317 
318  return result;
319 }
320 
321 int ps2ipc_send(int s, const void *dataptr, int size, unsigned int flags)
322 {
323  int result;
324  send_pkt *pkt = &_rpc_buffer.send_pkt;
325  int miss;
326 
327  WaitSema(lock_sema);
328 
329  pkt->socket = s;
330  pkt->length = size;
331  pkt->flags = flags;
332  pkt->ee_addr = (void *)dataptr;
333 
334  if((u32)dataptr & 0x3f)
335  {
336  miss = 64 - ((u32)dataptr & 0x3f);
337  if(miss > size) miss = size;
338 
339  } else {
340 
341  miss = 0;
342  }
343 
344  pkt->malign = miss;
345 
346  if( !IS_UNCACHED_SEG(dataptr))
347  sceSifWriteBackDCache((void *)dataptr, size);
348 
349  memcpy((void *)pkt->malign_buff, UNCACHED_SEG(dataptr), miss);
350 
351  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SEND, 0, (void*)pkt, sizeof(send_pkt),
352  (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
353  {
354  SignalSema(lock_sema);
355  return -1;
356  }
357 
358  result = _rpc_buffer.result;
359 
360  SignalSema(lock_sema);
361 
362  return result;
363 }
364 
365 int ps2ipc_sendto(int s, const void *dataptr, int size, unsigned int flags,
366  const struct sockaddr *to, int tolen)
367 {
368  int result;
369  send_pkt *pkt = &_rpc_buffer.send_pkt;
370  int miss;
371 
372  (void)tolen;
373 
374  WaitSema(lock_sema);
375 
376  pkt->socket = s;
377  pkt->length = size;
378  pkt->flags = flags;
379  pkt->ee_addr = (void *)dataptr;
380  memcpy((void *)&pkt->sockaddr, (void *)to, sizeof(struct sockaddr));
381 
382  if((u32)dataptr & 0x3f)
383  {
384  miss = 64 - ((u32)dataptr & 0x3f);
385  if(miss > size) miss = size;
386 
387  } else {
388 
389  miss = 0;
390  }
391 
392  pkt->malign = miss;
393 
394  if( !IS_UNCACHED_SEG(dataptr))
395  sceSifWriteBackDCache((void *)dataptr, size);
396 
397  memcpy((void *)pkt->malign_buff, UNCACHED_SEG(dataptr), miss);
398 
399  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SENDTO, 0, (void*)pkt, sizeof(send_pkt),
400  (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
401  {
402  SignalSema(lock_sema);
403  return -1;
404  }
405 
406  result = _rpc_buffer.result;
407 
408  SignalSema(lock_sema);
409 
410  return result;
411 }
412 
413 int ps2ipc_socket(int domain, int type, int protocol)
414 {
415  int result;
416  socket_pkt *pkt = &_rpc_buffer.socket_pkt;
417 
418  if(!_ps2ip.server) return -1;
419 
420  WaitSema(lock_sema);
421 
422  pkt->domain = domain;
423  pkt->type = type;
424  pkt->protocol = protocol;
425 
426  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SOCKET, 0, (void*)pkt, sizeof(socket_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
427  {
428  SignalSema(lock_sema);
429  return -1;
430  }
431 
432  result = _rpc_buffer.result;
433 
434  SignalSema(lock_sema);
435 
436  return result;
437 }
438 
439 int ps2ipc_ps2ip_setconfig(const t_ip_info *ip_info)
440 {
441  int result;
442 
443  if(!_ps2ip.server) return -1;
444 
445  WaitSema(lock_sema);
446 
447  // return config
448  memcpy(&_rpc_buffer.ip_info, ip_info, sizeof(t_ip_info));
449 
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)
451  {
452  SignalSema(lock_sema);
453  return -1;
454  }
455 
456  result = _rpc_buffer.result;
457 
458  SignalSema(lock_sema);
459 
460  return result;
461 }
462 
463 int ps2ipc_ps2ip_getconfig(char *netif_name, t_ip_info *ip_info)
464 {
465  if(!_ps2ip.server) return -1;
466 
467  WaitSema(lock_sema);
468 
469  // call with netif name
470  strlcpy(_rpc_buffer.netif_name, netif_name, sizeof(_rpc_buffer.netif_name));
471 
472  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)
473  {
474  SignalSema(lock_sema);
475  return -1;
476  }
477 
478  // return config
479  memcpy(ip_info, &_rpc_buffer.ip_info, sizeof(t_ip_info));
480 
481  SignalSema(lock_sema);
482 
483  return 1;
484 }
485 
486 /* Marshal between the caller's struct fd_set (newlib, ~128 bytes on EE)
487  * and the on-the-wire ps2ip_rpc_fd_set (MEMP_NUM_NETCONN/8 bytes, fixed
488  * size on both sides). Bit-by-bit copy avoids any reliance on
489  * sizeof(struct fd_set) matching across the RPC boundary. */
490 static void ps2ipc_pack_fdset(ps2ip_rpc_fd_set *dst, struct fd_set *src, int maxfdp1)
491 {
492  int i;
493  memset(dst, 0, sizeof(*dst));
494  if (src == NULL) return;
495  if (maxfdp1 > (int)(sizeof(dst->fd_bits) * 8))
496  maxfdp1 = (int)(sizeof(dst->fd_bits) * 8);
497  for (i = 0; i < maxfdp1; i++) {
498  if (FD_ISSET(i, src)) {
499  dst->fd_bits[i >> 3] |= (unsigned char)(1U << (i & 7));
500  }
501  }
502 }
503 
504 static void ps2ipc_unpack_fdset(struct fd_set *dst, const ps2ip_rpc_fd_set *src, int maxfdp1)
505 {
506  int i;
507  if (dst == NULL) return;
508  FD_ZERO(dst);
509  if (maxfdp1 > (int)(sizeof(src->fd_bits) * 8))
510  maxfdp1 = (int)(sizeof(src->fd_bits) * 8);
511  for (i = 0; i < maxfdp1; i++) {
512  if (src->fd_bits[i >> 3] & (1U << (i & 7))) {
513  FD_SET(i, dst);
514  }
515  }
516 }
517 
518 int ps2ipc_select(int maxfdp1, struct fd_set *readset, struct fd_set *writeset, struct fd_set *exceptset, struct timeval *timeout)
519 {
520  int result;
521  select_pkt *pkt = &_rpc_buffer.select_pkt;
522 
523  if(!_ps2ip.server) return -1;
524 
525  WaitSema(lock_sema);
526 
527  pkt->maxfdp1 = maxfdp1;
528  pkt->readset_p = (void *)readset;
529  pkt->writeset_p = (void *)writeset;
530  pkt->exceptset_p = (void *)exceptset;
531  pkt->timeout_p = timeout;
532  if( timeout )
533  {
534  pkt->timeout_sec = (s32)timeout->tv_sec;
535  pkt->timeout_usec = (s32)timeout->tv_usec;
536  }
537 
538  ps2ipc_pack_fdset(&pkt->readset, readset, maxfdp1);
539  ps2ipc_pack_fdset(&pkt->writeset, writeset, maxfdp1);
540  ps2ipc_pack_fdset(&pkt->exceptset, exceptset, maxfdp1);
541 
542  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SELECT, 0, (void*)pkt, sizeof(select_pkt), (void*)pkt, sizeof(select_pkt), NULL, NULL) < 0)
543  {
544  SignalSema(lock_sema);
545  return -1;
546  }
547 
548  if( timeout )
549  {
550  timeout->tv_sec = pkt->timeout_sec;
551  timeout->tv_usec = pkt->timeout_usec;
552  }
553 
554  ps2ipc_unpack_fdset(readset, &pkt->readset, maxfdp1);
555  ps2ipc_unpack_fdset(writeset, &pkt->writeset, maxfdp1);
556  ps2ipc_unpack_fdset(exceptset, &pkt->exceptset, maxfdp1);
557 
558  result = pkt->result;
559 
560  SignalSema(lock_sema);
561 
562  return result;
563 }
564 
565 int ps2ipc_ioctl(int s, long cmd, void *argp)
566 {
567  int result;
568  ioctl_pkt *pkt = &_rpc_buffer.ioctl_pkt;
569 
570  if(!_ps2ip.server) return -1;
571 
572  WaitSema(lock_sema);
573 
574  pkt->s = s;
575  pkt->cmd = (s32)cmd;
576  pkt->argp = argp;
577  if( argp )
578  pkt->value = *(s32*)argp;
579 
580  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_IOCTL, 0, (void*)pkt, sizeof(ioctl_pkt), (void*)pkt, sizeof(ioctl_pkt), NULL, NULL) < 0)
581  {
582  SignalSema(lock_sema);
583  return -1;
584  }
585 
586  if( argp )
587  *(s32*)argp = pkt->value;
588 
589  result = pkt->result;
590 
591  SignalSema(lock_sema);
592 
593  return result;
594 }
595 
596 int ps2ipc_getsockname(int s, struct sockaddr *name, int *namelen)
597 {
598  int result;
599  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
600 
601  if(!_ps2ip.server) return -1;
602 
603  WaitSema(lock_sema);
604 
605  pkt->socket = s;
606 
607  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKNAME, 0, (void*)pkt, sizeof(pkt->socket), (void*)pkt, sizeof(cmd_pkt), NULL, NULL) < 0)
608  {
609  SignalSema(lock_sema);
610  return -1;
611  }
612 
613  if(pkt->len < *namelen) *namelen = pkt->len;
614  memcpy((void *)name, (void *)&pkt->sockaddr, *namelen);
615 
616  result = pkt->socket;
617 
618  SignalSema(lock_sema);
619 
620  return result;
621 }
622 
623 int ps2ipc_getpeername(int s, struct sockaddr *name, int *namelen)
624 {
625  int result;
626  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
627 
628  if(!_ps2ip.server) return -1;
629 
630  WaitSema(lock_sema);
631 
632  pkt->socket = s;
633 
634  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETPEERNAME, 0, (void*)pkt, sizeof(pkt->socket), (void*)pkt, sizeof(cmd_pkt), NULL, NULL) < 0)
635  {
636  SignalSema(lock_sema);
637  return -1;
638  }
639 
640  if(pkt->len < *namelen) *namelen = pkt->len;
641  memcpy((void *)name, (void *)&pkt->sockaddr, *namelen);
642 
643  result = pkt->socket;
644 
645  SignalSema(lock_sema);
646 
647  return result;
648 }
649 
650 int ps2ipc_getsockopt(int s, int level, int optname, void* optval, socklen_t* optlen)
651 {
652  getsockopt_pkt *pkt = &_rpc_buffer.getsockopt_pkt;
653  getsockopt_res_pkt *res_pkt = &_rpc_buffer.getsockopt_res_pkt;
654  int result;
655 
656  if(!_ps2ip.server) return -1;
657 
658  WaitSema(lock_sema);
659 
660  pkt->s = s;
661  pkt->level = level;
662  pkt->optname = optname;
663 
664  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKOPT, 0, (void*)pkt, sizeof(getsockopt_pkt), (void*)res_pkt, sizeof(getsockopt_res_pkt), NULL, NULL) < 0)
665  {
666  SignalSema(lock_sema);
667  return -1;
668  }
669 
670  if(res_pkt->optlen < *optlen) *optlen = res_pkt->optlen;
671  memcpy((void*)optval, res_pkt->buffer, *optlen);
672 
673  result = res_pkt->result;
674 
675  SignalSema(lock_sema);
676 
677  return result;
678 }
679 
680 int ps2ipc_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
681 {
682  setsockopt_pkt *pkt = &_rpc_buffer.setsockopt_pkt;
683  int result;
684 
685  if(!_ps2ip.server) return -1;
686 
687  WaitSema(lock_sema);
688 
689  pkt->s = s;
690  pkt->level = level;
691  pkt->optname = optname;
692  pkt->optlen = optlen;
693 
694  memcpy(pkt->buffer, optval, optlen);
695 
696  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SETSOCKOPT, 0, (void*)pkt, sizeof(setsockopt_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
697  {
698  SignalSema(lock_sema);
699  return -1;
700  }
701 
702  result = _rpc_buffer.result;
703 
704  SignalSema(lock_sema);
705 
706  return result;
707 }
708 
709 #ifdef PS2IP_DNS
710 struct hostent *ps2ipc_gethostbyname(const char *name)
711 {
712  gethostbyname_res_pkt *res_pkt = &_rpc_buffer.gethostbyname_res_pkt;
713  struct hostent *result;
714  static ip_addr_t addr;
715  static ip_addr_t *addr_list[2];
716  static struct hostent hostent;
717 
718  if(!_ps2ip.server) return NULL;
719 
720  WaitSema(lock_sema);
721 
722  result = NULL;
723  strlcpy(_rpc_buffer.hostname, name, sizeof(_rpc_buffer.hostname));
724  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)
725  {
726  if(res_pkt->result == 0)
727  {
728  hostent.h_addrtype = res_pkt->hostent.h_addrtype;
729  hostent.h_length = res_pkt->hostent.h_length;
730  hostent.h_name = (char*)name;
731  hostent.h_aliases = NULL;
732  memcpy(&addr, &res_pkt->hostent.h_addr, sizeof(addr));
733  addr_list[0] = &addr;
734  addr_list[1] = NULL;
735  hostent.h_addr_list = (char**)&addr_list;
736  result = &hostent;
737  }
738  }
739 
740  SignalSema(lock_sema);
741 
742  return result;
743 }
744 
745 void ps2ipc_dns_setserver(u8 numdns, const ip_addr_t *dnsserver)
746 {
747  dns_setserver_pkt *pkt = &_rpc_buffer.dns_setserver_pkt;
748 
749  if(!_ps2ip.server) return;
750 
751  WaitSema(lock_sema);
752 
753  pkt->numdns = numdns;
754  pkt->dnsserver = (dnsserver != NULL) ? (*dnsserver) : *IP4_ADDR_ANY;
755 
756  sceSifCallRpc(&_ps2ip, PS2IPS_ID_DNS_SETSERVER, 0, (void*)pkt, sizeof(dns_setserver_pkt), NULL, 0, NULL, NULL);
757 
758  if (numdns < DNS_MAX_SERVERS)
759  dns_servers[numdns] = (dnsserver != NULL) ? (*dnsserver) : *IP4_ADDR_ANY;
760 
761  SignalSema(lock_sema);
762 }
763 
764 const ip_addr_t *ps2ipc_dns_getserver(u8 numdns)
765 {
766  dns_getserver_res_pkt *res_pkt = &_rpc_buffer.dns_getserver_res_pkt;
767  ip_addr_t *dns;
768 
769  if ((!_ps2ip.server) || (numdns >= DNS_MAX_SERVERS))
770  return IP4_ADDR_ANY;
771 
772  WaitSema(lock_sema);
773 
774  _rpc_buffer.numdns = numdns;
775  dns = &dns_servers[numdns];
776 
777  //If this fails, use the cached copy.
778  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)
779  ip_addr_copy(*dns, res_pkt->dnsserver);
780 
781  SignalSema(lock_sema);
782 
783  return dns;
784 }
785 #endif
r_recv_pkt
Definition: ps2ip_rpc.h:87
kernel.h
setsockopt_pkt
Definition: ps2ip_rpc.h:126
ps2ips.h
getsockopt_pkt
Definition: ps2ip_rpc.h:112
cmd_pkt
Definition: ps2ip_rpc.h:93
socket_pkt
Definition: ps2ip_rpc.h:49
s_recv_pkt
Definition: ps2ip_rpc.h:78
select_pkt
Definition: ps2ip_rpc.h:152
t_ip_info
Definition: tcpip.h:1990
iopcontrol.h
t_ee_sema
Definition: kernel.h:193
rests_pkt
Definition: fileXio.h:69
send_pkt
Definition: ps2ip_rpc.h:66
ps2ip_rpc.h
ip4_addr
Definition: tcpip.h:266
tamtypes.h
HasIopRebootedSinceLastCall
static int HasIopRebootedSinceLastCall(void)
Definition: iopcontrol.h:47
IPADDR_ANY
#define IPADDR_ANY
Definition: tcpip.h:281
hostent
Definition: tcpip.h:1940
send_pkt::malign_buff
u8 malign_buff[64]
Definition: ps2ip_rpc.h:75
timeval
Definition: time.h:29
t_SifRpcClientData
Definition: sifrpc-common.h:134
__attribute__
Definition: gif_registers.h:38
IP4_ADDR_ANY
#define IP4_ADDR_ANY
Definition: tcpip.h:1045
fd_set
Definition: tcpip.h:1838
getsockopt_res_pkt
Definition: ps2ip_rpc.h:119
ps2ip_rpc_fd_set
Definition: ps2ip_rpc.h:143
ioctl_pkt
Definition: ps2ip_rpc.h:170
listen_pkt
Definition: ps2ip_rpc.h:106
sockaddr
Definition: tcpip.h:1562