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 = -1;
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 = -1;
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  strncpy(_rpc_buffer.netif_name, netif_name, sizeof(_rpc_buffer.netif_name));
471  _rpc_buffer.netif_name[sizeof(_rpc_buffer.netif_name) - 1] = '\0';
472 
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)
474  {
475  SignalSema(lock_sema);
476  return -1;
477  }
478 
479  // return config
480  memcpy(ip_info, &_rpc_buffer.ip_info, sizeof(t_ip_info));
481 
482  SignalSema(lock_sema);
483 
484  return 1;
485 }
486 
487 /* Marshal between the caller's struct fd_set (newlib, ~128 bytes on EE)
488  * and the on-the-wire ps2ip_rpc_fd_set (MEMP_NUM_NETCONN/8 bytes, fixed
489  * size on both sides). Bit-by-bit copy avoids any reliance on
490  * sizeof(struct fd_set) matching across the RPC boundary. */
491 static void ps2ipc_pack_fdset(ps2ip_rpc_fd_set *dst, struct fd_set *src, int maxfdp1)
492 {
493  int i;
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));
501  }
502  }
503 }
504 
505 static void ps2ipc_unpack_fdset(struct fd_set *dst, const ps2ip_rpc_fd_set *src, int maxfdp1)
506 {
507  int i;
508  if (dst == NULL) return;
509  FD_ZERO(dst);
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))) {
514  FD_SET(i, dst);
515  }
516  }
517 }
518 
519 int ps2ipc_select(int maxfdp1, struct fd_set *readset, struct fd_set *writeset, struct fd_set *exceptset, struct timeval *timeout)
520 {
521  int result;
522  select_pkt *pkt = &_rpc_buffer.select_pkt;
523 
524  if(!_ps2ip.server) return -1;
525 
526  WaitSema(lock_sema);
527 
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;
533  if( timeout )
534  {
535  pkt->timeout_sec = (s32)timeout->tv_sec;
536  pkt->timeout_usec = (s32)timeout->tv_usec;
537  }
538 
539  ps2ipc_pack_fdset(&pkt->readset, readset, maxfdp1);
540  ps2ipc_pack_fdset(&pkt->writeset, writeset, maxfdp1);
541  ps2ipc_pack_fdset(&pkt->exceptset, exceptset, maxfdp1);
542 
543  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SELECT, 0, (void*)pkt, sizeof(select_pkt), (void*)pkt, sizeof(select_pkt), NULL, NULL) < 0)
544  {
545  SignalSema(lock_sema);
546  return -1;
547  }
548 
549  if( timeout )
550  {
551  timeout->tv_sec = pkt->timeout_sec;
552  timeout->tv_usec = pkt->timeout_usec;
553  }
554 
555  ps2ipc_unpack_fdset(readset, &pkt->readset, maxfdp1);
556  ps2ipc_unpack_fdset(writeset, &pkt->writeset, maxfdp1);
557  ps2ipc_unpack_fdset(exceptset, &pkt->exceptset, maxfdp1);
558 
559  result = pkt->result;
560 
561  SignalSema(lock_sema);
562 
563  return result;
564 }
565 
566 int ps2ipc_ioctl(int s, long cmd, void *argp)
567 {
568  int result;
569  ioctl_pkt *pkt = &_rpc_buffer.ioctl_pkt;
570 
571  if(!_ps2ip.server) return -1;
572 
573  WaitSema(lock_sema);
574 
575  pkt->s = s;
576  pkt->cmd = (s32)cmd;
577  pkt->argp = argp;
578  if( argp )
579  pkt->value = *(s32*)argp;
580 
581  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_IOCTL, 0, (void*)pkt, sizeof(ioctl_pkt), (void*)pkt, sizeof(ioctl_pkt), NULL, NULL) < 0)
582  {
583  SignalSema(lock_sema);
584  return -1;
585  }
586 
587  if( argp )
588  *(s32*)argp = pkt->value;
589 
590  result = pkt->result;
591 
592  SignalSema(lock_sema);
593 
594  return result;
595 }
596 
597 int ps2ipc_getsockname(int s, struct sockaddr *name, int *namelen)
598 {
599  int result;
600  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
601 
602  if(!_ps2ip.server) return -1;
603 
604  WaitSema(lock_sema);
605 
606  pkt->socket = s;
607 
608  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKNAME, 0, (void*)pkt, sizeof(pkt->socket), (void*)pkt, sizeof(cmd_pkt), NULL, NULL) < 0)
609  {
610  SignalSema(lock_sema);
611  return -1;
612  }
613 
614  if(pkt->len < *namelen) *namelen = pkt->len;
615  memcpy((void *)name, (void *)&pkt->sockaddr, *namelen);
616 
617  result = pkt->socket;
618 
619  SignalSema(lock_sema);
620 
621  return result;
622 }
623 
624 int ps2ipc_getpeername(int s, struct sockaddr *name, int *namelen)
625 {
626  int result;
627  cmd_pkt *pkt = &_rpc_buffer.cmd_pkt;
628 
629  if(!_ps2ip.server) return -1;
630 
631  WaitSema(lock_sema);
632 
633  pkt->socket = s;
634 
635  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETPEERNAME, 0, (void*)pkt, sizeof(pkt->socket), (void*)pkt, sizeof(cmd_pkt), NULL, NULL) < 0)
636  {
637  SignalSema(lock_sema);
638  return -1;
639  }
640 
641  if(pkt->len < *namelen) *namelen = pkt->len;
642  memcpy((void *)name, (void *)&pkt->sockaddr, *namelen);
643 
644  result = pkt->socket;
645 
646  SignalSema(lock_sema);
647 
648  return result;
649 }
650 
651 int ps2ipc_getsockopt(int s, int level, int optname, void* optval, socklen_t* optlen)
652 {
653  getsockopt_pkt *pkt = &_rpc_buffer.getsockopt_pkt;
654  getsockopt_res_pkt *res_pkt = &_rpc_buffer.getsockopt_res_pkt;
655  int result;
656 
657  if(!_ps2ip.server) return -1;
658 
659  WaitSema(lock_sema);
660 
661  pkt->s = s;
662  pkt->level = level;
663  pkt->optname = optname;
664 
665  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_GETSOCKOPT, 0, (void*)pkt, sizeof(getsockopt_pkt), (void*)res_pkt, sizeof(getsockopt_res_pkt), NULL, NULL) < 0)
666  {
667  SignalSema(lock_sema);
668  return -1;
669  }
670 
671  if(res_pkt->optlen < *optlen) *optlen = res_pkt->optlen;
672  memcpy((void*)optval, res_pkt->buffer, *optlen);
673 
674  result = res_pkt->result;
675 
676  SignalSema(lock_sema);
677 
678  return result;
679 }
680 
681 int ps2ipc_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
682 {
683  setsockopt_pkt *pkt = &_rpc_buffer.setsockopt_pkt;
684  int result;
685 
686  if(!_ps2ip.server) return -1;
687 
688  WaitSema(lock_sema);
689 
690  pkt->s = s;
691  pkt->level = level;
692  pkt->optname = optname;
693  pkt->optlen = optlen;
694 
695  memcpy(pkt->buffer, optval, optlen);
696 
697  if (sceSifCallRpc(&_ps2ip, PS2IPS_ID_SETSOCKOPT, 0, (void*)pkt, sizeof(setsockopt_pkt), (void*)&_rpc_buffer.result, sizeof(s32), NULL, NULL) < 0)
698  {
699  SignalSema(lock_sema);
700  return -1;
701  }
702 
703  result = _rpc_buffer.result;
704 
705  SignalSema(lock_sema);
706 
707  return result;
708 }
709 
710 #ifdef PS2IP_DNS
711 struct hostent *ps2ipc_gethostbyname(const char *name)
712 {
713  gethostbyname_res_pkt *res_pkt = &_rpc_buffer.gethostbyname_res_pkt;
714  struct hostent *result;
715  static ip_addr_t addr;
716  static ip_addr_t *addr_list[2];
717  static struct hostent hostent;
718 
719  if(!_ps2ip.server) return NULL;
720 
721  WaitSema(lock_sema);
722 
723  result = 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)
727  {
728  if(res_pkt->result == 0)
729  {
730  hostent.h_addrtype = res_pkt->hostent.h_addrtype;
731  hostent.h_length = res_pkt->hostent.h_length;
732  hostent.h_name = (char*)name;
733  hostent.h_aliases = NULL;
734  memcpy(&addr, &res_pkt->hostent.h_addr, sizeof(addr));
735  addr_list[0] = &addr;
736  addr_list[1] = NULL;
737  hostent.h_addr_list = (char**)&addr_list;
738  result = &hostent;
739  }
740  }
741 
742  SignalSema(lock_sema);
743 
744  return result;
745 }
746 
747 void ps2ipc_dns_setserver(u8 numdns, const ip_addr_t *dnsserver)
748 {
749  dns_setserver_pkt *pkt = &_rpc_buffer.dns_setserver_pkt;
750 
751  if(!_ps2ip.server) return;
752 
753  WaitSema(lock_sema);
754 
755  pkt->numdns = numdns;
756  pkt->dnsserver = (dnsserver != NULL) ? (*dnsserver) : *IP4_ADDR_ANY;
757 
758  sceSifCallRpc(&_ps2ip, PS2IPS_ID_DNS_SETSERVER, 0, (void*)pkt, sizeof(dns_setserver_pkt), NULL, 0, NULL, NULL);
759 
760  if (numdns < DNS_MAX_SERVERS)
761  dns_servers[numdns] = (dnsserver != NULL) ? (*dnsserver) : *IP4_ADDR_ANY;
762 
763  SignalSema(lock_sema);
764 }
765 
766 const ip_addr_t *ps2ipc_dns_getserver(u8 numdns)
767 {
768  dns_getserver_res_pkt *res_pkt = &_rpc_buffer.dns_getserver_res_pkt;
769  ip_addr_t *dns;
770 
771  if ((!_ps2ip.server) || (numdns >= DNS_MAX_SERVERS))
772  return IP4_ADDR_ANY;
773 
774  WaitSema(lock_sema);
775 
776  _rpc_buffer.numdns = numdns;
777  dns = &dns_servers[numdns];
778 
779  //If this fails, use the cached copy.
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);
782 
783  SignalSema(lock_sema);
784 
785  return dns;
786 }
787 #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