.\" Copyright (c) 2000 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.\" Created, 14 Dec 2000 by Michael Kerrisk
.\"
.TH BASENAME 3  2015-08-08 "GNU" "Linux Programmer's Manual"
.SH NAME
basename, dirname \- parse pathname components
.SH SYNOPSIS
.nf
.B #include <libgen.h>
.sp
.BI "char *dirname(char *" path );

.BI "char *basename(char *" path );
.fi
.SH DESCRIPTION
Warning: there are two different functions
.BR basename ()
- see below.
.LP
The functions
.BR dirname ()
and
.BR basename ()
break a null-terminated pathname string into directory
and filename components.
In the usual case,
.BR dirname ()
returns the string up to, but not including, the final \(aq/\(aq, and
.BR basename ()
returns the component following the final \(aq/\(aq.
Trailing \(aq/\(aq characters are not counted as part of the pathname.
.PP
If
.I path
does not contain a slash,
.BR dirname ()
returns the string "." while
.BR basename ()
returns a copy of
.IR path .
If
.I path
is the string "/", then both
.BR dirname ()
and
.BR basename ()
return the string "/".
If
.I path
is a null pointer or points to an empty string, then both
.BR dirname ()
and
.BR basename ()
return the string ".".
.PP
Concatenating the string returned by
.BR dirname (),
a "/", and the string returned by
.BR basename ()
yields a complete pathname.
.PP
Both
.BR dirname ()
and
.BR basename ()
may modify the contents of
.IR path ,
so it may be desirable to pass a copy when calling one of
these functions.
.PP
These functions may return pointers to statically allocated memory
which may be overwritten by subsequent calls.
Alternatively, they may return a pointer to some part of
.IR path ,
so that the string referred to by
.I path
should not be modified or freed until the pointer returned by
the function is no longer required.
.PP
The following list of examples (taken from SUSv2)
shows the strings returned by
.BR dirname ()
and
.BR basename ()
for different paths:
.RS
.TS
lb lb lb
l l l l.
path    	dirname	basename
/usr/lib	/usr	lib
/usr/   	/	usr
usr     	.	usr
/       	/	/
\&.       	.	.
\&..      	.	..
.TE
.RE
.SH RETURN VALUE
Both
.BR dirname ()
and
.BR basename ()
return pointers to null-terminated strings.
(Do not pass these pointers to
.BR free (3).)
.SH ATTRIBUTES
For an explanation of the terms used in this section, see
.BR attributes (7).
.TS
allbox;
lbw21 lb lb
l l l.
Interface	Attribute	Value
T{
.BR basename (),
.BR dirname ()
T}	Thread safety	MT-Safe
.TE
.SH CONFORMING TO
POSIX.1-2001, POSIX.1-2008.
.SH NOTES
There are two different versions of
.BR basename ()
- the POSIX version described above, and the GNU version, which one gets
after
.br
.nf

.BR "    #define _GNU_SOURCE" "         /* See feature_test_macros(7) */"
.br
.B "    #include <string.h>"

.fi
The GNU version never modifies its argument, and returns the
empty string when
.I path
has a trailing slash, and in particular also when it is "/".
There is no GNU version of
.BR dirname ().
.LP
With glibc, one gets the POSIX version of
.BR basename ()
when
.I <libgen.h>
is included, and the GNU version otherwise.
.SH BUGS
In the glibc implementation of the POSIX versions of these functions
they modify their argument, and segfault when called with a static string
like "/usr/".
Before glibc 2.2.1, the glibc version of
.BR dirname ()
did not correctly handle pathnames with trailing \(aq/\(aq characters,
and generated a segfault if given a NULL argument.
.SH EXAMPLE
.in +4n
.nf
char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";

dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\\n", dname, bname);
.fi
.in
.SH SEE ALSO
.BR basename (1),
.BR dirname (1)
