127 lines
2.4 KiB
C
127 lines
2.4 KiB
C
#include "system.h"
|
|
#include "basics.h"
|
|
#include "reftable-error.h"
|
|
#include "../lockfile.h"
|
|
#include "../tempfile.h"
|
|
|
|
int tmpfile_from_pattern(struct reftable_tmpfile *out, const char *pattern)
|
|
{
|
|
struct tempfile *tempfile;
|
|
|
|
tempfile = mks_tempfile(pattern);
|
|
if (!tempfile)
|
|
return REFTABLE_IO_ERROR;
|
|
|
|
out->path = tempfile->filename.buf;
|
|
out->fd = tempfile->fd;
|
|
out->priv = tempfile;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int tmpfile_close(struct reftable_tmpfile *t)
|
|
{
|
|
struct tempfile *tempfile = t->priv;
|
|
int ret = close_tempfile_gently(tempfile);
|
|
t->fd = -1;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
return 0;
|
|
}
|
|
|
|
int tmpfile_delete(struct reftable_tmpfile *t)
|
|
{
|
|
struct tempfile *tempfile = t->priv;
|
|
int ret = delete_tempfile(&tempfile);
|
|
*t = REFTABLE_TMPFILE_INIT;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
return 0;
|
|
}
|
|
|
|
int tmpfile_rename(struct reftable_tmpfile *t, const char *path)
|
|
{
|
|
struct tempfile *tempfile = t->priv;
|
|
int ret = rename_tempfile(&tempfile, path);
|
|
*t = REFTABLE_TMPFILE_INIT;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
return 0;
|
|
}
|
|
|
|
int flock_acquire(struct reftable_flock *l, const char *target_path,
|
|
long timeout_ms)
|
|
{
|
|
struct lock_file *lockfile;
|
|
int err;
|
|
|
|
lockfile = reftable_malloc(sizeof(*lockfile));
|
|
if (!lockfile)
|
|
return REFTABLE_OUT_OF_MEMORY_ERROR;
|
|
|
|
err = hold_lock_file_for_update_timeout(lockfile, target_path, LOCK_NO_DEREF,
|
|
timeout_ms);
|
|
if (err < 0) {
|
|
reftable_free(lockfile);
|
|
if (errno == EEXIST)
|
|
return REFTABLE_LOCK_ERROR;
|
|
return -1;
|
|
}
|
|
|
|
l->fd = get_lock_file_fd(lockfile);
|
|
l->path = get_lock_file_path(lockfile);
|
|
l->priv = lockfile;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int flock_close(struct reftable_flock *l)
|
|
{
|
|
struct lock_file *lockfile = l->priv;
|
|
int ret;
|
|
|
|
if (!lockfile)
|
|
return REFTABLE_API_ERROR;
|
|
|
|
ret = close_lock_file_gently(lockfile);
|
|
l->fd = -1;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int flock_release(struct reftable_flock *l)
|
|
{
|
|
struct lock_file *lockfile = l->priv;
|
|
int ret;
|
|
|
|
if (!lockfile)
|
|
return 0;
|
|
|
|
ret = rollback_lock_file(lockfile);
|
|
reftable_free(lockfile);
|
|
*l = REFTABLE_FLOCK_INIT;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int flock_commit(struct reftable_flock *l)
|
|
{
|
|
struct lock_file *lockfile = l->priv;
|
|
int ret;
|
|
|
|
if (!lockfile)
|
|
return REFTABLE_API_ERROR;
|
|
|
|
ret = commit_lock_file(lockfile);
|
|
reftable_free(lockfile);
|
|
*l = REFTABLE_FLOCK_INIT;
|
|
if (ret < 0)
|
|
return REFTABLE_IO_ERROR;
|
|
|
|
return 0;
|
|
}
|