From 771dfb0d396c72f4a8a80df768c464f81808313d Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sat, 30 May 2026 01:30:05 +0200 Subject: [PATCH] Add Missing netatalk files --- cmake/modules/FindNetatalk.cmake | 35 +++++++++++ include/nwatalk.h | 13 ++++ src/nwatalk.c | 102 +++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+) create mode 100644 cmake/modules/FindNetatalk.cmake create mode 100644 include/nwatalk.h create mode 100644 src/nwatalk.c diff --git a/cmake/modules/FindNetatalk.cmake b/cmake/modules/FindNetatalk.cmake new file mode 100644 index 0000000..6b33aee --- /dev/null +++ b/cmake/modules/FindNetatalk.cmake @@ -0,0 +1,35 @@ +# Find Netatalk's libatalk. +# +# Result variables: +# NETATALK_FOUND +# NETATALK_INCLUDE_DIRS +# NETATALK_LIBRARIES +# +# Optional cache hints: +# NETATALK_ROOT +# NETATALK_INCLUDE_DIR +# NETATALK_LIBRARY + +find_path(NETATALK_INCLUDE_DIR + NAMES atalk/adouble.h + HINTS ${NETATALK_ROOT} + PATH_SUFFIXES include +) + +find_library(NETATALK_LIBRARY + NAMES atalk libatalk + HINTS ${NETATALK_ROOT} + PATH_SUFFIXES lib lib64 +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Netatalk + REQUIRED_VARS NETATALK_INCLUDE_DIR NETATALK_LIBRARY +) + +if(NETATALK_FOUND) + set(NETATALK_INCLUDE_DIRS ${NETATALK_INCLUDE_DIR}) + set(NETATALK_LIBRARIES ${NETATALK_LIBRARY}) +endif() + +mark_as_advanced(NETATALK_INCLUDE_DIR NETATALK_LIBRARY) diff --git a/include/nwatalk.h b/include/nwatalk.h new file mode 100644 index 0000000..dde080c --- /dev/null +++ b/include/nwatalk.h @@ -0,0 +1,13 @@ +#ifndef _NWATALK_H_ +#define _NWATALK_H_ + +#include "net.h" + +#define NWATALK_FINDER_INFO_LEN 32 + +int nwatalk_backend_available(void); +int nwatalk_get_finder_info(const char *path, uint8 *finder_info, + int finder_info_len); +int nwatalk_get_resource_fork_size(const char *path, uint32 *resource_size); + +#endif diff --git a/src/nwatalk.c b/src/nwatalk.c new file mode 100644 index 0000000..16536cc --- /dev/null +++ b/src/nwatalk.c @@ -0,0 +1,102 @@ +/* Optional Netatalk/libatalk AFP metadata backend helpers. */ +#include "net.h" +#include "config.h" +#include "nwatalk.h" +#include "tools.h" + +#include + +#if NETATALK_SUPPORT +#include +#include +#include +#endif + +int nwatalk_backend_available(void) +{ +#if NETATALK_SUPPORT + return(1); +#else + return(0); +#endif +} + +#if NETATALK_SUPPORT +static int nwatalk_open_adouble(const char *path, struct adouble *ad) +{ + int result; + + if (!path || !*path) return(-0x9c); /* invalid path */ + + ad_init_old(ad, AD_VERSION, 0); + + result = ad_open(ad, path, + ADFLAGS_HF | ADFLAGS_RF | ADFLAGS_RDONLY | + ADFLAGS_NOHF | ADFLAGS_NORF); + if (result < 0) { + return(-0x9c); + } + + return(0); +} +#endif + +int nwatalk_get_finder_info(const char *path, uint8 *finder_info, + int finder_info_len) +{ +#if NETATALK_SUPPORT + struct adouble ad; + void *entry; + int result; + + if (!finder_info || finder_info_len < NWATALK_FINDER_INFO_LEN) { + return(-0x9c); + } + + memset(finder_info, 0, finder_info_len); + + result = nwatalk_open_adouble(path, &ad); + if (result < 0) return(result); + + entry = ad_entry(&ad, ADEID_FINDERI); + if (entry && ad_getentrylen(&ad, ADEID_FINDERI) >= NWATALK_FINDER_INFO_LEN) { + memcpy(finder_info, entry, NWATALK_FINDER_INFO_LEN); + } + + ad_close(&ad, 0); + return(0); +#else + (void)path; + (void)finder_info; + (void)finder_info_len; + return(-0xbf); /* invalid namespace / backend unavailable */ +#endif +} + +int nwatalk_get_resource_fork_size(const char *path, uint32 *resource_size) +{ +#if NETATALK_SUPPORT + struct adouble ad; + off_t size; + int result; + + if (!resource_size) return(-0x9c); + *resource_size = 0; + + result = nwatalk_open_adouble(path, &ad); + if (result < 0) return(result); + + size = ad_size(&ad, ADEID_RFORK); + if (size > 0) { + if (size > 0xffffffffUL) size = 0xffffffffUL; + *resource_size = (uint32)size; + } + + ad_close(&ad, 0); + return(0); +#else + (void)path; + (void)resource_size; + return(-0xbf); /* invalid namespace / backend unavailable */ +#endif +}