/* Tests for some interesting cases in non-standard strlcpy(). */
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main(void)
{
size_t copied;
char *src = malloc(100);
if (src == NULL) {
fprintf(stderr, "Memory allocation failure.\n");
return 1;
}
strcpy(src, "Hey, dude!");
char *dst = malloc(10);
if (dst == NULL) {
fprintf(stderr, "Memory allocation failure.\n");
return 1;
}
/* This is ok. */
copied = strlcpy(dst, src, 10);
if (copied != 10)
fprintf(stderr, "Expected 10 but got %zu for test #1.\n", copied);
/* Here dst is not large enough. */
copied = strlcpy(dst, src, strlen(src) + 1);
if (copied != 10)
fprintf(stderr, "Expected 10 but got %zu for test #2.\n", copied);
/* This is just a fancy way how to write strlen(src).
Undocumented but heavily used. */
copied = strlcpy(NULL, src, 0);
if (copied != 10)
fprintf(stderr, "Expected 10 but got %zu for test #3.\n", copied);
/* Source and destination overlap. */
strlcpy(src + 9, src, strlen(src) + 1);
/* Return value is not checked because function behaviour
is undefined in such case (and valgrind's differs). */
return 0;
}