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;
}
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)) {
#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
#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;
}
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"
/* 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);
file: read: {"x":1}
]], [ignore])
AT_CHECK(
- [test-ovsdb log-io file create read], [1],
+ [test-ovsdb log-io file create-excl read], [1],
[], [test-ovsdb: I/O error: file: create failed (File exists)
])
+AT_CHECK(
+ [test-ovsdb log-io file create read], [0],
+ [file: open successful
+file: read: {"x":1}
+])
AT_CHECK([test -f .file.~lock~])
AT_CLEANUP
mode = OVSDB_LOG_READ_WRITE;
} else if (!strcmp(mode_string, "create")) {
mode = OVSDB_LOG_CREATE;
+ } else if (!strcmp(mode_string, "create-excl")) {
+ mode = OVSDB_LOG_CREATE_EXCL;
} else {
ovs_fatal(0, "unknown log-io open mode \"%s\"", mode_string);
}