From: Andre Noll Date: Sat, 22 Jan 2011 15:57:02 +0000 (+0100) Subject: Merge branch 't/periodic_header_optional' X-Git-Tag: v0.4.6~52 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=a365b8263a0d7a1673699bdf454677c95b38eb95;hp=0c9c3239eb328c8b802447b4f9d2c922085e74ee Merge branch 't/periodic_header_optional' --- diff --git a/Makefile.in b/Makefile.in index 994aadd5..3fbbce21 100644 --- a/Makefile.in +++ b/Makefile.in @@ -14,7 +14,7 @@ build_date := $(shell date) uname_s := $(shell uname -s 2>/dev/null || echo "UNKNOWN_OS") uname_rs := $(shell uname -rs) cc_version := $(shell $(CC) --version | head -n 1) -codename := symmetric randomization +codename := deterministic entropy DEBUG_CPPFLAGS += -Wno-sign-compare -g -Wunused -Wundef -W DEBUG_CPPFLAGS += -Wredundant-decls diff --git a/NEWS b/NEWS index 239964e0..adcc23eb 100644 --- a/NEWS +++ b/NEWS @@ -1,18 +1,22 @@ -------------------------------------------------- -0.4.5 (to be announced) "symmetric randomization" -------------------------------------------------- +----------------------------------------------- +0.4.6 (to be announced) "deterministic entropy" +----------------------------------------------- -Mainly bug fixes and the var_fec_slices patch set. +-------------------------------------------- +0.4.5 (2010-12-17) "symmetric randomization" +-------------------------------------------- + +Bug fixes, internal cleanups and variable-sized FEC slices. - Contains a fix for an invalid-free-bug in the ogg audio format handler code. - Switching off the DCCP sender works again. - para_audiod handles crashes of para_server more robustly. - - Internal scheduler cleanups. - - reduced latency due to variable sized FEC slices. + - Internal scheduler and writer cleanups. + - Reduced latency due to variable-sized FEC slices. - Improved documentation and error diagnostics. - - The build of para_server is now optional, allowing to build the - client side executables if libosl is not installed. + - The build of para_server is now optional, allowing the build + to succeed in case libosl is not installed. ------------------------------------------ 0.4.4 (2010-08-06) "persistent regularity" diff --git a/aac.h b/aac.h index 0a4db41f..0653d35a 100644 --- a/aac.h +++ b/aac.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/aac_afh.c b/aac_afh.c index 3e394337..94b0f8b3 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/aac_common.c b/aac_common.c index 68c3c89b..14662fdd 100644 --- a/aac_common.c +++ b/aac_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/aacdec_filter.c b/aacdec_filter.c index 1127fc11..1ac6a99a 100644 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/acl.c b/acl.c index 02df1e48..132350dd 100644 --- a/acl.c +++ b/acl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/acl.h b/acl.h index 65ccc748..14950b36 100644 --- a/acl.h +++ b/acl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2010 Andre Noll + * Copyright (C) 2008-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/afh.c b/afh.c index b66e260a..5ce6cfc5 100644 --- a/afh.c +++ b/afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2010 Andre Noll + * Copyright (C) 2008-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/afh.h b/afh.h index ccfed2fb..8f74e236 100644 --- a/afh.h +++ b/afh.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/afh_common.c b/afh_common.c index 952ef7ca..dd2ae650 100644 --- a/afh_common.c +++ b/afh_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/afs.c b/afs.c index 97c3d569..2fb28b71 100644 --- a/afs.c +++ b/afs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/afs.h b/afs.h index ba5e134c..699998b0 100644 --- a/afs.h +++ b/afs.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/aft.c b/aft.c index aa6ef08f..412318b2 100644 --- a/aft.c +++ b/aft.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/alsa_write.c b/alsa_write.c index bcabe53c..d6493418 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -35,7 +35,7 @@ struct private_alsa_write_data { /** The alsa handle */ snd_pcm_t *handle; - /** Determined and set by alsa_open(). */ + /** Determined and set by alsa_init(). */ int bytes_per_frame; /** The approximate maximum buffer duration in us. */ unsigned buffer_time; @@ -142,28 +142,18 @@ static int alsa_init(struct private_alsa_write_data *pad, return 1; } -/* Open an instance of the alsa writer. */ -static int alsa_open(struct writer_node *wn) -{ - wn->private_data = para_calloc(sizeof(struct private_alsa_write_data)); - return 1; -} - static void alsa_write_pre_select(struct sched *s, struct task *t) { struct writer_node *wn = container_of(t, struct writer_node, task); struct private_alsa_write_data *pad = wn->private_data; struct timeval tv; snd_pcm_sframes_t avail, underrun; - int ret; + int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - if (!pad->handle) - return; - ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - if (ret < 0) - sched_request_timeout_ms(20, s); - if (ret <= 0) + if (ret == 0) return; + if (ret < 0 || !pad) + return sched_min_delay(s); /* * Data is available to be written to the alsa handle. Compute number * of milliseconds until next buffer underrun would occur. @@ -191,16 +181,16 @@ static void alsa_close(struct writer_node *wn) struct private_alsa_write_data *pad = wn->private_data; PARA_INFO_LOG("closing writer node %p\n", wn); - if (pad->handle) { - /* - * It's OK to have a blocking operation here because we already - * made sure that the PCM output buffer is (nearly) empty. - */ - snd_pcm_nonblock(pad->handle, 0); - snd_pcm_drain(pad->handle); - snd_pcm_close(pad->handle); - snd_config_update_free_global(); - } + if (!pad) + return; + /* + * It's OK to have a blocking operation here because we already made + * sure that the PCM output buffer is (nearly) empty. + */ + snd_pcm_nonblock(pad->handle, 0); + snd_pcm_drain(pad->handle); + snd_pcm_close(pad->handle); + snd_config_update_free_global(); free(pad); } @@ -222,10 +212,10 @@ again: return; btr_merge(btrn, wn->min_iqs); bytes = btr_next_buffer(btrn, &data); - if (ret < 0 || bytes < pad->bytes_per_frame) { /* eof */ + if (ret < 0 || bytes < wn->min_iqs) { /* eof */ assert(btr_no_parent(btrn)); ret = -E_ALSA_EOF; - if (!pad->handle) + if (!pad) goto err; /* wait until pending frames are played */ if (pad->drain_barrier.tv_sec == 0) { @@ -238,9 +228,11 @@ again: goto err; return; } - if (!pad->handle) { + if (!pad) { int32_t val; + pad = para_calloc(sizeof(*pad)); + wn->private_data = pad; if (bytes == 0) /* no data available */ return; get_btr_sample_rate(btrn, &val); @@ -279,21 +271,14 @@ err: t->error = ret; } -__malloc static void *alsa_parse_config(const char *options) +__malloc static void *alsa_parse_config_or_die(const char *options) { - int ret; - struct alsa_write_args_info *conf - = para_calloc(sizeof(struct alsa_write_args_info)); + struct alsa_write_args_info *conf = para_calloc(sizeof(*conf)); PARA_INFO_LOG("options: %s, %zd\n", options, strcspn(options, " \t")); - ret = alsa_cmdline_parser_string(options, conf, "alsa_write"); - if (ret) - goto err_out; - PARA_INFO_LOG("help given: %d\n", conf->help_given); + /* exits on errors */ + alsa_cmdline_parser_string(options, conf, "alsa_write"); return conf; -err_out: - free(conf); - return NULL; } static void alsa_free_config(void *conf) @@ -313,11 +298,10 @@ void alsa_write_init(struct writer *w) struct alsa_write_args_info dummy; alsa_cmdline_parser_init(&dummy); - w->open = alsa_open; w->close = alsa_close; w->pre_select = alsa_write_pre_select; w->post_select = alsa_write_post_select; - w->parse_config = alsa_parse_config; + w->parse_config_or_die = alsa_parse_config_or_die; w->shutdown = NULL; /* nothing to do */ w->free_config = alsa_free_config; w->help = (struct ggo_help) { diff --git a/amp_filter.c b/amp_filter.c index 29c62e3b..21fd9fd1 100644 --- a/amp_filter.c +++ b/amp_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/attribute.c b/attribute.c index a353f141..24536911 100644 --- a/attribute.c +++ b/attribute.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/audioc.c b/audioc.c index b17be3dd..74fb824c 100644 --- a/audioc.c +++ b/audioc.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/audiod.c b/audiod.c index 89b160db..8b62e083 100644 --- a/audiod.c +++ b/audiod.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/audiod.h b/audiod.h index 44b430c8..94399602 100644 --- a/audiod.h +++ b/audiod.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/audiod_command.c b/audiod_command.c index ce1aff68..eed9fc15 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/blob.c b/blob.c index 44159a6f..cbf2af49 100644 --- a/blob.c +++ b/blob.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/buffer_tree.c b/buffer_tree.c index bdcbec8d..c5417c2b 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/buffer_tree.h b/buffer_tree.h index 8bc8e602..fcf9df62 100644 --- a/buffer_tree.h +++ b/buffer_tree.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/chunk_queue.c b/chunk_queue.c index 468b1dc2..c0a8fb51 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -93,34 +93,6 @@ void cq_dequeue(struct chunk_queue *cq) free(qc); } -/** - * Force to add a chunk to the given queue. - * - * \param cq See \ref cq_enqueue. - * \param buf See \ref cq_enqueue. - * \param num_bytes See \ref cq_enqueue. - * - * If queuing the given buffer would result in exceeding the maximal queue - * size, buffers are dropped from the beginning of the queue. Note that this - * function still might fail. - * - * \return Standard. - */ -int cq_force_enqueue(struct chunk_queue *cq, const char *buf, size_t num_bytes) -{ - int ret; - - if (num_bytes > cq->max_pending) - return -E_QUEUE; - for (;;) { - ret = cq_enqueue(cq, buf, num_bytes); - if (ret >= 0) - return ret; - cq_dequeue(cq); - } - /* never reached */ -} - /** * Change the number of bytes sent for the current queued chunk. * diff --git a/chunk_queue.h b/chunk_queue.h index 9e794ba8..bcd43f8e 100644 --- a/chunk_queue.h +++ b/chunk_queue.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -16,4 +16,3 @@ void cq_update(struct chunk_queue *cq, size_t sent); int cq_get(struct queued_chunk *qc, const char **buf, size_t *len); struct chunk_queue *cq_new(size_t max_pending); void cq_destroy(struct chunk_queue *cq); -int cq_force_enqueue(struct chunk_queue *cq, const char *buf, size_t num_bytes); diff --git a/client.c b/client.c index 0b4afbd3..ec32cd41 100644 --- a/client.c +++ b/client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/client.h b/client.h index d4eae31a..667607e2 100644 --- a/client.h +++ b/client.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/client_common.c b/client_common.c index 593cb2c0..a7115fd7 100644 --- a/client_common.c +++ b/client_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -170,7 +170,7 @@ static void client_post_select(struct sched *s, struct task *t) return; ret = send_buffer(ct->rc4c.fd, buf); if (ret < 0) - goto err; + goto out; ct->status = CL_SENT_AUTH; return; case CL_SENT_AUTH: @@ -191,7 +191,7 @@ static void client_post_select(struct sched *s, struct task *t) ret = para_decrypt_buffer(ct->key_file, crypt_buf, (unsigned char *)buf, n); if (ret < 0) - goto err; + goto out; sha1_hash((char *)crypt_buf, CHALLENGE_SIZE, challenge_sha1); RC4_set_key(&ct->rc4c.send_key, RC4_KEY_LEN, crypt_buf + CHALLENGE_SIZE); @@ -202,7 +202,7 @@ static void client_post_select(struct sched *s, struct task *t) ret = send_bin_buffer(ct->rc4c.fd, (char *)challenge_sha1, HASH_SIZE); if (ret < 0) - goto err; + goto out; ct->status = CL_SENT_CH_RESPONSE; return; } @@ -237,7 +237,7 @@ static void client_post_select(struct sched *s, struct task *t) ret = rc4_send_buffer(&ct->rc4c, command); free(command); if (ret < 0) - goto err; + goto out; ct->status = CL_SENT_COMMAND; return; } @@ -265,7 +265,7 @@ static void client_post_select(struct sched *s, struct task *t) size_t sz; ret = btr_node_status(btrn, 0, BTR_NT_LEAF); if (ret < 0) - goto err; + goto out; if (ret == 0) return; if (!FD_ISSET(ct->rc4c.fd, &s->wfds)) @@ -273,7 +273,7 @@ static void client_post_select(struct sched *s, struct task *t) sz = btr_next_buffer(btrn, &buf2); ret = rc4_send_bin_buffer(&ct->rc4c, buf2, sz); if (ret < 0) - goto err; + goto out; btr_consume(btrn, sz); return; } @@ -282,7 +282,7 @@ static void client_post_select(struct sched *s, struct task *t) char *buf2; ret = btr_node_status(btrn, 0, BTR_NT_ROOT); if (ret < 0) - goto err; + goto out; if (ret == 0) return; /* @@ -301,7 +301,6 @@ static void client_post_select(struct sched *s, struct task *t) goto out; } } -err: out: t->error = ret; if (ret < 0) { diff --git a/close_on_fork.c b/close_on_fork.c index ac204e37..92517134 100644 --- a/close_on_fork.c +++ b/close_on_fork.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/command.c b/command.c index 664d2573..57e851f9 100644 --- a/command.c +++ b/command.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/compress_filter.c b/compress_filter.c index eee37518..d0816df4 100644 --- a/compress_filter.c +++ b/compress_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/crypt.c b/crypt.c index b6a54604..917948c6 100644 --- a/crypt.c +++ b/crypt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/crypt.h b/crypt.h index 8357b6d7..6bd8179b 100644 --- a/crypt.h +++ b/crypt.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/daemon.c b/daemon.c index eef504f1..a67e9e2b 100644 --- a/daemon.c +++ b/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/dccp_recv.c b/dccp_recv.c index 2ab9fcab..41c2ee1a 100644 --- a/dccp_recv.c +++ b/dccp_recv.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/dccp_send.c b/dccp_send.c index 38e4b7c8..304a42e7 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/error.h b/error.h index 9864b1d9..3dfee0dd 100644 --- a/error.h +++ b/error.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/exec.c b/exec.c index db05c022..b11b217b 100644 --- a/exec.c +++ b/exec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2010 Andre Noll + * Copyright (C) 2003-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/fade.c b/fade.c index d9f93ccf..8eeb79e7 100644 --- a/fade.c +++ b/fade.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1998-2010 Andre Noll + * Copyright (C) 1998-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/fd.c b/fd.c index 978ada45..a0969e3e 100644 --- a/fd.c +++ b/fd.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -97,7 +97,7 @@ int write_nonblock(int fd, const char *buf, size_t len) * In any case, \a num_bytes contains the number of bytes that have been * successfully read from \a fd (zero if the first readv() call failed with * EAGAIN). Note that even if the function returns negative, some data might - * have been read before the error occured. In this case \a num_bytes is + * have been read before the error occurred. In this case \a num_bytes is * positive. * * \sa \ref write_nonblock(), read(2), readv(2). diff --git a/fd.h b/fd.h index 00b02bef..436622f0 100644 --- a/fd.h +++ b/fd.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/fecdec_filter.c b/fecdec_filter.c index 30696c10..4f3ba950 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -414,7 +414,7 @@ static int dispatch_slice(char *buf, size_t len, struct fec_header *h, ret = fec_new(k, n, &pfd->fec); if (ret < 0) return ret; - pfd->btrp = btr_pool_new("fecdec", 20 * k * h->slice_bytes); + pfd->btrp = btr_pool_new("fecdec", 64 * 1024); /* decode and clear the first group */ ret = decode_group(pfd->first_complete_group, fn); if (ret < 0) diff --git a/file_write.c b/file_write.c index 0cee535a..8cafbb68 100644 --- a/file_write.c +++ b/file_write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -50,19 +50,17 @@ __must_check __malloc static char *random_filename(void) return result; } -static int file_write_open(struct writer_node *wn) +static int prepare_output_file(struct writer_node *wn) { - struct private_file_write_data *pfwd = para_calloc( - sizeof(struct private_file_write_data)); struct file_write_args_info *conf = wn->conf; char *filename; int ret; + struct private_file_write_data *pfwd = para_calloc(sizeof(*pfwd)); if (conf->filename_given) filename = conf->filename_arg; else filename = random_filename(); - wn->private_data = pfwd; ret = para_open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); if (!conf->filename_given) free(filename); @@ -70,8 +68,11 @@ static int file_write_open(struct writer_node *wn) goto out; pfwd->fd = ret; ret = mark_fd_blocking(pfwd->fd); - if (ret >= 0) - return 1; + if (ret < 0) + goto out_close; + wn->private_data = pfwd; + return 1; +out_close: close(pfwd->fd); out: free(pfwd); @@ -82,20 +83,21 @@ static void file_write_pre_select(struct sched *s, struct task *t) { struct writer_node *wn = container_of(t, struct writer_node, task); struct private_file_write_data *pfwd = wn->private_data; - int ret; + int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - t->error = 0; - ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - if (ret > 0) - para_fd_set(pfwd->fd, &s->wfds, &s->max_fileno); - else if (ret < 0) - sched_min_delay(s); + if (ret == 0) + return; + if (ret < 0 || !pfwd) + return sched_min_delay(s); + para_fd_set(pfwd->fd, &s->wfds, &s->max_fileno); } static void file_write_close(struct writer_node *wn) { struct private_file_write_data *pfwd = wn->private_data; + if (!pfwd) + return; close(pfwd->fd); free(pfwd); } @@ -114,6 +116,10 @@ static void file_write_post_select(__a_unused struct sched *s, ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF); if (ret <= 0) goto out; + if (!pfwd) { + ret = prepare_output_file(wn); + goto out; + } if (!FD_ISSET(pfwd->fd, &s->wfds)) return; bytes = btr_next_buffer(btrn, &buf); @@ -129,17 +135,13 @@ out: t->error = ret; } -__malloc static void *file_write_parse_config(const char *options) +__malloc static void *file_write_parse_config_or_die(const char *options) { - struct file_write_args_info *conf - = para_calloc(sizeof(struct file_write_args_info)); - int ret = file_cmdline_parser_string(options, conf, "file_write"); - - PARA_INFO_LOG("conf->filename_given: %d\n", conf->filename_given); - if (!ret) - return conf; - free(conf); - return NULL; + struct file_write_args_info *conf = para_calloc(sizeof(*conf)); + + /* exits on errors */ + file_cmdline_parser_string(options, conf, "file_write"); + return conf; } static void file_write_free_config(void *conf) @@ -153,10 +155,9 @@ void file_write_init(struct writer *w) struct file_write_args_info dummy; file_cmdline_parser_init(&dummy); - w->open = file_write_open; w->pre_select = file_write_pre_select; w->post_select = file_write_post_select; - w->parse_config = file_write_parse_config; + w->parse_config_or_die = file_write_parse_config_or_die; w->free_config = file_write_free_config; w->close = file_write_close; w->shutdown = NULL; /* nothing to do */ diff --git a/filter.c b/filter.c index 7726e35f..1d938c45 100644 --- a/filter.c +++ b/filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/filter.h b/filter.h index 692020c4..0808059d 100644 --- a/filter.h +++ b/filter.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/filter_common.c b/filter_common.c index cdd9f398..269c4d6d 100644 --- a/filter_common.c +++ b/filter_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ggo.c b/ggo.c index a25c0809..a9bc4c36 100644 --- a/ggo.c +++ b/ggo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2010 Andre Noll + * Copyright (C) 2008-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ggo.h b/ggo.h index cc0c96b3..88db8761 100644 --- a/ggo.h +++ b/ggo.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2010 Andre Noll + * Copyright (C) 2008-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/grab_client.c b/grab_client.c index b61981f2..8e671503 100644 --- a/grab_client.c +++ b/grab_client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/grab_client.h b/grab_client.h index 75ba4c91..88b95483 100644 --- a/grab_client.h +++ b/grab_client.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/gui.c b/gui.c index 865ed658..8e70dd93 100644 --- a/gui.c +++ b/gui.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1998-2010 Andre Noll + * Copyright (C) 1998-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/gui.h b/gui.h index 65342a4d..f8c6712b 100644 --- a/gui.h +++ b/gui.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/gui_theme.c b/gui_theme.c index 647eb66f..ffb47d43 100644 --- a/gui_theme.c +++ b/gui_theme.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/hash.h b/hash.h index be18a92a..6dfddbed 100644 --- a/hash.h +++ b/hash.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/http_recv.c b/http_recv.c index 9ade8dfb..53ef8e60 100644 --- a/http_recv.c +++ b/http_recv.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -49,7 +49,7 @@ struct private_http_recv_data { * The file descriptor used for receiving the http stream. * * The pre_select function of the http receiver adds this file descriptor to - * the set of file decriptors which are checked for reading/writing (depending + * the set of file descriptors which are checked for reading/writing (depending * on the current status) by the select loop of the application (para_audiod or * para_recv). * diff --git a/http_send.c b/http_send.c index d5c6397e..086b600f 100644 --- a/http_send.c +++ b/http_send.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ipc.c b/ipc.c index 6a0f00b5..c1069ad9 100644 --- a/ipc.c +++ b/ipc.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mm.c b/mm.c index 57121a1c..a9f4b9bd 100644 --- a/mm.c +++ b/mm.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mm.h b/mm.h index 55af744f..ebc968d3 100644 --- a/mm.h +++ b/mm.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mood.c b/mood.c index 89ad80d9..732df0a3 100644 --- a/mood.c +++ b/mood.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mood.h b/mood.h index 5ef01489..e9f08111 100644 --- a/mood.h +++ b/mood.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mp3_afh.c b/mp3_afh.c index 980649c8..b83343ed 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2010 Andre Noll + * Copyright (C) 2003-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/mp3dec_filter.c b/mp3dec_filter.c index c2c15a3a..82f01418 100644 --- a/mp3dec_filter.c +++ b/mp3dec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/net.c b/net.c index fa48e54f..2369dc8c 100644 --- a/net.c +++ b/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/net.h b/net.h index 75389aec..a1af08ae 100644 --- a/net.h +++ b/net.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ogg_afh.c b/ogg_afh.c index 744a1331..ef42c497 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Andre Noll + * Copyright (C) 2004-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ogg_afh_common.c b/ogg_afh_common.c index 54e92956..1deb5cda 100644 --- a/ogg_afh_common.c +++ b/ogg_afh_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Andre Noll + * Copyright (C) 2004-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -163,7 +163,7 @@ int ogg_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, afhi->chunk_table[1] = afhi->header_len; oss.returned = afhi->header_len; oss.fill = numbytes; - for (i = 0, j = 1; ogg_sync_pageseek(&oss, &op) > 0; i++) { + for (j = 1; ogg_sync_pageseek(&oss, &op) > 0; /* nothing */) { int granule = ogg_page_granulepos(&op); while (granule > j * frames_per_chunk) { diff --git a/ogg_afh_common.h b/ogg_afh_common.h index c7eb167e..01f8d6c5 100644 --- a/ogg_afh_common.h +++ b/ogg_afh_common.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Andre Noll + * Copyright (C) 2010-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/oggdec_filter.c b/oggdec_filter.c index 68b4db16..1bc6d2f7 100644 --- a/oggdec_filter.c +++ b/oggdec_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/oss_write.c b/oss_write.c index b82b3968..df9608a8 100644 --- a/oss_write.c +++ b/oss_write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -52,19 +52,20 @@ static void oss_pre_select(struct sched *s, struct task *t) struct private_oss_write_data *powd = wn->private_data; int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - t->error = 0; - if (ret < 0) - sched_min_delay(s); - else if (ret > 0) - para_fd_set(powd->fd, &s->wfds, &s->max_fileno); + if (ret == 0) + return; + if (ret < 0 || !powd) + return sched_min_delay(s); + para_fd_set(powd->fd, &s->wfds, &s->max_fileno); } static void oss_close(struct writer_node *wn) { struct private_oss_write_data *powd = wn->private_data; - if (powd->fd >= 0) - close(powd->fd); + if (!powd) + return; + close(powd->fd); free(powd); } @@ -85,12 +86,13 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate, int ret, format; unsigned ch, rate; struct oss_write_args_info *conf = wn->conf; - struct private_oss_write_data *powd = wn->private_data; + struct private_oss_write_data *powd = para_calloc(sizeof(*powd)); + wn->private_data = powd; PARA_INFO_LOG("opening %s\n", conf->device_arg); ret = para_open(conf->device_arg, O_WRONLY, 0); if (ret < 0) - return ret; + goto err_free; powd->fd = ret; ret = mark_fd_nonblocking(powd->fd); if (ret < 0) @@ -150,7 +152,8 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate, return 1; err: close(powd->fd); - powd->fd = -1; +err_free: + free(powd); return ret; } @@ -168,7 +171,7 @@ static void oss_post_select(__a_unused struct sched *s, goto out; if (ret == 0) return; - if (powd->fd < 0) { + if (!powd) { int32_t rate, ch, format; get_btr_sample_rate(btrn, &rate); get_btr_channels(btrn, &ch); @@ -199,28 +202,13 @@ out: btr_remove_node(btrn); } -static int oss_open(struct writer_node *wn) -{ - struct private_oss_write_data *powd; - - powd = para_calloc(sizeof(*powd)); - wn->private_data = powd; - powd->fd = -1; - return 1; -} - -__malloc static void *oss_parse_config(const char *options) +__malloc static void *oss_parse_config_or_die(const char *options) { - int ret; struct oss_write_args_info *conf = para_calloc(sizeof(*conf)); - ret = oss_cmdline_parser_string(options, conf, "oss_write"); - if (ret) - goto err_out; + /* exits on errors */ + oss_cmdline_parser_string(options, conf, "oss_write"); return conf; -err_out: - free(conf); - return NULL; } static void oss_free_config(void *conf) @@ -240,11 +228,10 @@ void oss_write_init(struct writer *w) struct oss_write_args_info dummy; oss_cmdline_parser_init(&dummy); - w->open = oss_open; w->close = oss_close; w->pre_select = oss_pre_select; w->post_select = oss_post_select; - w->parse_config = oss_parse_config; + w->parse_config_or_die = oss_parse_config_or_die; w->free_config = oss_free_config; w->shutdown = NULL; w->help = (struct ggo_help) { diff --git a/osx_write.c b/osx_write.c index cfd02e74..f27a49b0 100644 --- a/osx_write.c +++ b/osx_write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -187,18 +187,9 @@ static OSStatus osx_callback(void * inClientData, #define ENDIAN_FLAGS 0 #endif -static int osx_write_open(struct writer_node *wn) -{ - struct private_osx_write_data *powd = para_calloc(sizeof(*powd)); - - wn->private_data = powd; - init_buffers(wn); - return 0; -} - static int core_audio_init(struct writer_node *wn) { - struct private_osx_write_data *powd = wn->private_data; + struct private_osx_write_data *powd = para_calloc(sizeof(*powd)); ComponentDescription desc; Component comp; AURenderCallbackStruct inputCallback = {osx_callback, powd}; @@ -207,6 +198,8 @@ static int core_audio_init(struct writer_node *wn) struct btr_node *btrn = wn->btrn; int32_t val; + wn->private_data = powd; + init_buffers(wn); /* where did that default audio output go? */ desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_DefaultOutput; @@ -276,22 +269,18 @@ e2: e1: CloseComponent(powd->audio_unit); e0: + free(powd); + wn->private_data = NULL; return ret; } -__malloc static void *osx_write_parse_config(const char *options) +__malloc static void *osx_write_parse_config_or_die(const char *options) { - struct osx_write_args_info *conf - = para_calloc(sizeof(struct osx_write_args_info)); - PARA_INFO_LOG("options: %s\n", options); - int ret = osx_cmdline_parser_string(options, conf, "osx_write"); - if (ret) - goto err_out; - return conf; -err_out: - free(conf); - return NULL; + struct osx_write_args_info *conf = para_calloc(sizeof(*conf)); + /* exits on errors */ + osx_cmdline_parser_string(options, conf, "osx_write"); + return conf; } static void osx_free_config(void *conf) @@ -303,6 +292,8 @@ static void osx_write_close(struct writer_node *wn) { struct private_osx_write_data *powd = wn->private_data; + if (!powd) + return; PARA_INFO_LOG("closing writer node %p\n", wn); AudioOutputUnitStop(powd->audio_unit); AudioUnitUninitialize(powd->audio_unit); @@ -320,14 +311,15 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t) size_t bytes; int ret = 0; - while (powd->to->remaining <= 0) { + while (!powd || powd->to->remaining <= 0) { ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); if (ret <= 0) break; - if (powd->sample_rate == 0) { + if (!powd) { ret = core_audio_init(wn); if (ret < 0) break; + powd = wn->private_data; } btr_merge(btrn, 8192); bytes = btr_next_buffer(btrn, &data); @@ -342,7 +334,7 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t) } powd->to = powd->to->next; } - if (ret < 0 && powd->from->remaining <= 0) { + if (ret < 0 && (!powd || powd->from->remaining <= 0)) { btr_remove_node(btrn); t->error = ret; } @@ -353,17 +345,19 @@ static void osx_write_pre_select(struct sched *s, struct task *t) struct writer_node *wn = container_of(t, struct writer_node, task); struct private_osx_write_data *powd = wn->private_data; struct timeval tmp = {.tv_sec = 1, .tv_usec = 0}, delay = tmp; - unsigned long divisor; - size_t numbytes = powd->to->remaining * sizeof(short); + unsigned long factor; + size_t numbytes; int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); - if (ret < 0) - sched_min_delay(s); - if (ret <= 0 || numbytes < wn->min_iqs) + if (ret == 0) return; - divisor = powd->sample_rate * wn->min_iqs / numbytes; - if (divisor) - tv_divide(divisor, &tmp, &delay); + if (ret < 0 || !powd) + return sched_min_delay(s); + assert(powd->sample_rate > 0); + assert(wn->min_iqs > 0); + numbytes = powd->to->remaining * sizeof(short); + factor = numbytes / powd->sample_rate / wn->min_iqs; + tv_scale(factor, &tmp, &delay); sched_request_timeout(&delay, s); } @@ -373,11 +367,10 @@ void osx_write_init(struct writer *w) struct osx_write_args_info dummy; osx_cmdline_parser_init(&dummy); - w->open = osx_write_open; w->close = osx_write_close; w->pre_select = osx_write_pre_select; w->post_select = osx_write_post_select; - w->parse_config = osx_write_parse_config; + w->parse_config_or_die = osx_write_parse_config_or_die; w->free_config = osx_free_config; w->shutdown = NULL; /* nothing to do */ w->help = (struct ggo_help) { diff --git a/para.h b/para.h index 305707da..df7d755f 100644 --- a/para.h +++ b/para.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -50,7 +50,7 @@ _x > 0? _x : -_x; }) /** - * define a standard log function that always writes to stderr + * Define a standard log function that always writes to stderr. * * \param loglevel_barrier If the loglevel of the current message * is less than that, the message is going to be ignored. @@ -76,22 +76,22 @@ "Written by Andre Noll.\n" \ "Report bugs to .\n" -/** print out \p VERSION_TEXT and exit if version flag was given */ +/** Print out \p VERSION_TEXT and exit if version flag was given. */ #define HANDLE_VERSION_FLAG(_prefix, _args_info_struct) \ if (_args_info_struct.version_given) { \ printf("%s", VERSION_TEXT(_prefix)); \ exit(EXIT_SUCCESS); \ } -/* Sent by para_client to initiate the authentication procedure. */ +/** Sent by para_client to initiate the authentication procedure. */ #define AUTH_REQUEST_MSG "auth rsa " -/** sent by para_server for commands that expect a data file */ +/** Sent by para_server for commands that expect a data file. */ #define AWAITING_DATA_MSG "\nAwaiting Data." -/** sent by para_server if authentication was successful */ +/** Sent by para_server if authentication was successful. */ #define PROCEED_MSG "Proceed." -/** length of the \p PROCEED_MSG string */ +/** Length of the \p PROCEED_MSG string. */ #define PROCEED_MSG_LEN strlen(PROCEED_MSG) -/** sent by para_client to indicate the end of the command line */ +/** Sent by para_client to indicate the end of the command line. */ #define EOC_MSG "\nEnd of Command." /* exec */ @@ -165,6 +165,7 @@ _static_inline_ long int para_random(unsigned max) return ((max + 0.0) * (random() / (RAND_MAX + 1.0))); } +/** Divide and round up to next integer. */ #define DIV_ROUND_UP(x, y) ({ \ typeof(y) _divisor = y; \ ((x) + _divisor - 1) / _divisor; }) diff --git a/playlist.c b/playlist.c index b04598b8..2d2f23b4 100644 --- a/playlist.c +++ b/playlist.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/portable_io.h b/portable_io.h index 2353c610..e766d7bc 100644 --- a/portable_io.h +++ b/portable_io.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/prebuffer_filter.c b/prebuffer_filter.c index 548a8177..e1b0390c 100644 --- a/prebuffer_filter.c +++ b/prebuffer_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/recv.c b/recv.c index 99efefb7..a737e4cb 100644 --- a/recv.c +++ b/recv.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/recv.h b/recv.h index 271932b1..05c5ed76 100644 --- a/recv.h +++ b/recv.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/recv_common.c b/recv_common.c index 6517948d..3fe2a139 100644 --- a/recv_common.c +++ b/recv_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ringbuffer.c b/ringbuffer.c index 1f0b4e46..bf990b06 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/ringbuffer.h b/ringbuffer.h index 7ddfb1c0..67f9f3a8 100644 --- a/ringbuffer.h +++ b/ringbuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/sched.c b/sched.c index 6da5fa23..b0e9ce12 100644 --- a/sched.c +++ b/sched.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/sched.h b/sched.h index 1da5a220..7158a873 100644 --- a/sched.h +++ b/sched.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/score.c b/score.c index 6b9d05b5..27fec711 100644 --- a/score.c +++ b/score.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/send.h b/send.h index 52f7a10d..836babd5 100644 --- a/send.h +++ b/send.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/send_common.c b/send_common.c index 33c56e7a..6a85644d 100644 --- a/send_common.c +++ b/send_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/server.c b/server.c index 11397d02..efff208b 100644 --- a/server.c +++ b/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/server.h b/server.h index 43ba841d..3b2f381c 100644 --- a/server.h +++ b/server.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/sha1.c b/sha1.c index 70731ec2..b0e955ec 100644 --- a/sha1.c +++ b/sha1.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/signal.c b/signal.c index 0b4b6f0b..4726571c 100644 --- a/signal.c +++ b/signal.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Andre Noll + * Copyright (C) 2004-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/signal.h b/signal.h index 1dbfc981..799c317f 100644 --- a/signal.h +++ b/signal.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/spx.h b/spx.h index 6ffa80eb..124d6834 100644 --- a/spx.h +++ b/spx.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Andre Noll + * Copyright (C) 2010-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/spx_afh.c b/spx_afh.c index 472c2c80..6414f4c4 100644 --- a/spx_afh.c +++ b/spx_afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Andre Noll + * Copyright (C) 2010-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/spx_common.c b/spx_common.c index ce01e23a..f9f1eb7e 100644 --- a/spx_common.c +++ b/spx_common.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2006 Jean-Marc Valin - * Copyright (C) 2010 Andre Noll + * Copyright (C) 2010-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/spxdec_filter.c b/spxdec_filter.c index da2d5da6..41b66c51 100644 --- a/spxdec_filter.c +++ b/spxdec_filter.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2006 Jean-Marc Valin - * Copyright (C) 2010 Andre Noll + * Copyright (C) 2010-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/stat.c b/stat.c index b9d8e3b9..b125529a 100644 --- a/stat.c +++ b/stat.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/stdin.c b/stdin.c index ca5eb0e1..e625f372 100644 --- a/stdin.c +++ b/stdin.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/stdin.h b/stdin.h index a1983dd5..2d279a6e 100644 --- a/stdin.h +++ b/stdin.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/stdout.c b/stdout.c index 775f0649..5604fced 100644 --- a/stdout.c +++ b/stdout.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/stdout.h b/stdout.h index 3783796c..1e35d6ca 100644 --- a/stdout.h +++ b/stdout.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/string.c b/string.c index c228c24c..813999bb 100644 --- a/string.c +++ b/string.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Andre Noll + * Copyright (C) 2004-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/string.h b/string.h index 7b5887e1..06f4d3e6 100644 --- a/string.h +++ b/string.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/time.c b/time.c index 8faefc05..19bf469c 100644 --- a/time.c +++ b/time.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/udp_recv.c b/udp_recv.c index f008f1ed..e276343e 100644 --- a/udp_recv.c +++ b/udp_recv.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/udp_send.c b/udp_send.c index 7d4f1c79..4fb10b44 100644 --- a/udp_send.c +++ b/udp_send.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -31,7 +31,6 @@ #include "fd.h" #include "sched.h" #include "close_on_fork.h" -#include "chunk_queue.h" /** * Time window during which ICMP Destination/Port Unreachable messages are @@ -44,8 +43,6 @@ struct udp_target { /** Track time (seconds) of last ICMP Port Unreachable error */ time_t last_unreachable; - /** Common sender client data */ - struct sender_client *sc; /** The opaque structure returned by vss_add_fec_client(). */ struct fec_client *fc; /** The FEC parameters for this target. */ @@ -57,11 +54,11 @@ static int sender_status; static void udp_close_target(struct sender_client *sc) { - if (sc->cq != NULL) { - del_close_on_fork_list(sc->fd); - cq_destroy(sc->cq); - sc->cq = NULL; - } + const char *buf; + size_t len = vss_get_fec_eof_packet(&buf); + + /* ignore return value, closing the target anyway. */ + (void)write(sc->fd, buf, len); } static void udp_delete_target(struct sender_client *sc, const char *msg) @@ -70,6 +67,8 @@ static void udp_delete_target(struct sender_client *sc, const char *msg) PARA_NOTICE_LOG("deleting %s (%s) from list\n", sc->name, msg); udp_close_target(sc); + close(sc->fd); + del_close_on_fork_list(sc->fd); vss_del_fec_client(ut->fc); list_del(&sc->node); free(sc->name); @@ -153,30 +152,16 @@ err: return -ERRNO_TO_PARA_ERROR(errno); } -/** The maximal size of the per-target chunk queue. */ -#define UDP_CQ_BYTES 40000 - static void udp_init_session(struct sender_client *sc) { - if (sc->cq == NULL) { - sc->cq = cq_new(UDP_CQ_BYTES); - add_close_on_fork_list(sc->fd); - PARA_NOTICE_LOG("sending to udp %s\n", sc->name); - } + PARA_NOTICE_LOG("sending to udp %s\n", sc->name); } static void udp_shutdown_targets(void) { struct sender_client *sc, *tmp; - const char *buf; - size_t len = vss_get_fec_eof_packet(&buf); - list_for_each_entry_safe(sc, tmp, &targets, node) - if (sc->cq != NULL) { - /* ignore return value, closing the target anyway. */ - (void)write(sc->fd, buf, len); - udp_close_target(sc); - } + udp_close_target(sc); } static int udp_resolve_target(const char *url, struct sender_command_data *scd) @@ -295,19 +280,11 @@ static int udp_send_fec(struct sender_client *sc, char *buf, size_t len) if (sender_status == SENDER_OFF) return 0; - if (len == 0 && !cq_peek(sc->cq)) + if (len == 0) return 0; ret = udp_check_socket_state(sc); if (ret < 0) goto fail; - ret = send_queued_chunks(sc->fd, sc->cq); - if (ret < 0) - goto fail; - if (!ret) { /* still data left in the queue */ - ret = cq_force_enqueue(sc->cq, buf, len); - assert(ret >= 0); - return 0; - } ret = write_nonblock(sc->fd, buf, len); if (ret == -ERRNO_TO_PARA_ERROR(ECONNREFUSED)) { /* @@ -318,10 +295,6 @@ static int udp_send_fec(struct sender_client *sc, char *buf, size_t len) } if (ret < 0) goto fail; - if (ret != len) { - ret = cq_force_enqueue(sc->cq, buf + ret, len - ret); - assert(ret >= 0); - } return 1; fail: udp_delete_target(sc, para_strerror(-ret)); @@ -340,7 +313,7 @@ static int udp_com_add(struct sender_command_data *scd) return -E_TARGET_EXISTS; } ut = para_calloc(sizeof(*ut)); - sc = ut->sc = para_calloc(sizeof(*sc)); + sc = para_calloc(sizeof(*sc)); ut->fcp.slices_per_group = scd->slices_per_group; ut->fcp.data_slices_per_group = scd->data_slices_per_group; ut->fcp.init_fec = udp_init_fec; @@ -364,6 +337,7 @@ static int udp_com_add(struct sender_command_data *scd) PARA_INFO_LOG("adding to target list (%s)\n", sc->name); ut->fc = vss_add_fec_client(sc, &ut->fcp); para_list_add(&sc->node, &targets); + add_close_on_fork_list(sc->fd); return 1; err: if (sc->fd >= 0) diff --git a/user_list.c b/user_list.c index a1f1557c..fe1b946b 100644 --- a/user_list.c +++ b/user_list.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/user_list.h b/user_list.h index 5d3b27fb..cce577a6 100644 --- a/user_list.h +++ b/user_list.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/versions/paraslash-0.4.5.tar.bz2 b/versions/paraslash-0.4.5.tar.bz2 new file mode 100644 index 00000000..6299d0c5 Binary files /dev/null and b/versions/paraslash-0.4.5.tar.bz2 differ diff --git a/versions/paraslash-0.4.5.tar.bz2.asc b/versions/paraslash-0.4.5.tar.bz2.asc new file mode 100644 index 00000000..c56b9b36 --- /dev/null +++ b/versions/paraslash-0.4.5.tar.bz2.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.10 (GNU/Linux) + +iEYEABECAAYFAk0LimcACgkQWto1QDEAkw9cigCfQfJi6KJMC7HHGO7zrvlrz7f/ +4DoAn2hSNGm08WWIgqLYOjUGbQSCnNMc +=/3KE +-----END PGP SIGNATURE----- diff --git a/vss.c b/vss.c index 121373dc..916a71d5 100644 --- a/vss.c +++ b/vss.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2010 Andre Noll + * Copyright (C) 1997-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/vss.h b/vss.h index c7e41b9d..bd798b0c 100644 --- a/vss.h +++ b/vss.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/wav_filter.c b/wav_filter.c index b28b1d3c..8408034d 100644 --- a/wav_filter.c +++ b/wav_filter.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/web/footer.html b/web/footer.html index d9c9f058..38572c94 100644 --- a/web/footer.html +++ b/web/footer.html @@ -1,13 +1,4 @@
- -

- Valid HTML 4.01! -

---> diff --git a/web/index.in.html b/web/index.in.html index 663dea31..48f5bb51 100644 --- a/web/index.in.html +++ b/web/index.in.html @@ -1,6 +1,10 @@

Events


    +
  • 2010-12-17: paraslash-0.4.5 + (sig) + "symmetric randomization" +
  • 2010-08-06: paraslash-0.4.4 (sig) "persistent regularity" diff --git a/wma_afh.c b/wma_afh.c index d9a83483..9b7d85b3 100644 --- a/wma_afh.c +++ b/wma_afh.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/wma_common.c b/wma_common.c index 0cb881e5..781db5f4 100644 --- a/wma_common.c +++ b/wma_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andre Noll + * Copyright (C) 2009-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/write.c b/write.c index 424286b5..dda1b705 100644 --- a/write.c +++ b/write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ diff --git a/write.h b/write.h index 1361fcf1..0044ae4f 100644 --- a/write.h +++ b/write.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -36,26 +36,20 @@ struct writer { /** * The command line parser of the writer. * - * It should check whether the command line options given by \a options are - * valid. On success, it should return a pointer to the writer-specific - * configuration data determined by \a options. Note that this might be called - * more than once with different values of \a options. \sa \ref free_config(). + * It should check whether the command line options given by \a options + * are valid and return a pointer to the writer-specific configuration + * data determined by \a options. This function must either succeed or + * call exit(). Note that parse_config_or_die() might be called more + * than once with different values of \a options. \sa \ref + * free_config(). */ - void *(*parse_config)(const char *options); + void *(*parse_config_or_die)(const char *options); /** * Dellocate all configuration resources. * - * This should free whatever was allocated by \ref parse_config(). + * This should free whatever was allocated by \ref parse_config_or_die(). */ void (*free_config)(void *config); - /** - * Open one instance of this writer. - * - * This function should perform any work necessary to write the incoming - * stream. To this aim, it may allocate its private data structure and store - * a pointer to that structure via the given writer_node parameter. - */ - int (*open)(struct writer_node *); /** * Prepare the fd sets for select. * diff --git a/write_common.c b/write_common.c index 93562d0d..5988faf7 100644 --- a/write_common.c +++ b/write_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -66,27 +66,32 @@ void *check_writer_arg(const char *wa, int *writer_num) c = wa[len]; if (c && c != ' ') continue; - if (c && !writers[i].parse_config) - return NULL; *writer_num = i; - return writers[i].parse_config(c? wa + len + 1 : ""); + return writers[i].parse_config_or_die(c? wa + len + 1 : ""); } PARA_ERROR_LOG("writer not found\n"); return NULL; } +/** + * Open a writer node and register the corresponding task. + * + * \param wn The writer node to open. + * \param parent The parent btr node (the source for the writer node). + * + * The configuration of the writer node stored in \p wn->conf must be + * initialized before this function may be called. + */ void register_writer_node(struct writer_node *wn, struct btr_node *parent) { struct writer *w = writers + wn->writer_num; char *name = make_message("%s writer", writer_names[wn->writer_num]); - int ret; wn->btrn = btr_new_node(&(struct btr_node_description) EMBRACE(.name = name, .parent = parent, .handler = w->execute, .context = wn)); strcpy(wn->task.status, name); free(name); - ret = w->open(wn); wn->task.post_select = w->post_select; wn->task.pre_select = w->pre_select; register_task(&wn->task); @@ -115,7 +120,7 @@ int setup_writer_node(const char *arg, struct btr_node *parent, wn->conf = check_writer_arg(arg, &wn->writer_num); else { wn->writer_num = DEFAULT_WRITER; - wn->conf = writers[DEFAULT_WRITER].parse_config(""); + wn->conf = writers[DEFAULT_WRITER].parse_config_or_die(""); } if (!wn->conf) return -E_WRITE_COMMON_SYNTAX; @@ -123,7 +128,6 @@ int setup_writer_node(const char *arg, struct btr_node *parent, return 1; } - /** * Print the help text of all writers to stdout. * @@ -153,7 +157,15 @@ static void get_btr_value(struct btr_node *btrn, const char *cmd, char *buf = NULL; int ret = btr_exec_up(btrn, cmd, &buf); - assert(ret >= 0); + if (ret < 0) { + /* + * This really should not happen. It means one of our parent + * nodes died unexpectedly. Proceed with fingers crossed. + */ + PARA_CRIT_LOG("cmd %s: %s\n", cmd, para_strerror(-ret)); + *result = 0; + return; + } ret = para_atoi32(buf, result); assert(ret >= 0); free(buf); diff --git a/write_common.h b/write_common.h index 331fa460..5f55120b 100644 --- a/write_common.h +++ b/write_common.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */