source: EcnlProtoTool/trunk/mrbgems/mruby-ipaddr/src/ipaddr.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 1.7 KB
Line 
1#include "mruby.h"
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <arpa/inet.h>
6#include <string.h>
7#include "mruby/string.h"
8
9static mrb_value
10mrb_ipaddr_ntop(mrb_state *mrb, mrb_value klass)
11{
12 mrb_int af, n;
13 char *addr, buf[50];
14
15 mrb_get_args(mrb, "s", &addr, &n);
16 if (n == 4) {
17 af = AF_INET;
18 } else if (n == 16) {
19 af = AF_INET6;
20 } else {
21 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
22 }
23 if (inet_ntop(af, addr, buf, sizeof(buf)) == NULL)
24 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
25 return mrb_str_new_cstr(mrb, buf);
26}
27
28static mrb_value
29mrb_ipaddr_pton(mrb_state *mrb, mrb_value klass)
30{
31 mrb_int af, n;
32 mrb_value s;
33 char *bp, buf[50];
34
35 mrb_get_args(mrb, "is", &af, &bp, &n);
36 if (n > sizeof(buf) - 1)
37 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
38 memcpy(buf, bp, n);
39 buf[n] = '\0';
40
41 if (af == AF_INET) {
42 struct in_addr in;
43 if (inet_pton(AF_INET, buf, (void *)&in.s_addr) != 1) {
44 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
45 }
46 s = mrb_str_new(mrb, (char *)&in.s_addr, 4);
47 } else if (af == AF_INET6) {
48 struct in6_addr in6;
49 if (inet_pton(AF_INET6, buf, (void *)&in6.s6_addr) != 1) {
50 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
51 }
52 s = mrb_str_new(mrb, (char *)&in6.s6_addr, 16);
53 } else
54 mrb_raise(mrb, E_ARGUMENT_ERROR, "unsupported address family");
55
56 return s;
57}
58
59void
60mrb_mruby_ipaddr_gem_init(mrb_state *mrb)
61{
62 struct RClass *c;
63
64 c = mrb_define_class(mrb, "IPAddr", mrb->object_class);
65 mrb_define_class_method(mrb, c, "_pton", mrb_ipaddr_pton, MRB_ARGS_REQ(1));
66 mrb_define_class_method(mrb, c, "ntop", mrb_ipaddr_ntop, MRB_ARGS_REQ(1));
67}
68
69void
70mrb_mruby_ipaddr_gem_final(mrb_state *mrb)
71{
72}
Note: See TracBrowser for help on using the repository browser.