summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2012-04-18 14:49:22 +0200
committerJim Meyering <meyering@redhat.com>2012-04-19 13:10:36 +0200
commitbcb9078e380d81be62e8df00c45afc2f57392dc2 (patch)
tree2736fc34691d541f3a44706c26fa80c68318a66c
parent280aa28c4dc82f394d423bfceaac29b5b48c3cd2 (diff)
downloadcoreutils-bcb9078e380d81be62e8df00c45afc2f57392dc2.tar.xz
maint: ls: use stpncpy/stpcpy, not strncpy/strcpy
* src/ls.c (gobble_file): Move a decl "down". (make_link_name): Do not hard-code '/'. Use IS_ABSOLUTE_FILE_NAME and dir_len instead. Use stpcpy/stpncpy in place of strncpy/strcpy.
-rw-r--r--src/ls.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/src/ls.c b/src/ls.c
index db5819280..800f8138c 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -3037,11 +3037,10 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
if (S_ISLNK (f->stat.st_mode)
&& (format == long_format || check_symlink_color))
{
- char *linkname;
struct stat linkstats;
get_link_name (absolute_name, f, command_line_arg);
- linkname = make_link_name (absolute_name, f->linkname);
+ char *linkname = make_link_name (absolute_name, f->linkname);
/* Avoid following symbolic links when possible, ie, when
they won't be traced and when no indicator is needed. */
@@ -3204,19 +3203,17 @@ make_link_name (char const *name, char const *linkname)
if (!linkname)
return NULL;
- if (*linkname == '/')
+ if (IS_ABSOLUTE_FILE_NAME (linkname))
return xstrdup (linkname);
/* The link is to a relative name. Prepend any leading directory
in 'name' to the link name. */
- char const *linkbuf = strrchr (name, '/');
- if (linkbuf == NULL)
+ size_t prefix_len = dir_len (name);
+ if (prefix_len == 0)
return xstrdup (linkname);
- size_t bufsiz = linkbuf - name + 1;
- char *p = xmalloc (bufsiz + strlen (linkname) + 1);
- strncpy (p, name, bufsiz);
- strcpy (p + bufsiz, linkname);
+ char *p = xmalloc (prefix_len + 1 + strlen (linkname) + 1);
+ stpcpy (stpncpy (p, name, prefix_len + 1), linkname);
return p;
}