paraslash.git
2 years agoparaslash 0.6.1 v0.6.1
Andre Noll [Sat, 23 Sep 2017 15:09:19 +0000 (17:09 +0200)]
paraslash 0.6.1

2 years agoMerge branch 'maint'
Andre Noll [Sat, 23 Sep 2017 14:36:08 +0000 (16:36 +0200)]
Merge branch 'maint'

* maint:
  paraslash 0.5.8

NEWS.md conflicted slightly, but this was easy resolve.

2 years agoparaslash 0.5.8 v0.5.8
Andre Noll [Sat, 23 Sep 2017 14:31:26 +0000 (16:31 +0200)]
paraslash 0.5.8

2 years agovss: Reduce indentation level in vss_send().
Andre Noll [Sun, 6 Aug 2017 14:26:14 +0000 (16:26 +0200)]
vss: Reduce indentation level in vss_send().

If the current chunk is not due yet, we return from the function.
Reversing the logic of the test allows to reduce indentation by
one level. No semantic change.

2 years agovss: Propagate return value of afh_get_chunk().
Andre Noll [Sun, 6 Aug 2017 12:21:15 +0000 (14:21 +0200)]
vss: Propagate return value of afh_get_chunk().

With dynamic chunks, afh_get_chunk() may fail. Currently
vss_get_chunk() prints an error message in this case and returns
the null pointer. However, some callers of vss_get_chunk() happily
dereference the returned pointer without checking for NULL.

This patch modifies vss_get_chunk() to return int and teaches all
callers to check the return value. For the udp and dccp transport,
we disable the fec client temporarily in the error case while for
the http transport we log the error (but otherwise ignore it), and
try to continue with the next chunk.

This flaw was noticed by the clang static analyzer.

2 years agoaudioc: Use file_exists().
Andre Noll [Mon, 14 Aug 2017 00:13:00 +0000 (02:13 +0200)]
audioc: Use file_exists().

There is no need to open-code this function.

2 years agofd.c: Change return value of file_exists() to bool.
Andre Noll [Mon, 14 Aug 2017 00:10:44 +0000 (02:10 +0200)]
fd.c: Change return value of file_exists() to bool.

file_exists() is in fact a misnomer, since it simply calls stat(2),
which may fail for many reasons besides ENOENT. But that's another
issue for another patch..

2 years agoShorten copyright notice.
Andre Noll [Sun, 10 Sep 2017 12:15:50 +0000 (14:15 +0200)]
Shorten copyright notice.

The GPLv2 line does not add any additional information, so drop
it. This leaves a single line of legalese text for most files, which
is about the amount of screen real estate it deserves.

This patch was created with the following script (plus some manual
fixups):

awk '{
if (NR <= 5) {
gs = gensub(/.*Copyright.* ([0-9]+).*Andre Noll.*/, "\\1", "g")
if (gs != $0)
year = gs
next
}
if (NR == 6 && year != "")
printf("/* Copyright (C) %s Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */\n", year)
print
}'

2 years agoMerge branch 'refs/heads/t/mp'
Andre Noll [Fri, 22 Sep 2017 08:06:45 +0000 (10:06 +0200)]
Merge branch 'refs/heads/t/mp'

This pile contains the new version 2 mood parser which depends on
flex and bison.

Cooking for a month.

* refs/heads/t/mp:
  Version 2 moods.

2 years agoMerge branch 'refs/heads/t/sqrt'
Andre Noll [Sun, 17 Sep 2017 18:13:23 +0000 (20:13 +0200)]
Merge branch 'refs/heads/t/sqrt'

A significant speedup and a three trivial patches for int_sqrt(). No
user-visible changes. Cooking for seven weeks.

* refs/heads/t/sqrt:
  mood.c: Trivial cosmetics for int_sqrt().
  mood.c: Fix documentation of int_sqrt().
  mood: Speed up int_sqrt().
  mood: Add notice about int_sqrt().

2 years agoMerge branch 'refs/heads/t/opus'
Andre Noll [Sun, 10 Sep 2017 09:08:14 +0000 (11:08 +0200)]
Merge branch 'refs/heads/t/opus'

This series abstracts out the custom header concept of ogg/vorbis
streams and introduces a public API for it. The new API is employed
for ogg/opus streams to guarantee that fixed size audio format headers
are used for streaming.

Cooking for six weeks.

* refs/heads/t/opus:
  opus_afh: Use custom header API to strip comment packet.
  ogg: Abstract out custom header code.
  Prefix public functions of ogg_afh_common.c with "oac".
  afh_recv: Downgrade severity of log message.

2 years agoMerge branch 'refs/heads/t/portable_io'
Andre Noll [Sun, 3 Sep 2017 08:28:30 +0000 (10:28 +0200)]
Merge branch 'refs/heads/t/portable_io'

A small series with no user-visible impact. After this is merged,
no more casts are necessary for pointers passed to read_u*() and
write_u*() and their big-endian counterparts.

Cooking for five weeks.

* refs/heads/t/portable_io:
  blob: Remove some unnecessary casts for arguments to read_u32().
  crypt: Remove read_ssh_u32().
  Let helpers in portable_io.h receive void * arguments.

2 years agoMerge branch 'refs/heads/t/si_conversion'
Andre Noll [Sun, 27 Aug 2017 10:11:22 +0000 (12:11 +0200)]
Merge branch 'refs/heads/t/si_conversion'

A single patch which moves the list of status items from configure.ac
to para.h.

Cooking for five weeks.

* refs/heads/t/si_conversion:
  Define status items in para.h.

