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