예제 #1
0
int thread_read_read(struct  thread_read *thread, char * buf, int size)
{
    int ret = -1;
    int readlen = 0;
    int retrynum = 100;

    while (readlen == 0 && !ISTRYBECLOSED()) {
        //  streambuf_dumpstates(thread->streambuf);
        ret = streambuf_read(thread->streambuf, buf + readlen, size - readlen);
        //  LOGI("---------thread_read_read=%d,size=%d\n", ret, size);
        //streambuf_dumpstates(thread->streambuf);
        if (ret > 0) {
            readlen += ret;
        } else if (ret < 0) {
            streambuf_dumpstates(thread->streambuf);
            break;
        } else if (ret == 0) {
            if (thread->fatal_error) {
                ret = thread->fatal_error;
                break;
            }
            if (thread->error < 0 && thread->error != -11) {
                ret = thread->error;
                break;
            }
            thread_read_readwait(thread, 10 * 1000);
        }
        if (retrynum <= 0) {
            break;
        }
    }
    return readlen > 0 ? readlen : ret;

}
예제 #2
0
static bool_t decode_pcm_callback(void *data) {
	struct decode_pcm *self = (struct decode_pcm *) data;
	pcm_read_func_t read_func;
	sample_t *write_pos;
	u8_t *read_pos;
	u32_t s, num_samples;
	sample_t sample;
	size_t sz;

	sz = streambuf_read(self->read_buffer + self->leftover, 0, BLOCKSIZE - self->leftover, NULL);
	if (!sz) {
		current_decoder_state |= DECODE_STATE_UNDERRUN;
		return FALSE;
	}

	current_decoder_state &= ~DECODE_STATE_UNDERRUN;

	sz += self->leftover;

	read_func = pcm_read_funcs[(2 * self->sample_size) + self->big_endian];
	read_pos = self->read_buffer;
	write_pos = self->write_buffer;

	num_samples = sz / pcm_sample_widths[self->sample_size];
	if (self->stereo) {
		/* we need the same number of sample for both channels */
		num_samples &= ~0x01;
	}

	for (s = 0; s < num_samples; s++) {
		sample = read_func(read_pos);
		*write_pos++ = sample;
		if (!self->stereo) {
			*write_pos++ = sample;
		}
		read_pos += pcm_sample_widths[self->sample_size];
	}

	if (num_samples) {
		decode_output_samples(self->write_buffer, self->stereo ? num_samples / 2 : num_samples, self->sample_rate);
	}

	self->leftover = sz - (read_pos - self->read_buffer);

	if (self->leftover) {
		memcpy(self->read_buffer, read_pos, self->leftover);
	}
					      
	return TRUE;
}		
예제 #3
0
파일: ec_ssh.c 프로젝트: abdimuna1/ettercap
/* Read a crypted packet from the stream. 
 * The buffer is dynamically allocated, so
 * calling function has to free it.
 */
static int32 read_packet(u_char **buffer, struct stream_buf *dbuf)
{
   int32 length, mod;
   
   /* Read packet length and calculate modulus */
   if (streambuf_read(dbuf, (u_char *)&length, 4, STREAM_ATOMIC) == -EINVALID)
      return -EINVALID;
   length = ntohl(length);   
   mod = 8 - (length % 8);

   /* Allocate the buffer and read the whole packet 
    * SAFE_CALLOC is not good to handle errors.    
    */
   *buffer = (u_char *)malloc(length + mod + 4);
   if (*buffer == NULL)
      return -EINVALID;
      
   if (streambuf_get(dbuf, *buffer, length + mod + 4, STREAM_ATOMIC) == -EINVALID) {
      SAFE_FREE(*buffer);
      return -EINVALID;
   }
      
   return ESUCCESS;
}