utils.h 3.4 KB
Newer Older
J
Jonathan Calmels 已提交
1
/*
J
Jonathan Calmels 已提交
2
 * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
J
Jonathan Calmels 已提交
3 4 5 6 7
 */

#ifndef HEADER_UTILS_H
#define HEADER_UTILS_H

8
#include <sys/capability.h>
J
Jonathan Calmels 已提交
9 10 11 12 13 14 15 16 17
#include <sys/stat.h>
#include <sys/types.h>

#include <assert.h>
#include <stdbool.h>
#include <stddef.h>

#include "error.h"

18 19
#define CAP_AMBIENT (cap_flag_t)-1

20
#define quote_str(...) #__VA_ARGS__
J
Jonathan Calmels 已提交
21
#define nitems(x) (sizeof(x) / sizeof(*x))
22 23 24 25 26
#define maybe_unused __attribute__((unused))
#define assert_func(fn) do {      \
        maybe_unused int r_ = fn; \
        assert(r_ == 0);          \
} while (0)
J
Jonathan Calmels 已提交
27 28 29

#define MODE_DIR(mode) ((mode) | S_IFDIR)
#define MODE_REG(mode) ((mode) | S_IFREG)
30
#define MODE_LNK(mode) ((mode) | S_IFLNK)
J
Jonathan Calmels 已提交
31 32 33 34 35 36 37 38

bool log_active(void);
void log_open(const char *);
void log_close(void);
void log_write(char, const char *, unsigned long, const char *, ...)
    __attribute__((format(printf, 4, 5), nonnull(4)));
int  log_pipe_output(struct error *, int[2]);

39 40 41 42 43 44
#define log_info(msg) log_write('I', __FILE__, __LINE__, msg)
#define log_warn(msg) log_write('W', __FILE__, __LINE__, msg)
#define log_err(msg)  log_write('E', __FILE__, __LINE__, msg)
#define log_infof(fmt, ...) log_write('I', __FILE__, __LINE__, fmt, __VA_ARGS__)
#define log_warnf(fmt, ...) log_write('W', __FILE__, __LINE__, fmt, __VA_ARGS__)
#define log_errf(fmt, ...)  log_write('E', __FILE__, __LINE__, fmt, __VA_ARGS__)
J
Jonathan Calmels 已提交
45

J
Jonathan Calmels 已提交
46 47 48 49 50 51
void str_lower(char *);
bool str_equal(const char *, const char *);
bool str_case_equal(const char *, const char *);
bool str_has_prefix(const char *, const char *);
bool str_has_suffix(const char *, const char *);
bool str_empty(const char *);
52
bool str_array_match_prefix(const char *, const char * const [], size_t);
J
Jonathan Calmels 已提交
53 54 55 56
bool str_array_match(const char *, const char * const [], size_t);
int  str_to_pid(struct error *, const char *, pid_t *);
int  str_to_ugid(struct error *, char *, uid_t *, gid_t *);
int  str_join(struct error *, char **, const char *, const char *);
J
Jonathan Calmels 已提交
57

J
Jonathan Calmels 已提交
58 59
int ns_enter_at(struct error *, int, int);
int ns_enter(struct error *, const char *, int);
J
Jonathan Calmels 已提交
60 61 62 63

char **array_new(struct error *, size_t);
void array_free(char *[], size_t);
void array_pack(char *[], size_t *);
64
char **array_copy(struct error *, const char * const [], size_t);
65
size_t array_size(const char * const []);
J
Jonathan Calmels 已提交
66 67 68
const char **array_append(const char **, const char * const [], size_t);

void *file_map(struct error *, const char *, size_t *);
69
int  file_unmap(struct error *, const char *, void *, size_t);
J
Jonathan Calmels 已提交
70
int  file_create(struct error *, const char *, const char *, uid_t, gid_t, mode_t);
J
Jonathan Calmels 已提交
71 72
int  file_remove(struct error *, const char *);
int  file_exists(struct error *, const char *);
73
int  file_exists_at(struct error *, const char *, const char *);
J
Jonathan Calmels 已提交
74
int  file_mode(struct error *, const char *, mode_t *);
75
int  file_read_line(struct error *, const char *, char *, size_t);
76
int  file_read_text(struct error *, const char *, char **);
77
int  file_read_uint32(struct error *, const char *, uint32_t *);
J
Jonathan Calmels 已提交
78

79
int path_new(struct error *, char *, const char *);
J
Jonathan Calmels 已提交
80 81 82
int path_append(struct error *, char *, const char *);
int path_join(struct error *, char *, const char *, const char *);
int path_resolve(struct error *, char *, const char *, const char *);
83
int path_resolve_full(struct error *, char *, const char *, const char *);
J
Jonathan Calmels 已提交
84

85
int perm_drop_privileges(struct error *, uid_t, gid_t, bool);
86
int perm_set_bounds(struct error *, const cap_value_t [], size_t);
87
int perm_set_capabilities(struct error *, cap_flag_t, const cap_value_t [], size_t);
88

J
Jonathan Calmels 已提交
89
#endif /* HEADER_UTILS_H */