fs-posix.c revision e5974bef94e235504e262654cef98f7fda6df327
/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "buffer.h"
#include "str.h"
#include "istream.h"
#include "ostream.h"
#include "safe-mkstemp.h"
#include "mkdir-parents.h"
#include "write-full.h"
#include "file-lock.h"
#include "file-dotlock.h"
#include "fs-api-private.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_MKDIR_RETRY_COUNT 5
enum fs_posix_lock_method {
};
struct posix_fs {
char *temp_file_prefix;
};
struct posix_fs_file {
char *temp_path;
int fd;
enum fs_open_mode open_mode;
enum fs_open_flags open_flags;
bool seek_to_beginning;
bool success;
};
struct posix_fs_lock {
};
static struct fs *
{
if (*args == '\0')
else
}
{
}
{
return 1;
return 0;
return 1;
else {
return -1;
}
}
static int
char **temp_path_r)
{
unsigned int try_count = 0;
int fd;
(flags & FS_OPEN_FLAG_MKDIR) != 0) {
return -1;
try_count++;
}
if (fd == -1) {
return -1;
}
return fd;
}
static int
{
struct posix_fs_file *file;
int fd = -1;
switch (mode) {
case FS_OPEN_MODE_RDONLY:
if (fd == -1)
break;
case FS_OPEN_MODE_APPEND:
if (fd == -1)
break;
case FS_OPEN_MODE_CREATE:
case FS_OPEN_MODE_REPLACE:
T_BEGIN {
} T_END;
break;
}
if (fd == -1)
return -1;
return 0;
}
{
case FS_OPEN_MODE_RDONLY:
case FS_OPEN_MODE_APPEND:
break;
case FS_OPEN_MODE_CREATE:
case FS_OPEN_MODE_REPLACE:
break;
}
break;
}
}
}
}
{
if (file->seek_to_beginning) {
return -1;
}
}
if (ret < 0)
return ret;
}
static struct istream *
{
}
{
int ret;
return -1;
}
return -1;
}
case FS_OPEN_MODE_CREATE:
}
}
if (ret < 0)
return -1;
break;
case FS_OPEN_MODE_REPLACE:
return -1;
}
break;
default:
i_unreached();
}
return 0;
}
{
return -1;
}
return fs_posix_write_finish(file);
}
/* atomic append - it should either succeed or fail */
if (ret < 0) {
return -1;
}
return -1;
}
return 0;
}
{
return;
}
}
{
ret = -1;
}
case FS_OPEN_MODE_APPEND:
if (ret == 0) {
}
break;
case FS_OPEN_MODE_CREATE:
case FS_OPEN_MODE_REPLACE:
if (ret == 0)
break;
case FS_OPEN_MODE_RDONLY:
i_unreached();
}
return ret;
}
static int
{
#ifdef HAVE_FLOCK
#endif
struct dotlock_settings dotlock_set;
int ret = -1;
switch (fs->lock_method) {
#ifndef HAVE_FLOCK
#else
if (secs == 0) {
} else {
}
if (ret < 0) {
}
#endif
break;
secs == 0 ? 0 :
if (ret < 0) {
"file_dotlock_create(%s) failed: %m",
}
break;
}
if (ret <= 0)
return ret;
return 1;
}
{
}
{
return -1;
}
return 0;
}
{
return -1;
}
return 0;
}
return 1;
}
{
return -1;
}
return 0;
}
{
unsigned int try_count = 0;
int ret;
return -1;
try_count++;
}
if (ret < 0) {
return -1;
}
return 0;
}
{
unsigned int try_count = 0;
int ret;
return -1;
try_count++;
}
if (ret < 0) {
return -1;
}
return 0;
}
{
return -1;
}
return 0;
}
{
return -1;
}
return 0;
}
struct fs fs_class_posix = {
.name = "posix",
.v = {
}
};