2 years agomanual: Fix typo.
Andre Noll [Sat, 26 Aug 2017 18:44:24 +0000 (20:44 +0200)]
manual: Fix typo.

2 years agomanual: Update URLs which give 301.
Andre Noll [Sat, 26 Aug 2017 18:40:08 +0000 (20:40 +0200)]
manual: Update URLs which give 301.

The link to the discount page is missing a trailing slash. For all
others the URL is redirected permanently to the https variant.

Found by the w3m link checker.

2 years agomanual: Fix typo in link.
Andre Noll [Sat, 26 Aug 2017 18:31:41 +0000 (20:31 +0200)]
manual: Fix typo in link.

The leading slash results in a "Missing fragment" error. Found by
the w3m link checker.

2 years agofilter: Simplify FOR_EACH_FILTER().
Andre Noll [Mon, 14 Aug 2017 00:00:33 +0000 (02:00 +0200)]
filter: Simplify FOR_EACH_FILTER().

Use the FILTER_CMD() macro rather than open-coding it.

2 years agofd.c: Remove para_fchdir().
Andre Noll [Sun, 13 Aug 2017 01:59:35 +0000 (03:59 +0200)]
fd.c: Remove para_fchdir().

It was a trivial wrapper which was used only in
for_each_file_in_dir(). Just open-code it there.

2 years agoaudiod: Add log message for receiver errors.
Andre Noll [Fri, 11 Aug 2017 10:18:26 +0000 (12:18 +0200)]
audiod: Add log message for receiver errors.

If the receiver could not be opened, we return negative from
open_receiver() and audiod prints an error message which contains the
error string. However, this message is confusing because it does not
say that the error came from open_receiver(), much less which receiver
caused the error. The new log message should clarify this.

2 years agoVersion 2 moods.
Andre Noll [Tue, 11 Jul 2017 14:08:32 +0000 (16:08 +0200)]
Version 2 moods.

This introduces a context-free grammar for moods. The parser for the
corresponding language (the version 2 mood parser) is generated by
flex and bison and will eventually replace the open-coded parser for
traditional (version 1) moods. Those are still supported, but the
server now logs a deprecation warning when a version 1 mood is loaded,

Loading a version 2 mood is a two step procedure. In the first step the
bison parser reads the mood definition stored in the moods table of the
afs database. If there are no errors, the parser returns an abstract
syntax tree which represents the syntactic structure of the mood
definition. In the second step the abstract syntax tree is evaluated
for each row of the audio file table in turn. If the evaluation
function returns true, the audio file is considered admissible. In
this case a reference to the row is added to the score table in the
same way the version 1 mood parser stores the set of admissible files.

The commit adds the following new files to the repository:

* yy/mp.lex: the lexer
* yy/mp.y: the bison parser
* yy/makefile: rules for building the parser, included from main Makefile
* mp.c: frontend (high-level API) and backend (helpers for yy/mp.[ch])
* mp.h: backend data structures and function prototypes

The frontend is only needed in the existing mood.c, which now also
contains the declarations of the frontend API so that mp.h needs only
be included by the lexer and the parser.

The comment at the top of mp.c gives an overview of the mood parser
API. All non-static functions of mp.c (both frontend and backend)
are fully documented. The section on moods of the user manual has
been rewritten and extended.

Since flex and bison are required to build para_server, the list
of optional software packages now mentions these tools, with links
to their home page. If either tool is not installed, the configure
script succeeds but para_server will not be built.

2 years agoMerge branch 'refs/heads/t/si_update'
Andre Noll [Sun, 20 Aug 2017 13:54:25 +0000 (15:54 +0200)]
Merge branch 'refs/heads/t/si_update'

A single patch which teaches the afs event handler to trigger a status
item update when the image or lyrics table changes. This patch had a
bug which was only noticed after the branch had been merged to next.
Therefore the series contains a fixup commit.

Cooking for almost two months.

* refs/heads/t/si_update:
  server: Avoid NULL pointer dereference in make_status_items().
  Update status items on blob events.

2 years agoserver: Fix typo in comment.
Andre Noll [Sat, 12 Aug 2017 23:13:38 +0000 (01:13 +0200)]
server: Fix typo in comment.

Introduced in the lopsub conversion patch.

2 years agoserver: Fix typo in comment for init_user_list().
Andre Noll [Sat, 12 Aug 2017 22:54:15 +0000 (00:54 +0200)]
server: Fix typo in comment for init_user_list().

2 years agoForce status item update on mood/playlist changes.
Andre Noll [Sun, 30 Jul 2017 00:25:26 +0000 (02:25 +0200)]
Force status item update on mood/playlist changes.

This patch increments the mmd event counter whenever a new playlist
or mood is loaded. This instructs the stat command handlers to resend
the list of status items to all connected stat clients.

2 years agoafs: Use correct error code for com_select().
Andre Noll [Sun, 30 Jul 2017 00:04:47 +0000 (02:04 +0200)]
afs: Use correct error code for com_select().

If the argument does not start with "m/" or "p/" we have an invalid
argument rather than a syntax error. This removes the last user of
E_AFS_SYNTAX, so the error code can be removed as well.

2 years agomood.c: Don't try twice to activate an invalid mood.
Andre Noll [Sun, 9 Jul 2017 21:31:43 +0000 (23:31 +0200)]
mood.c: Don't try twice to activate an invalid mood.

(Re-)loading a mood by executing the "select" server command fails
if the mood definition is invalid. In this case we first try to
switch back to the old mood, and if this also fails, fall back to
the dummy mood.

If the mood which is currently active has been replaced by an invalid
mood, switching back to the old mood is pointless because this will
try to load the same invalid mood again.

This commit modifies the select callback to load the old mood only
if it is different from the new mood.

