コード例 #1
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #2
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #3
0
ファイル: zmsg.c プロジェクト: jrossi/lzmq
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);
}
コード例 #4
0
ファイル: zmsg.c プロジェクト: jrossi/lzmq
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);
}
コード例 #5
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #6
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #7
0
ファイル: zmsg.c プロジェクト: jrossi/lzmq
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);
}
コード例 #8
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #9
0
ファイル: zmsg.c プロジェクト: jrossi/lzmq
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);
}
コード例 #10
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #11
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #12
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #13
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);
}
コード例 #14
0
ファイル: zmsg.c プロジェクト: jrossi/lzmq
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);
}
コード例 #15
0
ファイル: zsocket.c プロジェクト: ajtulloch/lzmq
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);

}