int CompactBlockCompleteMessage::parse(char* data, int32_t len)
 {
   if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&block_id_)) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&success_)) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   if (get_int64(&data, &len, reinterpret_cast<int64_t*> (&server_id_)) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   if ((len < static_cast<int32_t> (sizeof(uint8_t))) || (len > TFS_MALLOC_MAX_SIZE))
   {
     return TFS_ERROR;
   }
   if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&flag_)) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   if (get_vint64(&data, &len, ds_list_) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   if (get_object(&data, &len, reinterpret_cast<void**> (&block_info_), BLOCKINFO_SIZE) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   return TFS_SUCCESS;
 }
Example #2
0
 T get( const field_desc_type *fld ) const
 {
     switch(fld->cpp_type( )) {
     case field_desc_type::CPPTYPE_INT32:
         return boost::lexical_cast<T>(get_int32(fld));
     case field_desc_type::CPPTYPE_INT64:
         return boost::lexical_cast<T>(get_int64(fld));
     case field_desc_type::CPPTYPE_UINT32:
         return boost::lexical_cast<T>(get_uint32(fld));
     case field_desc_type::CPPTYPE_UINT64:
         return boost::lexical_cast<T>(get_uint64(fld));
     case field_desc_type::CPPTYPE_FLOAT:
         return boost::lexical_cast<T>(get_float(fld));
     case field_desc_type::CPPTYPE_DOUBLE:
         return boost::lexical_cast<T>(get_double(fld));
     case field_desc_type::CPPTYPE_ENUM:
         return boost::lexical_cast<T>(get_enum(fld)->number());
     case field_desc_type::CPPTYPE_STRING:
         return boost::lexical_cast<T>(get_string(fld));
     case field_desc_type::CPPTYPE_BOOL:
         return boost::lexical_cast<T>(get_bool(fld));
     case field_desc_type::CPPTYPE_MESSAGE:
         throw std::bad_cast( );
     default:
         return T( );
     }
 }
    int ReplicateInfoMessage::get_counter_map(char** data, int32_t* len, COUNTER_TYPE & m)
    {
      int32_t i = 0;
      int32_t size = 0;
      uint64_t server_id = 0;
      uint32_t count = 0;

      if (get_int32(data, len, &size) == TFS_ERROR)
      {
        return TFS_ERROR;
      }
      for (i = 0; i < size; ++i)
      {
        if (get_int64(data, len, reinterpret_cast<int64_t*> (&server_id)) == TFS_ERROR)
        {
          return TFS_ERROR;
        }
        if (get_int32(data, len, reinterpret_cast<int32_t*> (&count)) == TFS_ERROR)
        {
          return TFS_ERROR;
        }
        m.insert(COUNTER_TYPE::value_type(server_id, count));
      }
      return TFS_SUCCESS;
    }
 int SuspectDataserverMessage::parse(char* data, int32_t len)
 {
   if (get_int64(&data, &len, reinterpret_cast<int64_t*> (&server_id_)) == TFS_ERROR)
   {
     return TFS_ERROR;
   }
   return TFS_SUCCESS;
 }
Example #5
0
static void sendfile_drv_output(ErlDrvData handle, char* buf,
                                ErlDrvSizeT buflen)
{
    int fd, socket_fd;
    Desc* d = (Desc*)handle;
    Buffer b;
    b.buffer = buf;
    socket_fd = get_int32(&(b.args->out_fd));
    fd = open(b.args->filename, O_RDONLY | O_NONBLOCK);
    if (fd < 0) {
        ErlDrvSizeT out_buflen = set_error_buffer(&b, socket_fd, errno);
        driver_output(d->port, buf, out_buflen);
    } else {
        Transfer* xfer;
        SocketFd sfd;
        sfd.socket_fd = socket_fd;
        xfer = (Transfer*)hashtable_search(d->xfer_table, sfd.hashkey);
        if (xfer == NULL) {
            /* Transfer objects are intentionally not freed until the
               driver stops, or if an insertion error occurs below. */
            xfer = (Transfer*)malloc(sizeof(Transfer));
            if (xfer == NULL) {
                ErlDrvSizeT out_buflen = set_error_buffer(&b, socket_fd,
                                                          ENOMEM);
                driver_output(d->port, buf, out_buflen);
                return;
            }
            if (!hashtable_insert(d->xfer_table, sfd.hashkey, xfer)) {
                ErlDrvSizeT out_buflen = set_error_buffer(&b, socket_fd,
                                                          ENOMEM);
                driver_output(d->port, buf, out_buflen);
                free(xfer);
                return;
            }
        }
        xfer->file_fd = fd;
        xfer->offset = get_int64(&(b.args->offset.offset));
        xfer->count = get_int64(&(b.args->count.size));
        xfer->total = 0;
#if defined(ERL_DRV_USE) && defined(ERL_DRV_WRITE)
        driver_select(d->port, sfd.ev_data, ERL_DRV_USE|ERL_DRV_WRITE, 1);
#else
        driver_select(d->port, sfd.ev_data, DO_WRITE, 1);
#endif
    }
}
Example #6
0
void SFTP::process_write(void)
{
	u_int32_t id;
	u_int64_t off;
	u_int len;
	int handle, status = SSH2_FX_FAILURE;
	char *data;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	data = (char*) get_string(&len);

#ifdef SLOW_DEBUG
	debug("request %u: write \"%s\" (handle %d) off %llu len %d",
	    id, 
      toUTF8 (handle_to_name(handle)).c_str (), 
      handle, (unsigned long long)off, len);
#endif
	HANDLE fh = handle_to_fh(handle);
	if (fh != INVALID_HANDLE_VALUE) {
    LARGE_INTEGER largeOffset;
    largeOffset.QuadPart = off;
		if (!::SetFilePointerEx 
         (fh, largeOffset, NULL, FILE_BEGIN)
        ) 
    {
			status = errno_to_portable(::GetLastError ());
			error("process_write: seek failed");
		} 
    else 
    {
/* XXX ATOMICIO ? */
			DWORD nBytesWritten;
      if (!::WriteFile (fh, data, len, &nBytesWritten, 0)) 
      {
				error("process_write: write failed");
        int err = ::GetLastError ();
        if (err != 0)
				  status = errno_to_portable(err);
        else 
          status = SSH2_FX_FAILURE; //TODO reason?
			} 
      else if ((size_t) nBytesWritten == len) 
      {
				status = SSH2_FX_OK;
				handle_update_write(handle, (ssize_t) nBytesWritten);
			} 
      else 
      {
				debug2("nothing at all written");
			}
		}
	}
	send_status(id, status);
	xfree(data);
}
Example #7
0
void mpfx_manager::set(mpfx & n, int v) {
    if (v == 0) {
        reset(n);
    }
    else {
        if (v < 0) {
            set(n, static_cast<unsigned>(-v));
            n.m_sign = 1;
        }
        else {
            set(n, static_cast<unsigned>(v));
        }
    }
    SASSERT(get_int64(n) == v);
    SASSERT(check(n));
}
static void dict_to_struct (GHashTable *dict,
                            const DictFieldMapping *mapping,
                            void *struct_ptr)
{
    const DictFieldMapping *it = mapping;
    g_return_if_fail (it != NULL);
    while (it->name != NULL) {
        switch (it->type) {
            case G_TYPE_INT64: {
                gint *field;
                field = G_STRUCT_MEMBER_P (struct_ptr, it->offset);
                *field = get_int64 (dict, it->name);
                break;
            }

            case G_TYPE_BOOLEAN: {
                gboolean *field;
                field = G_STRUCT_MEMBER_P (struct_ptr, it->offset);
                *field = get_boolean (dict, it->name);
                break;
            }

            case G_TYPE_STRING: {
                gchar **field;
                field = G_STRUCT_MEMBER_P (struct_ptr, it->offset);
                *field = get_string (dict, it->name);
                break;
            }

            case G_TYPE_DOUBLE: {
                gdouble *field;
                field = G_STRUCT_MEMBER_P (struct_ptr, it->offset);
                *field = get_double (dict, it->name);
                break;
            }
        }
        g_hash_table_remove (dict, it->name);
        ++it;
    }
#ifdef DEBUG_PARSING
    if (g_hash_table_size (dict) != 0) {
        g_print ("Unused keys:\n");
        g_hash_table_foreach (dict, dump_key_name, NULL);
        g_print ("\n");
    }
#endif
}
static void
process_write(void)
{
	u_int32_t id;
	u_int64_t off;
	u_int len;
	int handle, fd, ret, status;
	char *data;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	data = get_string(&len);

	debug("request %u: write \"%s\" (handle %d) off %llu len %d",
	    id, handle_to_name(handle), handle, (unsigned long long)off, len);
	fd = handle_to_fd(handle);
	
	if (fd < 0)
		status = SSH2_FX_FAILURE;
	else if (readonly)
		status = SSH2_FX_PERMISSION_DENIED;
	else {
		if (lseek(fd, off, SEEK_SET) < 0) {
			status = errno_to_portable(errno);
			error("process_write: seek failed");
		} else {
/* XXX ATOMICIO ? */
			ret = write(fd, data, len);
			if (ret < 0) {
				error("process_write: write failed");
				status = errno_to_portable(errno);
			} else if ((size_t)ret == len) {
				status = SSH2_FX_OK;
				handle_update_write(handle, ret);
			} else {
				debug2("nothing at all written");
				status = SSH2_FX_FAILURE;
			}
		}
	}
	send_status(id, status);
	xfree(data);
}
    int UpdateBlockInfoMessage::parse(char* data, int32_t len)
    {
      if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&block_id_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      }

      if (get_int64(&data, &len, reinterpret_cast<int64_t*> (&server_id_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      }

      int32_t have_block = 0;
      if (get_int32(&data, &len, &have_block) == TFS_ERROR)
      {
        have_block = 0;
      }
      if (have_block)
      {
        if (get_object(&data, &len, reinterpret_cast<void**> (&block_info_), BLOCKINFO_SIZE) == TFS_ERROR)
        {
          return TFS_ERROR;
        }
      }
      if (get_int32(&data, &len, &repair_) == TFS_ERROR)
      {
        return TFS_ERROR;
      }
      int32_t have_sdbm = 0;
      if (get_int32(&data, &len, &have_sdbm) == TFS_ERROR)
      {
        have_sdbm = 0;
      }
      if (have_sdbm > 0)
      {
        if (get_object(&data, &len, reinterpret_cast<void**> (&db_stat_), sizeof(SdbmStat)) == TFS_ERROR)
        {
          return TFS_ERROR;
        }
      }

      return TFS_SUCCESS;
    }
static void
process_read(void)
{
	char buf[64*1024];
	u_int32_t id, len;
	int handle, fd, ret, status = SSH2_FX_FAILURE;
	u_int64_t off;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	len = get_int();

	debug("request %u: read \"%s\" (handle %d) off %llu len %d",
	    id, handle_to_name(handle), handle, (unsigned long long)off, len);
	if (len > sizeof buf) {
		len = sizeof buf;
		debug2("read change len %d", len);
	}
	fd = handle_to_fd(handle);
	if (fd >= 0) {
		if (lseek(fd, off, SEEK_SET) < 0) {
			error("process_read: seek failed");
			status = errno_to_portable(errno);
		} else {
			ret = read(fd, buf, len);
			if (ret < 0) {
				status = errno_to_portable(errno);
			} else if (ret == 0) {
				status = SSH2_FX_EOF;
			} else {
				send_data(id, buf, ret);
				status = SSH2_FX_OK;
				handle_update_read(handle, ret);
			}
		}
	}
	if (status != SSH2_FX_OK)
		send_status(id, status);
}
Example #12
0
void mpfx_manager::set(mpfx & n, int64 v) {
    if (m_int_part_sz == 1) {
        if (v < -static_cast<int64>(static_cast<uint64>(UINT_MAX)) || 
            v > static_cast<int64>(static_cast<uint64>(UINT_MAX)))
            throw overflow_exception();
    }
    if (v == 0) {
        reset(n);
    }
    else {
        if (v < 0) {
            set(n, static_cast<uint64>(-v));
            n.m_sign = 1;
        }
        else {
            set(n, static_cast<uint64>(v));
        }
    }
    SASSERT(is_int(n));
    SASSERT(get_int64(n) == v);
    SASSERT(check(n));
}
static void
process_read(void)
{
	char buf[64*1024];
	u_int32_t id, len;
	int handle, fd, ret, status = SSH2_FX_FAILURE;
	u_int64_t off;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	len = get_int();

	TRACE("read id %u handle %d off %llu len %d", id, handle,
	    (u_int64_t)off, len);
	if (len > sizeof buf) {
		len = sizeof buf;
		log("read change len %d", len);
	}
	fd = handle_to_fd(handle);
	if (fd >= 0) {
		if (lseek(fd, off, SEEK_SET) < 0) {
			error("process_read: seek failed");
			status = errno_to_portable(errno);
		} else {
			ret = read(fd, buf, len);
			if (ret < 0) {
				status = errno_to_portable(errno);
			} else if (ret == 0) {
				status = SSH2_FX_EOF;
			} else {
				send_data(id, buf, ret);
				status = SSH2_FX_OK;
			}
		}
	}
	if (status != SSH2_FX_OK)
		send_status(id, status);
}
static void
process_write(void)
{
	u_int32_t id;
	u_int64_t off;
	u_int len;
	int handle, fd, ret, status = SSH2_FX_FAILURE;
	char *data;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	data = get_string(&len);

	TRACE("write id %u handle %d off %llu len %d", id, handle,
	    (u_int64_t)off, len);
	fd = handle_to_fd(handle);
	if (fd >= 0) {
		if (lseek(fd, off, SEEK_SET) < 0) {
			status = errno_to_portable(errno);
			error("process_write: seek failed");
		} else {
/* XXX ATOMICIO ? */
			ret = write(fd, data, len);
			if (ret == -1) {
				error("process_write: write failed");
				status = errno_to_portable(errno);
			} else if (ret == len) {
				status = SSH2_FX_OK;
			} else {
				log("nothing at all written");
			}
		}
	}
	send_status(id, status);
	xfree(data);
}
    int BlockWriteCompleteMessage::parse(char* data, int32_t len)
    {
      if (get_int64(&data, &len, reinterpret_cast<int64_t*> (&server_id_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      }
      if (get_object(&data, &len, reinterpret_cast<void**> (&block_info_), BLOCKINFO_SIZE) == TFS_ERROR)
      {
        return TFS_ERROR;
      }
      if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&lease_id_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      } if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&write_complete_status_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      }
      if (get_int32(&data, &len, reinterpret_cast<int32_t*> (&unlink_flag_)) == TFS_ERROR)
      {
        return TFS_ERROR;
      }

      return TFS_SUCCESS;
    }
Example #16
0
void SFTP::process_read(void)
{
	char buf[64*1024];
	u_int32_t id, len;
	int handle, status = SSH2_FX_FAILURE;
	u_int64_t off;

	id = get_int();
	handle = get_handle();
	off = get_int64();
	len = get_int();

#ifdef SLOW_DEBUG
	debug("request %u: read \"%s\" (handle %d) off %llu len %d",
    id, toUTF8(handle_to_name(handle)).c_str (), 
      handle, (unsigned long long)off, len);
#endif
	if (len > sizeof buf) {
		len = sizeof buf;
		debug2("read change len %d", len);
	}
	HANDLE fh = handle_to_fh(handle);
	if (fh != INVALID_HANDLE_VALUE) {
    LARGE_INTEGER largeOffset;
    largeOffset.QuadPart = off;

		if (!::SetFilePointerEx
         (fh, largeOffset, NULL, FILE_BEGIN))
    {
      int err = ::GetLastError ();
      if (!err)
        status = SSH2_FX_EOF;
      else
      {
			  error("process_read: seek failed");
        status = errno_to_portable(err);
      }
		} 
    else 
    {
      DWORD nBytesRed = 0;

			if (!::ReadFile (fh, buf, len, &nBytesRed, 0)) 
      {
				status = errno_to_portable(::GetLastError ());
			} 
      else if (nBytesRed == 0) 
      {
				status = SSH2_FX_EOF;
			} 
      else 
      {
        if (nBytesRed < len)
          debug ("process_read: requested %u, "
                 "%u was red", 
                 (unsigned) len, 
                 (unsigned) nBytesRed); 
				send_data(id, buf, (u_int) nBytesRed);
				status = SSH2_FX_OK;
				handle_update_read(handle, (u_int) nBytesRed);
			}
		}
	}
	if (status != SSH2_FX_OK)
		send_status(id, status);
}
Example #17
0
int Hash::anonymizeValue(Value* v) {
    
    unsigned char* mac;
    unsigned int macLen;    
  
    // @@@
    // cerr << "3333333" << endl;
    switch (Hash::hashType) {
        case HASHTYPE_MD2: // 16
        case HASHTYPE_MD5:
            mac = new unsigned char[17];
            memset(mac, 0, 17);
            macLen = 16;            
            break;
        case HASHTYPE_SHA:
        case HASHTYPE_SHA1:
        case HASHTYPE_RIPEMD160:
            mac = new unsigned char[21];
            memset(mac, 0, 21);
            macLen = 20;
            break;
        case HASHTYPE_SHA224:
            mac = new unsigned char[29];
            memset(mac, 0, 29);
            macLen = 28;            
            break;
        case HASHTYPE_SHA256:
            mac = new unsigned char[33];
            memset(mac, 0, 33);
            macLen = 32;
            break;
        case HASHTYPE_SHA384:
            mac = new unsigned char[49];
            memset(mac, 0, 49);
            macLen = 48;
            break;
        case HASHTYPE_SHA512:
            mac = new unsigned char[65];
            memset(mac, 0, 65);
            macLen = 64;            
    }
    // @@@
    // cerr << "44444" << endl;
    switch (v->Type()) {
        case VAL_TYPE_UINT8:
        case VAL_TYPE_UINT16:
        case VAL_TYPE_UINT32:
        case VAL_TYPE_INT8:
        case VAL_TYPE_INT16:
        case VAL_TYPE_INT32: {
            int64_t num = 0;
            get_int64(v, num);
            
            if (pwd.empty()) {
                (*hashFunc)((const unsigned char*)&num, 8, mac);
            } else {
                HMAC((*evpHashFunc)(), Hash::pwd.c_str(), Hash::pwd.size(), 
                        (const unsigned char*)&num, 8, mac, &macLen);
            }

            set_int64(v, num);            
            break;
        }
        case VAL_TYPE_CHAR_PTR: {
            char* c = Value::to_char_ptr(v);

            if (pwd.empty()) {
                (*hashFunc)((const unsigned char*)c, v->Bytes(), mac);
            } else {
                HMAC((*evpHashFunc)(), Hash::pwd.c_str(), Hash::pwd.size(), 
                        (const unsigned char*)c, v->Bytes(), mac, &macLen);
            }

            memcpy(v->Ptr(), ((void*)(mac)), v->Bytes());
            break;
        }
        case VAL_TYPE_STRING: {
            string *s = Value::to_string(v);            

            if (pwd.empty()) {
                (*hashFunc)((const unsigned char*)s->c_str(), s->size(), mac);
            } else {
                HMAC((*evpHashFunc)(), Hash::pwd.c_str(), Hash::pwd.size(), 
                        (const unsigned char*)s->c_str(), s->size(), mac, &macLen);
            }
            
            int32_t tmpSize = 2 * macLen + 1;
            char* temp = new char[tmpSize];
            memset(temp, 0, tmpSize);
            to_hexstr(mac, temp);

            *s = string(temp);
            delete[] temp;
            break;
        }
        default:
            cerr << "flaim Hashmac: Unsupported data type" <<endl;
            delete[] mac;
            exit(1);
    }
    delete[] mac;
    // @@@
    // cerr << "555555" << endl;
    return 0;
}
/* given a return value in OCaml land, translate it to 
   the return_val_t C structure
*/ 
return_val_t translate_return_value(value ocaml_result) {
  CAMLparam1(ocaml_result);
  CAMLlocal5(ocaml_shape, ocaml_strides, ocaml_data, ocaml_cur, ocaml_type);
  CAMLlocal1(v);
  
  return_val_t ret;
  
  if (Is_long(ocaml_result)) {
    // In this case, we know that the return code must have been Pass,
    // since the other two return codes have data.
    ret.return_code = RET_PASS;
    ret.results_len = 0;
  } else if (Tag_val(ocaml_result) == RET_FAIL) {
    ret.return_code = RET_FAIL;
    ret.results_len = caml_string_length(Field(ocaml_result, 0));
    ret.error_msg = malloc(ret.results_len + 1);
    strcpy(ret.error_msg, String_val(Field(ocaml_result, 0)));
  } else if (Tag_val(ocaml_result) == RET_SUCCESS) {
    
    ocaml_cur = Field(ocaml_result, 0);
    ret.return_code = RET_SUCCESS;
    ret.results_len = ocaml_list_length(ocaml_cur);
    ret.results = (ret_t*)malloc(sizeof(ret_t) * ret.results_len);
    
    int i, j;
    host_val h; 
    for (i = 0; i < ret.results_len; ++i) {
      v = Field(ocaml_cur, 0);
      h = create_host_val(v);  
      ocaml_cur = Field(ocaml_cur, 1);
      // returning a scalar
      if (value_is_scalar(h)) {

        ret.results[i].is_scalar = 1;
        ocaml_type = (scalar_type)value_type_of(h);
        ret.results[i].data.scalar.ret_type =
            get_scalar_element_type(ocaml_type);

        // WARNING:
        // Tiny Memory Leak Ahead
        // -----------------------
        // When scalar data is returned to the host language
        // on the heap, it should be manually deleted by the
        // host frontend

        if (type_is_bool(ocaml_type)) {
          ret.results[i].data.scalar.ret_scalar_value.boolean = get_bool(h);
        } else if (type_is_int32(ocaml_type)) {
          ret.results[i].data.scalar.ret_scalar_value.int32 = get_int32(h);
        } else if (type_is_int64(ocaml_type)) {
          ret.results[i].data.scalar.ret_scalar_value.int64 = get_int64(h);
        } else if (type_is_float32(ocaml_type)) { 
          ret.results[i].data.scalar.ret_scalar_value.float32 = get_float64(h);
        } else if (type_is_float64(ocaml_type)) {
          ret.results[i].data.scalar.ret_scalar_value.float64 = get_float64(h);
        } else {
          caml_failwith("Unable to return scalar of this type\n");
        }
      } else {
        // Pass the type
        ret.results[i].is_scalar = 0;
        ret.results[i].data.array.ret_type = array_type_of(h);

        // Pass the data
        ret.results[i].data.array.data = get_array_data(h);

        // Build the shape array
        ocaml_shape = value_get_shape(h);
        int shape_len = Wosize_val(ocaml_shape);

        ret.results[i].data.array.shape =
            (int*)malloc(shape_len * sizeof(int));
        ret.results[i].data.array.shape_len = shape_len;
        for (j = 0; j < shape_len; ++j) {
          ret.results[i].data.array.shape[j] = Int_val(Field(ocaml_shape, j));
        }

        // Build the strides array
        ocaml_strides = value_get_strides(h);
        int strides_len = Wosize_val(ocaml_strides);

        ret.results[i].data.array.strides_len = strides_len;
        ret.results[i].data.array.strides =
            (int*)malloc(strides_len * sizeof(int));
        for (j = 0; j < strides_len; ++j) {
          ret.results[i].data.array.strides[j] =
              Int_val(Field(ocaml_strides, j));
        }
      }
    }
  }
  CAMLreturnT(return_val_t, ret);
	
}
Example #19
0
static void get_torrent_list(torrent_array **result) {
    size_t size;
    xmlrpc_value *xml_array, *params;

    params = xmlrpc_array_new(&env);
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "main"));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.hash="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.name="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.is_active="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.state="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.bytes_done="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.size_bytes="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.up.rate="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.down.rate="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.down.total="));
    xmlrpc_array_append_item(&env, params, xmlrpc_string_new(&env, "d.ratio="));
    check_fault();

    execute_proxy_method(&xml_array, "d.multicall", params);
    check_fault(&env);
    assert(xmlrpc_value_type(xml_array) == XMLRPC_TYPE_ARRAY);

    XMLRPC_ASSERT_ARRAY_OK(xml_array);
    size = xmlrpc_array_size(&env, xml_array);
    check_fault(&env);

    if (size <= 0)
        goto finish;
        
    *result = torrent_array_new(size);
    for (size_t i = 0; i < size; ++i) {
        size_t tarray_size;
        xmlrpc_value *tarray = NULL;

        xmlrpc_array_read_item(&env, xml_array, i, &tarray);
        check_fault(&env);
        assert(xmlrpc_value_type(tarray) == XMLRPC_TYPE_ARRAY);

        XMLRPC_ASSERT_ARRAY_OK(tarray);
        tarray_size = xmlrpc_array_size(&env, tarray);

        for (size_t j = 0; j < tarray_size; ++j) {
            xmlrpc_value *item = NULL;

            xmlrpc_array_read_item(&env, tarray, j, &item);
            check_fault(&env);

            switch (j) {
                case 0:
                    get_string(item, &(*result)->torrents[i]->hash);
                    break;
                case 1:
                    get_string(item, &(*result)->torrents[i]->name);
                    break;
                case 2:
                    get_bool_from_int64(item, &(*result)->torrents[i]->active);
                    break;
                case 3:
                    get_bool_from_int64(item, &(*result)->torrents[i]->started);
                    break;
                case 4:
                    get_int64(item, &(*result)->torrents[i]->done_bytes);
                    break;
                case 5:
                    get_int64(item, &(*result)->torrents[i]->size_bytes);
                    break;
                case 6:
                    get_int64(item, &(*result)->torrents[i]->up_rate);
                    break;
                case 7:
                    get_int64(item, &(*result)->torrents[i]->down_rate);
                    break;
                case 8:
                    get_int64(item, &(*result)->torrents[i]->down_total);
                    break;
                case 9:
                    get_int64(item, &(*result)->torrents[i]->ratio);
                    break;
                default:
                    ;
            }
            xmlrpc_DECREF(item);
        }
        xmlrpc_DECREF(tarray);
    }

finish:
    xmlrpc_DECREF(xml_array);
}
Example #20
0
static void get_bool_from_int64(xmlrpc_value *value, bool *result) {
    int64_t tmp;
    get_int64(value, &tmp);
    *result = tmp == 1 ? true : false;
}