2 years agoaft: Make get_audio_file_path_of_row() more robust.
Andre Noll [Sun, 9 Jul 2017 13:05:53 +0000 (15:05 +0200)]
aft: Make get_audio_file_path_of_row() more robust.

On errors we used to leave the path pointer uninitialized. This
commit sets it to NULL in this case.

2 years agoafs: Improve error diagnostics.
Andre Noll [Sun, 9 Jul 2017 11:57:47 +0000 (13:57 +0200)]
afs: Improve error diagnostics.

If the given mood or playlist could not be opened, we silently switch
to the dummy mood. Let's tell the user what has happened, and why.

2 years agomood.c: Remove some superfluous includes.
Andre Noll [Sat, 8 Jul 2017 22:39:57 +0000 (00:39 +0200)]
mood.c: Remove some superfluous includes.

mood.c does not use any of the ipc, sideband, sched subsystems
directly.

2 years agovss: Remove self-made prefaulting.
Andre Noll [Sun, 6 Aug 2017 12:05:36 +0000 (14:05 +0200)]
vss: Remove self-made prefaulting.

It used to help a bit on a very old laptop with broken IDE hardware,
see commit 7bba6232 (vss: Mmap audio files using MAP_POPULATE) from
six years ago. But even there it did not eliminate buffer underruns
completely. Our prefault code is too ugly to live, and its benefits
are questionable at best, so let's get rid of it.

We still map the audio file with MAP_POPOLATE, which should be enough
get the full audio file cached before chunks are sent.

2 years agobuild: Prefer AC_CHECK_TYPE() over AC_LINK_IFELSE().
Andre Noll [Sat, 5 Aug 2017 16:01:41 +0000 (18:01 +0200)]
build: Prefer AC_CHECK_TYPE() over AC_LINK_IFELSE().

Both invocations of AC_LINK_IFELSE() check if a C structure is
defined. We don't need to run the linker for that, saving a few cycles
on Linux systems where both structures are defined.

2 years agoserver: Get rid of a dead store.
Andre Noll [Sun, 6 Aug 2017 11:36:51 +0000 (13:36 +0200)]
server: Get rid of a dead store.

We jump to the success label which sets ret no a non-negative value.
Found by the clang static analyzer.

2 years agowma_afh: Add some assert() statements.
Andre Noll [Sun, 6 Aug 2017 13:13:04 +0000 (15:13 +0200)]
wma_afh: Add some assert() statements.

The clang static analyzer seems to have a hard time proving that if
convert_utf8_to_utf16() returns non-negative, the destination pointer
is non-null. This patch should help it.

2 years agoMerge branch 'maint'
Andre Noll [Fri, 11 Aug 2017 12:05:09 +0000 (14:05 +0200)]
Merge branch 'maint'

* maint:
  server: Perform hostname lookup in client process.
  server: Fix memory leak in com_check().

2 years agoserver: Perform hostname lookup in client process.
Andre Noll [Sun, 6 Aug 2017 20:50:15 +0000 (22:50 +0200)]
server: Perform hostname lookup in client process.

When a connection arrives at the TCP command socket, the server process
looks up the remote name before it forks the child process. This is bad
because the server process can not afford to sleep, but name lookup may
take some time, for example if a DNS server is currently unavailable.

We may as well look up the hostname after the fork in the child
process, where blocking operations are not a problem.

2 years agoserver: Fix memory leak in com_check().
Andre Noll [Sun, 6 Aug 2017 19:24:03 +0000 (21:24 +0200)]
server: Fix memory leak in com_check().

parse_mood_line() is called by the select command to set up a mood
item structure for each line of the mood definition. The item is stored
in one of the three lists of the mood structure provided by the caller.

The check command also calls parse_mood_line() to verify the mood
definitions. However, since it does not create a new mood, it does
not allocate a mood structure and passes a null pointer instead.

parse_mood_line() frees the mood item in the error case, but misses
to do so if a successfully parsed mood line was not added to any of
the three lists because the mood pointer is NULL, leaking the mood
item. This commit plugs the leak by adjusting the condition on which
to free the mood item.

This bug was introduced 10 years ago when mood checking was implemented
in commit 02baea14. It was found by code inspection.

2 years agoserver: Rename init_vss_task() to vss_init().
Andre Noll [Mon, 7 Aug 2017 17:51:15 +0000 (19:51 +0200)]
server: Rename init_vss_task() to vss_init().

The function not only initializes the vss task but also the three
senders. Moreover, all other public functions of vss.c are also
prefixed with vss_. Finally, the new name is shorter.

2 years agoserver: Remove unused ->peer from struct command_context.
Andre Noll [Sun, 6 Aug 2017 20:40:05 +0000 (22:40 +0200)]
server: Remove unused ->peer from struct command_context.

It is initialized in handle_connect() but never used.

2 years agoserver: Fix comment of empty_status_items().
Andre Noll [Mon, 7 Aug 2017 21:01:16 +0000 (23:01 +0200)]
server: Fix comment of empty_status_items().

The function is not "used by vss", it is not even visible from vss.c
as it is a static function defined in command.c. De-doxyfy the comment
while at it.

2 years agoserver: Kill two pointless variables in vss.c.
Andre Noll [Mon, 7 Aug 2017 17:17:42 +0000 (19:17 +0200)]
server: Kill two pointless variables in vss.c.

Both variables are set but never used. The two variables were
introduced back in the CVS days and have been pointless for the whole
git history since 2006.

2 years agovss: Make fec_active a bool.
Andre Noll [Sun, 6 Aug 2017 14:22:29 +0000 (16:22 +0200)]
vss: Make fec_active a bool.

