diff options
author | Karel Zak | 2015-11-27 13:56:01 +0100 |
---|---|---|
committer | Karel Zak | 2015-11-27 13:56:01 +0100 |
commit | 04a5cb58b62598b86173a03af8e900d58f2bfed1 (patch) | |
tree | 1b4f897a4a174b7fc5ed52666ca16c3392899a33 /misc-utils/namei.c | |
parent | lsns: new command (diff) | |
download | kernel-qcow2-util-linux-04a5cb58b62598b86173a03af8e900d58f2bfed1.tar.gz kernel-qcow2-util-linux-04a5cb58b62598b86173a03af8e900d58f2bfed1.tar.xz kernel-qcow2-util-linux-04a5cb58b62598b86173a03af8e900d58f2bfed1.zip |
namei: move icache to lib/
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/namei.c')
-rw-r--r-- | misc-utils/namei.c | 111 |
1 files changed, 13 insertions, 98 deletions
diff --git a/misc-utils/namei.c b/misc-utils/namei.c index 15bec9960..41557cac3 100644 --- a/misc-utils/namei.c +++ b/misc-utils/namei.c @@ -38,6 +38,7 @@ #include "widechar.h" #include "strutils.h" #include "closestream.h" +#include "idcache.h" #ifndef MAXSYMLINKS #define MAXSYMLINKS 256 @@ -65,103 +66,10 @@ struct namei { int noent; /* is this item not existing */ }; -struct idcache { - unsigned long int id; - char *name; - struct idcache *next; -}; - static int flags; -static int uwidth; /* maximal width of username */ -static int gwidth; /* maximal width of groupname */ static struct idcache *gcache; /* groupnames */ static struct idcache *ucache; /* usernames */ -static struct idcache * -get_id(struct idcache *ic, unsigned long int id) -{ - while(ic) { - if (ic->id == id) - return ic; - ic = ic->next; - } - return NULL; -} - -static void -free_idcache(struct idcache *ic) -{ - while(ic) { - struct idcache *next = ic->next; - free(ic->name); - free(ic); - ic = next; - } -} - -static void -add_id(struct idcache **ic, char *name, unsigned long int id, int *width) -{ - struct idcache *nc, *x; - int w = 0; - - nc = xcalloc(1, sizeof(*nc)); - nc->id = id; - - if (name) { -#ifdef HAVE_WIDECHAR - wchar_t wc[LOGIN_NAME_MAX + 1]; - - if (mbstowcs(wc, name, LOGIN_NAME_MAX) > 0) { - wc[LOGIN_NAME_MAX] = '\0'; - w = wcswidth(wc, LOGIN_NAME_MAX); - } - else -#endif - w = strlen(name); - } - /* note, we ignore names with non-printable widechars */ - if (w > 0) - nc->name = xstrdup(name); - else - xasprintf(&nc->name, "%lu", id); - - for (x = *ic; x && x->next; x = x->next); - - /* add 'nc' at end of the 'ic' list */ - if (x) - x->next = nc; - else - *ic = nc; - if (w <= 0) - w = nc->name ? strlen(nc->name) : 0; - - *width = *width < w ? w : *width; - return; -} - -static void -add_uid(unsigned long int id) -{ - struct idcache *ic = get_id(ucache, id); - - if (!ic) { - struct passwd *pw = getpwuid((uid_t) id); - add_id(&ucache, pw ? pw->pw_name : NULL, id, &uwidth); - } -} - -static void -add_gid(unsigned long int id) -{ - struct idcache *ic = get_id(gcache, id); - - if (!ic) { - struct group *gr = getgrgid((gid_t) id); - add_id(&gcache, gr ? gr->gr_name : NULL, id, &gwidth); - } -} - static void free_namei(struct namei *nm) { @@ -254,8 +162,8 @@ new_namei(struct namei *parent, const char *path, const char *fname, int lev) if (S_ISLNK(nm->st.st_mode)) readlink_to_namei(nm, path); if (flags & NAMEI_OWNERS) { - add_uid(nm->st.st_uid); - add_gid(nm->st.st_gid); + add_uid(ucache, nm->st.st_uid); + add_gid(gcache, nm->st.st_gid); } if ((flags & NAMEI_MNTS) && S_ISDIR(nm->st.st_mode)) { @@ -371,7 +279,7 @@ print_namei(struct namei *nm, char *path) if (flags & NAMEI_MODES) blanks += 9; if (flags & NAMEI_OWNERS) - blanks += uwidth + gwidth + 2; + blanks += ucache->width + gcache->width + 2; if (!(flags & NAMEI_VERTICAL)) blanks += 1; blanks += nm->level * 2; @@ -397,9 +305,9 @@ print_namei(struct namei *nm, char *path) printf("%c", md[0]); if (flags & NAMEI_OWNERS) { - printf(" %-*s", uwidth, + printf(" %-*s", ucache->width, get_id(ucache, nm->st.st_uid)->name); - printf(" %-*s", gwidth, + printf(" %-*s", gcache->width, get_id(gcache, nm->st.st_gid)->name); } @@ -505,6 +413,13 @@ main(int argc, char **argv) usage(EXIT_FAILURE); } + ucache = new_idcache(); + if (!ucache) + err(EXIT_FAILURE, _("failed to allocate UID cache")); + gcache = new_idcache(); + if (!gcache) + err(EXIT_FAILURE, _("failed to allocate GID cache")); + for(; optind < argc; optind++) { char *path = argv[optind]; struct namei *nm = NULL; |