Merge master.
authorHiroshi Mimaki <[email protected]>
Fri, 5 Jun 2020 03:42:56 +0000 (5 12:42 +0900)
committerHiroshi Mimaki <[email protected]>
Fri, 5 Jun 2020 03:42:56 +0000 (5 12:42 +0900)
1  2 
README.md
include/mruby.h
mrbgems/mruby-io/test/mruby_io_test.c

diff --cc README.md
Simple merge
diff --cc include/mruby.h
Simple merge
@@@ -99,55 -70,50 +100,58 @@@ sock_test_out
  static mrb_value
  mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
  {
-   char rfname[]      = "tmp.mruby-io-test-r.XXXXXXXX";
-   char wfname[]      = "tmp.mruby-io-test-w.XXXXXXXX";
-   char symlinkname[] = "tmp.mruby-io-test-l.XXXXXXXX";
-   char socketname[]  = "tmp.mruby-io-test-s.XXXXXXXX";
+ #define GVNAME(n) "$mrbtest_io_" #n "name"
+   enum {IDX_READ, IDX_WRITE, IDX_LINK, IDX_SOCKET, IDX_COUNT};
+   const char *gvnames[] = {GVNAME(rf), GVNAME(wf), GVNAME(symlink), GVNAME(socket)};
+   char *fnames[IDX_COUNT];
+   int fds[IDX_COUNT];
    char msg[] = "mruby io test\n";
    mode_t mask;
-   int fd0, fd1;
    FILE *fp;
+   int i;
  #if !defined(_WIN32) && !defined(_WIN64)
-   int fd2, fd3;
    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
  
-   mask = umask(077);
-   fd0 = mkstemp(rfname);
-   fd1 = mkstemp(wfname);
-   if (fd0 == -1 || fd1 == -1) {
-     mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
-     return mrb_nil_value();
-   }
-   close(fd0);
-   close(fd1);
+   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));
  
+   mask = umask(077);
+   for (i = 0; i < IDX_COUNT; i++) {
+     mrb_value fname = mrb_str_new_capa(mrb, 0);
  #if !defined(_WIN32) && !defined(_WIN64)
-   fd2 = mkstemp(symlinkname);
-   fd3 = mkstemp(socketname);
-   if (fd2 == -1 || fd3 == -1) {
-     mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
-     return mrb_nil_value();
-   }
+     /*
+      * Workaround for not being able to bind a socket to some file systems
+      * (e.g. vboxsf, NFS). [#4981]
+      */
+     char *tmpdir = getenv("TMPDIR");
+     if (tmpdir && strlen(tmpdir) > 0) {
+       mrb_str_cat_cstr(mrb, fname, tmpdir);
+       if (*(RSTRING_END(fname)-1) != '/') mrb_str_cat_lit(mrb, fname, "/");
+     } else {
+       mrb_str_cat_lit(mrb, fname, "/tmp/");
+     }
  #endif
+     mrb_str_cat_cstr(mrb, fname, gvnames[i]+1);
+     mrb_str_cat_cstr(mrb, fname, ".XXXXXXXX");
+     fnames[i] = RSTRING_PTR(fname);
+     fds[i] = mkstemp(fnames[i]);
+     if (fds[i] == -1) {
+       mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
+     }
+     close(fds[i]);
+     mrb_gv_set(mrb, mrb_intern_cstr(mrb, gvnames[i]), fname);
+   }
    umask(mask);
  
-   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_rfname"), mrb_str_new_cstr(mrb, rfname));
-   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_wfname"), mrb_str_new_cstr(mrb, wfname));
-   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_symlinkname"), mrb_str_new_cstr(mrb, symlinkname));
-   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"), mrb_str_new_cstr(mrb, socketname));
-   mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));
-   fp = fopen(rfname, "wb");
+   fp = fopen(fnames[IDX_READ], "wb");
    if (fp == NULL) {
      mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
      return mrb_nil_value();