+ free(file_header->link_target);
+ free(file_header->name);
+ file_header->link_target = NULL;
+ file_header->name = NULL;
+
+ return EXIT_SUCCESS;
+
+ create_hardlinks:
+ free(file_header->link_target);
+ free(file_header->name);
+
+ while (saved_hardlinks) {
+ hardlinks_t *cur;
+ hardlinks_t *make_me = saved_hardlinks;
+ saved_hardlinks = make_me->next;
+
+ memset(file_header, 0, sizeof(*file_header));
+ file_header->name = make_me->name;
+ file_header->mode = make_me->mode;
+ /*file_header->size = 0;*/
+
+ /* Try to find a file we are hardlinked to */
+ cur = saved_hardlinks_created;
+ while (cur) {
+ /* TODO: must match maj/min too! */
+ if (cur->inode == make_me->inode) {
+ file_header->link_target = cur->name;
+ /* link_target != NULL, size = 0: "I am a hardlink" */
+ if (archive_handle->filter(archive_handle) == EXIT_SUCCESS)
+ archive_handle->action_data(archive_handle);
+ free(make_me);
+ goto next_link;
+ }
+ }
+ /* Oops... no file with such inode was created... do it now
+ * (happens when hardlinked files are empty (zero length)) */
+ file_header->mtime = make_me->mtime;
+ file_header->uid = make_me->uid ;
+ file_header->gid = make_me->gid ;
+ if (archive_handle->filter(archive_handle) == EXIT_SUCCESS)
+ archive_handle->action_data(archive_handle);
+ /* Move to the list of created hardlinked files */
+ make_me->next = saved_hardlinks_created;
+ saved_hardlinks_created = make_me;
+ next_link: ;
+ }
+
+ while (saved_hardlinks_created) {
+ hardlinks_t *p = saved_hardlinks_created;
+ saved_hardlinks_created = p->next;
+ free(p);
+ }
+
+ return EXIT_FAILURE; /* "No more files to process" */
+}