It's used as a boolean, so don't declare it as integer.

2 years agovss: Improve comment about sending empty chunks.
Andre Noll [Sun, 6 Aug 2017 14:36:17 +0000 (16:36 +0200)]
vss: Improve comment about sending empty chunks.

The old comment was misplaced, and "they" referred to the chunks,
while "senders" was intended.

2 years agovss: Fix trivial whitespace issue.
Andre Noll [Sun, 6 Aug 2017 14:20:55 +0000 (16:20 +0200)]
vss: Fix trivial whitespace issue.

No need to wrap this line, it's short enough.

2 years agostring.h: Fix indentation, add doxygen reference.
Andre Noll [Sat, 5 Aug 2017 18:01:27 +0000 (20:01 +0200)]
string.h: Fix indentation, add doxygen reference.

The comment was improperly formatted, and the reference to
para_printf() lacked a \ref statement.

2 years agoMerge branch 'maint'
Andre Noll [Sun, 6 Aug 2017 21:02:17 +0000 (23:02 +0200)]
Merge branch 'maint'

* maint:
  stdin/stdout: Only set nonblock flags for non-tty fds.

2 years agoMerge branch 'refs/heads/t/lopsub'
Andre Noll [Sun, 6 Aug 2017 13:56:25 +0000 (15:56 +0200)]
Merge branch 'refs/heads/t/lopsub'

Three simple patches for the build system, all related to lopsub.

Cooking for three weeks.

* refs/heads/t/lopsub:
  build: Echo "M4" when running an m4 command.
  build: Run lopsubgen with absolute path.
  build: Improve lopsub error diagnostics.

2 years agoImprove documentation of signal_init_or_die().
Andre Noll [Fri, 28 Jul 2017 21:13:52 +0000 (23:13 +0200)]
Improve documentation of signal_init_or_die().

Prefix the reference to para_install_sighandler() with \ref to make
sure doxygen warns if the reference becomes stale, and fix the man
section of exit(): it is not a system call (but _exit() is).

2 years agoautogen: Run make check after a successful build.
Andre Noll [Sun, 16 Jul 2017 12:06:58 +0000 (14:06 +0200)]
autogen: Run make check after a successful build.

This helps to run the test suite more often, so bugs get caught
earlier.

2 years agostdin/stdout: Only set nonblock flags for non-tty fds.
Andre Noll [Sun, 30 Jul 2017 21:11:38 +0000 (23:11 +0200)]
stdin/stdout: Only set nonblock flags for non-tty fds.

Although the ->post_select methods of all paraslash executables perform
I/O only when select(2) reports that the file descriptor is ready,
we set the O_NONBLOCK flag for all monitored fds. This is considered
good practice because, in general, it might happen that a subsequent
read(2) call blocks even if select(2) indicates that the fd is ready
for reading. For example, an fd corresponding to a TCP socket might
be flagged as ready for reading if a network packet with incorrect
checksum has arrived, but a subsequent read(2) blocks until the packet
has been retransmitted.

However, stdin and stdout often correspond to a terminal device where
the above scenario won't happen. Moreover, for terminals it's essential
to reset the O_NONBLOCK flag to the old value on exit because the
shell refers to the same file description and thus shares the file
status flags, including O_NONBLOCK. Many terminal applications, for
example dialog(1), expect stdout to be set to blocking mode and fail
in arcane ways if O_NONBLOCK is set.

When the stdin and stdout tasks are about to exit, they reset the
file status flags back to the original values. However if "para_client
stat" is killed with SIGINT, SIGTERM or SIGKILL, or put to sleep with
SIGSTOP, the O_NONBLOCK flag remains set because para_client does not
handle signals at all. para_recv, para_filter and para_write suffer
from the same issue. Adding signal handling to these programs would
not help in the SIGSTOP case because this signal can not be caught.

This patch modifies stdin.c and stdout.c to no longer set O_NONBLOCK
for fd 0 and fd 1 if these fds are associated with a terminal
device. This is much easier and should do the job as well.

2 years agoMerge branch 'refs/heads/t/wma'
Andre Noll [Sat, 5 Aug 2017 12:05:52 +0000 (14:05 +0200)]
Merge branch 'refs/heads/t/wma'

A couple of patches which simplify the wma decoder and improve the
robustness of the bitstream API.

Cooking for a month.

* refs/heads/t/wma:
  wma: Remove _XOPEN_SOURCE define from wmadec_filter.c.
  wma: make ->ms_stereo local to wma_decode_block().
  wma: Simplify init_coef_vlc().
  wma: Rename input/output buffer variables.
  wma: Drop unused argument from wma_decode_superframe().
  wma: Remove pointless/incorrect sanity checks.
  wma: Combine wmadec_cleanup() and wmadec_close().
  wma: Simplify get_vlc().
  wma: Remove pointless VLC_TYPE define.
  wma: Make bitstream API more robust.

2 years agoserver: Remove -F option to ls.
Andre Noll [Tue, 18 Jul 2017 23:56:58 +0000 (01:56 +0200)]
server: Remove -F option to ls.

Quoting the current help text of the option:

This option is the default, so it does nothing. Deprecated as of
v0.6.0, scheduled for removal in v0.6.1.

This patch gets rid of the option and also adjusts the test suite,
which still used it.

2 years agoserver: Make sender subcommand array const.
Andre Noll [Mon, 24 Jul 2017 23:39:58 +0000 (01:39 +0200)]
server: Make sender subcommand array const.

Also the array itself (not just the subcommands) are constant.

