mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-04 18:56:59 +00:00
Filebuf: Fixed a TODO in filebuf (real lock in lock_file)
Added gitfo_creat_locked and gitfo_creat_locked_force
This commit is contained in:
parent
bc6484912e
commit
1549cba9a4
@ -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)
|
|||||||
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);
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user