- /* There is a finished file to link with! */
- if (!(prev_file->flags & FLAG_HLINK_FIRST)) {
- /* The previous previous will be marked with FIRST. */
- prev_ndx = F_HL_PREV(prev_file);
- prev_file = FPTR(prev_ndx);
- /* Update our previous pointer to point to the first. */
- F_HL_PREV(file) = prev_ndx;
- }
- alt_dest = F_HL_PREV(prev_file); /* alternate value when DONE && FIRST */
- if (alt_dest >= 0 && dry_run) {
- pathjoin(prev_name, MAXPATHLEN, basis_dir[alt_dest],
- f_name(prev_file, NULL));
- f_name(prev_file, altbuf);
- realname = altbuf;
- } else {
- f_name(prev_file, prev_name);
- realname = prev_name;
+ prev_file = flist->files[prev_ndx - flist->ndx_start];
+
+ /* Is the previous link not complete yet? */
+ if (!(prev_file->flags & FLAG_HLINK_DONE)) {
+ /* Is the previous link being transferred? */
+ if (prev_file->flags & FLAG_FILE_SENT) {
+ /* Add ourselves to the list of files that will
+ * be updated when the transfer completes, and
+ * mark ourself as waiting for the transfer. */
+ F_HL_PREV(file) = F_HL_PREV(prev_file);
+ F_HL_PREV(prev_file) = ndx;
+ file->flags |= FLAG_FILE_SENT;
+ cur_flist->in_progress++;
+ return 1;
+ }
+ return 0;
+ }
+
+ /* There is a finished file to link with! */
+ if (!(prev_file->flags & FLAG_HLINK_FIRST)) {
+ /* The previous previous is FIRST when prev is not. */
+ prev_name = realname = check_prior(prev_file, gnum, &prev_ndx, &flist);
+ assert(prev_name != NULL || flist != NULL);
+ /* Update our previous pointer to point to the FIRST. */
+ F_HL_PREV(file) = prev_ndx;
+ }
+
+ if (!prev_name) {
+ int alt_dest;
+
+ prev_file = flist->files[prev_ndx - flist->ndx_start];
+ /* F_HL_PREV() is alt_dest value when DONE && FIRST. */
+ alt_dest = F_HL_PREV(prev_file);
+
+ if (alt_dest >= 0 && dry_run) {
+ pathjoin(namebuf, MAXPATHLEN, basis_dir[alt_dest],
+ f_name(prev_file, NULL));
+ prev_name = namebuf;
+ realname = f_name(prev_file, altbuf);
+ } else {
+ prev_name = f_name(prev_file, namebuf);
+ realname = prev_name;
+ }
+ }