diff options
| -rw-r--r-- | mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 13 | ||||
| -rw-r--r-- | mrbgems/mruby-io/include/mruby/ext/io.h | 3 | ||||
| -rw-r--r-- | mrbgems/mruby-io/mrbgem.rake | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 14 | ||||
| -rw-r--r-- | mrbgems/mruby-pack/mrbgem.rake | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-socket/mrbgem.rake | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-socket/mrblib/socket.rb | 13 | ||||
| -rw-r--r-- | mrbgems/mruby-socket/src/socket.c | 22 | ||||
| -rw-r--r-- | mrbgems/mruby-socket/test/unix.rb | 2 |
9 files changed, 57 insertions, 13 deletions
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 2447601aa..a58a72e7d 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -95,6 +95,7 @@ static void p(mrb_state *mrb, mrb_value obj, int prompt) { mrb_value val; + char* msg; val = mrb_funcall(mrb, obj, "inspect", 0); if (prompt) { @@ -108,7 +109,9 @@ p(mrb_state *mrb, mrb_value obj, int prompt) if (!mrb_string_p(val)) { val = mrb_obj_as_string(mrb, obj); } - fwrite(RSTRING_PTR(val), RSTRING_LEN(val), 1, stdout); + msg = mrb_locale_from_utf8(RSTRING_PTR(val), RSTRING_LEN(val)); + fwrite(msg, strlen(msg), 1, stdout); + mrb_locale_free(msg); putc('\n', stdout); } @@ -537,11 +540,15 @@ done: else { if (0 < parser->nwarn) { /* warning */ - printf("line %d: %s\n", parser->warn_buffer[0].lineno, parser->warn_buffer[0].message); + char* msg = mrb_locale_from_utf8(parser->warn_buffer[0].message, -1); + printf("line %d: %s\n", parser->warn_buffer[0].lineno, msg); + mrb_utf8_free(msg); } if (0 < parser->nerr) { /* syntax error */ - printf("line %d: %s\n", parser->error_buffer[0].lineno, parser->error_buffer[0].message); + char* msg = mrb_locale_from_utf8(parser->error_buffer[0].message, -1); + printf("line %d: %s\n", parser->error_buffer[0].lineno, msg); + mrb_utf8_free(msg); } else { /* generate bytecode */ diff --git a/mrbgems/mruby-io/include/mruby/ext/io.h b/mrbgems/mruby-io/include/mruby/ext/io.h index 8f412fc02..ba088156e 100644 --- a/mrbgems/mruby-io/include/mruby/ext/io.h +++ b/mrbgems/mruby-io/include/mruby/ext/io.h @@ -15,7 +15,8 @@ struct mrb_io { int pid; /* child's pid (for pipes) */ unsigned int readable:1, writable:1, - sync:1; + sync:1, + is_socket:1; }; #define FMODE_READABLE 0x00000001 diff --git a/mrbgems/mruby-io/mrbgem.rake b/mrbgems/mruby-io/mrbgem.rake index 8120f7832..50fa49678 100644 --- a/mrbgems/mruby-io/mrbgem.rake +++ b/mrbgems/mruby-io/mrbgem.rake @@ -1,6 +1,7 @@ MRuby::Gem::Specification.new('mruby-io') do |spec| spec.license = 'MIT' spec.authors = 'Internet Initiative Japan Inc.' + spec.summary = 'IO and File class' spec.cc.include_paths << "#{build.root}/src" diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 64729e05c..b2320038b 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -578,8 +578,18 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) } if (fptr->fd > 2) { - if (close(fptr->fd) == -1) { - saved_errno = errno; +#ifdef _WIN32 + if (fptr->is_socket) { + if (closesocket(fptr->fd) != 0) { + saved_errno = WSAGetLastError(); + } + fptr->fd = -1; + } +#endif + if (fptr->fd != -1) { + if (close(fptr->fd) == -1) { + saved_errno = errno; + } } fptr->fd = -1; } diff --git a/mrbgems/mruby-pack/mrbgem.rake b/mrbgems/mruby-pack/mrbgem.rake index 2b9dea5b1..6e8375d1e 100644 --- a/mrbgems/mruby-pack/mrbgem.rake +++ b/mrbgems/mruby-pack/mrbgem.rake @@ -1,6 +1,7 @@ MRuby::Gem::Specification.new('mruby-pack') do |spec| spec.license = 'MIT' spec.authors = 'Internet Initiative Japan Inc.' + spec.summary = 'Array#pack and String#unpack method' spec.cc.include_paths << "#{build.root}/src" end diff --git a/mrbgems/mruby-socket/mrbgem.rake b/mrbgems/mruby-socket/mrbgem.rake index 7ae914925..dcb1f77a2 100644 --- a/mrbgems/mruby-socket/mrbgem.rake +++ b/mrbgems/mruby-socket/mrbgem.rake @@ -1,6 +1,7 @@ MRuby::Gem::Specification.new('mruby-socket') do |spec| spec.license = 'MIT' spec.authors = 'Internet Initiative Japan' + spec.summary = 'standard socket class' spec.cc.include_paths << "#{build.root}/src" diff --git a/mrbgems/mruby-socket/mrblib/socket.rb b/mrbgems/mruby-socket/mrblib/socket.rb index 53c20e3cc..7f0dc7982 100644 --- a/mrbgems/mruby-socket/mrblib/socket.rb +++ b/mrbgems/mruby-socket/mrblib/socket.rb @@ -165,7 +165,7 @@ class Addrinfo end end -class BasicSocket +class BasicSocket < IO @@do_not_reverse_lookup = true def self.do_not_reverse_lookup @@ -178,6 +178,7 @@ class BasicSocket def initialize(*args) super(*args) + self._is_socket = true @do_not_reverse_lookup = @@do_not_reverse_lookup end @@ -207,7 +208,7 @@ class BasicSocket attr_accessor :do_not_reverse_lookup end -class IPSocket +class IPSocket < BasicSocket def self.getaddress(host) Addrinfo.ip(host).ip_address end @@ -226,7 +227,7 @@ class IPSocket end end -class TCPSocket +class TCPSocket < IPSocket def initialize(host, service, local_host=nil, local_service=nil) if @init_with_fd super(host, service) @@ -263,7 +264,7 @@ class TCPSocket #def self.gethostbyname(host) end -class TCPServer +class TCPServer < TCPSocket def initialize(host=nil, service) ai = Addrinfo.getaddrinfo(host, service, nil, nil, nil, Socket::AI_PASSIVE)[0] @init_with_fd = true @@ -305,7 +306,7 @@ class TCPServer end end -class UDPSocket +class UDPSocket < IPSocket def initialize(af=Socket::AF_INET) super(Socket._socket(af, Socket::SOCK_DGRAM, 0), "r+") @af = af @@ -349,7 +350,7 @@ class UDPSocket end end -class Socket +class Socket < BasicSocket def initialize(domain, type, protocol=0) super(Socket._socket(domain, type, protocol), "r+") end diff --git a/mrbgems/mruby-socket/src/socket.c b/mrbgems/mruby-socket/src/socket.c index 0b0835f56..a4e1d483a 100644 --- a/mrbgems/mruby-socket/src/socket.c +++ b/mrbgems/mruby-socket/src/socket.c @@ -40,6 +40,8 @@ #include "mruby/variable.h" #include "error.h" +#include "mruby/ext/io.h" + #define E_SOCKET_ERROR (mrb_class_get(mrb, "SocketError")) #if !defined(mrb_cptr) @@ -146,6 +148,10 @@ mrb_addrinfo_getaddrinfo(mrb_state *mrb, mrb_value klass) hints.ai_socktype = (int)mrb_fixnum(socktype); } + if (mrb_fixnum_p(protocol)) { + hints.ai_protocol = (int)mrb_fixnum(protocol); + } + lastai = mrb_cv_get(mrb, klass, mrb_intern_lit(mrb, "_lastai")); if (mrb_cptr_p(lastai)) { freeaddrinfo((struct addrinfo*)mrb_cptr(lastai)); @@ -476,6 +482,21 @@ mrb_basicsocket_shutdown(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_basicsocket_set_is_socket(mrb_state *mrb, mrb_value self) +{ + mrb_bool b; + struct mrb_io *io_p; + mrb_get_args(mrb, "b", &b); + + io_p = (struct mrb_io*)DATA_PTR(self); + if (io_p) { + io_p->is_socket = b; + } + + return mrb_bool_value(b); +} + +static mrb_value mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass) { mrb_int af, n; @@ -835,6 +856,7 @@ mrb_mruby_socket_gem_init(mrb_state* mrb) // #sendmsg_nonblock mrb_define_method(mrb, bsock, "setsockopt", mrb_basicsocket_setsockopt, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(2)); mrb_define_method(mrb, bsock, "shutdown", mrb_basicsocket_shutdown, MRB_ARGS_OPT(1)); + mrb_define_method(mrb, bsock, "_is_socket=", mrb_basicsocket_set_is_socket, MRB_ARGS_REQ(1)); ipsock = mrb_define_class(mrb, "IPSocket", bsock); mrb_define_class_method(mrb, ipsock, "ntop", mrb_ipsocket_ntop, MRB_ARGS_REQ(1)); diff --git a/mrbgems/mruby-socket/test/unix.rb b/mrbgems/mruby-socket/test/unix.rb index 1eb7365c5..2a29ddae7 100644 --- a/mrbgems/mruby-socket/test/unix.rb +++ b/mrbgems/mruby-socket/test/unix.rb @@ -127,4 +127,4 @@ assert('UNIXSocket#recvfrom') do end end -end # win? +end # SocketTest.win? |
