Index: trunk/i386/libsa/libsa.h =================================================================== --- trunk/i386/libsa/libsa.h (revision 2614) +++ trunk/i386/libsa/libsa.h (revision 2615) @@ -102,6 +102,7 @@ extern int atoi(const char * str); extern int ptol(const char * str); extern size_t strlen(const char * str); +extern size_t strlcat(char *, const char *, size_t); extern char *strcat(char * s1, const char * s2); extern char *strncat(char * s1, const char * s2, size_t n); extern char *strdup(const char *s1); Index: trunk/i386/libsa/string.c =================================================================== --- trunk/i386/libsa/string.c (revision 2614) +++ trunk/i386/libsa/string.c (revision 2615) @@ -243,7 +243,48 @@ } return sum; } +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +size_t strlcat(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + { + d++; + } + + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + { + return(dlen + strlen(s)); + } + + while (*s != '\0') + { + if (n != 1) + { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} + char *strncat(char *s1, const char *s2, size_t n) { register char *ret = s1;