]> git.proxmox.com Git - libgit2.git/blob - src/fileops.h
1b70fc83692e2c5afd6ed96348b7d38f79901f75
[libgit2.git] / src / fileops.h
1 /*
2 * fileops.h - OS agnostic disk io operations
3 *
4 * This header describes the strictly internal part of the api
5 */
6 #ifndef INCLUDE_fileops_h__
7 #define INCLUDE_fileops_h__
8
9 #include "common.h"
10 #include "map.h"
11 #include "dir.h"
12 #include <fcntl.h>
13 #include <time.h>
14
15 #define GIT_PATH_LIST_SEPARATOR ':'
16
17 #ifdef GIT_WIN32
18 #define GIT_PLATFORM_PATH_SEP '\\'
19 #else
20 #define GIT_PLATFORM_PATH_SEP '/'
21 #endif
22
23 #ifdef GIT_WIN32
24 GIT_INLINE(int) link(const char *GIT_UNUSED(old), const char *GIT_UNUSED(new))
25 {
26 GIT_UNUSED_ARG(old)
27 GIT_UNUSED_ARG(new)
28 errno = ENOSYS;
29 return -1;
30 }
31
32 GIT_INLINE(int) git__mkdir(const char *path, int GIT_UNUSED(mode))
33 {
34 GIT_UNUSED_ARG(mode)
35 return mkdir(path);
36 }
37
38 extern int git__unlink(const char *path);
39 extern int git__mkstemp(char *template);
40 extern int git__fsync(int fd);
41
42 # ifndef GIT__WIN32_NO_HIDE_FILEOPS
43 # define unlink(p) git__unlink(p)
44 # define mkstemp(t) git__mkstemp(t)
45 # define mkdir(p,m) git__mkdir(p, m)
46 # define fsync(fd) git__fsync(fd)
47 # endif
48 #endif /* GIT_WIN32 */
49
50
51 #if !defined(O_BINARY)
52 #define O_BINARY 0
53 #endif
54
55 #define GITFO_BUF_INIT {NULL, 0}
56
57 typedef int git_file;
58
59 typedef struct { /* file io buffer */
60 void *data; /* data bytes */
61 size_t len; /* data length */
62 } gitfo_buf;
63
64 extern int gitfo_exists(const char *path);
65 extern int gitfo_open(const char *path, int flags);
66 extern int gitfo_creat(const char *path, int mode);
67 extern int gitfo_creat_force(const char *path, int mode);
68 extern int gitfo_mktemp(char *path_out, const char *filename);
69 extern int gitfo_isdir(const char *path);
70 extern int gitfo_mkdir_recurs(const char *path, int mode);
71 extern int gitfo_mkdir_2file(const char *path);
72 #define gitfo_close(fd) close(fd)
73
74 extern int gitfo_read(git_file fd, void *buf, size_t cnt);
75 extern int gitfo_write(git_file fd, void *buf, size_t cnt);
76 #define gitfo_lseek(f,n,w) lseek(f, n, w)
77 extern git_off_t gitfo_size(git_file fd);
78
79 extern int gitfo_read_file(gitfo_buf *obj, const char *path);
80 extern void gitfo_free_buf(gitfo_buf *obj);
81
82 /* Move (rename) a file; this operation is atomic */
83 extern int gitfo_mv(const char *from, const char *to);
84
85 /* Move a file (forced); this will create the destination
86 * path if it doesn't exist */
87 extern int gitfo_mv_force(const char *from, const char *to);
88
89 #define gitfo_stat(p,b) stat(p, b)
90 #define gitfo_fstat(f,b) fstat(f, b)
91
92 #define gitfo_unlink(p) unlink(p)
93 #define gitfo_rmdir(p) rmdir(p)
94 #define gitfo_chdir(p) chdir(p)
95 #define gitfo_mkdir(p,m) mkdir(p, m)
96
97 #define gitfo_mkstemp(t) mkstemp(t)
98 #define gitfo_fsync(fd) fsync(fd)
99 #define gitfo_chmod(p,m) chmod(p, m)
100
101 /**
102 * Read-only map all or part of a file into memory.
103 * When possible this function should favor a virtual memory
104 * style mapping over some form of malloc()+read(), as the
105 * data access will be random and is not likely to touch the
106 * majority of the region requested.
107 *
108 * @param out buffer to populate with the mapping information.
109 * @param fd open descriptor to configure the mapping from.
110 * @param begin first byte to map, this should be page aligned.
111 * @param end number of bytes to map.
112 * @return
113 * - GIT_SUCCESS on success;
114 * - GIT_EOSERR on an unspecified OS related error.
115 */
116 extern int gitfo_map_ro(
117 git_map *out,
118 git_file fd,
119 git_off_t begin,
120 size_t len);
121
122 /**
123 * Release the memory associated with a previous memory mapping.
124 * @param map the mapping description previously configured.
125 */
126 extern void gitfo_free_map(git_map *map);
127
128 /**
129 * Walk each directory entry, except '.' and '..', calling fn(state).
130 *
131 * @param pathbuf buffer the function reads the initial directory
132 * path from, and updates with each successive entry's name.
133 * @param pathmax maximum allocation of pathbuf.
134 * @param fn function to invoke with each entry. The first arg is
135 * the input state and the second arg is pathbuf. The function
136 * may modify the pathbuf, but only by appending new text.
137 * @param state to pass to fn as the first arg.
138 */
139 extern int gitfo_dirent(
140 char *pathbuf,
141 size_t pathmax,
142 int (*fn)(void *, char *),
143 void *state);
144
145 extern int gitfo_cmp_path(const char *name1, int len1, int isdir1,
146 const char *name2, int len2, int isdir2);
147
148 extern int gitfo_getcwd(char *buffer_out, size_t size);
149
150 /**
151 * Clean up a provided absolute or relative directory path.
152 *
153 * This prettification relies on basic operations such as coalescing
154 * multiple forward slashes into a single slash, removing '.' and
155 * './' current directory segments, and removing parent directory
156 * whenever '..' is encountered.
157 *
158 * If not empty, the returned path ends with a forward slash.
159 *
160 * For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3/".
161 *
162 * This only performs a string based analysis of the path.
163 * No checks are done to make sure the path actually makes sense from
164 * the file system perspective.
165 *
166 * @param buffer_out buffer to populate with the normalized path.
167 * @param size buffer size.
168 * @param path directory path to clean up.
169 * @return
170 * - GIT_SUCCESS on success;
171 * - GIT_ERROR when the input path is invalid or escapes the current directory.
172 */
173 int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path, const char *base_path);
174
175 /**
176 * Clean up a provided absolute or relative file path.
177 *
178 * This prettification relies on basic operations such as coalescing
179 * multiple forward slashes into a single slash, removing '.' and
180 * './' current directory segments, and removing parent directory
181 * whenever '..' is encountered.
182 *
183 * For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3".
184 *
185 * This only performs a string based analysis of the path.
186 * No checks are done to make sure the path actually makes sense from
187 * the file system perspective.
188 *
189 * @param buffer_out buffer to populate with the normalized path.
190 * @param size buffer size.
191 * @param path file path to clean up.
192 * @return
193 * - GIT_SUCCESS on success;
194 * - GIT_ERROR when the input path is invalid or escapes the current directory.
195 */
196 int gitfo_prettify_file_path(char *buffer_out, size_t size, const char *path, const char *base_path);
197
198 int gitfo_retrieve_path_root_offset(const char *path);
199
200 #endif /* INCLUDE_fileops_h__ */