2 years agoMerge branch 'maint'
Andre Noll [Mon, 31 Jul 2017 09:47:20 +0000 (11:47 +0200)]
Merge branch 'maint'

A fix for the udp sender which silences an annoying log message.

* maint:
  udp sender: Send EOF package only once.

2 years agoudp sender: Send EOF package only once.
Andre Noll [Wed, 26 Jul 2017 18:45:27 +0000 (20:45 +0200)]
udp sender: Send EOF package only once.

We already have the per target ->sent_fec_eof flag, but we only set it
after the EOF packet was sent *successfully*. It's pointless to send
the packet more than once, so this patch modifies udp_close_target() to
set the flag regardless of whether the write(2) call succeeded.

2 years agoserver: Fix segfault in com_sender().
Andre Noll [Mon, 24 Jul 2017 22:18:50 +0000 (00:18 +0200)]
server: Fix segfault in com_sender().

Commit 1709cc8f (server: Convert non-afs commands to lopsub) from
one year ago dropped the terminating NULL pointer from the array
of sender commands, presumably because the array size is declared
as the NUM_SENDER_CMDS enum constant, and this constant can be used
to iterate over all sender subcommands.

However, the loop in check_sender_args() of command.c does not
terminate the loop after NUM_SENDER_CMDS elements but only when it
encounters a NULL pointer. Hence, without the terminating NULL, the
code reads beyond the end of the array. The resulting invalid memory
access causes the command handler process to segfault.

Fix this by changing the termination condition of the loop to check
the loop variable against NUM_SENDER_CMDS.

2 years agomood.c: Trivial cosmetics for int_sqrt().
Andre Noll [Mon, 24 Jul 2017 20:44:54 +0000 (22:44 +0200)]
mood.c: Trivial cosmetics for int_sqrt().

This saves two lines, fixes a whitespace issue, and removes a line
which was commented out for many years.

2 years agomood.c: Fix documentation of int_sqrt().
Andre Noll [Mon, 24 Jul 2017 20:41:40 +0000 (22:41 +0200)]
mood.c: Fix documentation of int_sqrt().

As pointed out by Peter Zijlstra on lkml, int_sqrt() is not
rough nor any approximation; it calculates the exact value of
floor(sqrt()). Document this.

2 years agomood: Speed up int_sqrt().
Andre Noll [Mon, 24 Jul 2017 20:10:42 +0000 (22:10 +0200)]
mood: Speed up int_sqrt().

Following a recent discussion on lkml, the choice of the initial
value for the square root is sub-optimal. The change introduced
in this commit was proposed by Peter Zijlstra who also measured a
significant speed improvement for both the hot and the cold cache case.

The speed improvements for the hot-cache case were confirmed on a
32 bit system by running a simple test program which calculates the
square root of 10000000 random numbers. With the new initial value,
the running time went down by 23%. This matters because when a new
mood is loaded, int_sqrt() is called four times per admissible file.

The new initial value is computed in terms of the position of the
most significant bit set in the given argument to int_sqrt(). While
ffs(3) (find first set bit) is in POSIX.1‐2008, there is no fls(3)
(find last set bit), so we have to introduce our own implementation.
We chose an open-coded version because this turned out to be faster
than reversing the bits and calling ffs(3).

2 years agomood: Add notice about int_sqrt().
Andre Noll [Mon, 24 Jul 2017 20:29:01 +0000 (22:29 +0200)]
mood: Add notice about int_sqrt().

While the algorithm probably predates Linux, the implementation was
copied from the Linux source tree in 2007. The commit which introduced
the function back then (f6f50d03, "Merge the new afs code.") should
have mentioned this.

De-doxify the function as it is static and hence not part of the html
generated by doxygen.

2 years agoMerge branch 'maint'
Andre Noll [Fri, 28 Jul 2017 08:03:34 +0000 (10:03 +0200)]
Merge branch 'maint'

A fix for an old bug which should be propagated to master and next.

* maint:
  vss: Avoid use after free in vss_send().

2 years agovss: Avoid use after free in vss_send().
Andre Noll [Mon, 24 Jul 2017 15:26:44 +0000 (17:26 +0200)]
vss: Avoid use after free in vss_send().

In vss_send() we increment the current slice number for the fec
client after fc->send_fec() has sent a slice. This results in a use
after free in case of a write error because ->send_fec() frees the
fec client structure on write errors. Valgrind complains about this
with the splat below.

To avoid this, the fc pointer must not be dereferenced after
->send_fec() has been called. This patch increases the current slice
number *before* the call to ->send_fec(). This works because the fec
clients do not care about this number.

The bug was introduced eight years ago in commit 625c5cd (Add forward
error correction code to the udp sender/receiver).

==8615== Invalid read of size 1
==8615==    at 0x805022B: vss_send (vss.c:1051)
==8615==    by 0x805022B: vss_post_select (vss.c:1168)
==8615==    by 0x8061DC7: call_post_select (sched.c:84)
==8615==    by 0x8061DC7: sched_post_select (sched.c:110)
==8615==    by 0x8061DC7: schedule (sched.c:163)
==8615==    by 0x804CBFD: main (server.c:607)
==8615==  Address 0x4670168 is 80 bytes inside a block of size 116 free'd
==8615==    at 0x402D221: free (vg_replace_malloc.c:530)
==8615==    by 0x8062D7C: udp_delete_target (udp_send.c:80)
==8615==    by 0x80630DC: udp_send_fec (udp_send.c:305)
==8615==    by 0x805022A: vss_send (vss.c:1049)
==8615==    by 0x805022A: vss_post_select (vss.c:1168)
==8615==    by 0x8061DC7: call_post_select (sched.c:84)
==8615==    by 0x8061DC7: sched_post_select (sched.c:110)
==8615==    by 0x8061DC7: schedule (sched.c:163)
==8615==    by 0x804CBFD: main (server.c:607)
==8615==  Block was alloc'd at
==8615==    at 0x402C1F0: malloc (vg_replace_malloc.c:299)
==8615==    by 0x8052D7E: para_malloc (string.c:67)
==8615==    by 0x8052FBD: para_calloc (string.c:90)
==8615==    by 0x804F48F: vss_add_fec_client (vss.c:686)
==8615==    by 0x8063433: udp_com_add (udp_send.c:342)
==8615==    by 0x8063688: udp_init_target_list (udp_send.c:395)
==8615==    by 0x806371D: udp_send_init (udp_send.c:442)
==8615==    by 0x805062A: init_vss_task (vss.c:1195)
==8615==    by 0x804CA57: server_init (server.c:537)
==8615==    by 0x804CA57: main (server.c:605)

