Compare commits

...

2 Commits

Author SHA1 Message Date
Přemysl Eric Janouch 338d00d605
Do not crash on opendir() failures
Show an error message, and a way out.
2021-11-09 07:52:48 +01:00
Přemysl Eric Janouch 015652e379
Fix build with recent ncurses
Easily gained, easily lost.  No more ^S binding.
2021-11-09 07:45:20 +01:00
1 changed files with 19 additions and 5 deletions

24
sdn.cpp
View File

@ -841,6 +841,11 @@ fun resort (const string anchor = at_cursor ().filename) {
focus (anchor);
}
fun show_message (const string &message, int ttl = 30) {
g.message = to_wide (message);
g.message_ttl = ttl;
}
fun reload (bool keep_anchor) {
g.unames.clear ();
while (auto *ent = getpwent ())
@ -859,6 +864,16 @@ fun reload (bool keep_anchor) {
auto now = time (NULL); g.now = *localtime (&now);
auto dir = opendir (".");
g.entries.clear ();
if (!dir) {
show_message (strerror (errno));
if (g.cwd != "/") {
struct dirent f = {};
strncpy(f.d_name, "..", sizeof f.d_name);
f.d_type = DT_DIR;
g.entries.push_back (make_entry (&f));
}
goto readfail;
}
while (auto f = readdir (dir)) {
string name = f->d_name;
// Two dots are for navigation but this ain't as useful
@ -869,6 +884,7 @@ fun reload (bool keep_anchor) {
}
closedir (dir);
readfail:
g.out_of_date = false;
for (int col = 0; col < entry::COLUMNS; col++) {
auto &longest = g.max_widths[col] = 0;
@ -889,11 +905,6 @@ fun reload (bool keep_anchor) {
(IN_ALL_EVENTS | IN_ONLYDIR | IN_EXCL_UNLINK) & ~(IN_ACCESS | IN_OPEN));
}
fun show_message (const string &message, int ttl = 30) {
g.message = to_wide (message);
g.message_ttl = ttl;
}
fun run_program (initializer_list<const char *> list, const string &filename) {
if (g.ext_helpers) {
// XXX: this doesn't try them all out, though it shouldn't make any
@ -1841,9 +1852,12 @@ int main (int argc, char *argv[]) {
pop_levels (g.cwd);
update ();
// Cunt, now I need to reïmplement all signal handling
#if NCURSES_VERSION_PATCH < 20210821
// This gets applied along with the following halfdelay()
cur_term->Nttyb.c_cc[VSTOP] =
cur_term->Nttyb.c_cc[VSTART] = _POSIX_VDISABLE;
#endif
// Invoking keypad() earlier would make ncurses flush its output buffer,
// which would worsen start-up flickering