paraslash.git
6 years agoserver: Move para_fgets() to user_list.c.
Andre Noll [Sun, 13 Aug 2017 00:36:14 +0000 (02:36 +0200)]
server: Move para_fgets() to user_list.c.

It's only used there, so we can make it static and dedoxify its
documentation.

6 years agoserver: Initialize user list at compile time.
Andre Noll [Sat, 12 Aug 2017 23:05:22 +0000 (01:05 +0200)]
server: Initialize user list at compile time.

This allows the removal of the "initialized" variable, and it
simplifies user_list_init().

6 years agoserver: Rename functions related to user lists.
Andre Noll [Sat, 12 Aug 2017 23:10:01 +0000 (01:10 +0200)]
server: Rename functions related to user lists.

The common user_list prefix of the two public functions declared in
user_list.h indicates that these functions are defined in user_list.c.

6 years agoserver: Constify return value of lookup_user().
Andre Noll [Sat, 12 Aug 2017 23:02:17 +0000 (01:02 +0200)]
server: Constify return value of lookup_user().

Command handlers only need to read this structure.

6 years agoserver: Let stat command handler perform cleanup on signals.
Andre Noll [Sat, 12 Aug 2017 21:27:55 +0000 (23:27 +0200)]
server: Let stat command handler perform cleanup on signals.

The stat command is special because it is the only command which may
run for a very long time, and because it catches SIGUSR1 which is sent
by the server to notify the command handler process when the status
items have changed and the command handler should update the client.

The stat command handler catches neither SIGINT nor SIGTERM, though,
so these signals terminate the process. This happens when para_server
is started without --daemon and CTRL+C is pressed (causing SIGINT
to be sent to the all processes in the foreground process group)
or when the server is about to exit, because in this case the main
process sends SIGTERM to all child processes.

If the command handler process terminates because it received SIGINT
or SIGTERM, valgrind reports various memory leaks. Although the leaks
are harmless, they clutter the valgrind output and make real memory
leaks hard to spot.

This commit changes com_stat() to ignore SIGINT and catch SIGTERM in
addition to SIGUSR1. We don't need to care about SIGINT in com_stat()
because in the above scenario, the main process sends SIGTERM to all
command handlers after it received SIGINT. With the patch applied, if
com_stat() received SIGTERM, it returns and the normal cleanup on exit
is performed.

We have to employ pselect(2) to avoid race conditions.

6 years agoserver: Have afs process close the current mood on exit().
Andre Noll [Sat, 12 Aug 2017 20:02:48 +0000 (22:02 +0200)]
server: Have afs process close the current mood on exit().

This eliminates a few (harmless but annoying) warnings about memory
leaks from the valgrind output.

6 years agoserver: Deplete close on fork list on exit.
Andre Noll [Sat, 12 Aug 2017 19:32:28 +0000 (21:32 +0200)]
server: Deplete close on fork list on exit.

We empty the list in the command handler process by calling
close_listed_fds(), but the server process leaks the memory
allocated for the entries of the close on fork list.

This commit introduces deplete_close_on_fork_list() to empty the
list without closing any file descriptors. It is called from main()
to avoid the leak.

With the patch applied, valgrind --show-reachable=no no longer
complains about possibly lost blocks for the server process.

6 years agodaemon: Introduce log mutex.
Andre Noll [Mon, 7 Aug 2017 22:02:03 +0000 (00:02 +0200)]
daemon: Introduce log mutex.

Currently the server processes append messages to the log file without
coordination. This usually does not cause problems, but sometimes
the log messages of the main server process and the afs process get
interleaved due to the lack of serialization.

This patch serializes access to the common log file by employing a
new lock: the log_mutex. Like the mmd_mutex, it is realized as an
one-element System V semaphore set.

Logging is performed by the daemon subsystem implemented in daemon.c.
This subsystem is also used by para_audiod which is single-threaded
and thus does not need to care about serialization of log messages.
To keep daemon.c working for both para_server and para_audiod,
struct daemon gains two optional methods, ->pre_log_hook and
->post_log_hook. If the function pointers are not NULL, the methods
are called before and after a message is logged. For para_server
the methods call back to the server code to take and release the
lock. para_audiod does not need to be modified because if the new
function pointers are left at their default value NULL, so no hooks
are called.

6 years agoserver: Exit cleanly on SIGINT/SIGTERM.
Andre Noll [Mon, 7 Aug 2017 19:41:00 +0000 (21:41 +0200)]
server: Exit cleanly on SIGINT/SIGTERM.

