udfclient is suite of udf-related utils developed for NetBSD Available for debian-based distros and arch, but notably not for rpm-based distros according to https://repology.org/project/udfclient/versions
can you download orig. tarball and patch it with attached patch and try to './configure / make' it on Linux box with normal {for us} gnu make? And run resulted udfclient from build dir? ./udfclient file.img (-W for writing) Also, can you try to compile my hack on newfs_udf from NetBSD current? just make in source tree.. might fail due to no configure at all. this is slightly different newfs_udf command, creates udf up to maximum revision 2.60 (with some limitations). My hack most likely will not work directly on optical drive - but it worked for me on small image file. Can you test it on large file too? both hacks already on my github (but I am not sure I uploaded files correctly via their webinterface)
Only in /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/: .o Only in /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/: Makefile diff -r -U 8 -x configure UDFclient.0.8.11/Makefile.in /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/Makefile.in --- UDFclient.0.8.11/Makefile.in 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/Makefile.in 2021-11-28 22:49:23.231029365 +0300 @@ -48,17 +48,20 @@ APPS= udfdump udfclient newfs_udf cd_sessions SCSI_APPS= cd_disect mmc_format LIB= osta.o udf.o udf_bmap.o udf_allocentries.o udf_discop.o uio.o LIB+= udf_verbose.o udf_readwrite.o udf_unix.o vfs_dirhash.o USCSILIB= uscsi_sense.o uscsi_subr.o CFLAGS+= -DNEEDS_ISPRINT $(CPPFLAGS) -all: @BUILD_APPS@ +all: touch @BUILD_APPS@ + +touch: + touch .o install: @BUILD_APPS@ $(INSTALL) -d $(DESTDIR)/$(bindir) for app in @BUILD_APPS@; do \ echo "$(INSTALL) $$app $(DESTDIR)/$(bindir)/$$app"; \ $(INSTALL) $$app $(DESTDIR)/$(bindir)/$$app; \ done @@ -73,16 +76,16 @@ rm -f Makefile libuscsi.a: $(USCSILIB) ar -rsc libuscsi.a $(USCSILIB) libudf.a: $(LIB) ar -rsc libudf.a $(LIB) -$(SCSI_APPS): $(.TARGET).o libuscsi.a - $(LD) -o $(.TARGET) $(LDFLAGS) $(.TARGET).o libuscsi.a $(POSTOBJ) +$(SCSI_APPS): $@.o libuscsi.a + $(LD) -o $@ $(LDFLAGS) $@.c libuscsi.a $(POSTOBJ) -$(APPS): $(.TARGET).o libuscsi.a libudf.a - $(LD) -o $(.TARGET) $(LDFLAGS) $(.TARGET).o libudf.a libuscsi.a $(POSTOBJ) +$(APPS): $@.o libuscsi.a libudf.a + $(LD) -o $@ $(CPPFLAGS) $(LDFLAGS) $@.c libudf.a libuscsi.a $(POSTOBJ) # DO NOT DELETE diff -r -U 8 -x configure UDFclient.0.8.11/dirhash.h /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/dirhash.h --- UDFclient.0.8.11/dirhash.h 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/dirhash.h 2021-11-28 22:09:39.163029223 +0300 @@ -34,16 +34,18 @@ #ifndef DIRHASH_SIZE #define DIRHASH_SIZE (1024*1024) #endif #define DIRHASH_HASHBITS 5 #define DIRHASH_HASHSIZE (1 << DIRHASH_HASHBITS) #define DIRHASH_HASHMASK (DIRHASH_HASHSIZE - 1) + + #ifdef NO_DIRENT_NAMLEN # define DIRENT_NAMLEN(d) strlen((d)->d_name) #else # define DIRENT_NAMLEN(d) (d)->d_namlen #endif #ifndef _DIRENT_SIZE diff -r -U 8 -x configure UDFclient.0.8.11/newfs_udf.c /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/newfs_udf.c --- UDFclient.0.8.11/newfs_udf.c 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/newfs_udf.c 2021-11-28 22:30:22.231029297 +0300 @@ -441,19 +441,26 @@ root_node->udf_log_vol->num_directories++; udf_insert_node_in_hash(root_node); udf_node_mark_dirty(root_node); /* note creation times */ #ifndef NO_STAT_BIRTHTIME udf_set_timespec_now(&root_node->stat.st_birthtimespec); #endif +#ifdef HAVE_STRUCT_STAT_ST_ATIM + udf_set_timespec_now(&root_node->stat.st_atim); + udf_set_timespec_now(&root_node->stat.st_ctim); + udf_set_timespec_now(&root_node->stat.st_mtim); +#endif +#ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC udf_set_timespec_now(&root_node->stat.st_atimespec); udf_set_timespec_now(&root_node->stat.st_ctimespec); udf_set_timespec_now(&root_node->stat.st_mtimespec); +#endif dscr_entry = TAILQ_FIRST(&root_node->dscr_allocs); fileset->rootdir_icb.loc.lb_num = udf_rw32(dscr_entry->lb_num); fileset->rootdir_icb.loc.part_num = udf_rw16(dscr_entry->vpart_num); fileset->rootdir_icb.len = udf_rw32(lb_size); /* FIXME type 4096? */ /* set all to writable or we're in trouble here */ udf_log_vol->logvol_state = UDF_INTEGRITY_OPEN; diff -r -U 8 -x configure UDFclient.0.8.11/udf.c /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udf.c --- UDFclient.0.8.11/udf.c 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udf.c 2021-11-28 22:09:39.171029223 +0300 @@ -3448,17 +3448,17 @@ /* can be passed either a file_entry or an extfil_entry trough fentry! */ int udf_check_for_vat(struct udf_log_vol *udf_log_vol, struct udf_part_mapping *part_mapping, uint32_t vat_lb, union dscrptr *dscr) { struct udf_part_mapping *s_part_mapping; struct udf_node *vat_udf_node; struct long_ad udf_icbptr; struct regid *regid; struct uio vat_uio; - struct iovec vat_iovec; + struct myiovec vat_iovec; struct icb_tag *icbtag; struct timestamp *mtime; uint64_t vat_length, vat_entries; uint32_t *vat_pos, vpart_num; uint8_t *vat; int error, found; /* prepare a `uio' structure for reading in complete VAT file */ @@ -5424,17 +5424,17 @@ *phas_fids = has_fids; } /* read one fid and process it into a dirent and advance to the next */ /* (*fid) has to be allocated a logical block in size, (*dirent) struct dirent length */ int udf_read_fid_stream(struct udf_node *dir_node, uint64_t *offset, struct fileid_desc *fid, struct dirent *dirent) { struct uio dir_uio; - struct iovec dir_iovec; + struct myiovec dir_iovec; char *fid_name; uint32_t entry_length, lb_size; int enough, error; assert(fid); assert(dirent); assert(dir_node); assert(offset); @@ -5787,17 +5787,17 @@ free(fid); return 0; } static int udf_writeout_fid_info(struct udf_node *dir_node, struct fileid_desc *fid, uint64_t offset, uint16_t fid_len) { struct uio uio; - struct iovec iovec; + struct myiovec iovec; int flags; bzero(&uio, sizeof(struct uio)); uio.uio_rw = UIO_READ; /* read from this space */ uio.uio_iovcnt = 1; uio.uio_iov = &iovec; iovec.iov_base = fid; iovec.iov_len = fid_len; diff -r -U 8 -x configure UDFclient.0.8.11/udf_verbose.c /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udf_verbose.c --- UDFclient.0.8.11/udf_verbose.c 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udf_verbose.c 2021-11-28 22:09:39.171029223 +0300 @@ -1325,17 +1325,17 @@ * extern defined read_logvol_descriptor breaks splitting rules but how * otherwise to provide a detailed description of the file entry udf_node */ #define DUMP_DIRBUFFER_SIZE (16*1024) void udf_dump_file_entry_node(struct udf_node *udf_node, char *prefix) { struct long_ad udf_icbptr; struct uio dir_uio; - struct iovec dir_iovec; + struct myiovec dir_iovec; struct dirent *dirent; struct fileid_desc *fid; struct udf_node *entry_node; uint32_t pos, lb_size; uint8_t *buffer; char fullpath[1024]; /* XXX arbitrary length XXX */ int isdot, isdotdot, isdir, found, eof; int error; diff -r -U 8 -x configure UDFclient.0.8.11/udfclient.c /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udfclient.c --- UDFclient.0.8.11/udfclient.c 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/udfclient.c 2021-11-28 22:38:04.123029325 +0300 @@ -38,16 +38,17 @@ #include <limits.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <errno.h> #include "udf.h" #include "udf_bswap.h" + /* switches */ /* #define DEBUG(a) (a) */ #define DEBUG(a) if (0) { a; } #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) @@ -320,17 +321,17 @@ } #define LS_SUBTREE_DIR_BUFFER_SIZE (16*1024) void udfclient_ls(int args, char *arg1) { struct udf_node *udf_node, *entry_node; uint8_t *buffer; struct uio dir_uio; - struct iovec dir_uiovec; + struct myiovec dir_uiovec; struct dirent *dirent; struct stat stat; uint32_t pos; int eof; char *node_name, *leaf_name; int error; if (args > 1) { @@ -564,17 +565,17 @@ gettimeofday(&tp, NULL); return 1000000*tp.tv_sec + tp.tv_usec; } int udfclient_get_file(struct udf_node *udf_node, char *fullsrcname, char *fulldstname) { struct uio file_uio; - struct iovec file_iov; + struct myiovec file_iov; struct stat stat; struct timeval times[2]; uint64_t file_length; uint64_t start, now, then, eta; uint64_t cur_speed, avg_speed, data_transfered; uint64_t file_block_size, file_transfer_size, written; uint8_t *file_block; char cur_txt[32], avg_txt[32], eta_txt[32]; @@ -597,19 +598,25 @@ return 0; error = mkdir(fulldstname, (udf_node->stat.st_mode) & 07777); if (!error) { /* set owner attribute and times; access permissions allready set on creation.*/ notok = chown(fulldstname, stat.st_uid, stat.st_gid); if (notok && (udf_verbose > UDF_VERBLEV_ACTIONS)) fprintf(stderr, "failed to set owner of directory, ignoring\n"); - +#ifdef HAVE_STRUCT_STAT_ST_ATIM + TIMESPEC_TO_TIMEVAL(×[0], &stat.st_atim); /* access time */ + TIMESPEC_TO_TIMEVAL(×[1], &stat.st_mtim); /* modification time */ +#endif +#ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC TIMESPEC_TO_TIMEVAL(×[0], &stat.st_atimespec); /* access time */ TIMESPEC_TO_TIMEVAL(×[1], &stat.st_mtimespec); /* modification time */ +#endif + notok = utimes(fulldstname, times); if (notok) fprintf(stderr, "failed to set times on directory, ignoring\n"); } if (error) fprintf(stderr, "While creating directory `%s' : %s\n", fulldstname, strerror(errno)); return 0; @@ -684,36 +691,41 @@ } while ((uint64_t) file_uio.uio_offset < file_length); printf(" finished\n"); free(file_block); /* set owner attribute and times; access permissions allready set on creation.*/ notok = fchown(fileh, stat.st_uid, stat.st_gid); if (notok && (udf_verbose > UDF_VERBLEV_ACTIONS)) fprintf(stderr, "failed to set owner of file, ignoring\n"); - +#ifdef HAVE_STRUCT_STAT_ST_ATIM + TIMESPEC_TO_TIMEVAL(×[0], &stat.st_atim); /* access time */ + TIMESPEC_TO_TIMEVAL(×[1], &stat.st_mtim); /* modification time */ +#endif +#ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC TIMESPEC_TO_TIMEVAL(×[0], &stat.st_atimespec); /* access time */ TIMESPEC_TO_TIMEVAL(×[1], &stat.st_mtimespec); /* modification time */ +#endif notok = futimes(fileh, times); if (notok) fprintf(stderr, "failed to set times on directory, ignoring\n"); close(fileh); } else { printf("Help! can't open file %s for output\n", fulldstname); } return error; } #define GET_SUBTREE_DIR_BUFFER_SIZE (16*1024) void udfclient_get_subtree(struct udf_node *udf_node, char *srcprefix, char *dstprefix, int recurse, uint64_t *total_size) { struct uio dir_uio; - struct iovec dir_iovec; + struct myiovec dir_iovec; uint8_t *buffer; uint32_t pos; char fullsrcpath[1024], fulldstpath[1024]; /* XXX arbitrary length XXX */ struct dirent *dirent; struct stat stat; struct udf_node *entry_node; struct fileid_desc *fid; struct long_ad udf_icbptr; @@ -895,17 +907,17 @@ if (node_name) free(node_name); } int udfclient_put_file(struct udf_node *udf_node, char *fullsrcname, char *fulldstname) { struct uio file_uio; - struct iovec file_iov; + struct myiovec file_iov; uint64_t file_length; uint64_t start, now, then, eta; uint64_t cur_speed, avg_speed, data_transfered; uint64_t file_block_size, file_transfer_size; uint8_t *file_block; char cur_txt[32], avg_txt[32], eta_txt[32]; int fileh; int error, printed; @@ -1216,17 +1228,17 @@ udf_sync_disc(udf_disc); } } #define RM_SUBTREE_DIR_BUFFER_SIZE (32*1024) int udfclient_rm_subtree(struct udf_node *parent_node, struct udf_node *dir_node, char *name, char *full_parent_name) { struct uio dir_uio; - struct iovec dir_iovec; + struct myiovec dir_iovec; uint8_t *buffer; uint32_t pos; char *fullpath; struct dirent *dirent; struct stat stat; struct udf_node *entry_node; struct fileid_desc *fid; struct long_ad udf_icbptr; diff -r -U 8 -x configure UDFclient.0.8.11/uio.c /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/uio.c --- UDFclient.0.8.11/uio.c 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/uio.c 2021-11-28 22:09:39.175029223 +0300 @@ -31,17 +31,17 @@ #include <assert.h> #include <string.h> #include "uio.h" /* modelled after NetBSD's uiomove */ int uiomove(void *buf, size_t amount, struct uio *uio) { - struct iovec *iov; + struct myiovec *iov; char *cp = buf; size_t cnt; assert(buf); assert(uio); assert(uio->uio_iov); while (amount > 0 && uio->uio_resid > 0) { diff -r -U 8 -x configure UDFclient.0.8.11/uio.h /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/uio.h --- UDFclient.0.8.11/uio.h 2020-04-18 13:05:40.000000000 +0300 +++ /data/data/com.termux/files/home/udfclient/UDFclient.0.8.11/uio.h 2021-11-28 22:09:39.179029223 +0300 @@ -38,35 +38,35 @@ /* define an uio structure for fragmenting reading in and writing data out */ /* modelled after BSD's kernel structures */ enum uio_rw { UIO_READ, UIO_WRITE }; -struct iovec { +struct myiovec { void *iov_base; /* base if this chunk */ size_t iov_len; /* length */ }; - /* this is consumed !! i.e. keep a copy */ struct uio { - struct iovec *uio_iov; /* pointer to array of iovecs */ + struct myiovec *uio_iov; /* pointer to array of iovecs */ int uio_iovcnt; /* number of iovecs in array */ off_t uio_offset; /* current offset */ size_t uio_resid; /* residual i/o count */ enum uio_rw uio_rw; /* read/write direction */ /* ... rest obmitted ... */ }; #endif /* _SYS_UIO_H_ */ + /* allways declare the functions */ /* move data from/to a uio structure to a blob */ extern int uiomove(void *buf, size_t amount, struct uio *uio); /* end of uio.h */
newfs_netbsd_hd_1.tar.gz
Description: application/gzip
-- Cin mailing list Cin@lists.cinelerra-gg.org https://lists.cinelerra-gg.org/mailman/listinfo/cin