static int luazmq_skt_set_i64 (lua_State *L, int option_name) { zsocket *skt = luazmq_getsocket(L); int64_t option_value = (int64_t)luaL_checknumber(L, 2); int ret = zmq_setsockopt(skt->skt, option_name, &option_value, sizeof(option_value)); if (ret == -1) return luazmq_fail(L, skt); return luazmq_pass(L); }
static int luazmq_skt_destroy (lua_State *L) { zsocket *skt = (zsocket *)luazmq_checkudatap (L, 1, LUAZMQ_SOCKET); luaL_argcheck (L, skt != NULL, 1, LUAZMQ_PREFIX"socket expected"); if(!(skt->flags & LUAZMQ_FLAG_CLOSED)){ int ret; luazmq_skt_before_close(L, skt); if(!(skt->flags & LUAZMQ_FLAG_DONT_DESTROY)){ if(lua_isnumber(L, 2)){ int linger = luaL_optint(L, 2, 0); zmq_setsockopt(skt->skt, ZMQ_LINGER, &linger, sizeof(linger)); } ret = zmq_close(skt->skt); assert(ret != -1); // if(ret == -1)return luazmq_fail(L, skt); } #if LZMQ_SOCKET_COUNT if(skt->ctx){ skt->ctx->socket_count--; assert(skt->ctx->socket_count >= 0); } #endif skt->flags |= LUAZMQ_FLAG_CLOSED; } return luazmq_pass(L); }
static int luazmq_msg_send(lua_State *L){ zmessage *zmsg = luazmq_getmessage(L); zsocket *zskt = luazmq_getsocket_at(L, 2); int flags = luaL_optint(L, 3, 0); int err = zmq_msg_send(&zmsg->msg, zskt->skt, flags); if(-1 == err)return luazmq_fail(L, zskt); return luazmq_pass(L); }
static int luazmq_msg_set(lua_State *L){ zmessage *zmsg = luazmq_getmessage(L); int optname = luaL_checkinteger(L,1); int optval = luaL_checkinteger(L,2); int err = zmq_msg_set(&zmsg->msg, optname, optval); if(-1 == err)return luazmq_fail(L, NULL); return luazmq_pass(L); }
static int luazmq_skt_set_str (lua_State *L, int option_name) { zsocket *skt = luazmq_getsocket(L); size_t len; const char *option_value = luaL_checklstring(L, 2, &len); int ret = zmq_setsockopt(skt->skt, option_name, option_value, len); if (ret == -1) return luazmq_fail(L, skt); return luazmq_pass(L); }
static int luazmq_skt_send_msg (lua_State *L) { zsocket *skt = luazmq_getsocket(L); zmessage *msg = luazmq_getmessage_at(L,2); int flags = luaL_optint(L,3,0); int ret = zmq_msg_send(&msg->msg, skt->skt, flags); if(-1 == ret) return luazmq_fail(L, skt); return luazmq_pass(L); }
int luazmq_msg_close(lua_State *L){ zmessage *zmsg = (zmessage *)luazmq_checkudatap (L, 1, LUAZMQ_MESSAGE); luaL_argcheck (L, zmsg != NULL, 1, LUAZMQ_PREFIX"message expected"); if(!(zmsg->flags & LUAZMQ_FLAG_CLOSED)){ zmq_msg_close(&zmsg->msg); zmsg->flags |= LUAZMQ_FLAG_CLOSED; } return luazmq_pass(L); }
static int luazmq_skt_reset_monitor (lua_State *L) { zsocket *skt = luazmq_getsocket(L); int ret = zmq_socket_monitor (skt->skt, NULL, 0); if(-1 == ret){ return luazmq_fail(L, skt); } return luazmq_pass(L); }
static int luazmq_msg_set_size(lua_State *L){ zmessage *zmsg = luazmq_getmessage(L); size_t nsize = luaL_checkinteger(L, 2); size_t osize = zmq_msg_size(&zmsg->msg); int err; zmq_msg_t msg; if(nsize == osize) return luazmq_pass(L); err = zmq_msg_init_size(&msg, nsize); if(-1 == err)return luazmq_fail(L, NULL); memcpy(zmq_msg_data(&msg), zmq_msg_data(&zmsg->msg), (nsize>osize)?osize:nsize); err = zmq_msg_move(&zmsg->msg, &msg); if(-1 == err){ zmq_msg_close(&msg); return luazmq_fail(L, NULL); } zmq_msg_close(&msg); // @FIXME do not close message return luazmq_pass(L); }
static int luazmq_skt_send (lua_State *L) { zsocket *skt = luazmq_getsocket(L); size_t len; const char *data = luaL_checklstring(L, 2, &len); int ret, flags = luaL_optint(L,3,0); #ifdef LUAZMQ_USE_SEND_AS_BUF ret = zmq_send(skt->skt, data, len, flags); #else zmq_msg_t msg; ret = zmq_msg_init_size(&msg, len); if(-1 == ret) return luazmq_fail(L, skt); memcpy(zmq_msg_data(&msg), data, len); ret = zmq_msg_send(&msg, skt->skt, flags); zmq_msg_close(&msg); #endif if(-1 == ret) return luazmq_fail(L, skt); return luazmq_pass(L); }
static int luazmq_skt_send_all (lua_State *L) { zsocket *skt = luazmq_getsocket(L); int flags = luaL_optint(L,3,0); int n, i = luaL_optint(L,4,1); if(lua_isnoneornil(L, 5)){ n = lua_objlen(L, 2); } else{ n = luaL_checkint(L, 5); luaL_argcheck(L, n >= i, 5, "invalid range"); } if(flags & (~ZMQ_SNDMORE)){ lua_pushnil(L); luazmq_error_create(L, ENOTSUP); return 2; } for(;i <= n; ++i){ zmq_msg_t msg; const char *data;size_t len; int ret; lua_rawgeti(L, 2, i); data = luaL_checklstring(L, -1, &len); ret = zmq_msg_init_size(&msg, len); if(-1 == ret){ ret = luazmq_fail(L, skt); lua_pushinteger(L, i); return ret + 1; } memcpy(zmq_msg_data(&msg), data, len); ret = zmq_msg_send(&msg, skt->skt, (i == n)?flags:ZMQ_SNDMORE); zmq_msg_close(&msg); if(-1 == ret){ ret = luazmq_fail(L, skt); lua_pushinteger(L, i); return ret + 1; } } return luazmq_pass(L); }
static int luazmq_skt_set_str_arr (lua_State *L, int option_name) { zsocket *skt; size_t len, tlen, i; const char *option_value; int ret; if(!lua_istable(L, 2)) return luazmq_skt_set_str(L, option_name); skt = luazmq_getsocket(L); tlen = lua_objlen(L,2); for (i = 1; i <= tlen; i++){ lua_rawgeti(L, 2, i); option_value = luaL_checklstring(L, -1, &len); ret = zmq_setsockopt(skt->skt, option_name, option_value, len); if (ret == -1){ int n = luazmq_fail(L, skt); lua_pushnumber(L, i); return n + 1; } } return luazmq_pass(L); }
static int luazmq_skt_sendx_impl(lua_State *L, int last_flag) { zsocket *skt = luazmq_getsocket(L); size_t i, n = lua_gettop(L); for(i = 2; i<=n; ++i){ zmq_msg_t msg; size_t len; const char *data = luaL_checklstring(L, i, &len); int ret = zmq_msg_init_size(&msg, len); if(-1 == ret){ ret = luazmq_fail(L, skt); lua_pushinteger(L, i); return ret + 1; } memcpy(zmq_msg_data(&msg), data, len); ret = zmq_msg_send(&msg, skt->skt, (i == n)?last_flag:ZMQ_SNDMORE); zmq_msg_close(&msg); if(-1 == ret){ ret = luazmq_fail(L, skt); lua_pushinteger(L, i); return ret + 1; } } return luazmq_pass(L); }
static int luazmq_msg_set_data(lua_State *L){ zmessage *zmsg = luazmq_getmessage(L); int start_pos = (lua_gettop(L) >= 3)?luaL_optint(L,2,1):1; size_t size; const char *data = luaL_checklstring(L, (lua_gettop(L) >= 3)?3:2, &size); int err; luaL_argcheck(L, start_pos >= 0, 2, "can not be negative or zero"); start_pos = start_pos - 1; if((start_pos + size) > zmq_msg_size(&zmsg->msg)){ zmq_msg_t msg; err = zmq_msg_init_size(&msg, start_pos + size); if(-1 == err)return luazmq_fail(L, NULL); memcpy(zmq_msg_data(&msg), zmq_msg_data(&zmsg->msg), zmq_msg_size(&zmsg->msg)); err = zmq_msg_move(&zmsg->msg, &msg); if(-1 == err){ zmq_msg_close(&msg); return luazmq_fail(L, NULL); } zmq_msg_close(&msg); // @FIXME do not close message } memcpy( (char*)zmq_msg_data(&zmsg->msg) + start_pos, data, size); return luazmq_pass(L); }
static int luazmq_skt_sendv_impl(lua_State *L, int flags) { zsocket *skt = luazmq_getsocket(L); size_t i, size = 0, top = lua_gettop(L); zmq_msg_t msg; int ret; for(i = 2; i<=top; ++i){ size_t s; luaL_checklstring(L,i,&s); size += s; } if (0 == size){ ret = zmq_msg_init(&msg); } else { ret = zmq_msg_init_size(&msg, size); } if(-1 == ret) return luazmq_fail(L, skt); { size_t pos; for(pos = 0, i = 2; i<=top; ++i){ const char *data = luaL_checklstring(L,i,&size); memcpy((char*)zmq_msg_data(&msg) + pos, data, size); pos += size; } } ret = zmq_msg_send(&msg, skt->skt, flags); zmq_msg_close(&msg); if(-1 == ret) return luazmq_fail(L, skt); return luazmq_pass(L); }