On Mon, 9 Dec 2024 23:43:12 +0000 Stuart Henderson <s...@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