Currently signal_post_select() kills all child processes and then
calls exit(3) if SIGNINT or SIGTERM was received. This leaves all file
descriptors open and memory blocks allocated, which makes debugging
memory leaks difficult because the valgrind output is hard to read.

This patch changes the server to cleanly shutdown the scheduler and
deallocate resources (close file descriptors, free memory, destroy
locks and shared memory areas) before exit(3) is called.

6 years agoserver: Cleanly shut down senders on exit.
Andre Noll [Mon, 7 Aug 2017 19:11:26 +0000 (21:11 +0200)]
server: Cleanly shut down senders on exit.

This introduces ->shutdown for struct sender. Each of the three senders
implements the new method to close file descriptors and to deallocate
the resources occupied by the sender. The method is only called on
exit via the new vss_shutdown() from both server and command handler
context after schedule() returns.

We need to introduce another helper, process_is_command_handler(), to
distinguish between the two callers.

6 years agoserver: Shutdown the scheduler before handling commands.
Andre Noll [Mon, 7 Aug 2017 01:44:07 +0000 (03:44 +0200)]
server: Shutdown the scheduler before handling commands.

Currently the command handlers are called from the ->post_select
method of the command task after the main server process has forked.
When the command handler is done, it exits with the scheduler still
active. This is not a problem per se, and it has been like this
for more than a decade, but it does make it harder to debug memory
leaks because we leak some resources. Valgrind complains about this,
cluttering the output with pointless warnings.

This commit cleans up the memory handling of the child process on
exit. The command task of the child process notifies all tasks in its
->post_select method and then returns the new pseudo error code
-E_CHILD_CONTEXT. This causes the scheduler to return to main().

The main() function checks via the new ->child_fd of struct
server_command_task whether it is running in child context after
schedule() has returned and calls the command handler in this case.

6 years agoserver: Make array of senders constant.
Andre Noll [Mon, 7 Aug 2017 15:44:15 +0000 (17:44 +0200)]
server: Make array of senders constant.

Currently we define an array of static non-constant sender structures
in vss.c with only ->init being initialized at compile time.
At startup the ->init method of each sender must fill out the other
function pointers of the structure. This approach is kind of pointless,
as these pointers are known at compile time and never change.

This patch changes the three senders to define a non-static constant
sender structure instead. The vss maintains an array of pointers to
these structures.

Since the new sender structures are non-static, they need to be
doxified. We use the opportunity to provide an overview of each sender.

The patch also introduces FOR_EACH_SENDER(), a macro which is used
several times to replace the open-coded loops we had before.

6 years agoserver: Define server command task structure in main().
Andre Noll [Sun, 6 Aug 2017 21:39:02 +0000 (23:39 +0200)]
server: Define server command task structure in main().

This way it does not need to be static, and we can look at the
contents after schedule() returns.

Preparatory patch for shutting down cleanly on exit.

6 years agobuild: Compile with -Wdiscarded-qualifiers.
Andre Noll [Wed, 3 Jan 2018 17:50:15 +0000 (18:50 +0100)]
build: Compile with -Wdiscarded-qualifiers.

This option is unsupported (but warnings are invariably enabled) for
old gcc versions including 4.2.2. It is supported but not enabled by
default for vanilla gcc-5.5.0, but is enabled for the gcc versions
which ship with Ubuntu-14.04 (4.8.4) and Ubuntu-16.04 (5.4.0).

This patch enables the warning everywhere. We have to employ the
cc-option macro to determine whether the option is supported.

6 years agoacl: Fix/improve acl_del_entry log message.
Andre Noll [Wed, 3 Jan 2018 13:12:00 +0000 (14:12 +0100)]
acl: Fix/improve acl_del_entry log message.

The given address/netmask can match any number of entries. Currently
we log one message per removed address but all messages contain the
address/netmask to match rather than the removed one that was stored
in the acl.

This patch changes acl_del_entry() to log both, with different
severities.

6 years agoacl: Avoid undefined behaviour due to 32-bit shift.
Andre Noll [Thu, 16 Nov 2017 02:24:47 +0000 (03:24 +0100)]
acl: Avoid undefined behaviour due to 32-bit shift.

On x86 a shift by 32-bits is a nop, but this is not backed by any
standard. Moreover, not shifting at all results in an effective netmask
of 32, which is unexpected for for v4_addr_match(), as the function
is supposed to answer the question "do the first zero bits of these
two addresses match?". This should always be true, regardless of the
two addresses.

