summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-io
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-io')
-rw-r--r--mrbgems/mruby-io/src/io.c114
-rw-r--r--mrbgems/mruby-io/test/mruby_io_test.c2
2 files changed, 52 insertions, 64 deletions
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c
index 8901b055f..b9d136a5a 100644
--- a/mrbgems/mruby-io/src/io.c
+++ b/mrbgems/mruby-io/src/io.c
@@ -327,6 +327,9 @@ mrb_io_alloc(mrb_state *mrb)
#define NOFILE 64
#endif
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+# define mrb_io_s_popen mrb_notimplement_m
+#else
static int
option_to_fd(mrb_state *mrb, mrb_value v)
{
@@ -345,22 +348,42 @@ option_to_fd(mrb_state *mrb, mrb_value v)
return -1; /* never reached */
}
-#ifdef _WIN32
static mrb_value
-mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
+mrb_io_s_popen_args(mrb_state *mrb, mrb_value klass,
+ const char **cmd, int *flags, int *doexec,
+ int *opt_in, int *opt_out, int *opt_err)
{
- mrb_value cmd, io;
- mrb_value mode = mrb_str_new_cstr(mrb, "r");
- mrb_value kv[3];
+ mrb_value mode = mrb_nil_value();
+ struct { mrb_value opt_in, opt_out, opt_err; } kv;
mrb_sym knames[3] = {MRB_SYM(in), MRB_SYM(out), MRB_SYM(err)};
const mrb_kwargs kw = {
3, 0,
knames,
- kv,
+ &kv.opt_in,
NULL,
};
+
+ mrb_get_args(mrb, "z|o:", cmd, &mode, &kw);
+
+ *flags = mrb_io_mode_to_flags(mrb, mode);
+ *doexec = (strcmp("-", *cmd) != 0);
+ *opt_in = option_to_fd(mrb, kv.opt_in);
+ *opt_out = option_to_fd(mrb, kv.opt_out);
+ *opt_err = option_to_fd(mrb, kv.opt_err);
+
+ return mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
+}
+
+#ifdef _WIN32
+static mrb_value
+mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
+{
+ mrb_value io;
+ int doexec;
+ int opt_in, opt_out, opt_err;
+ const char *cmd;
+
struct mrb_io *fptr;
- const char *pname;
int pid = 0, flags;
STARTUPINFO si;
PROCESS_INFORMATION pi;
@@ -369,23 +392,13 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
HANDLE ifd[2];
HANDLE ofd[2];
- int doexec;
-
ifd[0] = INVALID_HANDLE_VALUE;
ifd[1] = INVALID_HANDLE_VALUE;
ofd[0] = INVALID_HANDLE_VALUE;
ofd[1] = INVALID_HANDLE_VALUE;
- mrb_get_args(mrb, "S|o:", &cmd, &mode, &kw, &kv);
- io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
-
- pname = RSTRING_CSTR(mrb, cmd);
- flags = mrb_io_mode_to_flags(mrb, mode);
-
- doexec = (strcmp("-", pname) != 0);
- option_to_fd(mrb, kv[0]);
- option_to_fd(mrb, kv[1]);
- option_to_fd(mrb, kv[2]);
+ io = mrb_io_s_popen_args(mrb, klass, &cmd, &flags, &doexec,
+ &opt_in, &opt_out, &opt_err);
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
@@ -420,13 +433,13 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
si.hStdInput = ifd[0];
}
if (!CreateProcess(
- NULL, (char*)pname, NULL, NULL,
+ NULL, (char*)cmd, NULL, NULL,
TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi)) {
CloseHandle(ifd[0]);
CloseHandle(ifd[1]);
CloseHandle(ofd[0]);
CloseHandle(ofd[1]);
- mrb_raisef(mrb, E_IO_ERROR, "command not found: %v", cmd);
+ mrb_raisef(mrb, E_IO_ERROR, "command not found: %s", cmd);
}
CloseHandle(pi.hThread);
CloseHandle(ifd[0]);
@@ -448,46 +461,23 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
DATA_PTR(io) = fptr;
return io;
}
-#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-static mrb_value
-mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
-{
- mrb_raise(mrb, E_NOTIMP_ERROR, "IO#popen is not supported on the platform");
- return mrb_false_value();
-}
#else
static mrb_value
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
{
- mrb_value cmd, io, result;
- mrb_value mode = mrb_str_new_cstr(mrb, "r");
- mrb_value kv[3];
- mrb_sym knames[3] = {MRB_SYM(in), MRB_SYM(out), MRB_SYM(err)};
- const mrb_kwargs kw = {
- 3, 0,
- knames,
- kv,
- NULL,
- };
+ mrb_value io, result;
+ int doexec;
+ int opt_in, opt_out, opt_err;
+ const char *cmd;
+
struct mrb_io *fptr;
- const char *pname;
int pid, flags, fd, write_fd = -1;
int pr[2] = { -1, -1 };
int pw[2] = { -1, -1 };
- int doexec;
int saved_errno;
- int opt_in, opt_out, opt_err;
-
- mrb_get_args(mrb, "S|o:", &cmd, &mode, &kw);
- io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
-
- pname = RSTRING_CSTR(mrb, cmd);
- flags = mrb_io_mode_to_flags(mrb, mode);
- doexec = (strcmp("-", pname) != 0);
- opt_in = option_to_fd(mrb, kv[0]);
- opt_out = option_to_fd(mrb, kv[1]);
- opt_err = option_to_fd(mrb, kv[2]);
+ io = mrb_io_s_popen_args(mrb, klass, &cmd, &flags, &doexec,
+ &opt_in, &opt_out, &opt_err);
if (OPEN_READABLE_P(flags)) {
if (pipe(pr) == -1) {
@@ -544,8 +534,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
for (fd = 3; fd < NOFILE; fd++) {
close(fd);
}
- mrb_proc_exec(pname);
- mrb_raisef(mrb, E_IO_ERROR, "command not found: %v", cmd);
+ mrb_proc_exec(cmd);
+ mrb_raisef(mrb, E_IO_ERROR, "command not found: %s", cmd);
_exit(127);
}
result = mrb_nil_value();
@@ -596,7 +586,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
}
return result;
}
-#endif
+#endif /* _WIN32 */
+#endif /* TARGET_OS_IPHONE */
static int
mrb_dup(mrb_state *mrb, int fd, mrb_bool *failed)
@@ -1340,10 +1331,10 @@ mrb_io_fileno_m(mrb_state *mrb, mrb_value io)
return mrb_fixnum_value(fd);
}
+#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
static mrb_value
mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
{
-#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
struct mrb_io *fptr;
int ret;
@@ -1357,17 +1348,15 @@ mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
if ((ret = fcntl(fptr->fd, F_GETFD)) == -1) mrb_sys_fail(mrb, "F_GETFD failed");
if (!(ret & FD_CLOEXEC)) return mrb_false_value();
return mrb_true_value();
-
+}
#else
- mrb_raise(mrb, E_NOTIMP_ERROR, "IO#close_on_exec? is not supported on the platform");
- return mrb_false_value();
+# define mrb_io_close_on_exec_p mrb_notimplement_m
#endif
-}
+#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
static mrb_value
mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
{
-#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
struct mrb_io *fptr;
int flag, ret;
mrb_bool b;
@@ -1394,11 +1383,10 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
}
return mrb_bool_value(b);
+}
#else
- mrb_raise(mrb, E_NOTIMP_ERROR, "IO#close_on_exec= is not supported on the platform");
- return mrb_nil_value();
+# define mrb_io_set_close_on_exec mrb_notimplement_m
#endif
-}
static mrb_value
mrb_io_set_sync(mrb_state *mrb, mrb_value self)
diff --git a/mrbgems/mruby-io/test/mruby_io_test.c b/mrbgems/mruby-io/test/mruby_io_test.c
index 8bc87a0d4..cf99260e2 100644
--- a/mrbgems/mruby-io/test/mruby_io_test.c
+++ b/mrbgems/mruby-io/test/mruby_io_test.c
@@ -80,7 +80,7 @@ mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
FILE *fp;
int i;
#if !defined(_WIN32) && !defined(_WIN64)
- struct sockaddr_un sun0;
+ struct sockaddr_un sun0 = { 0 }; /* Initialize them all because it is environment dependent */
#endif
mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));