diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2021-11-09 07:52:09 +0100 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2021-11-09 07:52:48 +0100 |
commit | 338d00d6054b7832cf4da83ca7a052258bf5aad4 (patch) | |
tree | 797f93064d7bbee5f4bf3e1859baf7e5c48492ab /sdn.cpp | |
parent | 015652e37948ceeda7921664d359448b2e8ea224 (diff) | |
download | sdn-338d00d6054b7832cf4da83ca7a052258bf5aad4.tar.gz sdn-338d00d6054b7832cf4da83ca7a052258bf5aad4.tar.xz sdn-338d00d6054b7832cf4da83ca7a052258bf5aad4.zip |
Do not crash on opendir() failures
Show an error message, and a way out.
Diffstat (limited to 'sdn.cpp')
-rw-r--r-- | sdn.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -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 |