Fix this, and change the return type of the function while at it.

6 years agoafs: Fix typo in error message.
Andre Noll [Wed, 3 Jan 2018 00:48:09 +0000 (01:48 +0100)]
afs: Fix typo in error message.

It was the ->open() method that failed when this message is logged.

6 years agoafs: Fix memory leak in make_status_items().
Andre Noll [Tue, 2 Jan 2018 23:55:03 +0000 (00:55 +0100)]
afs: Fix memory leak in make_status_items().

The leak occurs when the second call to print_list_item() fails. In
this case we leak the memory pointed to by the lpr pointer. This patch
also streamlines the code a bit by introducing the free_status_items()
helper.

6 years agofd.c: Simplify para_mmap().
Andre Noll [Sun, 14 Jan 2018 17:57:22 +0000 (18:57 +0100)]
fd.c: Simplify para_mmap().

Both callers pass in a zero offset, so we can get rid of this
parameter.

6 years agogcrypt: Allocate a secmem pool at startup.
Andre Noll [Wed, 3 Jan 2018 03:33:02 +0000 (04:33 +0100)]
gcrypt: Allocate a secmem pool at startup.

The client side loads private keys. This patch makes sure the memory
which contains such key material is never swapped out.

6 years agocrypt: Introduce crypt_shutdown().
Andre Noll [Fri, 29 Dec 2017 15:22:37 +0000 (16:22 +0100)]
crypt: Introduce crypt_shutdown().

This plugs a few harmless memory leaks in the openssl crypto
backend. The leaks occur on exit and are only reported by valgrind
if it is run with --leak-check=full --show-leak-kinds=all.

The gcrypt backend has similar problems, but there is no way to
provide a similar patch for libgrypt. The newly added comment in
gcrypt.c explains why.

6 years agocrypt: Rename init_random_seed_or_die() -> crypt_init().
Andre Noll [Thu, 28 Dec 2017 20:57:23 +0000 (21:57 +0100)]
crypt: Rename init_random_seed_or_die() -> crypt_init().

At least the gcrypt implementation does more than just seed the
PRNG. The new name is shorter and more descriptive.

6 years agogcrypt: Use ROUND_DOWN() macro.
Andre Noll [Thu, 28 Dec 2017 20:48:10 +0000 (21:48 +0100)]
gcrypt: Use ROUND_DOWN() macro.

6 years agocrypt: Rename RSA functions.
Andre Noll [Thu, 28 Dec 2017 14:52:31 +0000 (15:52 +0100)]
crypt: Rename RSA functions.

This renames the functions and constants of the public crypto API
which deal with RSA to have the common "apc" (asymmetric pubkey
cryptosystem) prefix.  This hides RSA as an implementation detail
and makes it clear that the functions/constants are related to apc.

Pure renaming, no semantic change. The only other changes are a new
comment to crypt.h and a \ref statement in the doxygen comment of
apc_free_pubkey().

6 years agocrypt: Deduplicate get_public_key().
Andre Noll [Thu, 28 Dec 2017 00:41:14 +0000 (01:41 +0100)]
crypt: Deduplicate get_public_key().

The openssl and grypt implementations of this function share quite
some code. This patch factors out the common code into the new
decode_ssh_key() helper of crypt_common.c. Both implementations are
changed to call the new helper.

As a side effect of this change, all callers of is_ssh_rsa_key()
and check_ssh_key_header() now reside in crypt_common.c, so we can
make these two functions static and remove their declarations from
crypt_backend.h.

6 years agocrypt.h: Remove two unused constants.
Andre Noll [Wed, 27 Dec 2017 20:59:33 +0000 (21:59 +0100)]
crypt.h: Remove two unused constants.

These should have been removed already last year in commit d9f54f43
(crypto: Remove support for ASN public keys), since that commit made
the constants obsolete.

6 years agoRename crypt.c -> openssl.c.
Andre Noll [Wed, 27 Dec 2017 20:47:40 +0000 (21:47 +0100)]
Rename crypt.c -> openssl.c.

The old name made sense back when we had only one crypto backend. These
days paraslash can be compiled against either openssl or gcrypt,
so the new name makes it clear that the file is only compiled in if
the openssl library was selected as the crypto backend.

6 years agoserver: Avoid use of uninitialized memory.
Andre Noll [Mon, 29 Jan 2018 22:21:11 +0000 (23:21 +0100)]
server: Avoid use of uninitialized memory.

