commit: 9ae65d39ea20a999a8d939a55aea381ea3e1531e Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> AuthorDate: Mon Oct 6 09:13:12 2025 +0000 Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> CommitDate: Mon Oct 6 09:15:22 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9ae65d39
sys-fs/reiserfsprogs: fix building on musl The patch addition is safe for glibc, since all additions are behind "#if !defined(__GLIBC__)". The patches are from void-linux. On musl it also requires sys-libs/obstack-standalone, and manual add of "-lobstack" to linking (needed by debugreiserfs). Also noted that we are missing sys-fs/e2fsprogs in R/DEP, for which I've revbumped. Closes: https://bugs.gentoo.org/832972 Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> .../files/reiserfsprogs-3.6.27-musl.patch | 281 +++++++++++++++++++++ ...27-r1.ebuild => reiserfsprogs-3.6.27-r2.ebuild} | 9 +- 2 files changed, 288 insertions(+), 2 deletions(-) diff --git a/sys-fs/reiserfsprogs/files/reiserfsprogs-3.6.27-musl.patch b/sys-fs/reiserfsprogs/files/reiserfsprogs-3.6.27-musl.patch new file mode 100644 index 000000000000..040914be4f49 --- /dev/null +++ b/sys-fs/reiserfsprogs/files/reiserfsprogs-3.6.27-musl.patch @@ -0,0 +1,281 @@ +https://github.com/void-linux/void-packages/tree/master/srcpkgs/reiserfsprogs/patches + +Define _GNU_SOURCE for the declaration of loff_t in fcntl.h +Add missing typedefs for __compar_fn_t and compare_fn_t for +non __GLIBC__ case. + +--- a/include/misc.h ++++ b/include/misc.h +@@ -35,6 +35,11 @@ + + #define INVAL_PTR (void *)-1 + ++#if !defined(__GLIBC__) ++typedef int (*__compar_fn_t) (const void*, const void*); ++typedef __compar_fn_t comparison_fn_t; ++#endif ++ + void check_memory_msg(void); + void die(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); + void *getmem(int size); +See https://www.openwall.com/lists/musl/2013/01/23/6 +--- a/include/reiserfs_lib.h ++++ b/include/reiserfs_lib.h +@@ -3,6 +3,10 @@ + * reiserfsprogs/README + */ + ++#if !defined(__GLIBC__) ++#define loff_t off_t ++#endif ++ + #ifndef REISERFSPROGS_LIB_H + #define REISERFSPROGS_LIB_H + +Add definitions for LONG_LONG_MIN and _MAX derived +from the values for int64_t. + +--- a/resize_reiserfs/resize_reiserfs.c ++++ b/resize_reiserfs/resize_reiserfs.c +@@ -15,6 +15,13 @@ + #include "resize.h" + #include <limits.h> + ++#if !defined(__GLIBC__) ++/* These are not defined in musl libc */ ++#include <stdint.h> ++#define LONG_LONG_MIN INT64_MIN ++#define LONG_LONG_MAX INT64_MAX ++#endif ++ + static int opt_banner = 0; + static int opt_skipj = 0; + int opt_force = 0; +--- a/reiserfscore/prints.c ++++ b/reiserfscore/prints.c +@@ -7,8 +7,11 @@ + + #include "includes.h" + #include <stdarg.h> ++#include <stdint.h> + #include <limits.h> ++#if defined(__GLIBC__) + #include <printf.h> ++#endif + #include <limits.h> + #include <time.h> + +@@ -16,6 +19,38 @@ + # include <uuid/uuid.h> + #endif + ++ ++char ftypelet (mode_t mode) ++{ ++ if (S_ISBLK (mode)) ++ return 'b'; ++ if (S_ISCHR (mode)) ++ return 'c'; ++ if (S_ISDIR (mode)) ++ return 'd'; ++ if (S_ISREG (mode)) ++ return '-'; ++ if (S_ISFIFO (mode)) ++ return 'p'; ++ if (S_ISLNK (mode)) ++ return 'l'; ++ if (S_ISSOCK (mode)) ++ return 's'; ++ return '?'; ++} ++ ++ ++static int rwx (FILE * stream, mode_t mode) ++{ ++ return fprintf (stream, "%c%c%c", ++ (mode & S_IRUSR) ? 'r' : '-', ++ (mode & S_IWUSR) ? 'w' : '-', ++ (mode & S_IXUSR) ? 'x' : '-'); ++} ++ ++#if defined(__GLIBC__) ++ ++ + #ifndef HAVE_REGISTER_PRINTF_SPECIFIER + #define register_printf_specifier(x, y, z) register_printf_function(x, y, z) + static int arginfo_ptr(const struct printf_info *info, size_t n, int *argtypes) +@@ -129,33 +164,6 @@ static int print_disk_child(FILE * stream, + FPRINTF; + } + +-char ftypelet(mode_t mode) +-{ +- if (S_ISBLK(mode)) +- return 'b'; +- if (S_ISCHR(mode)) +- return 'c'; +- if (S_ISDIR(mode)) +- return 'd'; +- if (S_ISREG(mode)) +- return '-'; +- if (S_ISFIFO(mode)) +- return 'p'; +- if (S_ISLNK(mode)) +- return 'l'; +- if (S_ISSOCK(mode)) +- return 's'; +- return '?'; +-} +- +-static int rwx(FILE * stream, mode_t mode) +-{ +- return fprintf(stream, "%c%c%c", +- (mode & S_IRUSR) ? 'r' : '-', +- (mode & S_IWUSR) ? 'w' : '-', +- (mode & S_IXUSR) ? 'x' : '-'); +-} +- + /* %M */ + static int print_sd_mode(FILE * stream, + const struct printf_info *info, +@@ -211,6 +219,140 @@ void reiserfs_warning(FILE * fp, const char *fmt, ...) + va_end(args); + } + ++#else /* defined(__GLIBC__) */ ++ ++typedef void* void_ptr; ++ ++void reiserfs_warning (FILE * fp, const char * fmt, ...) ++{ ++ char * buffer; ++ int len; ++ char format_buf[32]; ++ char* dst = format_buf; ++ char* end = &dst[30]; ++ const struct buffer_head * bh; ++ const struct item_head * ih; ++ const struct disk_child * dc; ++ const struct reiserfs_key * key; ++ uint16_t mode; ++#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) ++ const unsigned char *uuid; ++ char uuid_buf[37]; ++#endif ++ va_list args; ++ int esc = 0; ++ ++ va_start (args, fmt); ++ while (*fmt) { ++ int ch = *fmt++; ++ if (esc) { ++ switch (ch) { ++ case '%': ++ fputc(ch, fp); ++ esc = 0; ++ break; ++ case 'b': // block head ++ bh = (const struct buffer_head *) va_arg(args, void_ptr); ++ len = asprintf(&buffer, "level=%d, nr_items=%d, free_space=%d rdkey", ++ B_LEVEL (bh), B_NR_ITEMS (bh), B_FREE_SPACE (bh)); ++ *dst++ = 's'; ++ *dst = '\0'; ++ fprintf(fp, format_buf, buffer); ++ esc = 0; ++ break; ++ case 'K': // short key ++ key = (const struct reiserfs_key *) va_arg(args, void_ptr); ++ len = asprintf(&buffer, "[%u %u]", get_key_dirid (key), ++ get_key_objectid (key)); ++ *dst++ = 's'; ++ *dst = '\0'; ++ fprintf(fp, format_buf, buffer); ++ esc = 0; ++ break; ++ case 'k': // key ++ key = (const struct reiserfs_key *) va_arg(args, void_ptr); ++ len = asprintf(&buffer, "[%u %u 0x%Lx %s (%d)]", ++ get_key_dirid (key), get_key_objectid (key), ++ (unsigned long long)get_offset (key), key_of_what (key), get_type (key)); ++ *dst++ = 's'; ++ *dst = '\0'; ++ fprintf(fp, format_buf, buffer); ++ esc = 0; ++ break; ++ case 'H': // item head ++ ih = (const struct item_head *) va_arg(args, void_ptr); ++ len = asprintf(&buffer, "%u %u 0x%Lx %s (%d), " ++ "len %u, location %u entry count %u, fsck need %u, format %s", ++ get_key_dirid (&ih->ih_key), get_key_objectid (&ih->ih_key), ++ (unsigned long long)get_offset (&ih->ih_key), key_of_what (&ih->ih_key), ++ get_type (&ih->ih_key), get_ih_item_len (ih), get_ih_location (ih), ++ get_ih_entry_count (ih), get_ih_flags (ih), ++ get_ih_key_format (ih) == KEY_FORMAT_2 ? ++ "new" : ++ ((get_ih_key_format (ih) == KEY_FORMAT_1) ? "old" : "BAD")); ++ *dst++ = 's'; ++ *dst = '\0'; ++ fprintf(fp, format_buf, buffer); ++ esc = 0; ++ break; ++ case 'y': // disk child ++ dc = (const struct disk_child *) va_arg(args, void_ptr); ++ len = asprintf(&buffer, "[dc_number=%u, dc_size=%u]", get_dc_child_blocknr (dc), ++ get_dc_child_size (dc)); ++ *dst++ = 's'; ++ *dst = '\0'; ++ fprintf(fp, format_buf, buffer); ++ esc = 0; ++ break; ++ case 'M': // sd mode ++ mode = (mode_t) va_arg(args, void_ptr); ++ fputc(ftypelet (mode), fp); ++ rwx (fp, (mode & 0700) << 0); ++ rwx (fp, (mode & 0070) << 3); ++ rwx (fp, (mode & 0007) << 6); ++ esc = 0; ++ break; ++ case 'U': // UUID ++#if defined(HAVE_LIBUUID) && defined(HAVE_UUID_UUID_H) ++ uuid = (const unsigned char *) va_arg(args, void_ptr); ++ uuid_buf[36] = '\0'; ++ uuid_unparse(uuid, uuid_buf); ++ fprintf(fp, "%s", uuid_buf); ++#else ++ fprintf(fp, "<no libuuid installed>"); ++#endif ++ esc = 0; ++ break; ++ case '-': case '+': case '#': case '.': ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': case '8': case '9': ++ case 'l': case 'L': case 'h': ++ // non-terminal format modifiers ++ if (dst < end) ++ *dst++ = ch; ++ break; ++ default: ++ *dst++ = ch; ++ *dst = '\0'; ++ fprintf(fp, format_buf, va_arg(args, void_ptr)); ++ esc = 0; ++ break; ++ } ++ } else if (ch == '%') { ++ esc = 1; ++ dst = format_buf; ++ end = &dst[30]; // leave room for final "s\0" ++ *dst++ = ch; ++ } else { ++ fputc(ch, fp); ++ } ++ } ++ ++ va_end (args); ++} ++ ++#endif /* !defined(__GLIBC__) */ ++ + static void print_directory_item(FILE *fp, reiserfs_filsys_t fs, + struct buffer_head *bh, struct item_head *ih) + { diff --git a/sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r1.ebuild b/sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r2.ebuild similarity index 87% rename from sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r1.ebuild rename to sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r2.ebuild index 2f01d6ddd991..348bbc07da96 100644 --- a/sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r1.ebuild +++ b/sys-fs/reiserfsprogs/reiserfsprogs-3.6.27-r2.ebuild @@ -18,10 +18,14 @@ IUSE="static-libs" PATCHES=( "${FILESDIR}/${PN}-3.6.25-no_acl.patch" "${FILESDIR}/${PN}-3.6.27-loff_t.patch" + "${FILESDIR}/${PN}-3.6.27-musl.patch" ) -# Needed for libuuid -RDEPEND="sys-apps/util-linux" +RDEPEND=" + sys-apps/util-linux + sys-fs/e2fsprogs + elibc_musl? ( sys-libs/obstack-standalone ) +" DEPEND="${RDEPEND}" src_prepare() { @@ -31,6 +35,7 @@ src_prepare() { src_configure() { append-flags -std=gnu89 #427300 + use elibc_musl && append-ldflags -lobstack local myeconfargs=( --bindir="${EPREFIX}/bin"
