+
+/* NOTE: Cross recursion between start_header and write_extended */
+
+static union block *
+write_extended (union block *old_header, char type)
+{
+ union block *header, hp;
+ struct tar_stat_info foo;
+ size_t size;
+ size_t bufsize;
+ char *p;
+
+ if (extended_header.buffer || extended_header.stk == NULL)
+ return old_header; /* Prevent recursion */
+
+ xheader_finish (&extended_header);
+ size = extended_header.size;
+ memset (&foo, 0, sizeof foo);
+ foo.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
+ time (&foo.stat.st_ctime);
+ foo.stat.st_atime = foo.stat.st_ctime;
+ foo.stat.st_mtime = foo.stat.st_ctime;
+ foo.stat.st_size = size;
+
+ memcpy (hp.buffer, old_header, sizeof (hp));
+
+ header = start_header ("././@PaxHeader", &foo);
+ header->header.typeflag = type;
+
+ finish_header (header, -1);
+
+ p = extended_header.buffer;
+
+ do
+ {
+ size_t len;
+
+ header = find_next_block ();
+ len = BLOCKSIZE;
+ if (len > size)
+ len = size;
+ memcpy (header->buffer, p, len);
+ if (len < BLOCKSIZE)
+ memset (header->buffer + len, 0, BLOCKSIZE - len);
+ p += len;
+ size -= len;
+ set_next_block_after (header);
+ }
+ while (size > 0);
+
+ xheader_destroy (&extended_header);
+ header = find_next_block ();
+ memcpy (header, &hp.buffer, sizeof (hp.buffer));
+ return header;
+}
+