+#define OBUFSZ 1048576
+static int overlay_merge(char *buf,off_t off,size_t size) {
+ static char obuf[ OBUFSZ ];
+#if DEBUG
+ fprintf( stderr, "merge %ld %ld\n", off, size );
+#endif
+ while ( size > 0 ) {
+ size_t n = size < OBUFSZ? size : OBUFSZ;
+ off_t ox = lseek( overlay.fd, off, SEEK_SET );
+#if DEBUG
+ fprintf( stderr, " seek %ld %ld %ld\n", off, ox, n );
+#endif
+ if ( ox < 0 ) {
+ perror( overlay.filename );
+ return -ENOENT;
+ }
+ if ( ox < off ) {
+ break;
+ }
+ n = read( overlay.fd, obuf, n );
+#if DEBUG
+ fprintf( stderr, " got %ld\n", n );
+#endif
+ if ( n < 0 ) {
+ perror( overlay.filename );
+ return -ENOENT;
+ }
+ if ( n == 0 ) {
+ break;
+ }
+ char *p = obuf;
+ while ( n-- > 0 ) {
+ if ( *p ) {
+ *buf = *p;
+ }
+ p++;
+ buf++;
+ size--;
+ off++;
+ }
+ }
+#if DEBUG
+ fprintf( stderr, "merged\n" );
+#endif
+ return 0;
+}
+