Commit 1549cba9 by Romain Geissler

Filebuf: Fixed a TODO in filebuf (real lock in lock_file)

Added gitfo_creat_locked and gitfo_creat_locked_force
parent bc648491
...@@ -41,16 +41,14 @@ static int lock_file(git_filebuf *file, int flags) ...@@ -41,16 +41,14 @@ static int lock_file(git_filebuf *file, int flags)
/* create path to the file buffer is required */ /* create path to the file buffer is required */
if (flags & GIT_FILEBUF_FORCE) { if (flags & GIT_FILEBUF_FORCE) {
file->fd = gitfo_creat_force(file->path_lock, 0644); file->fd = gitfo_creat_locked_force(file->path_lock, 0644);
} else { } else {
file->fd = gitfo_creat(file->path_lock, 0644); file->fd = gitfo_creat_locked(file->path_lock, 0644);
} }
if (file->fd < 0) if (file->fd < 0)
return git__throw(GIT_EOSERR, "Failed to create lock"); return git__throw(GIT_EOSERR, "Failed to create lock");
/* TODO: do a flock() in the descriptor file_lock */
if ((flags & GIT_FILEBUF_APPEND) && gitfo_exists(file->path_original) == 0) { if ((flags & GIT_FILEBUF_APPEND) && gitfo_exists(file->path_original) == 0) {
git_file source; git_file source;
char buffer[2048]; char buffer[2048];
......
...@@ -66,6 +66,20 @@ int gitfo_creat_force(const char *path, int mode) ...@@ -66,6 +66,20 @@ int gitfo_creat_force(const char *path, int mode)
return gitfo_creat(path, mode); return gitfo_creat(path, mode);
} }
int gitfo_creat_locked(const char *path, int mode)
{
int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_EXCL, mode);
return fd >= 0 ? fd : git__throw(GIT_EOSERR, "Failed to create locked file. Could not open %s", path);
}
int gitfo_creat_locked_force(const char *path, int mode)
{
if (gitfo_mkdir_2file(path) < GIT_SUCCESS)
return git__throw(GIT_EOSERR, "Failed to create locked file %s", path);
return gitfo_creat_locked(path, mode);
}
int gitfo_read(git_file fd, void *buf, size_t cnt) int gitfo_read(git_file fd, void *buf, size_t cnt)
{ {
char *b = buf; char *b = buf;
......
...@@ -65,6 +65,8 @@ extern int gitfo_exists(const char *path); ...@@ -65,6 +65,8 @@ extern int gitfo_exists(const char *path);
extern int gitfo_open(const char *path, int flags); extern int gitfo_open(const char *path, int flags);
extern int gitfo_creat(const char *path, int mode); extern int gitfo_creat(const char *path, int mode);
extern int gitfo_creat_force(const char *path, int mode); extern int gitfo_creat_force(const char *path, int mode);
extern int gitfo_creat_locked(const char *path, int mode);
extern int gitfo_creat_locked_force(const char *path, int mode);
extern int gitfo_mktemp(char *path_out, const char *filename); extern int gitfo_mktemp(char *path_out, const char *filename);
extern int gitfo_isdir(const char *path); extern int gitfo_isdir(const char *path);
extern int gitfo_isfile(const char *path); extern int gitfo_isfile(const char *path);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment