おれstrncpyなんか使った事無いよ。
仕様確認すんの面倒だから長さの判定が必要ならmemcpy使うし。
結局strlcpy と strlcatもstrnと同じ問題抱えてる。

strcat使う局面でバッファ管理するぐらいなら↓を使う。


s = strdup("hage");
s = strdupcat(s, "hage");
s = strdupcat(s, "hage");
s = strdupcat(s, "hage");

#define strdupcat2(s,cat1,cat2) strdupcat(strdupcat((s),(cat1)),(cat2))
#define strdupcat3(s,cat1,cat2,cat3) strdupcat(strdupcat2(s,cat1,cat2),(cat3))
#define strdupcat4(s,cat1,cat2,cat3,cat4) strdupcat(strdupcat3(s,cat1,cat2,cat3),(cat4))

strdupcat(s,cat) {
int catlen = strlen(cat);
if (s) {
int slen = strlen(s);
s = xrealloc(s, slen + catlen + 1);
memcpy(s + slen, cat, catlen);
*(char *)(s + slen + catlen) = 0;
} else {
s = xcalloc(1,catlen+1);
memcpy(s, cat, catlen);
*(char *)(s + catlen) = 0;
}
return s;
}