Import XPG4-compliant basename(3) and dirname(3) from OpenBSD.
The man pages need some adjustments. PR: 12960, 12962 Submitted by: James Howard <howardjp@wam.umd.edu> Obtained from: OpenBSD
This commit is contained in:
parent
c52396e365
commit
1250db8139
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=65294
@ -11,7 +11,7 @@ SUBDIR= rpcsvc
|
|||||||
FILES= a.out.h ar.h assert.h bitstring.h ctype.h db.h dirent.h disktab.h \
|
FILES= a.out.h ar.h assert.h bitstring.h ctype.h db.h dirent.h disktab.h \
|
||||||
dlfcn.h elf.h err.h fnmatch.h fstab.h \
|
dlfcn.h elf.h err.h fnmatch.h fstab.h \
|
||||||
fts.h glob.h grp.h strhash.h histedit.h ieeefp.h ifaddrs.h iso646.h \
|
fts.h glob.h grp.h strhash.h histedit.h ieeefp.h ifaddrs.h iso646.h \
|
||||||
limits.h link.h locale.h malloc.h memory.h mpool.h \
|
libgen.h limits.h link.h locale.h malloc.h memory.h mpool.h \
|
||||||
ndbm.h netdb.h nl_types.h nlist.h objformat.h \
|
ndbm.h netdb.h nl_types.h nlist.h objformat.h \
|
||||||
paths.h pthread.h pthread_np.h pwd.h \
|
paths.h pthread.h pthread_np.h pwd.h \
|
||||||
ranlib.h regex.h regexp.h resolv.h rune.h runetype.h \
|
ranlib.h regex.h regexp.h resolv.h rune.h runetype.h \
|
||||||
|
49
include/libgen.h
Normal file
49
include/libgen.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/* $OpenBSD: libgen.h,v 1.4 1999/05/28 22:00:22 espie Exp $ */
|
||||||
|
/* $FreeBSD$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIBGEN_H_
|
||||||
|
#define _LIBGEN_H_
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
char *basename __P((const char *));
|
||||||
|
char *dirname __P((const char *));
|
||||||
|
#if 0
|
||||||
|
char *regcmp __P((const char *, ...));
|
||||||
|
char *regex __P((const char *, const char *, ...));
|
||||||
|
|
||||||
|
extern char *__loc1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* _LIBGEN_H_ */
|
@ -5,8 +5,9 @@
|
|||||||
.PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
|
.PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
|
||||||
|
|
||||||
SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
|
SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
|
||||||
|
basename.c \
|
||||||
clock.c closedir.c confstr.c \
|
clock.c closedir.c confstr.c \
|
||||||
crypt.c ctermid.c daemon.c devname.c disklabel.c \
|
crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
|
||||||
dlfcn.c drand48.c erand48.c err.c errlst.c \
|
dlfcn.c drand48.c erand48.c err.c errlst.c \
|
||||||
exec.c fnmatch.c fstab.c ftok.c fts.c getbootfile.c getbsize.c \
|
exec.c fnmatch.c fstab.c ftok.c fts.c getbootfile.c getbsize.c \
|
||||||
getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \
|
getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \
|
||||||
@ -34,8 +35,9 @@ SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
|
|||||||
|
|
||||||
.if ${LIB} == "c"
|
.if ${LIB} == "c"
|
||||||
MAN3+= alarm.3 arc4random.3 clock.3 \
|
MAN3+= alarm.3 arc4random.3 clock.3 \
|
||||||
|
basename.3 \
|
||||||
confstr.3 ctermid.3 daemon.3 \
|
confstr.3 ctermid.3 daemon.3 \
|
||||||
devname.3 directory.3 dladdr.3 dllockinit.3 dlopen.3 \
|
devname.3 directory.3 dirname.3 dladdr.3 dllockinit.3 dlopen.3 \
|
||||||
err.3 exec.3 fnmatch.3 frexp.3 ftok.3 fts.3 \
|
err.3 exec.3 fnmatch.3 frexp.3 ftok.3 fts.3 \
|
||||||
getbootfile.3 getbsize.3 getcap.3 getcwd.3 \
|
getbootfile.3 getbsize.3 getcap.3 getcwd.3 \
|
||||||
getdiskbyname.3 getdomainname.3 getfsent.3 \
|
getdiskbyname.3 getdomainname.3 getfsent.3 \
|
||||||
|
99
lib/libc/gen/basename.3
Normal file
99
lib/libc/gen/basename.3
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. The name of the author may not be used to endorse or promote products
|
||||||
|
.\" derived from this software without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" $OpenBSD: basename.3,v 1.12 2000/04/18 03:01:25 aaron Exp $
|
||||||
|
.\" $FreeBSD$
|
||||||
|
.\"
|
||||||
|
.Dd August 17, 1997
|
||||||
|
.Dt BASENAME 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm basename
|
||||||
|
.Nd extract the base portion of a pathname
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Fd #include <libgen.h>
|
||||||
|
.Ft char *
|
||||||
|
.Fn basename "const char *path"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Fn basename
|
||||||
|
function
|
||||||
|
returns the last component from the pathname pointed to by
|
||||||
|
.Ar path ,
|
||||||
|
deleting any trailing
|
||||||
|
.Sq \&/
|
||||||
|
characters.
|
||||||
|
If
|
||||||
|
.Ar path
|
||||||
|
consists entirely of
|
||||||
|
.Sq \&/
|
||||||
|
characters, a pointer to the string
|
||||||
|
.Qq \&/
|
||||||
|
is returned.
|
||||||
|
If
|
||||||
|
.Ar path
|
||||||
|
is a null pointer or the empty string, a pointer to the string
|
||||||
|
.Qq \&.
|
||||||
|
is returned.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
On successful completion,
|
||||||
|
.Fn basename
|
||||||
|
returns a pointer to the last component of
|
||||||
|
.Ar path .
|
||||||
|
.Pp
|
||||||
|
If
|
||||||
|
.Fn basename
|
||||||
|
fails, a null pointer is returned and the global variable
|
||||||
|
.Va errno
|
||||||
|
is set to indicate the error.
|
||||||
|
.Sh ERRORS
|
||||||
|
The following error codes may be set in
|
||||||
|
.Va errno :
|
||||||
|
.Bl -tag -width Er
|
||||||
|
.It Bq Er ENAMETOOLONG
|
||||||
|
The path component to be returned was larger than
|
||||||
|
.Dv MAXPATHLEN .
|
||||||
|
.El
|
||||||
|
.Sh WARNINGS
|
||||||
|
.Fn basename
|
||||||
|
returns a pointer to internal static storage space that will be overwritten
|
||||||
|
by subsequent calls.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr basename 1 ,
|
||||||
|
.Xr dirname 1 ,
|
||||||
|
.Xr dirname 3
|
||||||
|
.Sh STANDARDS
|
||||||
|
The
|
||||||
|
.Fn basename
|
||||||
|
function conforms to
|
||||||
|
.St -xpg4.2 .
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Fn basename
|
||||||
|
function first appeared in
|
||||||
|
.Ox 2.2 .
|
||||||
|
.Sh AUTHOR
|
||||||
|
Todd C. Miller <Todd.Miller@courtesan.com>
|
76
lib/libc/gen/basename.c
Normal file
76
lib/libc/gen/basename.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/* $OpenBSD: basename.c,v 1.4 1999/05/30 17:10:30 espie Exp $ */
|
||||||
|
/* $FreeBSD$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char rcsid[] = "$OpenBSD: basename.c,v 1.4 1999/05/30 17:10:30 espie Exp $";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
char *
|
||||||
|
basename(path)
|
||||||
|
const char *path;
|
||||||
|
{
|
||||||
|
static char bname[MAXPATHLEN];
|
||||||
|
register const char *endp, *startp;
|
||||||
|
|
||||||
|
/* Empty or NULL string gets treated as "." */
|
||||||
|
if (path == NULL || *path == '\0') {
|
||||||
|
(void)strcpy(bname, ".");
|
||||||
|
return(bname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip trailing slashes */
|
||||||
|
endp = path + strlen(path) - 1;
|
||||||
|
while (endp > path && *endp == '/')
|
||||||
|
endp--;
|
||||||
|
|
||||||
|
/* All slashes becomes "/" */
|
||||||
|
if (endp == path && *endp == '/') {
|
||||||
|
(void)strcpy(bname, "/");
|
||||||
|
return(bname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the start of the base */
|
||||||
|
startp = endp;
|
||||||
|
while (startp > path && *(startp - 1) != '/')
|
||||||
|
startp--;
|
||||||
|
|
||||||
|
if (endp - startp + 1 > sizeof(bname)) {
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
(void)strncpy(bname, startp, endp - startp + 1);
|
||||||
|
bname[endp - startp + 1] = '\0';
|
||||||
|
return(bname);
|
||||||
|
}
|
106
lib/libc/gen/dirname.3
Normal file
106
lib/libc/gen/dirname.3
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. The name of the author may not be used to endorse or promote products
|
||||||
|
.\" derived from this software without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" $OpenBSD: dirname.3,v 1.9 2000/04/18 03:01:25 aaron Exp $
|
||||||
|
.\" $FreeBSD$
|
||||||
|
.\"
|
||||||
|
.Dd August 17, 1997
|
||||||
|
.Dt DIRNAME 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm dirname
|
||||||
|
.Nd extract the directory portition of a pathname
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Fd #include <libgen.h>
|
||||||
|
.Ft char *
|
||||||
|
.Fn dirname "const char *path"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Fn dirname
|
||||||
|
function
|
||||||
|
is the converse of
|
||||||
|
.Xr basename 3 ;
|
||||||
|
it returns a pointer to the parent directory of the pathname pointed to by
|
||||||
|
.Ar path .
|
||||||
|
Any trailing
|
||||||
|
.Sq \&/
|
||||||
|
characters are not counted as part of the directory
|
||||||
|
name.
|
||||||
|
If
|
||||||
|
.Ar path
|
||||||
|
is a null pointer, the empty string, or contains no
|
||||||
|
.Sq \&/
|
||||||
|
characters,
|
||||||
|
.Fn dirname
|
||||||
|
returns a pointer to the string
|
||||||
|
.Qq \&. ,
|
||||||
|
signifying the current directory.
|
||||||
|
.Sh RETURN VALUES
|
||||||
|
On successful completion,
|
||||||
|
.Fn dirname
|
||||||
|
returns a pointer to the parent directory of
|
||||||
|
.Ar path .
|
||||||
|
.Pp
|
||||||
|
If
|
||||||
|
.Fn dirname
|
||||||
|
fails, a null pointer is returned and the global variable
|
||||||
|
.Va errno
|
||||||
|
is set to indicate the error.
|
||||||
|
.Sh ERRORS
|
||||||
|
The following error codes may be set in
|
||||||
|
.Va errno :
|
||||||
|
.Bl -tag -width Er
|
||||||
|
.It Bq Er ENAMETOOLONG
|
||||||
|
The path component to be returned was larger than
|
||||||
|
.Dv MAXPATHLEN .
|
||||||
|
.El
|
||||||
|
.Sh WARNINGS
|
||||||
|
.Fn dirname
|
||||||
|
returns a pointer to internal static storage space that will be overwritten
|
||||||
|
by subsequent calls (each function has its own separate storage).
|
||||||
|
.Pp
|
||||||
|
Other vendor implementations of
|
||||||
|
.Fn dirname
|
||||||
|
may modify the contents of the string passed to
|
||||||
|
.Fn dirname ;
|
||||||
|
this should be taken into account when writing code which calls this function
|
||||||
|
if portability is desired.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr basename 1 ,
|
||||||
|
.Xr dirname 1 ,
|
||||||
|
.Xr basename 3
|
||||||
|
.Sh STANDARDS
|
||||||
|
The
|
||||||
|
.Fn dirname
|
||||||
|
function conforms to
|
||||||
|
.St -xpg4.2 .
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Fn dirname
|
||||||
|
function first appeared in
|
||||||
|
.Ox 2.2 .
|
||||||
|
.Sh AUTHOR
|
||||||
|
Todd C. Miller <Todd.Miller@courtesan.com>
|
79
lib/libc/gen/dirname.c
Normal file
79
lib/libc/gen/dirname.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/* $OpenBSD: dirname.c,v 1.4 1999/05/30 17:10:30 espie Exp $ */
|
||||||
|
/* $FreeBSD$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char rcsid[] = "$OpenBSD: dirname.c,v 1.4 1999/05/30 17:10:30 espie Exp $";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
char *
|
||||||
|
dirname(path)
|
||||||
|
const char *path;
|
||||||
|
{
|
||||||
|
static char bname[MAXPATHLEN];
|
||||||
|
register const char *endp;
|
||||||
|
|
||||||
|
/* Empty or NULL string gets treated as "." */
|
||||||
|
if (path == NULL || *path == '\0') {
|
||||||
|
(void)strcpy(bname, ".");
|
||||||
|
return(bname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip trailing slashes */
|
||||||
|
endp = path + strlen(path) - 1;
|
||||||
|
while (endp > path && *endp == '/')
|
||||||
|
endp--;
|
||||||
|
|
||||||
|
/* Find the start of the dir */
|
||||||
|
while (endp > path && *endp != '/')
|
||||||
|
endp--;
|
||||||
|
|
||||||
|
/* Either the dir is "/" or there are no slashes */
|
||||||
|
if (endp == path) {
|
||||||
|
(void)strcpy(bname, *endp == '/' ? "/" : ".");
|
||||||
|
return(bname);
|
||||||
|
} else {
|
||||||
|
do {
|
||||||
|
endp--;
|
||||||
|
} while (endp > path && *endp == '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endp - path + 1 > sizeof(bname)) {
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
(void)strncpy(bname, path, endp - path + 1);
|
||||||
|
bname[endp - path + 1] = '\0';
|
||||||
|
return(bname);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user