summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/luv/src/pipe.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/luv/src/pipe.c')
-rw-r--r--3rdparty/luv/src/pipe.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/3rdparty/luv/src/pipe.c b/3rdparty/luv/src/pipe.c
new file mode 100644
index 00000000000..b490c1597b3
--- /dev/null
+++ b/3rdparty/luv/src/pipe.c
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2014 The Luvit Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include "luv.h"
+
+static uv_pipe_t* luv_check_pipe(lua_State* L, int index) {
+ uv_pipe_t* handle = luv_checkudata(L, index, "uv_pipe");
+ luaL_argcheck(L, handle->type == UV_NAMED_PIPE && handle->data, index, "Expected uv_pipe_t");
+ return handle;
+}
+
+static int luv_new_pipe(lua_State* L) {
+ uv_pipe_t* handle;
+ int ipc, ret;
+ luaL_checktype(L, 1, LUA_TBOOLEAN);
+ ipc = lua_toboolean(L, 1);
+ handle = luv_newuserdata(L, sizeof(*handle));
+ ret = uv_pipe_init(luv_loop(L), handle, ipc);
+ if (ret < 0) {
+ lua_pop(L, 1);
+ return luv_error(L, ret);
+ }
+ handle->data = luv_setup_handle(L);
+ return 1;
+}
+
+static int luv_pipe_open(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ uv_file file = luaL_checkinteger(L, 2);
+ int ret = uv_pipe_open(handle, file);
+ if (ret < 0) return luv_error(L, ret);
+ lua_pushinteger(L, ret);
+ return 1;
+}
+
+static int luv_pipe_bind(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ const char* name = luaL_checkstring(L, 2);
+ int ret = uv_pipe_bind(handle, name);
+ if (ret < 0) return luv_error(L, ret);
+ lua_pushinteger(L, ret);
+ return 1;
+}
+
+static int luv_pipe_connect(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ const char* name = luaL_checkstring(L, 2);
+ int ref = luv_check_continuation(L, 3);
+ uv_connect_t* req = lua_newuserdata(L, sizeof(*req));
+ req->data = luv_setup_req(L, ref);
+ uv_pipe_connect(req, handle, name, luv_connect_cb);
+ return 1;
+}
+
+static int luv_pipe_getsockname(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ size_t len = 2*PATH_MAX;
+ char buf[2*PATH_MAX];
+ int ret = uv_pipe_getsockname(handle, buf, &len);
+ if (ret < 0) return luv_error(L, ret);
+ lua_pushlstring(L, buf, len);
+ return 1;
+}
+
+static int luv_pipe_getpeername(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ size_t len = 2*PATH_MAX;
+ char buf[2*PATH_MAX];
+ int ret = uv_pipe_getpeername(handle, buf, &len);
+ if (ret < 0) return luv_error(L, ret);
+ lua_pushlstring(L, buf, len);
+ return 1;
+}
+
+static int luv_pipe_pending_instances(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ int count = luaL_checkinteger(L, 2);
+ uv_pipe_pending_instances(handle, count);
+ return 0;
+}
+
+static int luv_pipe_pending_count(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ lua_pushinteger(L, uv_pipe_pending_count(handle));
+ return 1;
+}
+
+static int luv_pipe_pending_type(lua_State* L) {
+ uv_pipe_t* handle = luv_check_pipe(L, 1);
+ uv_handle_type type = uv_pipe_pending_type(handle);
+ const char* type_name;
+ switch (type) {
+#define XX(uc, lc) \
+ case UV_##uc: type_name = #lc; break;
+ UV_HANDLE_TYPE_MAP(XX)
+#undef XX
+ default: return 0;
+ }
+ lua_pushstring(L, type_name);
+ return 1;
+}