summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRomain Geissler <romain.geissler@gmail.com>2011-06-03 21:18:24 +0200
committerRomain Geissler <romain.geissler@gmail.com>2011-06-03 23:08:42 +0200
commit1549cba9a4f7d9ad79441b748937bbe606ba79c1 (patch)
tree6fd6a4d881062713122f0cdf5e6fff58d4086f21 /src
parentbc6484912ebb3db2ac9637abebdeadd28f6d84c3 (diff)
downloadlibgit2-1549cba9a4f7d9ad79441b748937bbe606ba79c1.tar.gz
Filebuf: Fixed a TODO in filebuf (real lock in lock_file)
Added gitfo_creat_locked and gitfo_creat_locked_force
Diffstat (limited to 'src')
-rw-r--r--src/filebuf.c6
-rw-r--r--src/fileops.c14
-rw-r--r--src/fileops.h2
3 files changed, 18 insertions, 4 deletions
diff --git a/src/filebuf.c b/src/filebuf.c
index 63f2897cb..97dec83f3 100644
--- a/src/filebuf.c
+++ b/src/filebuf.c
@@ -41,16 +41,14 @@ static int lock_file(git_filebuf *file, int flags)
/* create path to the file buffer is required */
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 {
- file->fd = gitfo_creat(file->path_lock, 0644);
+ file->fd = gitfo_creat_locked(file->path_lock, 0644);
}
if (file->fd < 0)
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) {
git_file source;
char buffer[2048];
diff --git a/src/fileops.c b/src/fileops.c
index 11634c263..c407515f1 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -66,6 +66,20 @@ int gitfo_creat_force(const char *path, int 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)
{
char *b = buf;
diff --git a/src/fileops.h b/src/fileops.h
index aa225dca6..23f16542b 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -65,6 +65,8 @@ extern int gitfo_exists(const char *path);
extern int gitfo_open(const char *path, int flags);
extern int gitfo_creat(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_isdir(const char *path);
extern int gitfo_isfile(const char *path);