change_current_mood() receives an errmsg pointer which the callers
expect to be initialized with an error string if (and only if) the
function returns negative.

However, most error paths miss to initialize the pointer which results
in undefined behaviour in the caller which attempts to free(3)
uninitialized memory. The gcc AddressSanitizer and valgrind both
catch this:

gcc:

==14788==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x081af250 in thread T0

valgrind:

==4410== Invalid free() / delete / delete[] / realloc()

The bug was introduced half a year ago when version 2 moods were
introduced in commit 3d3a2f50.

6 years agodaemon: Fix log reload for relative paths.
Andre Noll [Sun, 31 Dec 2017 20:56:35 +0000 (21:56 +0100)]
daemon: Fix log reload for relative paths.

If the argument to --logfile is a relative path, it is interpreted
as relative to the current working directory. In daemon mode, the
current working directory is changed to / during startup. Hence,
when para_server re-opens the log file after it received SIGHUP, the
logfile path will now be interpreted as relative to the the root of
the file system.

Fix this by remembering the original current working directory.
Opening "." as recommended in getcwd(3) is not an option here since the
whole point of changing the cwd to / is to prevent the daemon from
keeping the cwd busy.

6 years agoImprove daemon_open_log_or_die().
Andre Noll [Sun, 31 Dec 2017 19:32:52 +0000 (20:32 +0100)]
Improve daemon_open_log_or_die().

If the log file can not be re-opened, the error message is lost
because the log file has already been closed when PARA_EMERG_LOG() is
called. We can do better by deferring the call to daemon_close_log()
until the new log file has been opened.

With the patch applied, the reason why the (new) log file could not
be opened is logged to the old file.

6 years agoserver: Close logfile later on SIGHUP.
Andre Noll [Sun, 31 Dec 2017 19:27:57 +0000 (20:27 +0100)]
server: Close logfile later on SIGHUP.

The call to daemon_open_log_or_die() will close the log file just
before it is reopened. This is better because that way any errors
which occur in between won't get lost.

6 years agoserver: Simplify afs socket cookie code.
Andre Noll [Sun, 31 Dec 2017 15:27:25 +0000 (16:27 +0100)]
server: Simplify afs socket cookie code.

Currently, the afs_socket_cookie value is passed to afs_init() and
is stored in the commmand task structure of the afs process. This
is unnecessary since the variable defined in server.c is non-static,
and declared as extern in afs.c. We may thus refer to this variable
from afs.c.

The variable was also documented twice. Get rid of one comment.

6 years agomixer: Remove default moods for sleep.
Andre Noll [Tue, 30 Jan 2018 18:56:16 +0000 (19:56 +0100)]
mixer: Remove default moods for sleep.

The documented behavior of the sleep subcommand is to not fade out
if no fade out mood was given. The current code, however, tries to
switch to the default m/fade. This fails if this mood does not exist,
causing the sleep subcommand to terminate. By removing the default
value we get the documented behaviour.

The --fo-mood and --sleep-mood suffer from the same issue and can be
fixed in the same way.

6 years agobuild: Error out early if flex or bison are not found.
Andre Noll [Thu, 11 Jan 2018 08:05:13 +0000 (09:05 +0100)]
build: Error out early if flex or bison are not found.

The configure script tests for these executables, but we happily
proceed even if they are not found. For the m4 executable we got
the check right, however. Introduce a general helper that calls
AC_PATH_PROG() to locate an executable and aborts if it is not found.

6 years agoFix bad grammar "allows <infinitive>".
Andre Noll [Tue, 7 Nov 2017 22:29:03 +0000 (23:29 +0100)]
Fix bad grammar "allows <infinitive>".

In standard English, the verb "allows" can never take an infinitive as
its direct object. This patch corrects these mistakes.

6 years agoaft: Avoid implicit fallthrough in switch statement.
Andre Noll [Sat, 27 Jan 2018 11:08:04 +0000 (12:08 +0100)]
aft: Avoid implicit fallthrough in switch statement.

The missing return statement causes gcc-7 to complain:

aft.c:2579:3: warning: this statement may fall through [-Wimplicit-fallthrough=]

And indeed, this fall through was not intended when the code in
question was introduced some months ago in commit a7a8d30e (Update
status items on blob events).

The issue is benign though, because also after falling through we
return 0.

6 years agoogg_afh_common.c: Add missing whitespace to log message.
Andre Noll [Wed, 3 Jan 2018 04:11:23 +0000 (05:11 +0100)]
ogg_afh_common.c: Add missing whitespace to log message.

