Example #1
0
int pack_msg(pomme_protocol_t *pro, pomme_pack_t **buf)
{
    int ret = 0;
    size_t t_len = 0;

    assert( pro!= NULL );
    assert( buf!= NULL );

    t_len = pomme_msg_len(pro);
    //pro->len+sizeof(pomme_protocol_type_t)+2*sizeof(size_t);
    ret =  pomme_pack_create(buf, NULL, t_len);

    if( ret < 0 )
    {
        debug("buf create fail");
        goto err;
    }

    pomme_pack(&pro->op, pomme_protocol_type_t, *buf);
    pomme_pack(&pro->total_len, size_t , *buf);

    pomme_pack(&pro->id, u_int64 ,*buf);
    pomme_pack(&pro->offset, size_t,*buf);

    pomme_pack_array(&pro->data, char, pro->len , *buf);
    ret = t_len;
err:
    return ret;
}
Example #2
0
int pomme_client_get_data(uuid_t id,
	size_t off,
	size_t len,
	int handle,
	void *buffer,
	int *r_len)
{
    assert( buffer !=NULL );
    assert( r_len  != NULL );
    int ret = 0,flags=0;

    pomme_protocol_t pro,rpro;
    memset( &pro, 0, sizeof(pro));
    memset( &rpro, 0, sizeof(rpro));

    pro.op = get_data;
    pro.total_len = len;
    pro.offset = off;
    uuid_copy(pro.id, id);

    pomme_pack_t *buf = NULL;
    if( ( ret = pack_msg(&pro, &buf) ) < 0 )
    {
	debug("pack msg failure");
	goto err;
    }

    if( ( ret = pomme_send(handle, buf->data, 
		    pomme_msg_get_len((&pro)),flags )) < 0)
    {
	debug("send data fail");
	goto err;
    }
    /*
     * recv data package
     */
    unsigned char t_buffer[POMME_PACKAGE_SIZE];
    size_t t_len = 0;

    if( ( ret = pomme_recv(handle, t_buffer, 
		    POMME_PACKAGE_SIZE,
	    &t_len, flags) ) < 0 )
    {
	debug("recv first fail");
	goto err;
    }

    pomme_pack_t *p_buffer = NULL;
    if( (ret = pomme_pack_create(&p_buffer,t_buffer,
		    t_len)) < 0 )
    {
	debug("create buffer error");
	goto err;
    }	

    if( (ret = unpack_msg( &rpro, p_buffer) ) < 0 )
    {
	debug("unpack msg fail");
	goto data_err;
    }

    pomme_print_proto(&rpro,NULL);
    if( rpro.op != put_data )
    {
	debug("wrong operation");
	goto data_err;
    }
    if( rpro.total_len > len )
    {
	debug("too much data recved");
	goto data_err;
    }

    size_t tr_len = rpro.len;
    memcpy(buffer,t_buffer, tr_len);

    while( tr_len < rpro.total_len )
    {
	size_t tmp = 0;
	ret = pomme_recv(handle, buffer+tr_len, 
		rpro.total_len - tr_len, 
		&tmp, flags);
	if( ret < 0 )
	{
	    debug("recv err,data total get:%d",tr_len);
	    break;
	}
	tr_len += tmp;
    }
    *r_len = tr_len;
    debug("data len %d",tr_len);
data_err:
    pomme_pack_distroy(&p_buffer);

err:
    pomme_pack_distroy(&buf); 
    return ret;
}