summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c13
-rw-r--r--mrbgems/mruby-io/include/mruby/ext/io.h3
-rw-r--r--mrbgems/mruby-io/mrbgem.rake1
-rw-r--r--mrbgems/mruby-io/src/io.c14
-rw-r--r--mrbgems/mruby-pack/mrbgem.rake1
-rw-r--r--mrbgems/mruby-socket/mrbgem.rake1
-rw-r--r--mrbgems/mruby-socket/mrblib/socket.rb13
-rw-r--r--mrbgems/mruby-socket/src/socket.c22
-rw-r--r--mrbgems/mruby-socket/test/unix.rb2
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?