#include <errno.h>
#include <libgen.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
char * __freebsd11_basename_r(const char *path, char *bname);
char * __freebsd11_basename(char *path);
char *
__freebsd11_basename_r(const char *path, char *bname)
{
const char *endp, *startp;
size_t len;
if (path == NULL || *path == '\0') {
bname[0] = '.';
bname[1] = '\0';
return (bname);
}
endp = path + strlen(path) - 1;
while (endp > path && *endp == '/')
endp--;
if (endp == path && *endp == '/') {
bname[0] = '/';
bname[1] = '\0';
return (bname);
}
startp = endp;
while (startp > path && *(startp - 1) != '/')
startp--;
len = endp - startp + 1;
if (len >= MAXPATHLEN) {
errno = ENAMETOOLONG;
return (NULL);
}
memcpy(bname, startp, len);
bname[len] = '\0';
return (bname);
}
char *
__freebsd11_basename(char *path)
{
static char *bname = NULL;
if (bname == NULL) {
bname = (char *)malloc(MAXPATHLEN);
if (bname == NULL)
return (NULL);
}
return (__freebsd11_basename_r(path, bname));
}
__sym_compat(basename_r, __freebsd11_basename_r, FBSD_1.2);
__sym_compat(basename, __freebsd11_basename, FBSD_1.0);