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
e5682f6642
commit
ca49fd7cdb
@ -11,7 +11,7 @@ SUBDIR= rpcsvc
|
||||
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 \
|
||||
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 \
|
||||
paths.h pthread.h pthread_np.h pwd.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
|
||||
|
||||
SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
|
||||
basename.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 \
|
||||
exec.c fnmatch.c fstab.c ftok.c fts.c getbootfile.c getbsize.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"
|
||||
MAN3+= alarm.3 arc4random.3 clock.3 \
|
||||
basename.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 \
|
||||
getbootfile.3 getbsize.3 getcap.3 getcwd.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