kicad/thirdparty/sentry-native/src/sentry_path.h

232 lines
5.8 KiB
C

#ifndef SENTRY_PATH_H_INCLUDED
#define SENTRY_PATH_H_INCLUDED
#include "sentry_boot.h"
#include <stdio.h>
#ifdef SENTRY_PLATFORM_WINDOWS
typedef wchar_t sentry_pathchar_t;
# define SENTRY_PATH_PRI "S"
#else
typedef char sentry_pathchar_t;
# define SENTRY_PATH_PRI "s"
#endif
struct sentry_path_s {
sentry_pathchar_t *path;
};
struct sentry_filelock_s {
struct sentry_path_s *path;
int fd;
bool is_locked;
};
typedef struct sentry_path_s sentry_path_t;
typedef struct sentry_pathiter_s sentry_pathiter_t;
typedef struct sentry_filelock_s sentry_filelock_t;
/**
* NOTE on encodings:
*
* When not stated otherwise, all `char` functions defined here will assume an
* OS-specific encoding, typically ANSI on Windows, and UTF-8 on Unix.
*/
/**
* Creates a new path by making `path` into an absolute path.
*/
sentry_path_t *sentry__path_absolute(const sentry_path_t *path);
/**
* This will return the path to the current executable running the code.
*/
sentry_path_t *sentry__path_current_exe(void);
/**
* This will return the parent directory name of the given `path`.
*/
sentry_path_t *sentry__path_dir(const sentry_path_t *path);
/**
* Create a new path from the given string.
*/
sentry_path_t *sentry__path_from_str(const char *s);
sentry_path_t *sentry__path_from_str_n(const char *s, size_t s_len);
/**
* Create a new path from the given string.
* The string is moved into the returned path instead of copied.
*/
sentry_path_t *sentry__path_from_str_owned(char *s);
/**
* Return a new path with a new path segment (directory or file name) appended.
*/
sentry_path_t *sentry__path_join_str(
const sentry_path_t *base, const char *other);
/**
* Return a new path with the given suffix appended.
* This is different to `sentry__path_join_str` as it does not create a new path
* segment.
*/
sentry_path_t *sentry__path_append_str(
const sentry_path_t *base, const char *suffix);
/**
* Creates a copy of the path.
*/
sentry_path_t *sentry__path_clone(const sentry_path_t *path);
/**
* Free the path instance.
*/
void sentry__path_free(sentry_path_t *path);
/**
* This will return a pointer to the last path segment, which is typically the
* file or directory name
*/
const sentry_pathchar_t *sentry__path_filename(const sentry_path_t *path);
/**
* Returns whether the last path segment matches `filename`.
*/
bool sentry__path_filename_matches(
const sentry_path_t *path, const char *filename);
/**
* This will check for a specific suffix.
*/
bool sentry__path_ends_with(const sentry_path_t *path, const char *suffix);
/**
* Return whether the path refers to a directory.
*/
bool sentry__path_is_dir(const sentry_path_t *path);
/**
* Return whether the path refers to a regular file.
*/
bool sentry__path_is_file(const sentry_path_t *path);
/**
* Remove the directory or file referred to by `path`.
* This will *not* recursively delete any directory content. Use
* `sentry__path_remove_all` for that.
* Returns 0 on success.
*/
int sentry__path_remove(const sentry_path_t *path);
/**
* Recursively remove the given directory and everything in it.
* Returns 0 on success.
*/
int sentry__path_remove_all(const sentry_path_t *path);
/**
* This will create the directory referred to by `path`, and any non-existing
* parent directory.
* Returns 0 on success.
*/
int sentry__path_create_dir_all(const sentry_path_t *path);
/**
* This will touch or create an empty file at `path`.
* Returns 0 on success.
*/
int sentry__path_touch(const sentry_path_t *path);
/**
* This will return the size of the file at `path`, or 0 on failure.
*/
size_t sentry__path_get_size(const sentry_path_t *path);
/**
* This will read all the content of `path` into a newly allocated buffer, and
* write its size into `size_out`.
*/
char *sentry__path_read_to_buffer(const sentry_path_t *path, size_t *size_out);
/**
* This will truncate the given file and write the given `buf` into it.
*/
int sentry__path_write_buffer(
const sentry_path_t *path, const char *buf, size_t buf_len);
/**
* This will append `buf` to an existing file.
*/
int sentry__path_append_buffer(
const sentry_path_t *path, const char *buf, size_t buf_len);
/**
* Create a new directory iterator for `path`.
*/
sentry_pathiter_t *sentry__path_iter_directory(const sentry_path_t *path);
/**
* This will return a borrowed path to the next file or directory for the given
* `piter`.
*/
const sentry_path_t *sentry__pathiter_next(sentry_pathiter_t *piter);
/**
* This will close and free the previously created directory iterator.
*/
void sentry__pathiter_free(sentry_pathiter_t *piter);
/**
* Create a new lockfile at the given path.
*/
sentry_filelock_t *sentry__filelock_new(sentry_path_t *path);
/**
* This will try to acquire a lock on the given file.
* The function will return `false` when no lock can be acquired, for example if
* the lock is being held by another process.
*/
bool sentry__filelock_try_lock(sentry_filelock_t *lock);
/**
* This will release the lock on the given file.
*/
void sentry__filelock_unlock(sentry_filelock_t *lock);
/**
* Free the allocated lockfile. This will unlock the file first.
*/
void sentry__filelock_free(sentry_filelock_t *lock);
/* windows specific API additions */
#ifdef SENTRY_PLATFORM_WINDOWS
/**
* Create a new path from a Wide String.
*/
sentry_path_t *sentry__path_from_wstr(const wchar_t *s);
sentry_path_t *sentry__path_from_wstr_n(const wchar_t *s, size_t s_len);
/**
* Create another path by appending a new path segment.
*/
sentry_path_t *sentry__path_join_wstr(
const sentry_path_t *base, const wchar_t *other);
#endif
/**
* Create a new path from the platform native string type.
*/
static inline sentry_path_t *
sentry__path_new(const sentry_pathchar_t *s)
{
#ifdef SENTRY_PLATFORM_WINDOWS
return sentry__path_from_wstr(s);
#else
return sentry__path_from_str(s);
#endif
}
#endif