blob: 3f4d3158485a8314f67cb05adeeba97d4d05cf8f [file] [log] [blame]
bigbiff bigbiff9c754052013-01-09 09:09:08 -05001/* $OpenBSD: basename.c,v 1.4 1999/05/30 17:10:30 espie Exp $ */
2
3/*
4 * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef lint
Ethan Yonker58f21322018-08-24 11:17:36 -050031//static char rcsid[] = "$OpenBSD: basename.c,v 1.4 1999/05/30 17:10:30 espie Exp $";
bigbiff bigbiff9c754052013-01-09 09:09:08 -050032#endif /* not lint */
33
34#include <errno.h>
35#include <string.h>
36#include <sys/param.h>
37
38char *
39openbsd_basename(path)
40 const char *path;
41{
42 static char bname[MAXPATHLEN];
43 register const char *endp, *startp;
44
45 /* Empty or NULL string gets treated as "." */
46 if (path == NULL || *path == '\0') {
47 (void)strcpy(bname, ".");
48 return(bname);
49 }
50
51 /* Strip trailing slashes */
52 endp = path + strlen(path) - 1;
53 while (endp > path && *endp == '/')
54 endp--;
55
56 /* All slashes becomes "/" */
57 if (endp == path && *endp == '/') {
58 (void)strcpy(bname, "/");
59 return(bname);
60 }
61
62 /* Find the start of the base */
63 startp = endp;
64 while (startp > path && *(startp - 1) != '/')
65 startp--;
66
James Christopher Adduono6f57f7c2016-03-01 16:01:53 -050067 if (endp - startp + 1 > (int)sizeof(bname)) {
bigbiff bigbiff9c754052013-01-09 09:09:08 -050068 errno = ENAMETOOLONG;
69 return(NULL);
70 }
71 (void)strncpy(bname, startp, endp - startp + 1);
72 bname[endp - startp + 1] = '\0';
73 return(bname);
74}