2 years agoblob: Remove some unnecessary casts for arguments to read_u32().
Andre Noll [Thu, 20 Jul 2017 15:41:22 +0000 (17:41 +0200)]
blob: Remove some unnecessary casts for arguments to read_u32().

Since read_u32() has been modified to receive a void * pointer,
these casts are no longer needed.

2 years agocrypt: Remove read_ssh_u32().
Andre Noll [Sat, 15 Jul 2017 13:24:07 +0000 (15:24 +0200)]
crypt: Remove read_ssh_u32().

It was just another implementation of read_u32_be(). This commit makes
the crypto code use the helper of portable_io.h instead.

2 years agoLet helpers in portable_io.h receive void * arguments.
Andre Noll [Sat, 15 Jul 2017 13:19:32 +0000 (15:19 +0200)]
Let helpers in portable_io.h receive void * arguments.

The functions have to convert the bytes to uint8_t (aka unsigned char)
anyway, so allow to pass any pointer type.

2 years agoMerge branch 'refs/heads/t/hash-sort-for-ls'
Andre Noll [Sun, 23 Jul 2017 13:23:03 +0000 (15:23 +0200)]
Merge branch 'refs/heads/t/hash-sort-for-ls'

A single commit which allows to pass -s=h to the ls command for
sorting the output by hash value.

Cooking for six weeks.

* refs/heads/t/hash-sort-for-ls:
  server: Introduce hash sort for ls command.

2 years agoMake dummy completers static.
Andre Noll [Tue, 13 Jun 2017 19:39:12 +0000 (21:39 +0200)]
Make dummy completers static.

This revealed that the completers for SUPERCOMMAND_UNAVAILABLE are all
unused..

2 years agoopus_afh: Use custom header API to strip comment packet.
Andre Noll [Mon, 17 Jul 2017 21:07:06 +0000 (23:07 +0200)]
opus_afh: Use custom header API to strip comment packet.

