]> Sergey Matveev's repositories - nnn.git/commitdiff
One shot guid cache (#988)
authorluukvbaal <31730729+luukvbaal@users.noreply.github.com>
Fri, 7 May 2021 17:30:59 +0000 (19:30 +0200)
committerArun Prakash Jana <engineerarun@gmail.com>
Fri, 7 May 2021 17:36:24 +0000 (23:06 +0530)
src/nnn.c

index d501e212ee6a699c1098a19bac59d5b4c10c0a69..524db9660349e52d3897f1af1a29d4d2fcde1bfe 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -1014,6 +1014,41 @@ static char *xextension(const char *fname, size_t len)
        return xmemrchr((uchar_t *)fname, '.', len);
 }
 
+#ifndef NOUG
+/* One-shot cache for getpwuid/getgrgid. Returns the cached name if the
+ * provided uid is the same as the previous uid. Returns xitoa(guid) if
+ * the guid is not found in the password database. */
+static char *getpwname(uid_t uid)
+{
+       static uint_t uidcache = UINT_MAX;
+       static char *namecache = NULL;
+
+       if (uidcache != uid) {
+               struct passwd *pw = getpwuid(uid);
+
+               uidcache = uid;
+               namecache = pw ? pw->pw_name : NULL;
+       }
+
+       return namecache ? namecache : xitoa(uid);
+}
+
+static char *getgrname(gid_t gid)
+{
+       static uint_t gidcache = UINT_MAX;
+       static char *grpcache = NULL;
+
+       if (gidcache != gid) {
+               struct group *gr = getgrgid(gid);
+
+               gidcache = gid;
+               grpcache = gr ? gr->gr_name : NULL;
+       }
+
+       return grpcache ? grpcache : xitoa(gid);
+}
+#endif
+
 static inline bool getutil(char *util)
 {
        return spawn("which", util, NULL, F_NORMAL | F_NOTRACE) == 0;
@@ -5629,12 +5664,9 @@ static void statusbar(char *path)
                addch(' ');
 #ifndef NOUG
                if (g_state.uidgid) {
-                       struct passwd *pw = getpwuid(pent->uid);
-                       struct group  *gr = getgrgid(pent->gid);
-
-                       addstr(pw ? pw->pw_name : xitoa(pent->uid));
+                       addstr(getpwname(pent->uid));
                        addch(':');
-                       addstr(gr ? gr->gr_name : xitoa(pent->gid));
+                       addstr(getgrname(pent->gid));
                        addch(' ');
                }
 #endif