Use OpenBSD strlcpy() - smdev - suckless mdev
 (HTM) git clone git://git.suckless.org/smdev
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b1b09f7896b6d2f3fca3cc0c74a85d9e2f246bfa
 (DIR) parent b221ca33fd0deb80fadcdf9bd06392f9e2480553
 (HTM) Author: sin <sin@2f30.org>
       Date:   Sat,  2 Aug 2014 13:51:52 +0100
       
       Use OpenBSD strlcpy()
       
       I don't remember where the previous implementation comes from and
       therefore I can't provide appropriate credit.
       
       Diffstat:
         M util/strlcpy.c                      |      49 +++++++++++++++++++++++++------
       
       1 file changed, 40 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/util/strlcpy.c b/util/strlcpy.c
       @@ -1,16 +1,47 @@
       -#include <stdio.h>
       +/*
       + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
       + *
       + * Permission to use, copy, modify, and distribute this software for any
       + * purpose with or without fee is hereby granted, provided that the above
       + * copyright notice and this permission notice appear in all copies.
       + *
       + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
       + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
       + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
       + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
       + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
       + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
       + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
       + */
       +
       +#include <sys/types.h>
        #include <string.h>
        #include "../util.h"
        
       +/*
       + * Copy src to string dst of size siz. At most siz-1 characters
       + * will be copied. Always NUL terminates (unless siz == 0).
       + * Returns strlen(src); if retval >= siz, truncation occurred.
       + */
        size_t
       -strlcpy(char *dest, const char *src, size_t size)
       +strlcpy(char *dst, const char *src, size_t siz)
        {
       -        size_t ret = strlen(src);
       -
       -        if (size) {
       -                size_t len = (ret >= size) ? size - 1 : ret;
       -                memcpy(dest, src, len);
       -                dest[len] = '\0';
       +        char *d = dst;
       +        const char *s = src;
       +        size_t n = siz;
       +        /* Copy as many bytes as will fit */
       +        if (n != 0) {
       +                while (--n != 0) {
       +                        if ((*d++ = *s++) == '\0')
       +                                break;
       +                }
       +        }
       +        /* Not enough room in dst, add NUL and traverse rest of src */
       +        if (n == 0) {
       +                if (siz != 0)
       +                        *d = '\0'; /* NUL-terminate dst */
       +                while (*s++)
       +                        ;
                }
       -        return ret;
       +        return(s - src - 1); /* count does not include NUL */
        }