int ret;
struct timeval stream_start;
long unsigned i, first_chunk, last_chunk;
- char *buf;
+ const char *buf;
size_t size;
- if (conf.begin_chunk_arg < 0)
- return -ERRNO_TO_PARA_ERROR(EINVAL);
- first_chunk = conf.begin_chunk_arg;
-
- if (conf.end_chunk_given) {
- if (conf.end_chunk_arg < 0)
+ if (conf.begin_chunk_arg < 0) {
+ if (-conf.begin_chunk_arg > afhi->chunks_total)
return -ERRNO_TO_PARA_ERROR(EINVAL);
- if (conf.end_chunk_arg >= afhi->chunks_total)
- return -ERRNO_TO_PARA_ERROR(EINVAL);
- last_chunk = conf.end_chunk_arg;
+ first_chunk = afhi->chunks_total + conf.begin_chunk_arg;
+ } else
+ first_chunk = conf.begin_chunk_arg;
+ if (conf.end_chunk_given) {
+ if (conf.end_chunk_arg < 0) {
+ if (-conf.end_chunk_arg > afhi->chunks_total)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ last_chunk = afhi->chunks_total + conf.end_chunk_arg;
+ } else {
+ if (conf.end_chunk_arg >= afhi->chunks_total)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ last_chunk = conf.end_chunk_arg;
+ }
} else
last_chunk = afhi->chunks_total - 1;
+ if (first_chunk >= last_chunk)
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
if (!afhi->chunks_total)
return 1;
afh_get_header(afhi, audio_file_data, &buf, &size);
}
}
PARA_INFO_LOG("writing chunk %lu\n", i);
- ret = write(STDOUT_FILENO, buf, size);
+ ret = write_all(STDOUT_FILENO, buf, &size);
if (ret < 0)
return ret;
- if (ret != size)
- return -E_AFH_SHORT_WRITE;
}
return 1;
}
int main(int argc, char **argv)
{
- int ret, audio_format_num;
+ int ret, audio_format_num, fd;
void *audio_file_data;
size_t audio_file_size;
struct afh_info afhi;
goto out;
afh_init();
ret = mmap_full_file(conf.inputs[0], O_RDONLY, &audio_file_data,
- &audio_file_size, NULL);
+ &audio_file_size, &fd);
if (ret < 0)
goto out;
- ret = compute_afhi(conf.inputs[0], audio_file_data, audio_file_size, &afhi);
+ ret = compute_afhi(conf.inputs[0], audio_file_data, audio_file_size,
+ fd, &afhi);
if (ret < 0)
goto out;
audio_format_num = ret;