|
@ -1,4 +1,4 @@ |
|
|
.\" $OpenBSD: strncat.3,v 1.2 2013/12/19 22:00:58 jmc Exp $ |
|
|
|
|
|
|
|
|
.\" $OpenBSD: strncat.3,v 1.3 2014/04/19 11:30:40 deraadt Exp $ |
|
|
.\" |
|
|
.\" |
|
|
.\" Copyright (c) 1990, 1991 The Regents of the University of California. |
|
|
.\" Copyright (c) 1990, 1991 The Regents of the University of California. |
|
|
.\" All rights reserved. |
|
|
.\" All rights reserved. |
|
@ -31,7 +31,7 @@ |
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
|
.\" SUCH DAMAGE. |
|
|
.\" SUCH DAMAGE. |
|
|
.\" |
|
|
.\" |
|
|
.Dd $Mdocdate: December 19 2013 $ |
|
|
|
|
|
|
|
|
.Dd $Mdocdate: April 19 2014 $ |
|
|
.Dt STRNCAT 3 |
|
|
.Dt STRNCAT 3 |
|
|
.Os |
|
|
.Os |
|
|
.Sh NAME |
|
|
.Sh NAME |
|
@ -40,86 +40,91 @@ |
|
|
.Sh SYNOPSIS |
|
|
.Sh SYNOPSIS |
|
|
.In string.h |
|
|
.In string.h |
|
|
.Ft char * |
|
|
.Ft char * |
|
|
.Fn strncat "char *s" "const char *append" "size_t count" |
|
|
|
|
|
|
|
|
.Fn strncat "char *dst" "const char *append" "size_t count" |
|
|
.Sh DESCRIPTION |
|
|
.Sh DESCRIPTION |
|
|
The |
|
|
The |
|
|
.Fn strncat |
|
|
.Fn strncat |
|
|
function appends not more than |
|
|
function appends not more than |
|
|
.Fa count |
|
|
.Fa count |
|
|
characters of the NUL-terminated string |
|
|
|
|
|
|
|
|
characters of the string |
|
|
.Fa append |
|
|
.Fa append |
|
|
to the end of the NUL-terminated string |
|
|
|
|
|
.Fa s . |
|
|
|
|
|
|
|
|
to the end of the string found in the buffer |
|
|
|
|
|
.Fa dst . |
|
|
Space for the terminating |
|
|
Space for the terminating |
|
|
.Ql \e0 |
|
|
.Ql \e0 |
|
|
should not be included in |
|
|
should not be included in |
|
|
.Fa count . |
|
|
.Fa count . |
|
|
The string |
|
|
|
|
|
.Fa s |
|
|
|
|
|
must have sufficient space to hold the result. |
|
|
|
|
|
|
|
|
.Pp |
|
|
|
|
|
Bounds checking must be performed manually with great care. |
|
|
|
|
|
If the buffer |
|
|
|
|
|
.Fa dst |
|
|
|
|
|
is not large enough to hold the result, |
|
|
|
|
|
subsequent memory will be damaged. |
|
|
.Sh RETURN VALUES |
|
|
.Sh RETURN VALUES |
|
|
The |
|
|
The |
|
|
.Fn strncat |
|
|
.Fn strncat |
|
|
function returns the pointer |
|
|
function returns the pointer |
|
|
.Fa s . |
|
|
|
|
|
|
|
|
.Fa dst . |
|
|
.Sh EXAMPLES |
|
|
.Sh EXAMPLES |
|
|
The following appends |
|
|
|
|
|
.Dq Li abc |
|
|
|
|
|
to |
|
|
|
|
|
.Va chararray : |
|
|
|
|
|
.Bd -literal -offset indent |
|
|
|
|
|
char *letters = "abcdefghi"; |
|
|
|
|
|
|
|
|
|
|
|
(void)strncat(chararray, letters, 3); |
|
|
|
|
|
.Ed |
|
|
|
|
|
.Pp |
|
|
|
|
|
The following example shows how to use |
|
|
The following example shows how to use |
|
|
.Fn strncat |
|
|
.Fn strncat |
|
|
safely in conjunction with |
|
|
|
|
|
.Xr strncpy 3 . |
|
|
|
|
|
|
|
|
in conjunction with |
|
|
|
|
|
.Xr strncpy 3 : |
|
|
.Bd -literal -offset indent |
|
|
.Bd -literal -offset indent |
|
|
char buf[BUFSIZ]; |
|
|
char buf[BUFSIZ]; |
|
|
char *input, *suffix; |
|
|
|
|
|
|
|
|
char *base, *suffix; |
|
|
|
|
|
|
|
|
(void)strncpy(buf, input, sizeof(buf) - 1); |
|
|
|
|
|
|
|
|
(void)strncpy(buf, base, sizeof(buf) - 1); |
|
|
buf[sizeof(buf) - 1] = '\e0'; |
|
|
buf[sizeof(buf) - 1] = '\e0'; |
|
|
(void)strncat(buf, suffix, sizeof(buf) - 1 - strlen(buf)); |
|
|
(void)strncat(buf, suffix, sizeof(buf) - 1 - strlen(buf)); |
|
|
.Ed |
|
|
.Ed |
|
|
.Pp |
|
|
.Pp |
|
|
The above will copy as many characters from |
|
|
The above will copy as many characters from |
|
|
.Va input |
|
|
|
|
|
|
|
|
.Va base |
|
|
to |
|
|
to |
|
|
.Va buf |
|
|
.Va buf |
|
|
as will fit. |
|
|
as will fit. |
|
|
It then appends as many characters from |
|
|
It then appends as many characters from |
|
|
.Va suffix |
|
|
.Va suffix |
|
|
as will fit (or none |
|
|
|
|
|
if there is no space). |
|
|
|
|
|
For operations like this, the |
|
|
|
|
|
|
|
|
as will fit. |
|
|
|
|
|
If either |
|
|
|
|
|
.Va base |
|
|
|
|
|
or |
|
|
|
|
|
.Va suffix |
|
|
|
|
|
are too large, truncation will occur without detection. |
|
|
|
|
|
.Pp |
|
|
|
|
|
The above example shows dangerous coding patterns, including an |
|
|
|
|
|
inability to detect truncation. |
|
|
|
|
|
.Fn strncat |
|
|
|
|
|
and |
|
|
|
|
|
.Fn strncpy |
|
|
|
|
|
are dangerously easy to misuse. |
|
|
|
|
|
The |
|
|
.Xr strlcpy 3 |
|
|
.Xr strlcpy 3 |
|
|
and |
|
|
and |
|
|
.Xr strlcat 3 |
|
|
.Xr strlcat 3 |
|
|
functions are a better choice, as shown below. |
|
|
|
|
|
|
|
|
functions are safer for this kind of operation: |
|
|
|
|
|
.Bd -literal -offset indent |
|
|
|
|
|
if (strlcpy(buf, base, sizeof(buf)) >= sizeof(buf) || |
|
|
|
|
|
strlcat(buf, suffix, sizeof(buf)) >= sizeof(buf)) |
|
|
|
|
|
goto toolong; |
|
|
|
|
|
|
|
|
|
|
|
.Ed |
|
|
|
|
|
or for greatest portability, |
|
|
.Bd -literal -offset indent |
|
|
.Bd -literal -offset indent |
|
|
(void)strlcpy(buf, input, sizeof(buf)); |
|
|
|
|
|
(void)strlcat(buf, suffix, sizeof(buf)); |
|
|
|
|
|
|
|
|
if (snprintf(buf, sizeof(buf), "%s%s", |
|
|
|
|
|
base, suffix) >= sizeof(buf)) |
|
|
|
|
|
goto toolong; |
|
|
.Ed |
|
|
.Ed |
|
|
|
|
|
|
|
|
.Sh SEE ALSO |
|
|
.Sh SEE ALSO |
|
|
.Xr bcopy 3 , |
|
|
|
|
|
.Xr memccpy 3 , |
|
|
|
|
|
.Xr memcpy 3 , |
|
|
|
|
|
.Xr memmove 3 , |
|
|
|
|
|
.Xr strcat 3 , |
|
|
|
|
|
.Xr strcpy 3 , |
|
|
|
|
|
.Xr strlcpy 3 , |
|
|
.Xr strlcpy 3 , |
|
|
.Xr wcscat 3 , |
|
|
.Xr wcscat 3 , |
|
|
.Xr wcslcpy 3 |
|
|
.Xr wcslcpy 3 |
|
|
.Sh STANDARDS |
|
|
.Sh STANDARDS |
|
|
The |
|
|
The |
|
|
.Fn strcat |
|
|
|
|
|
and |
|
|
|
|
|
.Fn strncat |
|
|
.Fn strncat |
|
|
functions conform to |
|
|
|
|
|
|
|
|
function conform to |
|
|
.St -ansiC . |
|
|
.St -ansiC . |
|
|
.Sh HISTORY |
|
|
.Sh HISTORY |
|
|
The |
|
|
The |
|
|