summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorUchio Kondo <[email protected]>2020-04-28 01:33:50 +0900
committerHiroshi Mimaki <[email protected]>2020-05-01 16:50:54 +0900
commit3486675e00d530b5efde4072b34f708bbe236fd4 (patch)
tree8d2451f375ea750b27436ec1feb9c2dfb1ac8920 /mrbgems
parent3d46f1b62092a064d740c66d5395bcf89c899ee9 (diff)
downloadmruby-3486675e00d530b5efde4072b34f708bbe236fd4.tar.gz
mruby-3486675e00d530b5efde4072b34f708bbe236fd4.zip
Test mruby-io in tmpdir when AF_UNIX cannot be created on cwd
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-io/test/mruby_io_test.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/mrbgems/mruby-io/test/mruby_io_test.c b/mrbgems/mruby-io/test/mruby_io_test.c
index 44b8acebb..ac6ab530a 100644
--- a/mrbgems/mruby-io/test/mruby_io_test.c
+++ b/mrbgems/mruby-io/test/mruby_io_test.c
@@ -1,6 +1,7 @@
#include <mruby/common.h>
#include <sys/types.h>
#include <errno.h>
+#include <assert.h>
#if defined(_WIN32) || defined(_WIN64)
@@ -57,6 +58,7 @@ mkdtemp(char *temp)
#include <sys/stat.h>
#include <stdlib.h>
+#include <fcntl.h>
#include "mruby.h"
#include "mruby/array.h"
@@ -65,9 +67,48 @@ mkdtemp(char *temp)
#include "mruby/variable.h"
#include <mruby/ext/io.h>
+int wd_save;
+int socket_available_p;
+
+static int mrb_io_socket_abailable()
+{
+ int fd, retval = 1;
+ struct sockaddr_un sun0;
+ char socketname[] = "tmp.mruby-io-socket-ok.XXXXXXXX";
+ if (!(fd = mkstemp(socketname))) {
+ retval = 0;
+ goto sock_test_out;
+ }
+ unlink(socketname);
+ close(fd);
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd == -1) {
+ retval = 0;
+ goto sock_test_out;
+ }
+ sun0.sun_family = AF_UNIX;
+ snprintf(sun0.sun_path, sizeof(sun0.sun_path), "%s", socketname);
+ if (bind(fd, (struct sockaddr *)&sun0, sizeof(sun0)) == -1) {
+ retval = 0;
+ }
+sock_test_out:
+ close(fd);
+ return retval;
+}
+
static mrb_value
mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
{
+ if(!(socket_available_p = mrb_io_socket_abailable())) {
+ char *tmpdir;
+ wd_save = open(".", O_DIRECTORY);
+ tmpdir = getenv("TMPDIR");
+ if (tmpdir)
+ assert(!chdir(tmpdir));
+ else
+ assert(!chdir("/tmp"));
+ }
+
char rfname[] = "tmp.mruby-io-test-r.XXXXXXXX";
char wfname[] = "tmp.mruby-io-test-w.XXXXXXXX";
char symlinkname[] = "tmp.mruby-io-test-l.XXXXXXXX";
@@ -176,6 +217,11 @@ 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(!socket_available_p) {
+ assert(!fchdir(wd_save));
+ close(wd_save);
+ }
+
return mrb_nil_value();
}