diff options
| author | Přemysl Janouch <p@janouch.name> | 2018-10-24 08:47:02 +0200 | 
|---|---|---|
| committer | Přemysl Janouch <p@janouch.name> | 2018-10-24 10:23:26 +0200 | 
| commit | 45f79abf9c4833c37c8178b8e7fa983cd458eee5 (patch) | |
| tree | 53fa1acadd99a83cbaca3b00e6c92ddefaaf8766 | |
| parent | 1b74b1976afc3e48a0017c59251024e58b860b56 (diff) | |
| download | sdn-45f79abf9c4833c37c8178b8e7fa983cd458eee5.tar.gz sdn-45f79abf9c4833c37c8178b8e7fa983cd458eee5.tar.xz sdn-45f79abf9c4833c37c8178b8e7fa983cd458eee5.zip | |
Load users, groups and current time once per refresh
Avoids plenty of costly syscalls per loaded entry.
| -rw-r--r-- | sdn.cpp | 36 | 
1 files changed, 24 insertions, 12 deletions
| @@ -319,6 +319,12 @@ static struct {  	map<int, chtype> ls_colors;         ///< LS_COLORS decoded  	map<string, chtype> ls_exts;        ///< LS_COLORS file extensions + +	// Refreshed by reload(): + +	map<uid_t, string> unames;          ///< User names by UID +	map<gid_t, string> gnames;          ///< Group names by GID +	struct tm now;                      ///< Current local time for display  } g;  fun ls_format (const string &filename, const struct stat &info) -> chtype { @@ -384,15 +390,15 @@ fun make_row (const string &filename, const struct stat &info) -> row {  		mode += L"+";  	r.cols[row::MODES] = apply_attrs (mode, 0); -	auto user = to_wstring (info.st_uid); -	if (auto u = getpwuid (info.st_uid)) -		user = to_wide (u->pw_name); -	r.cols[row::USER] = apply_attrs (user, 0); +	auto usr = g.unames.find (info.st_uid); +	r.cols[row::USER] = (usr != g.unames.end ()) +		? apply_attrs (to_wide (usr->second), 0) +		: apply_attrs (to_wstring (info.st_uid), 0); -	auto group = to_wstring (info.st_gid); -	if (auto g = getgrgid (info.st_gid)) -		group = to_wide (g->gr_name); -	r.cols[row::GROUP] = apply_attrs (group, 0); +	auto grp = g.gnames.find (info.st_gid); +	r.cols[row::GROUP] = (grp != g.unames.end ()) +		? apply_attrs (to_wide (grp->second), 0) +		: apply_attrs (to_wstring (info.st_gid), 0);  	auto size = to_wstring (info.st_size);  	if      (info.st_size >> 40) size = to_wstring (info.st_size >> 40) + L"T"; @@ -401,13 +407,10 @@ fun make_row (const string &filename, const struct stat &info) -> row {  	else if (info.st_size >> 10) size = to_wstring (info.st_size >> 10) + L"K";  	r.cols[row::SIZE] = apply_attrs (size, 0); -	auto now = time (NULL); -	auto now_year = localtime (&now)->tm_year; -  	char buf[32] = "";  	auto tm = localtime (&info.st_mtime);  	strftime (buf, sizeof buf, -		(tm->tm_year == now_year) ? "%b %e %H:%M" : "%b %e  %Y", tm); +		(tm->tm_year == g.now.tm_year) ? "%b %e %H:%M" : "%b %e  %Y", tm);  	r.cols[row::MTIME] = apply_attrs (to_wide (buf), 0);  	// TODO: show symlink target: check st_mode/DT_*, readlink @@ -463,6 +466,15 @@ fun update () {  }  fun reload () { +	g.unames.clear(); +	while (auto *ent = getpwent ()) g.unames.emplace(ent->pw_uid, ent->pw_name); +	endpwent(); + +	g.gnames.clear(); +	while (auto *ent = getgrent ()) g.gnames.emplace(ent->gr_gid, ent->gr_name); +	endgrent(); + +	auto now = time (NULL); g.now = *localtime (&now);  	char buf[4096]; g.cwd = getcwd (buf, sizeof buf);  	auto dir = opendir ("."); | 
