Merge master.
[mruby.git] / mrbgems / mruby-io / test / mruby_io_test.c
index 8bc87a0..eb3f610 100644 (file)
@@ -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();
 }