Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hfsfuse for openSUSE:Factory checked in at 2026-04-18 21:35:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hfsfuse (Old) and /work/SRC/openSUSE:Factory/.hfsfuse.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hfsfuse" Sat Apr 18 21:35:31 2026 rev:7 rq:1347844 version:0.416 Changes: -------- --- /work/SRC/openSUSE:Factory/hfsfuse/hfsfuse.changes 2026-03-02 17:41:31.522325302 +0100 +++ /work/SRC/openSUSE:Factory/.hfsfuse.new.11940/hfsfuse.changes 2026-04-18 21:35:46.476095458 +0200 @@ -1,0 +2,16 @@ +Mon Apr 13 12:08:14 UTC 2026 - John Paul Adrian Glaubitz <[email protected]> + +- Update to 0.416 + * Fixes hfstar's error output on failure to open a volume. + Previously the archive name was printed here instead of + the path to the volume. + * On macOS: ensures the rpath for libfuse is set in the + hfsfuse binary if needed (e.g. for FUSE-T). +- from version 0.410 + * This release features a modest performance improvement + for most operations. + * Fixes a bug that could cause LZVN HFS+ compressed files + to be incorrectly reported as unsupported. +- Add missing changelog entry for 0.404 + +------------------------------------------------------------------- @@ -6,0 +23,5 @@ +- from version 0.404 + * Fixes building with statx support. + * -o allow_other is no longer on by default. See 2a0a8df for the + rationale for this change and more information. + * Help and version text is now printed to stdout rather than stderr. Old: ---- hfsfuse-0.406.tar.gz New: ---- hfsfuse-0.416.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hfsfuse.spec ++++++ --- /var/tmp/diff_new_pack.2AruyR/_old 2026-04-18 21:35:46.996116651 +0200 +++ /var/tmp/diff_new_pack.2AruyR/_new 2026-04-18 21:35:47.000116814 +0200 @@ -17,7 +17,7 @@ Name: hfsfuse -Version: 0.406 +Version: 0.416 Release: 0 Summary: FUSE driver for HFS+ filesystems License: BSD-1-Clause AND BSD-2-Clause AND BSD-3-Clause AND MIT ++++++ hfsfuse-0.406.tar.gz -> hfsfuse-0.416.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/Makefile new/hfsfuse-0.416/Makefile --- old/hfsfuse-0.406/Makefile 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/Makefile 2026-04-08 23:19:26.000000000 +0200 @@ -267,6 +267,10 @@ hfsfuse: LDLIBS += $(FUSE_LIB) hfsfuse: src/hfsfuse.o $(LIBS) + $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) +ifeq ($(OS), Darwin) + if ! otool -l hfsfuse | grep -q LC_RPATH; then install_name_tool -add_rpath /usr/local/lib hfsfuse; fi +endif hfsdump: src/hfsdump.o $(LIBS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/README.md new/hfsfuse-0.416/README.md --- old/hfsfuse-0.406/README.md 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/README.md 2026-04-08 23:19:26.000000000 +0200 @@ -4,7 +4,7 @@ hfsfuse also includes two standalone tools, hfsdump and hfstar, which can be used without FUSE. -This driver and tools are read-only and cannot write to or alter the target filesystem. +The driver and tools are read-only and cannot write to or alter the target filesystem. **Supported** @@ -40,7 +40,7 @@ * [utf8proc](http://julialang.org/utf8proc/) for working with non-ASCII pathnames * [ublio](https://www.freshports.org/devel/libublio/) for read caching, which may improve performance -* [zlib](https://www.zlib.net), [lzfse](https://github.com/0x09/lzfse), and [lzvn](https://github.com/xerub/LZVN) for reading files with HFS+ compression +* [zlib](https://www.zlib.net), [lzfse](https://github.com/0x09/lzfse), and [lzvn](https://github.com/0x09/LZVN) for reading files with HFS+ compression utf8proc, ublio, and LZVN are each bundled with hfsfuse and built by default. hfsfuse can be configured to use already-installed versions of these if available, or may be built without them entirely if the respective functionality is not needed (see [Configuring](#Configuring)). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/lib/libhfs/libhfs.c new/hfsfuse-0.416/lib/libhfs/libhfs.c --- old/hfsfuse-0.406/lib/libhfs/libhfs.c 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/lib/libhfs/libhfs.c 2026-04-08 23:19:26.000000000 +0200 @@ -1790,6 +1790,9 @@ * out_record_ptr_sizes_array may be NULL if the caller is not interested in * reading the records, but must not be NULL if out_record_ptrs_array is not. * + * if specified, the elements of out_record_ptrs_array point to memory in + * in_bytes and should not be used beyond the lifetime of in_bytes. + * * in_parent_file is HFS_CATALOG_FILE, HFS_EXTENTS_FILE, or * HFS_ATTRIBUTES_FILE, depending on the special file in which this node * resides. @@ -1971,12 +1974,6 @@ for (i = 0; i < numrecords; i++) { - (*out_record_ptrs_array)[i] = - hfslib_malloc((*out_record_ptr_sizes_array)[i], cbargs); - - if ((*out_record_ptrs_array)[i] == NULL) - HFS_LIBERR("could not allocate node record #%i",i); - /* * If this is a keyed node (i.e., a leaf or index node), there are two * boundary rules that each record must obey: @@ -2024,8 +2021,7 @@ HFS_LIBERR("record offset outside of node bounds %" PRIu16, (*out_record_ptr_sizes_array)[i]); - memcpy((*out_record_ptrs_array)[i], ptr, - (*out_record_ptr_sizes_array)[i]); + (*out_record_ptrs_array)[i] = ptr; ptr = (uint8_t*)ptr + (*out_record_ptr_sizes_array)[i]; } @@ -2513,18 +2509,10 @@ uint16_t* inout_num_recs, hfs_callback_args* cbargs) { - uint16_t i; - if (inout_num_recs == NULL || *inout_num_recs == 0) return; if (inout_node_recs != NULL && *inout_node_recs != NULL) { - for (i = 0 ; i < *inout_num_recs; i++) { - if ((*inout_node_recs)[i] != NULL) { - hfslib_free((*inout_node_recs)[i], cbargs); - (*inout_node_recs)[i] = NULL; - } - } hfslib_free(*inout_node_recs, cbargs); *inout_node_recs = NULL; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/lib/libhfsuser/decmpfs.c new/hfsfuse-0.416/lib/libhfsuser/decmpfs.c --- old/hfsfuse-0.406/lib/libhfsuser/decmpfs.c 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/lib/libhfsuser/decmpfs.c 2026-04-08 23:19:26.000000000 +0200 @@ -53,6 +53,10 @@ case DECMPFS_COMPRESSION_SPARSE: return decmpfs_storage_inline(type); case DECMPFS_COMPRESSION_LZVN: +#if HAVE_LZVN + return true; +#endif + return false; case DECMPFS_COMPRESSION_LZFSE: #if HAVE_LZFSE return true; @@ -382,7 +386,7 @@ if(hfslib_find_attribute_record_with_key(vol,&attrkey,&attr,(void*)&buf,NULL)) return 1; - // if this is a zlib or lzfse compressed file and hfsfuse wasn't built with these libraries, continue to treat it as a zero-length file + // if this is a zlib, lzvn, or lzfse compressed file and hfsfuse wasn't built with these libraries, continue to treat it as a zero-length file // the com.apple.decmpfs xattr may still be inspected directly to access the compressed data if(attr.type != HFS_ATTR_INLINE_DATA || !hfs_decmpfs_parse_record(h,attr.inline_record.length,buf)) { free(buf); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/src/hfsfuse.c new/hfsfuse-0.416/src/hfsfuse.c --- old/hfsfuse-0.406/src/hfsfuse.c 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/src/hfsfuse.c 2026-04-08 23:19:26.000000000 +0200 @@ -250,7 +250,7 @@ } #endif -struct hf_dir { +struct hfsfuse_dir { hfs_catalog_keyed_record_t dir_record; hfs_cnid_t parent_cnid; hfs_catalog_keyed_record_t* records; @@ -261,7 +261,7 @@ pthread_rwlock_t lock; }; -int hf_dir_close(struct hf_dir* d) { +int hfsfuse_dir_close(struct hfsfuse_dir* d) { int ret = pthread_rwlock_wrlock(&d->lock); if(ret) return -ret; @@ -277,7 +277,7 @@ static int hfsfuse_opendir(const char* path, struct fuse_file_info* info) { hfs_volume* vol = fuse_get_context()->private_data; - struct hf_dir* d = malloc(sizeof(*d)); + struct hfsfuse_dir* d = malloc(sizeof(*d)); if(!d) return -ENOMEM; @@ -312,27 +312,17 @@ ret = -1; goto end; } - hfs_catalog_keyed_record_t link; - for(hfs_catalog_keyed_record_t* record = d->records; record != d->records + d->nentries; record++) - if(record->type == HFS_REC_FILE && ( - (record->file.user_info.file_creator == HFS_HFSPLUS_CREATOR && - record->file.user_info.file_type == HFS_HARD_LINK_FILE_TYPE && - !hfslib_get_hardlink(vol, record->file.bsd.special.inode_num, &link, NULL)) || - (record->file.user_info.file_creator == HFS_MACS_CREATOR && - record->file.user_info.file_type == HFS_DIR_HARD_LINK_FILE_TYPE && - !hfslib_get_directory_hardlink(vol, record->file.bsd.special.inode_num, &link, NULL)))) - *record = link; info->fh = (uint64_t)d; end: if(ret) - hf_dir_close(d); + hfsfuse_dir_close(d); return ret; } static int hfsfuse_releasedir(const char* path, struct fuse_file_info* info) { - return hf_dir_close((struct hf_dir*)info->fh); + return hfsfuse_dir_close((struct hfsfuse_dir*)info->fh); } #if FUSE_VERSION >= 30 @@ -341,7 +331,7 @@ static int hfsfuse_readdir(const char* path, void* buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info* info) { #endif hfs_volume* vol = fuse_get_context()->private_data; - struct hf_dir* d = (struct hf_dir*)info->fh; + struct hfsfuse_dir* d = (struct hfsfuse_dir*)info->fh; int ret = -pthread_rwlock_tryrdlock(&d->lock); if(ret) return ret; @@ -394,13 +384,30 @@ ret = len; continue; } - hfs_cache_path(vol,fullpath,d->pathlen+len,d->records+i); + + hfs_catalog_keyed_record_t* record = d->records + i; + + hfs_catalog_keyed_record_t link; + if(record->type == HFS_REC_FILE) { + if(record->file.user_info.file_creator == HFS_HFSPLUS_CREATOR && + record->file.user_info.file_type == HFS_HARD_LINK_FILE_TYPE) { + if(!hfslib_get_hardlink(vol, record->file.bsd.special.inode_num, &link, NULL)) + record = &link; + } + else if(record->file.user_info.file_creator == HFS_MACS_CREATOR && + record->file.user_info.file_type == HFS_DIR_HARD_LINK_FILE_TYPE) { + if(!hfslib_get_directory_hardlink(vol, record->file.bsd.special.inode_num, &link, NULL)) + record = &link; + } + } + + hfs_cache_path(vol,fullpath,d->pathlen+len,record); struct stat st = {0}; - hfs_stat(vol,d->records+i,&st,0); + hfs_stat(vol,record,&st,0); int ret; #if FUSE_DARWIN_ENABLE_EXTENSIONS - ret = filler(buf,pelem,&stat_to_fuse_darwin_attr(d->records[i],st),i+3,FUSE_FILL_DIR_PLUS); + ret = filler(buf,pelem,&stat_to_fuse_darwin_attr(*record,st),i+3,FUSE_FILL_DIR_PLUS); #elif FUSE_VERSION >= 30 ret = filler(buf,pelem,&st,i+3,FUSE_FILL_DIR_PLUS); #else @@ -937,7 +944,7 @@ char* opts = NULL; fuse_opt_add_opt(&opts, "ro"); - // passthrough allow_other to fuse; otherwise our opt parser consumed it + // passthrough allow_other to fuse; otherwise our opt parser consumed it if (cfg.allow_other_set) fuse_opt_add_opt(&opts, "allow_other"); #if FUSE_VERSION < 30 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/src/hfstar.c new/hfsfuse-0.416/src/hfstar.c --- old/hfsfuse-0.406/src/hfstar.c 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/src/hfstar.c 2026-04-08 23:19:26.000000000 +0200 @@ -703,7 +703,7 @@ cfg.cache_size = 0; if((ctx.hfs_err = hfs_open_volume(argv[0],ctx.vol,&cfg))) { - log_hfs_err(&ctx,"Couldn't open volume '%s'",argv[1]); + log_hfs_err(&ctx,"Couldn't open volume '%s'",argv[0]); goto end; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hfsfuse-0.406/src/version.h new/hfsfuse-0.416/src/version.h --- old/hfsfuse-0.406/src/version.h 2026-02-21 22:10:21.000000000 +0100 +++ new/hfsfuse-0.416/src/version.h 2026-04-08 23:19:26.000000000 +0200 @@ -1 +1 @@ -#define HFSFUSE_VERSION_STRING "0.406-06deec6" +#define HFSFUSE_VERSION_STRING "0.416-26649ec"