There was no space character between the number and the word "seconds".

6 years agomp.c: Fix typo in comment.
Andre Noll [Sun, 7 Jan 2018 00:20:49 +0000 (01:20 +0100)]
mp.c: Fix typo in comment.

6 years agocommand.c: Fix typo in comment.
Andre Noll [Thu, 28 Dec 2017 21:37:20 +0000 (22:37 +0100)]
command.c: Fix typo in comment.

6 years agoUpdate copyright year to 2018.
Andre Noll [Thu, 11 Jan 2018 08:04:17 +0000 (09:04 +0100)]
Update copyright year to 2018.

Fortunately, there is only a single place to update.

6 years agoplay: Print help text if no audio files are given.
Andre Noll [Fri, 29 Dec 2017 14:08:15 +0000 (15:08 +0100)]
play: Print help text if no audio files are given.

This is more helpful than the lopsub error message. Since
handle_help_flags() already checked the arg count, the call to
lls_check_arg_count() can be removed.

6 years agoplay: Always check arg count and init keymap.
Andre Noll [Sun, 14 Jan 2018 21:12:32 +0000 (22:12 +0100)]
play: Always check arg count and init keymap.

Currently we miss to do so if the config file does not exist or
is empty. This triggers the following assertion if, in addition,
no non-option arguments given:

        para_play: string.c:62: para_malloc: Assertion `size' failed.

This is because we try to allocate a zero sized buffer in main() due
to lls_num_inputs() returning 0. Fix this by changing the target of
the goto in handle_help_flags().

This bug was introduced during the conversion to lopsub.

6 years agodoc: Move filter examples to man page.
Andre Noll [Mon, 6 Nov 2017 17:02:57 +0000 (18:02 +0100)]
doc: Move filter examples to man page.

para_filter(1) is a better place for examples than the user manual
because the man pages explain one command command while purpose of
the manual is to describe the connection and the interaction of the
various commands.

6 years agodoc: Move sender examples to manual page.
Andre Noll [Sun, 5 Nov 2017 16:36:15 +0000 (17:36 +0100)]
doc: Move sender examples to manual page.

The general paraslash user manual contains a couple of examples for
the sender subcommand of para_server. However, the para_server(1)
manual page is a better place for this, so this patch moves the
examples there. They have also been slightly reworded, and the help
text of the sender command has been clarified.

6 years agoMerge branch 'maint'
Andre Noll [Sun, 31 Dec 2017 14:04:16 +0000 (15:04 +0100)]
Merge branch 'maint'

A conflict in init_random_seed_or_die() of gcrypt.c. The fix added
in the maint branch conflicted against the master branch which also
modified the function to bump the required libgcrypt version.

* maint:
  resample filter: Don't discard const.
  gcrypt: Seed PRNG in init_random_seed_or_die().
  bash_completion: Get rid of weird retry logic.

6 years agoresample filter: Don't discard const.
Andre Noll [Fri, 29 Dec 2017 13:50:28 +0000 (14:50 +0100)]
resample filter: Don't discard const.

Newer versions of libsamplerate made the data_in pointer const. This
causes the following warning:

In file included from resample_filter.c:6:0:
/usr/local/include/samplerate.h:177:6: note: expected 'float *' but argument is of type 'const float *'
 void src_short_to_float_array (const short *in, float *out, int len) ;
      ^
resample_filter.c:173:7: warning: passing argument 1 of 'free' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
In file included from para.h:11:0,
 from resample_filter.c:10:
/usr/include/stdlib.h:460:13: note: expected 'void *' but argument is of type 'const float *'
 extern void free (void *__ptr) __THROW;

The problem is that we first convert the input from int16 to float
and use the data_in pointer as the target for the conversion.

Fix this by introducing a temporary non-const variable for the
converted input.

6 years agocrypt.c: Plug memory leak in get_public_key().
Andre Noll [Thu, 16 Nov 2017 01:18:50 +0000 (02:18 +0100)]
crypt.c: Plug memory leak in get_public_key().

If server.users refers to an existing file which is not a ssh public
key, we leak 4 bytes of memory:

==27302== 4 bytes in 1 blocks are definitely lost in loss record 1 of 8
==27302==    at 0x402C201: malloc (vg_replace_malloc.c:299)
==27302==    by 0x8052FF3: para_malloc (string.c:63)
==27302==    by 0x8066532: get_public_key (crypt.c:151)
==27302==    by 0x80569D1: user_list_init (user_list.c:90)
==27302==    by 0x804D74D: parse_config_or_die (server.c:279)
==27302==    by 0x804C719: server_init (server.c:554)
==27302==    by 0x804C719: main (server.c:655)

Furtunately, this issue is trivial to fix.

6 years agogcrypt: Seed PRNG in init_random_seed_or_die().
Andre Noll [Thu, 28 Dec 2017 15:48:48 +0000 (16:48 +0100)]
gcrypt: Seed PRNG in init_random_seed_or_die().

The function is supposed to call srandom(3) to set the seed for a new
sequence of pseudo-random integers to be returned by random(3). The
openssl crypto backend does this, but the gcrypt one does not.

This is not a fatal flaw as we don't use random(3) for any
cryptographic purpose. Let's fix it anyway.

6 years agocrypt.c: Fix two typos in comment.
Andre Noll [Wed, 27 Dec 2017 20:37:23 +0000 (21:37 +0100)]
crypt.c: Fix two typos in comment.

s/adds/add and s/random/urandom. Also add the man section to random().

6 years agobash_completion: Get rid of weird retry logic.
Andre Noll [Sun, 5 Nov 2017 18:38:44 +0000 (19:38 +0100)]
bash_completion: Get rid of weird retry logic.

It's totally unclear what this is supposed to do, as the commit which
introduced it six years ago does not say anything about the space
character being the only "proper" value.

Removing the check fixes an issue that only happens on the first
completion attempt: if a unique completion is possible, the completer
prints this completion as if there were multiple completions possible
instead of completing the command line.

6 years agogui: Catch SIGWINCH.
Andre Noll [Sat, 23 Sep 2017 17:48:40 +0000 (19:48 +0200)]
gui: Catch SIGWINCH.

Commit 9775f534 from more than three years ago removed the signal
handler for SIGWINCH on the grounds that it is unnecessary and
simplifies the gui menu code that was in preparation back then.

However, the gui menu feature was never merged and handling SIGWINCH in
the input task does have a disadvantage: since KEY_RESIZE is generated
by the curses library, select(2) (which watches STDIN_FILENO) does
not notice that wgetch(3) would not block or return ERR any more
after SIGWINCH was received. Hence the window will only be refreshed
after select(2) returns for another reason. This can delay the window
update for up to one second.

This patch gets rid of the delay by reintroducing the signal handler
for SIGWINCH, effectively reverting the above mentioned commit.

6 years agoserver: Disable com_tasks().
Andre Noll [Tue, 8 Aug 2017 11:08:27 +0000 (13:08 +0200)]
server: Disable com_tasks().

This server subcommand will break once we terminate the scheduler
before calling the command handler. The command was only a debugging
aid anyway, and the output was not very interesting to begin with. In
particular, it did not include the tasks of the afs process, and
always showed the same three tasks (command, vss and status).

We keep the subcommand for backward compatibility, but this commit
changes it to be a no-op. Scheduled for removal in v0.7.0.

6 years agoserver: Move afs_pid out of mmd struct.
Andre Noll [Mon, 7 Aug 2017 18:33:55 +0000 (20:33 +0200)]
server: Move afs_pid out of mmd struct.

The afs_pid variable is read-only after it has been initialized. Hence
it does not qualify for being part of the shared memory area which
contains the mmd struct. Make it a global variable instead.

6 years agoserver: Don't pass peername to handle_connect().
Andre Noll [Sun, 6 Aug 2017 21:45:38 +0000 (23:45 +0200)]
server: Don't pass peername to handle_connect().

The only reason we pass it is that handle_connect() can print a
log message containing the peer name. However, we already log this
information right after the connection was accepted.

6 years agoserver: Rename "vss task" -> vss.
Andre Noll [Mon, 7 Aug 2017 22:32:33 +0000 (00:32 +0200)]
server: Rename "vss task" -> vss.

The other tasks of the server process are called "server command"
and "signal", so let's be consistent and drop the redundant "task".

6 years agobash_completion: Fix typo.
Andre Noll [Sun, 24 Sep 2017 19:25:04 +0000 (21:25 +0200)]
bash_completion: Fix typo.

The underscore was dropped by mistake recently in commit d31995b3
(Shorten copyright notice).

6 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

6 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.

6 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

6 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.

6 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.

6 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.

6 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..

6 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
}'

6 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.

6 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().

6 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.

6 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.

6 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.

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

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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().

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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().

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.