Upgrade to 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-socket / test / sockettest.c
1 #include <stdlib.h>
2
3 #include "mruby.h"
4 #include "mruby/error.h"
5
6 #if defined(_WIN32) || defined(_WIN64)
7
8 #include <io.h>
9
10 #if defined(_MSC_VER) || \
11     (defined(MRB_MINGW32_VERSION) && MRB_MINGW32_VERSION < 3021) || \
12     (defined(MRB_MINGW64_VERSION) && MRB_MINGW64_VERSION < 4000)
13
14 #include <fcntl.h>
15 #include <sys/stat.h>
16 #define open  _open
17 #define close _close
18 #define unlink _unlink
19
20 static int
21 mkstemp(char *p)
22 {
23   int fd;
24   char* fname = _mktemp(p);
25   if (fname == NULL)
26     return -1;
27   fd = open(fname, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE);
28   if (fd >= 0)
29     return fd;
30   return -1;
31 }
32 #endif
33
34 #else
35
36 #include <unistd.h>
37
38 #endif
39
40 mrb_value
41 mrb_sockettest_tmppath(mrb_state *mrb, mrb_value klass)
42 {
43   char name[] = "mruby-socket.XXXXXXXX";
44   int fd = mkstemp(name);
45   if (fd == -1) {
46     mrb_sys_fail(mrb, 0);
47   }
48   if (close(fd) == -1) {
49     mrb_sys_fail(mrb, 0);
50   }
51   if (unlink(name) == -1) {
52     mrb_sys_fail(mrb, 0);
53   }
54   return mrb_str_new_cstr(mrb, name);
55 }
56
57 mrb_value
58 mrb_sockettest_win_p(mrb_state *mrb, mrb_value klass)
59 {
60 #ifdef _WIN32
61   return mrb_true_value();
62 #else
63   return mrb_false_value();
64 #endif
65 }
66
67 mrb_value
68 mrb_sockettest_cygwin_p(mrb_state *mrb, mrb_value klass)
69 {
70 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
71   return mrb_true_value();
72 #else
73   return mrb_false_value();
74 #endif
75 }
76
77 void
78 mrb_mruby_socket_gem_test(mrb_state* mrb)
79 {
80   struct RClass *c = mrb_define_module(mrb, "SocketTest");
81   mrb_define_class_method(mrb, c, "tmppath", mrb_sockettest_tmppath, MRB_ARGS_NONE());
82   mrb_define_class_method(mrb, c, "win?", mrb_sockettest_win_p, MRB_ARGS_NONE());
83   mrb_define_class_method(mrb, c, "cygwin?", mrb_sockettest_cygwin_p, MRB_ARGS_NONE());
84 }