return resolved_path;
}
+/* finds abspath of link pointed by filepath, taking cwd into account */
+static char *bmtarget(const char *filepath, char *cwd, char *buf)
+{
+ char target[PATH_MAX + 1];
+ ssize_t n = readlink(filepath, target, PATH_MAX);
+ if (n != -1) {
+ target[n] = '\0';
+ return abspath(target, cwd, buf);
+ }
+ return NULL;
+}
+
/* wraps the argument in single quotes so it can be safely fed to shell */
static bool shell_escape(char *output, size_t outlen, const char *s)
{
"cT Set time type%110 Lock\n"
"b^L Redraw%18? Help, conf\n"
};
+ char help_buf[1<<11]; // if editing helpstr, ensure this has enough space to decode it
int fd = create_tmp_file();
if (fd == -1)
get_output(prog, NULL, NULL, fd, FALSE);
bool hex = true;
- char *w = g_buf;
+ char *w = help_buf;
const char *end = helpstr + (sizeof helpstr - 1);
for (const char *s = helpstr; s < end; ++s) {
if (hex) {
}
hex = *s == '\n';
}
- if (write(fd, g_buf, w - g_buf)) {} // silence warning
+ ssize_t res = write(fd, help_buf, w - help_buf);
+ (void)res; // silence warning
dprintf(fd, "\nLOCATIONS\n");
for (uchar_t i = 0; i < CTX_MAX; ++i)
pent = &pdents[cur];
if (!g_state.selbm || !(S_ISLNK(pent->mode) &&
- realpath(pent->name, newpath) &&
+ bmtarget(pent->name, path, newpath) &&
xstrsncpy(path, lastdir, PATH_MAX)))
mkpath(path, pent->name, newpath);
g_state.selbm = 0;