}
}
- if (copybufpos)
- pcopybuf[copybufpos - 1] = '\n';
+ /* Enabling the following will miss files with newlines */
+ /* if (copybufpos)
+ pcopybuf[copybufpos - 1] = '\n'; */
copybufpos += xstrlcpy(pcopybuf + copybufpos, path, len);
return TRUE;
}
+/* Write selected file paths to fd, linefeed separated */
+static ssize_t selectiontofd(int fd)
+{
+ char *pbuf = pcopybuf;
+ ssize_t pos = 0, len, r, lastpos = copybufpos - 1;
+
+ while (pos < copybufpos) {
+ while(pcopybuf[pos])
+ ++pos;
+
+ len = strlen(pbuf);
+
+ r = write(fd, pbuf, len);
+ if (r != len)
+ return pos;
+
+ if (pos != lastpos) {
+ if (write(fd, "\n", 1) != 1)
+ return pos;
+ pbuf = pbuf + len + 1;
+ }
+ ++pos;
+ }
+
+ return pos;
+}
+
static bool showcplist()
{
- ssize_t len;
+ int fd;
+ ssize_t pos;
if (!copybufpos)
return FALSE;
return -1;
}
- int fd = mkstemp(g_tmpfpath);
+ fd = mkstemp(g_tmpfpath);
if (fd == -1)
return FALSE;
- len = write(fd, pcopybuf, copybufpos - 1);
- close(fd);
+ pos = selectiontofd(fd);
+ close(fd);
exitcurses();
- if (len == copybufpos - 1)
+ if (pos && pos == copybufpos)
get_output(NULL, 0, "cat", g_tmpfpath, NULL, 1);
unlink(g_tmpfpath);
refresh();
}
if (sel == SEL_CP)
- snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -d \'\n\' -a %s cp -ir --preserve=all -t .", g_cppath);
+ snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -a %s cp -ir --preserve=all -t .", g_cppath);
else if (sel == SEL_MV)
- snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -d \'\n\' -a %s mv -i -t .", g_cppath);
+ snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -a %s mv -i -t .", g_cppath);
else /* SEL_RMMUL */
- snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -d \'\n\' -a %s rm -Ir", g_cppath);
+ snprintf(g_buf, MAX_CMD_LEN, "xargs -0 -a %s rm -Ir", g_cppath);
spawn("sh", "-c", g_buf, path, F_NORMAL | F_SIGINT);
if (cfg.pickraw) {
if (copybufpos) {
- opt = write(1, pcopybuf, copybufpos - 1);
- if (opt != (int)(copybufpos - 1))
+ opt = selectiontofd(1);
+ if (opt != (int)(copybufpos))
fprintf(stderr, "%s\n", strerror(errno));
}
} else if (!cfg.picker && g_cppath[0])