diff options
Diffstat (limited to 'mrbgems/mruby-io/test/mruby_io_test.c')
| -rw-r--r-- | mrbgems/mruby-io/test/mruby_io_test.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/mrbgems/mruby-io/test/mruby_io_test.c b/mrbgems/mruby-io/test/mruby_io_test.c index 8bc87a0d4..eb3f6108c 100644 --- a/mrbgems/mruby-io/test/mruby_io_test.c +++ b/mrbgems/mruby-io/test/mruby_io_test.c @@ -67,6 +67,36 @@ mkdtemp(char *temp) #include "mruby/variable.h" #include <mruby/ext/io.h> +int wd_save; +int socket_available_p; + +#if !defined(_WIN32) && !defined(_WIN64) +static int mrb_io_socket_available() +{ + int fd, retval = 0; + struct sockaddr_un sun0; + char socketname[] = "tmp.mruby-io-socket-ok.XXXXXXXX"; + if (!(fd = mkstemp(socketname))) { + goto sock_test_out; + } + unlink(socketname); + close(fd); + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) { + goto sock_test_out; + } + sun0.sun_family = AF_UNIX; + strncpy(sun0.sun_path, socketname, sizeof(sun0.sun_path)); + if (bind(fd, (struct sockaddr *)&sun0, sizeof(sun0)) == 0) { + retval = 1; + } +sock_test_out: + unlink(socketname); + close(fd); + return retval; +} +#endif + static mrb_value mrb_io_test_io_setup(mrb_state *mrb, mrb_value self) { @@ -81,6 +111,14 @@ mrb_io_test_io_setup(mrb_state *mrb, mrb_value self) int i; #if !defined(_WIN32) && !defined(_WIN64) struct sockaddr_un sun0; + + if(!(socket_available_p = mrb_io_socket_available())) { + char *tmpdir; + wd_save = open(".", O_DIRECTORY); + tmpdir = getenv("TMPDIR"); + if (tmpdir) chdir(tmpdir); + else chdir("/tmp"); + } #endif mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg)); @@ -181,6 +219,13 @@ mrb_io_test_io_cleanup(mrb_state *mrb, mrb_value self) mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"), mrb_nil_value()); mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_nil_value()); +#if !defined(_WIN32) && !defined(_WIN64) + if(!socket_available_p) { + fchdir(wd_save); + close(wd_save); + } +#endif + return mrb_nil_value(); } |
