Messages in this thread | | | Date | Wed, 3 Oct 2012 14:39:21 -0400 | From | Nick Bowler <> | Subject | Re: [PATCH 1/7] string: introduce helper to get base file name from given path |
| |
On 2012-10-02 11:12 -0700, Greg KH wrote: > On Tue, Oct 02, 2012 at 08:52:05PM +0300, Andy Shevchenko wrote: > > On Tue, Oct 2, 2012 at 8:34 PM, Greg KH <gregkh@linuxfoundation.org> wrote: > > > On Tue, Oct 02, 2012 at 06:00:54PM +0300, Andy Shevchenko wrote: [...] > > >> +/** > > >> + * kbasename - return the last part of a pathname. > > >> + * > > >> + * @path: path to extract the filename from. > > >> + */ > > >> +static inline const char *kbasename(const char *path) > > >> +{ > > >> + const char *tail = strrchr(path, '/'); > > >> + return tail ? tail + 1 : path; > > > > > > What happens if '/' is the last thing in the string? You will then > > > point to an empty string, which I don't think all callers of this > > > function is assuming going to work properly (hint, the USB caller will > > > not...) > > Thanks for pointing to that. I think it's a usb specific case, so, I > > assume your comment related to that patch. > > Well, if you want your kbasename() function to work like the basename(3) > function, you need to properly handle a trailing '/' character.
Specifically, POSIX basename trims trailing '/' characters, so
char foo[] = "a/string/with/trailing/slashes///"; basename(foo);
results in a string that compares equal to "slashes". This implies that it must either modify the provided string or copy it somewhere else (POSIX admits either behaviour).
On the other hand, GNU basename does not trim trailing '/' characters and returns the empty string in this case. It's truly unfortunate that glibc contains two different functions called basename, but regardless, the behaviour of the function in this proposal is certainly not unprecedented.
Cheers, -- Nick Bowler, Elliptic Technologies (http://www.elliptictech.com/)
| |