Currently we define the header of an ogg/opus file as the first two ogg
pages. This is problematic for two reasons: (a) the metadata packet
(ogg packet #2) may be arbitrary large and should not be sent over
the network as it is not needed for decoding the audio stream, and (b)
the second ogg page may contain, in addition to the metadata packet,
opus encoded audio packets which should not be part of the header.

This patch employs the recently added custom header API to avoid both
problems in the same way the ogg/vorbis audio format handler does:
we create a custom header which contains the unmodified ID header
packet and a dummy metadata packet.

2 years agoogg: Abstract out custom header code.
Andre Noll [Mon, 17 Jul 2017 23:02:50 +0000 (01:02 +0200)]
ogg: Abstract out custom header code.

The ogg/vorbis audio format handler employs the callback mechanism of
oac_get_file_info() to replace the metadata packet of an ogg/vorbis
stream by a fixed sized dummy packet. The same approach should also be
used for the ogg/opus audio format handler because ogg/opus metadata
can be arbitrary large too.

As a preparation for modifying the ogg/opus audio format
handler to skip the metadata header in this way, this commit
makes the infrastructure available to all audio format handlers
which employ the ogg container format by providing a public
interface in ogg_afh_common.c. The central data structure is struct
oac_custom_header, which replaces the former vorbis_get_header_data
structure. The layout of the new structure is only known to
ogg_afh_common.c. Users of this API need to call the accessor functions
declared in ogg_afh_common.h.

Only the ogg/vorbis audio format handler is converted to the new API.
A subsequent patch will make the ogg/opus audio format handler the
second user.

2 years agoPrefix public functions of ogg_afh_common.c with "oac".
Andre Noll [Mon, 17 Jul 2017 21:39:14 +0000 (23:39 +0200)]
Prefix public functions of ogg_afh_common.c with "oac".

This way it is clear that these are not functions provided by libogg.
Pure rename. no real changes.

2 years agoafh_recv: Downgrade severity of log message.
Andre Noll [Mon, 17 Jul 2017 21:06:42 +0000 (23:06 +0200)]
afh_recv: Downgrade severity of log message.

Currently we print one line per chunk, which can get very noisy. So
"debug" is the right loglevel to use here.

2 years agoMerge branch 'refs/heads/t/doxygen'
Andre Noll [Fri, 21 Jul 2017 17:45:31 +0000 (19:45 +0200)]
Merge branch 'refs/heads/t/doxygen'

This series contains an update of Doxyfile to a newer doxygen version
and an overhaul of the source code documentation. Several stale
references have been fixed. Other parts of the documentation have
been improved.

Cooking for almost a month.

* refs/heads/t/doxygen:
  aft.c: Trivial spelling/whitespace fixes.
  afh: Expand documentation of init function declarations.
  filter: Remove duplicate documentation of filter_get().
  doxygen: Improve documentation of struct receiver.
  doxygen: Add \ref to references.
  Improve documentation of mm.c and mm.h.
  doxygen: Don't refer to Black Hats Manual.
  doxygen: Don't refer to libosl functions.
  doxygen: Trivial cleanups.
  doxygen: Remove some stale doxygen references.
  recv: Explain user data mechanism.
  Update to doxygen-1.8.11.

The merge resulted in a few conflicts which were easy to resolve.

2 years agoDefine status items in para.h.
Andre Noll [Fri, 14 Jul 2017 15:11:32 +0000 (17:11 +0200)]
Define status items in para.h.

The only reason the status item enum and string array are defined in
configure.ac is that upper case identifiers and lower case strings
are not easy to do in cpp as it lacks toupper().

However, configure.ac is not the right place for defining C language
constructs as the configure script should only check for installed
packages.

This commit moves the definition of the status item enum and array to
para.h and modifies all users to use lower case for the item names.
This was automated with a script which essentially did

upper=${i^^}
sed -i "s/\<SI_$upper/SI_$i/g" $files

for each status item $i. Care has been taken to leave the order of
the status items unchanged. This is important because the item numbers
must be considered part of the API between server and client.

2 years agoafh: Unify name of init functions.
Andre Noll [Fri, 14 Jul 2017 18:05:21 +0000 (20:05 +0200)]
afh: Unify name of init functions.

The init functions of the mp3 and ogg audio format handlers lacked
the _afh part in the name which all other audio format handlers have.

2 years agoafh: Fix typo in comment.
Andre Noll [Fri, 14 Jul 2017 18:45:57 +0000 (20:45 +0200)]
afh: Fix typo in comment.

2 years agoaft.c: Improve documentation of get_afhi_of_row().
Andre Noll [Tue, 11 Jul 2017 17:33:31 +0000 (19:33 +0200)]
aft.c: Improve documentation of get_afhi_of_row().

It is not obvious that the function initializes the afh_info structure
so that its members point to memory-mapped data. This comment adds
some clarifying comments.

2 years agomood.c: Rename compute_mood_score().
Andre Noll [Thu, 6 Jul 2017 18:46:29 +0000 (20:46 +0200)]
mood.c: Rename compute_mood_score().

The main purpose of this function is to determine whether the
audio file is admissible with respect to the given mood. So
row_is_admissible() is more to the point.

2 years agomood.c: Trivial whitespace fixes.
Andre Noll [Thu, 6 Jul 2017 19:52:45 +0000 (21:52 +0200)]
mood.c: Trivial whitespace fixes.

2 years agoserver: Avoid NULL pointer dereference in make_status_items().
Andre Noll [Sun, 16 Jul 2017 14:21:07 +0000 (16:21 +0200)]
server: Avoid NULL pointer dereference in make_status_items().

The previous patch (Update status items on blob events) modified the
aft event handler to call make_status_items() on certain blob events
because the event could have rendered the current status information
stale.

However, if no audio file is open at the time the event occurs,
make_status_items() triggers a segfault because the ->path and ->hash
members of status_item_ls_data are NULL in this case.

This patch avoids the problem by returning early from
make_status_items() if ->path is NULL.

2 years agoRemove some unnecessary includes.
Andre Noll [Sun, 9 Jul 2017 18:20:05 +0000 (20:20 +0200)]
Remove some unnecessary includes.

These headers are already included with para.h.

2 years agogui: Trivial whitespace and spelling fixes.
Andre Noll [Sat, 15 Jul 2017 12:01:28 +0000 (14:01 +0200)]
gui: Trivial whitespace and spelling fixes.

Nothing interesting in this patch..

2 years agoaft: Fix a typo in comment.
Andre Noll [Sun, 16 Jul 2017 00:21:59 +0000 (02:21 +0200)]
aft: Fix a typo in comment.

2 years agoafs: Improve documentation of callback_result_handler.
Andre Noll [Sun, 16 Jul 2017 00:07:48 +0000 (02:07 +0200)]
afs: Improve documentation of callback_result_handler.

The old text was rather incomprehensive ("chunks to data").

2 years agobuild: Remove an unused function from configure.ac.
Andre Noll [Fri, 14 Jul 2017 13:55:28 +0000 (15:55 +0200)]
build: Remove an unused function from configure.ac.

This function has become unused with the removal of gengetopt, but
we missed to drop it back then.

2 years agobuild: Fix typo in comment to HAVE_IP_MREQN.
Andre Noll [Sat, 8 Jul 2017 23:15:41 +0000 (01:15 +0200)]
build: Fix typo in comment to HAVE_IP_MREQN.

Introduced in 2009 when the --udp_mcast_iface option was implemented
and the check for struct ip_mreqn was added.

2 years agomanual: Add a sentence about release notifications.
Andre Noll [Sat, 15 Jul 2017 13:37:43 +0000 (15:37 +0200)]
manual: Add a sentence about release notifications.

This patch was meant to be applied years ago, but it got stashed
and then forgotten.

2 years agomanual: Fix typo.
Andre Noll [Sat, 15 Jul 2017 13:33:47 +0000 (15:33 +0200)]
manual: Fix typo.

Duplicate "about".

2 years agomanual: libosl is optional.
Andre Noll [Fri, 14 Jul 2017 13:39:28 +0000 (15:39 +0200)]
manual: libosl is optional.

Even without libosl, the build succeeds (only para_server won't be
built). Hence libosl should be listed as optional software. This
commit moves the item out of the list of mandatory packages.

2 years agobuild: Echo "M4" when running an m4 command.
Andre Noll [Sat, 8 Jul 2017 19:47:55 +0000 (21:47 +0200)]
build: Echo "M4" when running an m4 command.

Translating a .suite.m4 file into a lopsub suite is a quiet operation
for no good reason. Let's add the usual output line to the build.

2 years agobuild: Run lopsubgen with absolute path.
Andre Noll [Sat, 8 Jul 2017 16:53:11 +0000 (18:53 +0200)]
build: Run lopsubgen with absolute path.

The configure script detects the location of the lopsubgen executable,
but we never use this information and rely on the shell to find the
executable in $PATH when the recipes in m4/lls/makefile are run.

This should not matter much, but it is inconsistent to how we deal
with m4. Moreover, using the LOPSUBGEN autoconf variable in the
recipes allows the user to override the path at build time.

2 years agobuild: Fix check for lopsub.
Andre Noll [Sat, 8 Jul 2017 16:36:03 +0000 (18:36 +0200)]
build: Fix check for lopsub.

If the lopsub library is not installed, HAVE_LOPSUB should be set to
"no".  The current code in configure.ac gets this wrong, causing the
configure script to succeed even if the library is not installed.

2 years agobuild: Improve lopsub error diagnostics.
Andre Noll [Sat, 8 Jul 2017 16:43:00 +0000 (18:43 +0200)]
build: Improve lopsub error diagnostics.

The configure script checks for the lopsubgen executable, the lopsub.h
header file and the liblopsub.a library. If the executable is not
found, we print a short error while a long error message with download
instructions is shown if the header file or the library is missing.

In the common failure case none of the three files is installed,
in which case we print the short message because the check for the
executable comes first. This is unfortunate.

This commit moves the check for the executable to the lopsub section
of configure.ac and prints the long error message if any of the three
files is missing.

2 years agoMerge branch 'refs/heads/t/manual'
Andre Noll [Fri, 14 Jul 2017 12:50:43 +0000 (14:50 +0200)]
Merge branch 'refs/heads/t/manual'

A couple of patches which merge the contents of the overview.pdf file
into the user manual. After this, the documentation no longer depends
on dia.

Cooking for six weeks.

* refs/heads/t/manual:
  manual: Expand description of para_play.
  manual: Omit level 3 headers from table of contents.
  manual: Combine overview.pdf and the user manual.
  manual: Remove text about permissions of /var/paraslash.
  manual: Correct format of para_client help output.
  manual: Add lopsub installation instructions to quick start.

2 years agoMerge branch 'maint'
Andre Noll [Thu, 13 Jul 2017 15:21:13 +0000 (17:21 +0200)]
Merge branch 'maint'

A single important fix for the error subsystem. The merge conflicted
because master removed the E_AAC_AFH_INIT error code while maint
still has it. The conflict was trivial to resolve.

* refs/heads/maint:
  Let error codes start out at index 1.

2 years agoLet error codes start out at index 1.
Andre Noll [Sat, 8 Jul 2017 20:55:11 +0000 (22:55 +0200)]
Let error codes start out at index 1.

When the error code facility was simplified one year ago in commit
a775408 (Simplify the error subsystem, get rid of error2.[ch]) we
introduced a simple enum for all error codes, but missed the fact
that this approach assigns the first error code the value zero.

Hence, when the AAC decoder returns this error code, it will not be
recognized as an error because we generally check for negative return
values only.

This patch introduces an unused dummy error code so that the real
error codes start at index 1.

2 years agoMerge branch 'refs/heads/t/para_play'
Andre Noll [Sun, 9 Jul 2017 17:38:40 +0000 (19:38 +0200)]
Merge branch 'refs/heads/t/para_play'

A single patch which removes pointless play_task arguments to many
functions in play.c.

Cooking for well over a month.

* refs/heads/t/para_play:
  play: Remove pointless play_task arguments.

2 years agowma: Remove _XOPEN_SOURCE define from wmadec_filter.c.
Andre Noll [Wed, 14 Jun 2017 17:24:45 +0000 (19:24 +0200)]
wma: Remove _XOPEN_SOURCE define from wmadec_filter.c.

It has been there since day one of the wma decoder with no indication
why it is needed. The code compiles fine without it on all supported
platforms, so get rid of it.

2 years agowma: make ->ms_stereo local to wma_decode_block().
Andre Noll [Sun, 11 Jun 2017 16:25:32 +0000 (18:25 +0200)]
wma: make ->ms_stereo local to wma_decode_block().

mid/side stereo mode is a per-block property and thus does not
need to be stored in the private_wmadec_data structure.

2 years agowma: Simplify init_coef_vlc().
Andre Noll [Sun, 11 Jun 2017 16:10:39 +0000 (18:10 +0200)]
wma: Simplify init_coef_vlc().

This function of wmadec_filter.c was unnecessarily convoluted.
The patched version should be equivalent, and easier to understand.

This also allows to get rid of ->coef_vlcs of struct private_wmadec_data,
which was utterly confusing since we also have ->coef_vlc.

2 years agowma: Rename input/output buffer variables.
Andre Noll [Sun, 11 Jun 2017 14:20:01 +0000 (16:20 +0200)]
wma: Rename input/output buffer variables.

The naming was confusing. With the new names it is clear which buffer
is used for input and which for output.

2 years agowma: Drop unused argument from wma_decode_superframe().
Andre Noll [Sun, 11 Jun 2017 14:10:40 +0000 (16:10 +0200)]
wma: Drop unused argument from wma_decode_superframe().

The function depends on the caller not passing a smaller value than
the packet size - WMA_FRAME_SKIP, and only uses this many input
bytes anyway. So we may get rid of the input size argument.