summaryrefslogtreecommitdiff
path: root/ovsdb
diff options
context:
space:
mode:
authorBen Pfaff <blp@ovn.org>2017-12-05 09:30:26 -0800
committerBen Pfaff <blp@ovn.org>2017-12-24 11:47:33 -0800
commit1e0b7e94ecf35e06037b00099fa2f23e13954b99 (patch)
tree92dec31f7234a1c25e61d12c79f6179ad747098c /ovsdb
parentc7007aa7150b15b610ec0c8c737c2267788fa0ad (diff)
downloadopenvswitch-1e0b7e94ecf35e06037b00099fa2f23e13954b99.tar.gz
log: Add new open mode OVSDB_LOG_CREATE_EXCL.
Until now, OVSDB_LOG_CREATE implied EXCL, but this commit breaks them apart. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Justin Pettit <jpettit@ovn.org>
Diffstat (limited to 'ovsdb')
-rw-r--r--ovsdb/file.c2
-rw-r--r--ovsdb/log.c23
-rw-r--r--ovsdb/log.h3
-rw-r--r--ovsdb/ovsdb-tool.c2
4 files changed, 22 insertions, 8 deletions
diff --git a/ovsdb/file.c b/ovsdb/file.c
index 1c5573c32..983759e35 100644
--- a/ovsdb/file.c
+++ b/ovsdb/file.c
@@ -439,7 +439,7 @@ ovsdb_file_save_copy__(const char *file_name, int locking,
struct json *json;
error = ovsdb_log_open(file_name, OVSDB_MAGIC,
- OVSDB_LOG_CREATE, locking, &log);
+ OVSDB_LOG_CREATE_EXCL, locking, &log);
if (error) {
return error;
}
diff --git a/ovsdb/log.c b/ovsdb/log.c
index edce44310..b7f822274 100644
--- a/ovsdb/log.c
+++ b/ovsdb/log.c
@@ -96,11 +96,16 @@ ovsdb_log_open(const char *name, const char *magic,
lockfile = NULL;
}
- if (open_mode == OVSDB_LOG_READ_ONLY) {
+ switch (open_mode) {
+ case OVSDB_LOG_READ_ONLY:
flags = O_RDONLY;
- } else if (open_mode == OVSDB_LOG_READ_WRITE) {
+ break;
+
+ case OVSDB_LOG_READ_WRITE:
flags = O_RDWR;
- } else if (open_mode == OVSDB_LOG_CREATE) {
+ break;
+
+ case OVSDB_LOG_CREATE_EXCL:
#ifndef _WIN32
if (stat(name, &s) == -1 && errno == ENOENT
&& lstat(name, &s) == 0 && S_ISLNK(s.st_mode)) {
@@ -115,7 +120,13 @@ ovsdb_log_open(const char *name, const char *magic,
#else
flags = O_RDWR | O_CREAT | O_EXCL;
#endif
- } else {
+ break;
+
+ case OVSDB_LOG_CREATE:
+ flags = O_RDWR | O_CREAT;
+ break;
+
+ default:
OVS_NOT_REACHED();
}
#ifdef _WIN32
@@ -123,7 +134,9 @@ ovsdb_log_open(const char *name, const char *magic,
#endif
fd = open(name, flags, 0666);
if (fd < 0) {
- const char *op = open_mode == OVSDB_LOG_CREATE ? "create" : "open";
+ const char *op = (open_mode == OVSDB_LOG_CREATE_EXCL ? "create"
+ : open_mode == OVSDB_LOG_CREATE ? "create or open"
+ : "open");
error = ovsdb_io_error(errno, "%s: %s failed", name, op);
goto error_unlock;
}
diff --git a/ovsdb/log.h b/ovsdb/log.h
index 8bba3f1b7..a6cba58e1 100644
--- a/ovsdb/log.h
+++ b/ovsdb/log.h
@@ -27,7 +27,8 @@ struct ovsdb_log;
enum ovsdb_log_open_mode {
OVSDB_LOG_READ_ONLY, /* Open existing file, read-only. */
OVSDB_LOG_READ_WRITE, /* Open existing file, read/write. */
- OVSDB_LOG_CREATE /* Create new file, read/write. */
+ OVSDB_LOG_CREATE_EXCL, /* Create new file, read/write. */
+ OVSDB_LOG_CREATE /* Create or open file, read/write. */
};
#define OVSDB_MAGIC "OVSDB JSON"
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 157ebabc7..4343e3ce5 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -220,7 +220,7 @@ do_create(struct ovs_cmdl_context *ctx)
/* Create database file. */
check_ovsdb_error(ovsdb_log_open(db_file_name, OVSDB_MAGIC,
- OVSDB_LOG_CREATE, -1, &log));
+ OVSDB_LOG_CREATE_EXCL, -1, &log));
check_ovsdb_error(ovsdb_log_write(log, json));
check_ovsdb_error(ovsdb_log_commit(log));
ovsdb_log_close(log);