summaryrefslogtreecommitdiffstats
path: root/include/path.h
blob: 19c1be6e7e36dc2c571c44f2a28911bd6142f981 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * No copyright is claimed.  This code is in the public domain; do with
 * it what you wish.
 */
#ifndef UTIL_LINUX_PATH_H
#define UTIL_LINUX_PATH_H

#include <stdio.h>
#include <stdint.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>

#include "c.h"

struct path_cxt {
	int	dir_fd;
	char	*dir_path;

	int	refcount;

	char *prefix;
	char path_buffer[PATH_MAX];

	void	*dialect;
	void	(*free_dialect)(struct path_cxt *);
	int	(*redirect_on_enoent)(struct path_cxt *, const char *, int *);
};

struct path_cxt *ul_new_path(const char *dir, ...)
			__attribute__ ((__format__ (__printf__, 1, 2)));
void ul_unref_path(struct path_cxt *pc);
void ul_ref_path(struct path_cxt *pc);

void ul_path_init_debug(void);

int ul_path_set_prefix(struct path_cxt *pc, const char *prefix);
const char *ul_path_get_prefix(struct path_cxt *pc);

int ul_path_set_dir(struct path_cxt *pc, const char *dir);
const char *ul_path_get_dir(struct path_cxt *pc);

int ul_path_set_dialect(struct path_cxt *pc, void *data, void free_data(struct path_cxt *));
void *ul_path_get_dialect(struct path_cxt *pc);

int ul_path_set_enoent_redirect(struct path_cxt *pc, int (*func)(struct path_cxt *, const char *, int *));
int ul_path_get_dirfd(struct path_cxt *pc);
void ul_path_close_dirfd(struct path_cxt *pc);
int ul_path_isopen_dirfd(struct path_cxt *pc);
int ul_path_is_accessible(struct path_cxt *pc);

char *ul_path_get_abspath(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));

int ul_path_stat(struct path_cxt *pc, struct stat *sb, int flags, const char *path);
int ul_path_access(struct path_cxt *pc, int mode, const char *path);
int ul_path_accessf(struct path_cxt *pc, int mode, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_open(struct path_cxt *pc, int flags, const char *path);
int ul_path_openf(struct path_cxt *pc, int flags, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));
int ul_path_vopenf(struct path_cxt *pc, int flags, const char *path, va_list ap)
				__attribute__ ((__format__ (__printf__, 3, 0)));

FILE *ul_path_fopen(struct path_cxt *pc, const char *mode, const char *path);
FILE *ul_path_fopenf(struct path_cxt *pc, const char *mode, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));
FILE *ul_path_vfopenf(struct path_cxt *pc, const char *mode, const char *path, va_list ap)
				__attribute__ ((__format__ (__printf__, 3, 0)));

DIR *ul_path_opendir(struct path_cxt *pc, const char *path);
DIR *ul_path_vopendirf(struct path_cxt *pc, const char *path, va_list ap)
				__attribute__ ((__format__ (__printf__, 2, 0)));
DIR *ul_path_opendirf(struct path_cxt *pc, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 2, 3)));

ssize_t ul_path_readlink(struct path_cxt *pc, char *buf, size_t bufsiz, const char *path);
ssize_t ul_path_readlinkf(struct path_cxt *pc, char *buf, size_t bufsiz, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));

int ul_path_read(struct path_cxt *pc, char *buf, size_t len, const char *path);
int ul_path_vreadf(struct path_cxt *pc, char *buf, size_t len, const char *path, va_list ap)
				__attribute__ ((__format__ (__printf__, 4, 0)));
int ul_path_readf(struct path_cxt *pc, char *buf, size_t len, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));

int ul_path_read_string(struct path_cxt *pc, char **str, const char *path);
int ul_path_readf_string(struct path_cxt *pc, char **str, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_read_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path);
int ul_path_readf_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));

int ul_path_scanf(struct path_cxt *pc, const char *path, const char *fmt, ...)
				__attribute__ ((__format__ (__scanf__, 3, 4)));
int ul_path_scanff(struct path_cxt *pc, const char *path, va_list ap, const char *fmt, ...)
				__attribute__ ((__format__ (__printf__, 2, 0)))
				__attribute__ ((__format__ (__scanf__, 4, 5)));

int ul_path_read_majmin(struct path_cxt *pc, dev_t *res, const char *path);
int ul_path_readf_majmin(struct path_cxt *pc, dev_t *res, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_read_u32(struct path_cxt *pc, uint32_t *res, const char *path);
int ul_path_readf_u32(struct path_cxt *pc, uint32_t *res, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_read_s32(struct path_cxt *pc, int32_t *res, const char *path);
int ul_path_readf_s32(struct path_cxt *pc, int32_t *res, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_read_u64(struct path_cxt *pc, uint64_t *res, const char *path);
int ul_path_readf_u64(struct path_cxt *pc, uint64_t *res, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_read_s64(struct path_cxt *pc, int64_t *res, const char *path);
int ul_path_readf_s64(struct path_cxt *pc, int64_t *res, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_write_string(struct path_cxt *pc, const char *str, const char *path);
int ul_path_writef_string(struct path_cxt *pc, const char *str, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_write_s64(struct path_cxt *pc, int64_t num, const char *path);
int ul_path_write_u64(struct path_cxt *pc, uint64_t num, const char *path);
int ul_path_writef_u64(struct path_cxt *pc, uint64_t num, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 3, 4)));

int ul_path_count_dirents(struct path_cxt *pc, const char *path);
int ul_path_countf_dirents(struct path_cxt *pc, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 2, 3)));

int ul_path_next_dirent(struct path_cxt *pc, DIR **sub, const char *dirname, struct dirent **d);

FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode);


#ifdef HAVE_CPU_SET_T
# include "cpuset.h"
int ul_path_readf_cpuset(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));

int ul_path_readf_cpulist(struct path_cxt *pc, cpu_set_t **set, int maxcpus, const char *path, ...)
				__attribute__ ((__format__ (__printf__, 4, 5)));
#endif /* HAVE_CPU_SET_T */
#endif /* UTIL_LINUX_PATH_H */