- lte = __lookup_resource(w->lookup_table, dentry_hash(dentry));
-
- /* If we already extracted the same file or a hard link copy of it, we
- * may be able to simply create a link. The exact action is specified
- * by the current @link_type. */
- if ((extract_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK | WIMLIB_EXTRACT_FLAG_HARDLINK)) &&
- lte && lte->out_refcnt != 0)
- {
- wimlib_assert(lte->file_on_disk);
-
- if (extract_flags & WIMLIB_EXTRACT_FLAG_HARDLINK) {
- if (link(lte->file_on_disk, output_path) != 0) {
- ERROR_WITH_ERRNO("Failed to hard link "
- "`%s' to `%s'",
- output_path, lte->file_on_disk);
- return WIMLIB_ERR_LINK;
- }
- } else {
- int num_path_components;
- int num_output_dir_path_components;
- size_t file_on_disk_len;
- char *p;
- const char *p2;
- size_t i;
-
- num_path_components =
- get_num_path_components(dentry->full_path_utf8) - 1;
- num_output_dir_path_components =
- get_num_path_components(w->output_dir);
-
- if (w->is_multi_image_extraction) {
- num_path_components++;
- num_output_dir_path_components--;
- }
- file_on_disk_len = strlen(lte->file_on_disk);
-
- char buf[file_on_disk_len + 3 * num_path_components + 1];
- p = &buf[0];
-
- for (i = 0; i < num_path_components; i++) {
- *p++ = '.';
- *p++ = '.';
- *p++ = '/';
- }
- p2 = lte->file_on_disk;
- while (*p2 == '/')
- p2++;
- while (num_output_dir_path_components--)
- p2 = path_next_part(p2, NULL);
- strcpy(p, p2);
- if (symlink(buf, output_path) != 0) {
- ERROR_WITH_ERRNO("Failed to symlink `%s' to "
- "`%s'",
- buf, lte->file_on_disk);
- return WIMLIB_ERR_LINK;
- }