Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Apr 2008 01:26:40 +0200
From:      Mel <fbsd.questions@rachie.is-a-geek.net>
To:        freebsd-questions@freebsd.org
Cc:        Giorgos Keramidas <keramida@ceid.upatras.gr>, stevefranks@ieee.org
Subject:   Re: [?OT?] strndup exists in FreeBSD?
Message-ID:  <200804150126.40980.fbsd.questions@rachie.is-a-geek.net>
In-Reply-To: <877if0qbnz.fsf@kobe.laptop>
References:  <539c60b90804141543h29b3c2f4y8c38694821d67d95@mail.gmail.com> <877if0qbnz.fsf@kobe.laptop>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 15 April 2008 01:06:24 Giorgos Keramidas wrote:
> On Mon, 14 Apr 2008 15:43:24 -0700, "Steve Franks" <stevefranks@ieee.org> 
wrote:
> > I'm getting an undefined reference to strndup, so clearly there's a
> > header somewhere with it - doesn't seem to be in my default libc,
> > however on 7.0-amd64?
>
> I don't see an strndup() function in our libc.
>
> keramida@kobe:/usr/src/lib/libc/string$ grep ^strdup *.c
> strdup.c:strdup(str)
> keramida@kobe:/usr/src/lib/libc/string$ grep ^strndup *.c
> keramida@kobe:/usr/src/lib/libc/string$
>
> While it seems like a cool function name, what's the point of having it?
> If you know how much you want to copy, it's trivial to allocate a buffer
> large enough and strlcpy() into it.  If you don't know how much you want
> to copy, then strdup() is ok anyway :)

It can be convenient for trickery:
char file[MAXPATHLEN];
char *dir;
...
dir = strndup(file, (strrchr(file, '/')-file)));

Or space optimization:
char *p, *path;
path = malloc(MAXPATHLEN);
(void)strlcpy(path, argv[i], MAXPATHLEN);
p = strndup(path, strlen(path));
free(path);

But, personally I prefer taking the long route or wasting a few bytes over 
dual allocations.


-- 
Mel

Problem with today's modular software: they start with the modules
    and never get to the software part.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804150126.40980.fbsd.questions>