Download raw body.
Attempting new port: ctune Internet Radio player
On Mon, 9 Dec 2024 23:43:12 +0000
Stuart Henderson <stu@spacehopper.org> wrote:
> On 2024/12/08 13:36, Chris Billington wrote:
> > I am attempting to make a port of ctune [https://github.com/An7ar35/ctune], an nCurses Internet Radio player written in C.
> >
> > This seems to be worthwhile, because audio/gradio and audio/curseradio are both currently nonfunctional due to API changes in underlying libraries, and are based on inactive projects.
> >
> > I tested ctune on a Linux install and it seems to be both functional, low-resource and fast. It also includes support for sndio output.
> >
> > First steps, getting the program to build, having solved a few type errors I have run into the following issue:
> >
> > [ 23%] Building C object plugins/output/pulseaudio/CMakeFiles/ctune_plugin_pulseaudio.dir/__/__/__/src/datastructure/CircularBuffer.c.o
> > cd /home/chris/Downloads/build/ctune/plugins/output/pulseaudio && /usr/bin/cc -Dctune_plugin_pulseaudio_EXPORTS -I/home/chris/Downloads/build/ctune/libraries -I/usr/local/include -I/home/chris/Downloads/build/ctune/generated-src -Wextra -O2 -std=gnu99 -fPIC -MD -MT plugins/output/pulseaudio/CMakeFiles/ctune_plugin_pulseaudio.dir/__/__/__/src/datastructure/CircularBuffer.c.o -MF CMakeFiles/ctune_plugin_pulseaudio.dir/__/__/__/src/datastructure/CircularBuffer.c.o.d -o CMakeFiles/ctune_plugin_pulseaudio.dir/__/__/__/src/datastructure/CircularBuffer.c.o -c /home/chris/Downloads/build/ctune/src/datastructure/CircularBuffer.c
> > /home/chris/Downloads/build/ctune/src/datastructure/CircularBuffer.c:36:17: warning: call to undeclared function 'syscall'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
> > long fd = syscall( __NR_memfd_create, name, flags );
> > ^
> > /home/chris/Downloads/build/ctune/src/datastructure/CircularBuffer.c:36:26: error: use of undeclared identifier '__NR_memfd_create'
> > long fd = syscall( __NR_memfd_create, name, flags );
> > ^
> > 1 warning and 1 error generated.
> > *** Error 1 in . (plugins/output/pulseaudio/CMakeFiles/ctune_plugin_pulseaudio.dir/build.make:107 'plugins/output/pulseaudio/CMakeFiles/ctune_plugin_pulseaudio.dir/__/__/__/src/datastructure/CircularBuffer.c.o')
> > *** Error 2 in . (CMakeFiles/Makefile2:504 'plugins/output/pulseaudio/CMakeFiles/ctune_plugin_pulseaudio.dir/all')
> > *** Error 2 in /home/chris/Downloads/build/ctune (Makefile:139 'all')
> >
> > Pulseaudio is installed on my machine because other progams I run require it .
> >
> > The relevant lines of the file causing the above issue are:
> >
> > (src/datastructure/CircularBuffer.c)
> >
> > #include "CircularBuffer.h"
> >
> > #include <errno.h>
> > #include <string.h>
> > #include <limits.h>
> > #include <sys/mman.h>
> > #include <sys/syscall.h>
> > #include <unistd.h>
> >
> > #include "logger/src/Logger.h"
> >
> > /**
> > * [PRIVATE] Gets a string representation of the error enum val for pthread returns
> > * @param i Error enum integer val
> > * @return String
> > */
> > static const char * CircularBuffer_getPThreadErrStr( int i ) {
> > switch( i ) {
> > case 0 : return "OK";
> > case EINVAL : return "EINVAL";
> > case EBUSY : return "EBUSY";
> > case EAGAIN : return "EAGAIN";
> > case EDEADLK: return "EDEADLK";
> > case EPERM : return "EPERM";
> > default : return "UNKNOWN";
> > }
> > }
> >
> > /**
> > * [PRIVATE] Gets a file descriptor for an anonymous file residing in memory (replica of https://man7.org/>
> > * @param name Name of file
> > * @param flags Flags
> > * @return File descriptor (-1 or error)
> > */
> > static int CircularBuffer_memfd_create( const char * name, unsigned int flags ) {
> > long fd = syscall( __NR_memfd_create, name, flags );
> > int cast = 0;
> >
> > if( fd >= 0 ) {
> > if( fd <= INT_MAX ) {
> > cast = (int) fd;
> >
> > } else {
> > CTUNE_LOG( CTUNE_LOG_ERROR,
> > "[CircularBuffer_memfd_create( \"%s\", %d )] Failed cast long->int (%ld)",
> > name, flags, fd
> > );
> >
> > cast = -1;
> > }
> > }
> >
> > return cast;
> > }
> >
> >
> > Can anyone offer some assistance in resolving this 'undeclared function' issue please?
>
> As it has sndio support anyway, we don't want to build pulseaudio
> support anyway (nor the other plugins really). However this
> CircularBuffer data structure is also used in src/ui/EventQueue.c which
> looks more of a core thing so I think it will still need an alternative
> - try gkoehler's suggestion for that.
>
> To disable - there doesn't seem to be a cmake flag you can use in
> CONFIGURE_ARGS to disable these but you can patch CMakeLists.txt - in
> the ports framework, extract the files (I usually type "make patch"
> for this, even if there aren't any yet), "cd `make show=WRKSRC`", "cp
> CMakeLists.txt CMakeLists.txt.orig.port", edit CMakeLists.txt, "cd -",
> "make update-patches"
>
> Looking lower in cmakelists we have
>
> target_link_libraries(ctune PRIVATE
> ctune_logger #CTUNE_LOG(..)
> ${JSONC_LIBRARIES} #(json-c/*.h) for `parse/JSON.c`
> ${NCURSES_LIBRARIES} #(ncurses.h) for `ui/*`
> ${CURSES_LIBRARIES} #(ncurses.h) for `ui/*`
> panel #(panel.h) ncurses panel lib for `ui/*`
> form #(form.h) ncurses form lib for `ui/*`
> pthread #threading
> OpenSSL::SSL #(openssl/*.h) for `network/NetworkUtils.c`
> OpenSSL::Crypto #(openssl/*.h) for `network/NetworkUtils.c`
> m #(math.h) for `utils/utilities.c`
> uuid #(uuid/uuid.h) for `utils/utilities.c`
> curl #(curl/curl.h) for `network/NetworkUtils.c`
> dl #(dlfcn.h) for `fs/Plugin.c`
> )
>
> giving some clues for other libraries you'll need installed - some
> are in base, from ports you'll want libjson-c (devel/json-c), libuuid
> (it probably wants the one in sysutils/e2fsprogs), curl (net/curl).
> OpenBSD doesn't use libdl and you probably need to delete that line
> in a patch (the relevant functions are just in libc on OpenBSD,
> there is no libdl, so trying to link with it will fail).
>
> > How does one declare the 'syscall' function here, and why is it not needed on the Linux platform?
> >
> > Do we have an equivalent for the Linux macro syscall __NR_memfd_create (which seems also to be aliased as SYS_memfd_create)?
>
> IIUC: Linux has this history of adding things to the kernel that glibc
> doesn't want to add wrappers for, so in order to use them programs
> wanting to use it have to use the syscall directly.
>
> OpenBSD (since recently) doesn't permit using syscall() at all any more
> - it's a potent vector for BROP attacks ("ret2syscall"). But because the
> kernel and libraries are developed alongside each other and we don't
> have a policy of maintaining ABI so that old binaries stay running, its
> not a problem to add wrappers for kernel calls to libc if we need them.
>
> That said we don't have memfd support at all hence gkoehler's suggestion
> of a workaround.
>
Thank you George and Stuart for the tips.
Is it also possible to use shm_mkstemp(3) to put the buffer in Shared
Memory instead of a disk file?
libjson-c is pulled from git at present as a cmake external, but I will
try and change it to use the port.
I will work on the port over the next couple of evenings and
hopefully will have something functional to test soon.
--
Chris Billington
Attempting new port: ctune Internet Radio player