mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-09 00:00:53 -04:00
path: Move path related utility functions to separate files
This commit is contained in:
parent
7585a85f1a
commit
001a22e2c1
@ -41,7 +41,7 @@ utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
|
|||||||
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
||||||
utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
|
utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
|
||||||
utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
|
utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
|
||||||
utils/utils/tty.c
|
utils/utils/tty.c utils/utils/path.c
|
||||||
|
|
||||||
libstrongswan_la_SOURCES += \
|
libstrongswan_la_SOURCES += \
|
||||||
threading/thread.c \
|
threading/thread.c \
|
||||||
|
@ -39,7 +39,7 @@ utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
|
|||||||
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
||||||
utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
|
utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
|
||||||
utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
|
utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
|
||||||
utils/utils/tty.c
|
utils/utils/tty.c utils/utils/path.c
|
||||||
|
|
||||||
if !USE_WINDOWS
|
if !USE_WINDOWS
|
||||||
libstrongswan_la_SOURCES += \
|
libstrongswan_la_SOURCES += \
|
||||||
@ -110,7 +110,7 @@ utils/printf_hook/printf_hook_vstr.h utils/printf_hook/printf_hook_builtin.h \
|
|||||||
utils/parser_helper.h utils/test.h utils/integrity_checker.h utils/process.h \
|
utils/parser_helper.h utils/test.h utils/integrity_checker.h utils/process.h \
|
||||||
utils/utils/strerror.h utils/compat/windows.h utils/compat/apple.h \
|
utils/utils/strerror.h utils/compat/windows.h utils/compat/apple.h \
|
||||||
utils/utils/atomics.h utils/utils/types.h utils/utils/byteorder.h \
|
utils/utils/atomics.h utils/utils/types.h utils/utils/byteorder.h \
|
||||||
utils/utils/string.h utils/utils/memory.h utils/utils/tty.h
|
utils/utils/string.h utils/utils/memory.h utils/utils/tty.h utils/utils/path.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
library.lo : $(top_builddir)/config.status
|
library.lo : $(top_builddir)/config.status
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE /* for memrchr */
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/* for GetTickCount64, Windows 7 */
|
/* for GetTickCount64, Windows 7 */
|
||||||
# define _WIN32_WINNT 0x0601
|
# define _WIN32_WINNT 0x0601
|
||||||
@ -22,13 +21,11 @@
|
|||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <limits.h>
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
@ -179,149 +176,6 @@ void wait_sigint()
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Described in header.
|
|
||||||
*/
|
|
||||||
char* path_dirname(const char *path)
|
|
||||||
{
|
|
||||||
char *pos;
|
|
||||||
|
|
||||||
pos = path ? strrchr(path, DIRECTORY_SEPARATOR[0]) : NULL;
|
|
||||||
|
|
||||||
if (pos && !pos[1])
|
|
||||||
{ /* if path ends with slashes we have to look beyond them */
|
|
||||||
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
|
||||||
{ /* skip trailing slashes */
|
|
||||||
pos--;
|
|
||||||
}
|
|
||||||
pos = memrchr(path, DIRECTORY_SEPARATOR[0], pos - path + 1);
|
|
||||||
}
|
|
||||||
if (!pos)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
if (path && strlen(path))
|
|
||||||
{
|
|
||||||
if ((isalpha(path[0]) && path[1] == ':'))
|
|
||||||
{ /* if just a drive letter given, return that as dirname */
|
|
||||||
return chunk_clone(chunk_from_chars(path[0], ':', 0)).ptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return strdup(".");
|
|
||||||
}
|
|
||||||
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
|
||||||
{ /* skip superfluous slashes */
|
|
||||||
pos--;
|
|
||||||
}
|
|
||||||
return strndup(path, pos - path + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Described in header.
|
|
||||||
*/
|
|
||||||
char* path_basename(const char *path)
|
|
||||||
{
|
|
||||||
char *pos, *trail = NULL;
|
|
||||||
|
|
||||||
if (!path || !*path)
|
|
||||||
{
|
|
||||||
return strdup(".");
|
|
||||||
}
|
|
||||||
pos = strrchr(path, DIRECTORY_SEPARATOR[0]);
|
|
||||||
if (pos && !pos[1])
|
|
||||||
{ /* if path ends with slashes we have to look beyond them */
|
|
||||||
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
|
||||||
{ /* skip trailing slashes */
|
|
||||||
pos--;
|
|
||||||
}
|
|
||||||
if (pos == path && *pos == DIRECTORY_SEPARATOR[0])
|
|
||||||
{ /* contains only slashes */
|
|
||||||
return strdup(DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
trail = pos + 1;
|
|
||||||
pos = memrchr(path, DIRECTORY_SEPARATOR[0], trail - path);
|
|
||||||
}
|
|
||||||
pos = pos ? pos + 1 : (char*)path;
|
|
||||||
return trail ? strndup(pos, trail - pos) : strdup(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Described in header.
|
|
||||||
*/
|
|
||||||
bool path_absolute(const char *path)
|
|
||||||
{
|
|
||||||
if (!path)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#ifdef WIN32
|
|
||||||
if (strpfx(path, "\\\\"))
|
|
||||||
{ /* UNC */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (strlen(path) && isalpha(path[0]) && path[1] == ':')
|
|
||||||
{ /* drive letter */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#else /* !WIN32 */
|
|
||||||
if (path[0] == DIRECTORY_SEPARATOR[0])
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Described in header.
|
|
||||||
*/
|
|
||||||
bool mkdir_p(const char *path, mode_t mode)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char *pos, full[PATH_MAX];
|
|
||||||
pos = full;
|
|
||||||
if (!path || *path == '\0')
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
len = snprintf(full, sizeof(full)-1, "%s", path);
|
|
||||||
if (len < 0 || len >= sizeof(full)-1)
|
|
||||||
{
|
|
||||||
DBG1(DBG_LIB, "path string %s too long", path);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* ensure that the path ends with a '/' */
|
|
||||||
if (full[len-1] != '/')
|
|
||||||
{
|
|
||||||
full[len++] = '/';
|
|
||||||
full[len] = '\0';
|
|
||||||
}
|
|
||||||
/* skip '/' at the beginning */
|
|
||||||
while (*pos == '/')
|
|
||||||
{
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
while ((pos = strchr(pos, '/')))
|
|
||||||
{
|
|
||||||
*pos = '\0';
|
|
||||||
if (access(full, F_OK) < 0)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
if (_mkdir(full) < 0)
|
|
||||||
#else
|
|
||||||
if (mkdir(full, mode) < 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
DBG1(DBG_LIB, "failed to create directory %s", full);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*pos = '/';
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef HAVE_CLOSEFROM
|
#ifndef HAVE_CLOSEFROM
|
||||||
/**
|
/**
|
||||||
* Described in header.
|
* Described in header.
|
||||||
|
@ -81,20 +81,12 @@
|
|||||||
#include "utils/string.h"
|
#include "utils/string.h"
|
||||||
#include "utils/memory.h"
|
#include "utils/memory.h"
|
||||||
#include "utils/strerror.h"
|
#include "utils/strerror.h"
|
||||||
|
#include "utils/path.h"
|
||||||
#include "utils/tty.h"
|
#include "utils/tty.h"
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
# include "compat/apple.h"
|
# include "compat/apple.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Directory separator character in paths on this platform
|
|
||||||
*/
|
|
||||||
#ifdef WIN32
|
|
||||||
# define DIRECTORY_SEPARATOR "\\"
|
|
||||||
#else
|
|
||||||
# define DIRECTORY_SEPARATOR "/"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize utility functions
|
* Initialize utility functions
|
||||||
*/
|
*/
|
||||||
@ -389,49 +381,6 @@ void free_align(void *ptr);
|
|||||||
*/
|
*/
|
||||||
void wait_sigint();
|
void wait_sigint();
|
||||||
|
|
||||||
/**
|
|
||||||
* Like dirname(3) returns the directory part of the given null-terminated
|
|
||||||
* pathname, up to but not including the final '/' (or '.' if no '/' is found).
|
|
||||||
* Trailing '/' are not counted as part of the pathname.
|
|
||||||
*
|
|
||||||
* The difference is that it does this in a thread-safe manner (i.e. it does not
|
|
||||||
* use static buffers) and does not modify the original path.
|
|
||||||
*
|
|
||||||
* @param path original pathname
|
|
||||||
* @return allocated directory component
|
|
||||||
*/
|
|
||||||
char *path_dirname(const char *path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Like basename(3) returns the filename part of the given null-terminated path,
|
|
||||||
* i.e. the part following the final '/' (or '.' if path is empty or NULL).
|
|
||||||
* Trailing '/' are not counted as part of the pathname.
|
|
||||||
*
|
|
||||||
* The difference is that it does this in a thread-safe manner (i.e. it does not
|
|
||||||
* use static buffers) and does not modify the original path.
|
|
||||||
*
|
|
||||||
* @param path original pathname
|
|
||||||
* @return allocated filename component
|
|
||||||
*/
|
|
||||||
char *path_basename(const char *path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a given path is absolute.
|
|
||||||
*
|
|
||||||
* @param path path to check
|
|
||||||
* @return TRUE if absolute, FALSE if relative
|
|
||||||
*/
|
|
||||||
bool path_absolute(const char *path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a directory and all required parent directories.
|
|
||||||
*
|
|
||||||
* @param path path to the new directory
|
|
||||||
* @param mode permissions of the new directory/directories
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
bool mkdir_p(const char *path, mode_t mode);
|
|
||||||
|
|
||||||
#ifndef HAVE_CLOSEFROM
|
#ifndef HAVE_CLOSEFROM
|
||||||
/**
|
/**
|
||||||
* Close open file descriptors greater than or equal to lowfd.
|
* Close open file descriptors greater than or equal to lowfd.
|
||||||
|
168
src/libstrongswan/utils/utils/path.c
Normal file
168
src/libstrongswan/utils/utils/path.c
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2014 Tobias Brunner
|
||||||
|
* Copyright (C) 2005-2008 Martin Willi
|
||||||
|
* Hochschule fuer Technik Rapperswil
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE /* for memrchr */
|
||||||
|
#include <utils/utils.h>
|
||||||
|
#include <utils/debug.h>
|
||||||
|
#include <utils/chunk.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in header.
|
||||||
|
*/
|
||||||
|
char* path_dirname(const char *path)
|
||||||
|
{
|
||||||
|
char *pos;
|
||||||
|
|
||||||
|
pos = path ? strrchr(path, DIRECTORY_SEPARATOR[0]) : NULL;
|
||||||
|
|
||||||
|
if (pos && !pos[1])
|
||||||
|
{ /* if path ends with slashes we have to look beyond them */
|
||||||
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
|
{ /* skip trailing slashes */
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
pos = memrchr(path, DIRECTORY_SEPARATOR[0], pos - path + 1);
|
||||||
|
}
|
||||||
|
if (!pos)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
if (path && strlen(path))
|
||||||
|
{
|
||||||
|
if ((isalpha(path[0]) && path[1] == ':'))
|
||||||
|
{ /* if just a drive letter given, return that as dirname */
|
||||||
|
return chunk_clone(chunk_from_chars(path[0], ':', 0)).ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return strdup(".");
|
||||||
|
}
|
||||||
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
|
{ /* skip superfluous slashes */
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
return strndup(path, pos - path + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in header.
|
||||||
|
*/
|
||||||
|
char* path_basename(const char *path)
|
||||||
|
{
|
||||||
|
char *pos, *trail = NULL;
|
||||||
|
|
||||||
|
if (!path || !*path)
|
||||||
|
{
|
||||||
|
return strdup(".");
|
||||||
|
}
|
||||||
|
pos = strrchr(path, DIRECTORY_SEPARATOR[0]);
|
||||||
|
if (pos && !pos[1])
|
||||||
|
{ /* if path ends with slashes we have to look beyond them */
|
||||||
|
while (pos > path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
|
{ /* skip trailing slashes */
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
if (pos == path && *pos == DIRECTORY_SEPARATOR[0])
|
||||||
|
{ /* contains only slashes */
|
||||||
|
return strdup(DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
trail = pos + 1;
|
||||||
|
pos = memrchr(path, DIRECTORY_SEPARATOR[0], trail - path);
|
||||||
|
}
|
||||||
|
pos = pos ? pos + 1 : (char*)path;
|
||||||
|
return trail ? strndup(pos, trail - pos) : strdup(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in header.
|
||||||
|
*/
|
||||||
|
bool path_absolute(const char *path)
|
||||||
|
{
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#ifdef WIN32
|
||||||
|
if (strpfx(path, "\\\\"))
|
||||||
|
{ /* UNC */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (strlen(path) && isalpha(path[0]) && path[1] == ':')
|
||||||
|
{ /* drive letter */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#else /* !WIN32 */
|
||||||
|
if (path[0] == DIRECTORY_SEPARATOR[0])
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in header.
|
||||||
|
*/
|
||||||
|
bool mkdir_p(const char *path, mode_t mode)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *pos, full[PATH_MAX];
|
||||||
|
pos = full;
|
||||||
|
if (!path || *path == '\0')
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
len = snprintf(full, sizeof(full)-1, "%s", path);
|
||||||
|
if (len < 0 || len >= sizeof(full)-1)
|
||||||
|
{
|
||||||
|
DBG1(DBG_LIB, "path string %s too long", path);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* ensure that the path ends with a '/' */
|
||||||
|
if (full[len-1] != '/')
|
||||||
|
{
|
||||||
|
full[len++] = '/';
|
||||||
|
full[len] = '\0';
|
||||||
|
}
|
||||||
|
/* skip '/' at the beginning */
|
||||||
|
while (*pos == '/')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
while ((pos = strchr(pos, '/')))
|
||||||
|
{
|
||||||
|
*pos = '\0';
|
||||||
|
if (access(full, F_OK) < 0)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
if (_mkdir(full) < 0)
|
||||||
|
#else
|
||||||
|
if (mkdir(full, mode) < 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
DBG1(DBG_LIB, "failed to create directory %s", full);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*pos = '/';
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
77
src/libstrongswan/utils/utils/path.h
Normal file
77
src/libstrongswan/utils/utils/path.h
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008-2014 Tobias Brunner
|
||||||
|
* Copyright (C) 2008 Martin Willi
|
||||||
|
* Hochschule fuer Technik Rapperswil
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup path_i path
|
||||||
|
* @{ @ingroup utils_i
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PATH_H_
|
||||||
|
#define PATH_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directory separator character in paths on this platform
|
||||||
|
*/
|
||||||
|
#ifdef WIN32
|
||||||
|
# define DIRECTORY_SEPARATOR "\\"
|
||||||
|
#else
|
||||||
|
# define DIRECTORY_SEPARATOR "/"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like dirname(3) returns the directory part of the given null-terminated
|
||||||
|
* pathname, up to but not including the final '/' (or '.' if no '/' is found).
|
||||||
|
* Trailing '/' are not counted as part of the pathname.
|
||||||
|
*
|
||||||
|
* The difference is that it does this in a thread-safe manner (i.e. it does not
|
||||||
|
* use static buffers) and does not modify the original path.
|
||||||
|
*
|
||||||
|
* @param path original pathname
|
||||||
|
* @return allocated directory component
|
||||||
|
*/
|
||||||
|
char *path_dirname(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like basename(3) returns the filename part of the given null-terminated path,
|
||||||
|
* i.e. the part following the final '/' (or '.' if path is empty or NULL).
|
||||||
|
* Trailing '/' are not counted as part of the pathname.
|
||||||
|
*
|
||||||
|
* The difference is that it does this in a thread-safe manner (i.e. it does not
|
||||||
|
* use static buffers) and does not modify the original path.
|
||||||
|
*
|
||||||
|
* @param path original pathname
|
||||||
|
* @return allocated filename component
|
||||||
|
*/
|
||||||
|
char *path_basename(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a given path is absolute.
|
||||||
|
*
|
||||||
|
* @param path path to check
|
||||||
|
* @return TRUE if absolute, FALSE if relative
|
||||||
|
*/
|
||||||
|
bool path_absolute(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a directory and all required parent directories.
|
||||||
|
*
|
||||||
|
* @param path path to the new directory
|
||||||
|
* @param mode permissions of the new directory/directories
|
||||||
|
* @return TRUE on success
|
||||||
|
*/
|
||||||
|
bool mkdir_p(const char *path, mode_t mode);
|
||||||
|
|
||||||
|
#endif /** PATH_H_ @} */
|
Loading…
x
Reference in New Issue
Block a user