Date: Tue, 27 Feb 2001 04:05:34 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: "Kenneth D. Merry" <ken@kdm.org> Cc: arch@FreeBSD.ORG Subject: Re: sbufs in userland Message-ID: <Pine.BSF.4.21.0102270336450.19382-100000@besplex.bde.org> In-Reply-To: <20010226003319.A19994@panzer.kdm.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 26 Feb 2001, Kenneth D. Merry wrote:
> ...
> I would like to use the sbuf(9) interface to do the string formatting,
> since it is fairly superior to my current string formatting method (see
> scsi_sense_string() in sys/cam/scsi/scsi_all.c).
> ...
> Code without sbufs:
>
> switch (error_code) {
> case SSD_DEFERRED_ERROR:
> retlen = snprintf(tmpstr, tmpstrlen, "Deferred Error: ");
>
> if ((tmplen = str_len - cur_len - 1) < 0)
> goto sst_bailout;
>
> strncat(str, tmpstr, tmplen);
> cur_len += retlen;
> str[str_len - 1] = '\0';
> /* FALLTHROUGH */
This seems to be insufficiently large to be correct :-). It doesn't check
for snprintf failing (retlen == -1) or truncating (retlen >= tmpstrlen).
>
> Code with sbufs:
>
> switch (error_code) {
> case SSD_DEFERRED_ERROR:
> sbuf_printf(sb, "Deferred Error: ");
>
> /* FALLTHROUGH */
Code with an funopen(3)'d stream:
switch (error_code) {
case SSD_DEFERRED_ERROR:
fprintf(fp, "Deferred Error: ");
/* FALLTHROUGH */
:-).
funopen() is more general than sbufs, so it is not quite as easy to use,
but I think it is easy enough.
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0102270336450.19382-100000>
