tstrlcpy.c - scribo - Email-based phlog generator
 (HTM) git clone git://git.z3bra.org/scribo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tstrlcpy.c (1689B)
       ---
            1 /* NOTE: This code was adapted from openbsd-compat/strlcpy.c in OpenSSH */
            2 
            3 /*        $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $        */
            4 
            5 /*
            6  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
            7  *
            8  * Permission to use, copy, modify, and distribute this software for any
            9  * purpose with or without fee is hereby granted, provided that the above
           10  * copyright notice and this permission notice appear in all copies.
           11  *
           12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
           13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
           14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
           15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
           16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
           17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
           18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
           19  */
           20 
           21 /* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */
           22 
           23 #include <sys/types.h>
           24 #include <string.h>
           25 
           26 /*
           27  * Copy src to string dst of size siz.  At most siz-1 characters
           28  * will be copied.  Always NUL terminates (unless siz == 0).
           29  * Returns strlen(src); if retval >= siz, truncation occurred.
           30  */
           31 size_t
           32 strlcpy(char *dst, const char *src, size_t siz)
           33 {
           34         char *d = dst;
           35         const char *s = src;
           36         size_t n = siz;
           37 
           38         /* Copy as many bytes as will fit */
           39         if (n != 0) {
           40                 while (--n != 0) {
           41                         if ((*d++ = *s++) == '\0')
           42                                 break;
           43                 }
           44         }
           45 
           46         /* Not enough room in dst, add NUL and traverse rest of src */
           47         if (n == 0) {
           48                 if (siz != 0)
           49                         *d = '\0';                /* NUL-terminate dst */
           50                 while (*s++)
           51                         ;
           52         }
           53 
           54         return(s - src - 1);        /* count does not include NUL */
           55 }
           56