1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#include "../git-compat-util.h"
#include "system.h"
#include "basics.h"
#include "reftable-error.h"
#include "../lockfile.h"
#include "../tempfile.h"
uint32_t reftable_rand(void)
{
return git_rand(CSPRNG_BYTES_INSECURE);
}
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;
}
|