Andre Noll [Thu, 22 May 2025 17:13:09 +0000 (19:13 +0200)]
Merge topic branch t/rm_sha1 into next
The series first drops the para_upgrade_db executable because it is no longer
needed. This removes the penultimate user of the sha1 infrastructure. The
remaining user is the handshake between para_client and para_server.
Since paraslash-0.7.0, client and server employ sha256 by default, but fall
back to sha1 in order to stay compatible to old 0.6.x versions. This series
instructs server and client to always employ sha256 as the hash algorithm,
breaking compatibility with 0.6.x clients. As a result, the sha1 hash algorithm
is no longer used anywhere, so the corresponding infrastructure is no longer
needed. This gets rid of a fair amount of code.
<!--
- The para_upgrade_db executable to convert old paraslash databases has
been removed. paraslash-0.7.0 was released more than three years ago, so
everybody should have upgraded by now.
- Authentication now rejects the weak sha1 hash algorithm, breaking
compatibility with 0.6.x versions. Older 0.7.x clients are still compatible
to current server versions and current clients can still talk to servers
running older 0.7.x versions.
-->
* refs/heads/t/rm_sha1:
Rename hash2 -> hash.
Remove sha1.
Remove para_upgrade_db.
aft: Compare the full hash, not just the first 20 bytes.
Andre Noll [Sun, 18 May 2025 18:17:12 +0000 (20:17 +0200)]
Remove sha1.
Server and client prefer sha256 in the authentication protocol since
paraslash-0.7.0, while 0.6.x clients and servers only know about sha1. This
patch drops the compatibility code which enabled old clients to connect to
new servers and vice versa.
Now the client code no longer checks whether the sha256 feature is supported,
but requests and uses the feature unconditionally. The server still announces
the sha256 feature and accepts the corresponding feature request, but uses
sha256 unconditionally.
With this approach older 0.7.x clients are still compatible to current
server versions and current clients can still talk to servers running older
0.7.x versions.
Andre Noll [Thu, 22 May 2025 16:47:09 +0000 (18:47 +0200)]
Merge branch 'master' into next
* master:
Improve documentation of set_max_chunk_size().
Warn about old (0.5.x or earlier) on-disk afhi.
doxyen: Completely suppress brief descriptions.
buffer_tree: Assert that we don't pass NULL to memcpy().
mp.c: Remove a dead store.
mood.c: Remove a dead store and fix the documentation of mood_load().
flac_afh: Check for possible integer overflows.
gcc-compat.h: Drop inline #define.
Andre Noll [Sun, 18 May 2025 18:12:24 +0000 (20:12 +0200)]
aft: Compare the full hash, not just the first 20 bytes.
In 0.7.0 the hash algorithm for the hash column of the audio file table
changed from the 20 byte sha1 to the 32 byte sha256. However, the audio file
selector kept calling hash_compare() as the comparator, which looks only at
the first 20 bytes of the buffers passed.
This omission is clearly a bug, but given that we still accept old clients
which only know about sha1, it's benign because the truncated sha256 should
not be worse than sha1. Fix the bug anyway.
Andre Noll [Wed, 21 May 2025 18:36:52 +0000 (20:36 +0200)]
Improve documentation of set_max_chunk_size().
The old text implied that the function could be removed at some point, which
is not the case. Remove this part of the documentation and clarify what the
function actually does.
Andre Noll [Wed, 21 May 2025 18:23:23 +0000 (20:23 +0200)]
Warn about old (0.5.x or earlier) on-disk afhi.
Nine years ago, starting with commit 234647bb5, old on-disk entries are
reported with a notice to re-add the file in order to update the audio file
table. Bump the loglevel for now, and add a comment to turn the check into
a hard error eventually.
Andre Noll [Tue, 20 May 2025 20:47:46 +0000 (22:47 +0200)]
buffer_tree: Assert that we don't pass NULL to memcpy().
The buffer pointer cannot be NULL here because this only happens when the
buffer tree area is full, which is not the case thanks to the previous n <=
btr_pool_unused(btrp) check.
Andre Noll [Tue, 20 May 2025 19:33:04 +0000 (21:33 +0200)]
Merge topic branch t/build into master
A medium sized series for the build system which improves the way the git
version string is stored in the executables and man pages. Subsequent patches
of the series remove some warts from the makefile: we no longer use order-only
dependencies and the .PRECIOUS target.
The merge results in a conflict against the "remove regex include" commit 67388cd4fae0. This is trivial to resolve, though.
* refs/heads/t/build:
Doxify version functions.
Doxify OV_EXCLUDE_STATIC_CALLBACKS #define.
Makefile: Fix braino in tarball target.
build: Remove superfluous dependency in Makefile.real.
build: Remove the .PRECIOUS target.
build: Improve clean targets.
build: Get rid of directory order-only dependencies.
build: Compile with -Wunused -Wall also on BSD.
build: Revamp git versioning.
build: Merge version.{c,h} into string.{c,h}.
Andre Noll [Sat, 19 Apr 2025 11:39:26 +0000 (13:39 +0200)]
Revamp bash_completion.
This rewrite of the bash_completion script improves completion for the
para_client and para_audioc commands significantly.
One flaw which is fixed by this patch is related to the fact that by default
readline creates COMP_WORDS by splitting at characters that separate a shell
command, including "=", but for paraslash commands we only want to split at
spaces. So we modify the completer to return the special code 124 to instruct
readline to try split again with space as the only delimiter.
Andre Noll [Sat, 3 May 2025 18:07:34 +0000 (20:07 +0200)]
bash completion: Fix help option parsing.
If we complete on para_client or para_audioc options rather than on server
or audiod subcommands, we parse the --help output to determine the options to
complete on. The regular expression we currently use for that is too lenient
because it also matches the options in the synopsis section of the help output.
Fix this by prefixing the expression with '^' to extract only the options
of the subsequent help text.
Andre Noll [Sun, 6 Apr 2025 20:14:43 +0000 (22:14 +0200)]
i9e: Introduce i9e_cword_is_option_arg().
Call the new function to complete --admissible, --sort and --listing-mode of
the ls subcommand and teach the touch completer to prevent filename completion
if a numerical argument is expected. The grab subcommand of para_audiod
also benefits from the new helper: para_audioc learned to complete the three
different grab modes.
Since --admissible expects a mood or playlist argument, factor out the code
from the select completer which returns the list of all moods and playlists
so that it can be called by the ls completer as well.
Andre Noll [Sun, 6 Apr 2025 17:30:53 +0000 (19:30 +0200)]
i9e: Constify i9e_complete_option().
i9e_extract_completions() and i9e_complete_option() both take a char **
argument for the option/string list although they do not modify the pointers
of the list. This commit marks these pointer variables constant.
Andre Noll [Sun, 18 May 2025 17:16:06 +0000 (19:16 +0200)]
Merge branch 'master' into next
* master:
doxygen: Don't show includes.
load_afd(): Double check shared memory sizes.
about: Mention that paraslash works without internet access.
mp3_afh: Kill FOR_EACH_FIELD().
mp3_afh: Document id3_field_init() and id3_field_finish().
Andre Noll [Mon, 5 May 2025 21:52:42 +0000 (23:52 +0200)]
load_afd(): Double check shared memory sizes.
The shared memory ID is sent by a trusted source, so it is a programming error
(rather than a runtime error that could be handled) if the size of the shared
memory area is smaller than the size of an audio file data structure. Thus,
the right thing to do is to abort immediately in this case.
Andre Noll [Mon, 28 Apr 2025 22:03:26 +0000 (00:03 +0200)]
mp3_afh: Document id3_field_init() and id3_field_finish().
These functions are somewhat obscure because they are not part of the
libid3tag API. They are not part of the internal paraslash API either,
so their documentation should not be shown on the API page. Exclude the
documentation with the doxygen \cond and \endcond markers.
Andre Noll [Sun, 23 Mar 2025 20:53:15 +0000 (21:53 +0100)]
blob: Get rid of the two dummy event handlers.
The four blob operation structures defined in blob.c are created by
a macro which initializes the function pointer for the event handler
to ${name}_event_handler, where $name is the blob type, i.e. one of
images, lyrics, moods, playlists.
Only two of the four, moods and playlists, need an event handler
because the images and lyrics tables ignore events. Currently we
have to define dummy functions {images,lyrics}_event_handler() to
avoid link errors. This extra code can easily be avoided by making
the macros a little smarter.
Andre Noll [Tue, 18 Mar 2025 18:31:33 +0000 (19:31 +0100)]
Check return value of lsu_com_help().
This function fails if an invalid command name is passed as the argument, yet
all callers ignore the error. Modify the callers to print the strerror text as
appropriate and no longer do that in lsu_lopsub_error(). Rename this function
and introduce the error type argument to print more meaningful error messages.
Andre Noll [Mon, 28 Apr 2025 15:45:04 +0000 (17:45 +0200)]
Merge topic branch t/wmadec into next
A few patches which remove unused code from the wma decoder and audio
format handler. Notably, noise coding was removed completely since
it was only used for unusual bit rates. Most likely, it never worked
in the first place.
The old name is confusing since we also have struct i9e_completer,
which is a completely different beast. Rewrite the documentation
of the function while at it.
Andre Noll [Mon, 25 Nov 2024 20:55:43 +0000 (21:55 +0100)]
com_select(): Support '-' to reactivate the previous mood/playlist.
This adds two static global variables to afs.c which track the
previously active mood or playlist. The select subcommand now makes
use of this information if the argument is the special string '-'. The
subcommand then follows common Unix conventions and reactivates the
previous mood or playlist.
Andre Noll [Mon, 7 Apr 2025 17:00:00 +0000 (19:00 +0200)]
Merge branch 'master' into next
* master:
Add missing newline in mp_init() error string.
com_check(): Report inconsistencies consistently.
aft: Simplify print_list_item().
vss_init(): Adjust loglevel.
manual: s/pipe/socket in the section on AFS.
base64: Document PAD64.
Teach the mood parser to not leak on errors.
Andre Noll [Wed, 19 Mar 2025 17:10:42 +0000 (18:10 +0100)]
com_check(): Report inconsistencies consistently.
Currently the various checkers report the inconsistencies they detect
in one of the osl tables to either stdout via the pbout para_buffer
or to stderr by calling afs_error(), Unify this by replacing all
calls to afs_error().
Andre Noll [Wed, 1 Jan 2025 21:24:03 +0000 (22:24 +0100)]
build: Improve clean targets.
In a "fresh build" (e.g. after a make clean) we create the .d and the
.o file in one go to speed up this common case. However, if one runs
"make clean" followed by e.g. "make para_audioc", this will create
*all* object and dependency files, not just the ones needed to build
para_audioc. This behaviour is unfortunate because most dependencies
are irrelevant for a single target, and even the few which do matter
are ignored as well in this case because the object file does not
exist and needs to be recreated anyway,
Work around this shortcoming by shuffling the commands of the four
rules a little so that the clean target only removes object files
but keeps the dependency files.
Also remove the calls to SAY in the recipe of the clean targets because
with the rm commands spelled out it is clear what is being removed.
Andre Noll [Wed, 1 Jan 2025 16:19:47 +0000 (17:19 +0100)]
build: Get rid of directory order-only dependencies.
They only clutter the Makefile for no good reason. Just create all
build directories beforehand when running ./version-gen.sh.
One order-only dependency remains: We want to invoke the compiler
only after all generated .h files have been created. Otherwise the
.d files may be created incorrectly.
Andre Noll [Wed, 1 Jan 2025 00:16:48 +0000 (01:16 +0100)]
build: Revamp git versioning.
This rewrites GIT-VERSION-GEN and renames it to version-gen.sh. The
main difference is that the script now generates version.c rather
than version.h, speeding up the build because switching branches
or transitioning from a clean to a dirty work-tree (or vice versa)
changes the version string. Before the patch, all files which included
version.h were recompiled. With the patch applied, only the short
version.c needs to be recompiled.
The generated version,c defines one function which returns the
single-line version string and a second function which returns
the multi-line version information (author, copyright, git URL
etc). This information is now passed to version-gen.sh via environment
variables. The CPP macros we had before are removed.
Andre Noll [Tue, 31 Dec 2024 23:48:26 +0000 (00:48 +0100)]
build: Merge version.{c,h} into string.{c,h}.
This is a preparatory patch for the upcoming revamp of the git
version script. The revamped script generates version.c, a file
which is currently tracked by git. We can easily get rid of it (and
of version.h) since all paraslash executables link in both string.o
and version.o. So let's move the three small functions of version.c
to string.c and their declarations from version.h to string.h.
Andre Noll [Wed, 19 Mar 2025 23:18:30 +0000 (00:18 +0100)]
Teach the mood parser to not leak on errors.
Attempting to load an incomplete mood definition such as "1 &&"
currently causes memory leaks because the memory for the partial
syntax tree is never freed.
Employ bison's %destructor directive to call mp_free_ast() whenever
a syntax error happens.
Andre Noll [Fri, 17 Jan 2025 19:52:48 +0000 (20:52 +0100)]
gui: Improve "closing command fd" log message.
Make the EOF case silent because this is no real error, but print the
log message with a high severity level if the read operation failed
for any other reason.
Andre Noll [Wed, 1 Jan 2025 20:39:34 +0000 (21:39 +0100)]
Kill BINDIR.
When executing para_client or para_audioc from para_mixer or para_gui
we currently pass an absolute path whose directory part is BINDIR
to execvp(2). This is unnecessary because execvp(2) honors $PATH.
This commit modifies gui.c and mixer.c to pass only the basename of
the executable instead, allowing us to remove the BINDIR preprocessor
define. We still need the bindir make variable, though, because it
is referenced in the recipe of the two install targets.
Andre Noll [Mon, 19 Aug 2024 19:41:23 +0000 (21:41 +0200)]
gui: Kill also child processes of external commands.
When a command is executed as a display command from para_gui, and
the command is interrupted from within para_gui by pressing any key,
para_gui only kills the spawned process but leaves alone its child
processes.
Address this problem by putting the spawned process into a separate
process group so that we can easily kill all processes of the group
by passing the negated PID of the child to kill(2).
In theory, the change in exec.c also affects para_mixer, which executes
para_client and para_audioc. However, para_mixer never kills any of
its child processes.
Andre Noll [Mon, 25 Nov 2024 23:28:53 +0000 (00:28 +0100)]
Fix memory leak in playlist.c.
If the result pointer is NULL. we currently leak one playlist instance
structure (12 bytes on 32 bit, 20 bytes on 64 bit) each time a playlist
is loaded.
Andre Noll [Sun, 1 Dec 2024 16:56:25 +0000 (17:56 +0100)]
Remove the documentation of the maint branch.
paraslash-0.6.5 was the last maintenance release. As of today,
the "maint" branch no longer exists in the git repo, so adjust the
documentation at two places: the user manual and the download page.
Streamline the text a bit, while at it.
Andre Noll [Tue, 17 Sep 2024 15:52:07 +0000 (17:52 +0200)]
Merge topic branch t/openssl-3 into master
The series starts with a few cleanups and crypto-backend tweaks to
beat the openssl specific code into shape for the main objective:
the switch of the RSA encryption and decryption routines to the
high-level EVP API. This has become necessary because the old RSA
API functions have been deprecated in openssl-3.
This merge conflicted against commit a18458cff51c (No longer check
for CRYPTO_cleanup_all_ex_data()). The resolution is to remove the
checks which that commit removed and to add the checks which commit 0485079436ad (openssl: Use the EVP library for RSA public encryption)
of this series introduced.
Cooking for four months.
* refs/heads/t/openssl-3:
openssl: Reactivate openssl warnings.
openssl: Use the EVP library for RSA private decryption.
openssl: Use the EVP library for RSA public encryption.
apc_priv_decrypt: Let the callee allocate the buffer.
apc_pub_encrypt: Let the callee allocate the buffer.
openssl: Assume that openssl allocation functions functions succeed.
openssl: Introduce openssl_perror().
openssl: Don't pass pointers to RSA structures around.
openssl: Kill rsa coefficient computations.
client: Check buffer size returned by apc_priv_decrypt().
Andre Noll [Sat, 8 Sep 2018 10:11:33 +0000 (12:11 +0200)]
New audio formats: 32 bit float (little and big endian).
At least the little endian version seems to be popular these days. It
is only supported by ALSA, however. To check whether a given wave
file employs one of the two SF_FLOAT formats (aka IEEE float) we have
to consult the format code, a 16 bit integer stored at offset 20 of
the wave header which describes the waveform data according to the
table below.
Additional checks are added to check_wav_post_select() which make
sure that the format code is either 1 or 3, and that the number is
compatible with the bits per sample value.
Andre Noll [Sun, 15 Sep 2024 16:23:24 +0000 (18:23 +0200)]
Merge topic branch t/ls-l into master
A single commit which deprecates the chunk table and mbox listing
modes. The chunk table can still be listed with para_afh(1), and the
mbox format was never really useful to begin with. The idea is to
remove support after 0.8.0 has been released.
Cooking for three months.
* refs/heads/t/ls-l:
server: Deprecate -l=c and -l=m of com_ls().
Andre Noll [Fri, 9 Aug 2024 20:53:00 +0000 (22:53 +0200)]
gui: Fix formatting of amp value.
It was observed on a 178 column wide xterm window that for the colorful
blackness theme the amp value shown in the top window of para_gui
wrapped into the subsequent line under some circumstances. Adjust
the corresponding value in gui_theme.c to fix this.
Also add the missing space character to the prefix and fix a whitespace
issue while at it.
Andre Noll [Tue, 10 Sep 2024 13:41:49 +0000 (15:41 +0200)]
Merge topic branch t/btr into master
Some helpers such as btr_get_input_queue_size() are very expensive
if the buffer tree contains many buffers, which is the case for mp3
and aac streams. This is noticeable in particular with para_play,
which spends more time in the btr subsystem than in the mp3 decoder
if the file is large enough. This branch contains a few patches to
improve that.
Cooking for four months.
* refs/heads/t/btr:
btr: Streamline the documentation of buffer_tree.h.
Constify buffer tree API.
btr: Merge buffers on insertion.
btr: Speed up btr_node_status().
Speed up mp3dec filter.
Andre Noll [Wed, 4 Sep 2024 13:49:50 +0000 (15:49 +0200)]
Merge topic branch t/play into master
This small series contains a few minor tweaks for para_play. The most
obvious change is that para_play is no longer built on systems which
lack libreadline.
The merge conflicted badly in configure.ac due to the changes
introduced by the earlier merge of the "built" topic branch. The
resolution needs to modify the non-conflicting Makefile.real to exclude
para_play from the list of executables if libreadline is not present
while the corresponding commit of the "play" topic branch implemented
the logic in configure.ac.
Cooking for a month.
* refs/heads/t/play:
play: Shut down alsa on input EOF.
play: Simplify and improve get_key_map_seq().
play: Remove pointless goto in play_post_monitor().
Return from filter_setup() so callers can reset the terminal.
Let para_play depend on libreadline.
Andre Noll [Thu, 6 Oct 2022 14:11:55 +0000 (16:11 +0200)]
play: Shut down alsa on input EOF.
para_play leaks a lot of memory on exit because we didn't bother
to shut down the alsa subsystem. While this is harmless from the
correctness point of view, it does make it harder to spot real
memory leaks.
Rework the error handling to always shut down alsa via kill_stream().
Combine play_post_monitor() and session_post_monitor() because they
are small enough and the latter was badly named anyway.
Andre Noll [Sun, 25 Jun 2023 12:29:07 +0000 (14:29 +0200)]
play: Simplify and improve get_key_map_seq().
Combine it with get_user_key_map_seq() and replace the NULL check
with an assertion since the condition can never be true here. This
makes gcc's static analyzer happy, which complained about a possible
NULL pointer dereference.
Andre Noll [Wed, 14 Jun 2023 21:15:18 +0000 (23:15 +0200)]
i9e: Clear history on close.
This frees each history entry and the history itself, reducing the
amount of memory leaked by readline applications on exit. Normally,
this should not be used since it leaks the memory associated with the
user defined history data pointer of each entry. However, that's OK
here because the i9e subsystem ignores this feature of the history
library.
Andre Noll [Tue, 20 Aug 2024 20:57:10 +0000 (22:57 +0200)]
Merge topic branch t/build into master
This series simplifies the build system quite a bit. The bulk of the
series consists of the commits which move the logic to construct
the object list of the paraslash executables from configure.ac to
Makefile.real.
Started on 2023-06-21, was cooking for five months.
* refs/heads/t/build:
build: Rename all_objs -> dep_objs.
build: No longer check for CRYPTO_cleanup_all_ex_data().
build: Construct list of executables in Makefile.
build: Construct audioc object list in Makefile.
build: Construct write object list in Makefile.
build: Construct play object list in Makefile.
build: Construct afh object list in Makefile.
build: Construct filter object list in Makefile.
build: Construct recv object list in Makefile.
build: Construct gui object list in Makefile.
build: Construct mixer object list in Makefile.
build: Construct audiod and client object list in Makefile.
build: Construct server and upgrade_db object list in Makefile.
build: Simplify condition for building para_server.
build: Simplify ogg helpers of configure.ac.
build: Remove AUDIOD_AUDIO_FORMATS_ENUM.
build: Remove _errlist in shell variables of configure.ac.
build: yy_src_dir and yy_build_dir can be simply expanded.
build: Remove info about ucred from configure output.