diff options
-rw-r--r-- | src/nvim/shada.c | 75 |
1 files changed, 14 insertions, 61 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 412bf54516..53100dc081 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -386,26 +386,6 @@ struct sd_read_def { ///< reader structure initialization). May overflow. }; -typedef struct sd_write_def ShaDaWriteDef; - -/// Function used to close files defined by ShaDaWriteDef -typedef void (*ShaDaWriteCloser)(ShaDaWriteDef *const sd_writer) - REAL_FATTR_NONNULL_ALL; - -/// Function used to write ShaDa files -typedef ptrdiff_t (*ShaDaFileWriter)(ShaDaWriteDef *const sd_writer, - const void *const src, - const size_t size) - REAL_FATTR_NONNULL_ALL REAL_FATTR_WARN_UNUSED_RESULT; - -/// Structure containing necessary pointers for writing ShaDa files -struct sd_write_def { - ShaDaFileWriter write; ///< Writer function. - ShaDaWriteCloser close; ///< Close function. - FileDescriptor cookie; ///< Data describing object written to. - const char *error; ///< Error message in case of error. -}; - #ifdef INCLUDE_GENERATED_DECLARATIONS # include "shada.c.generated.h" #endif @@ -636,21 +616,6 @@ static int read_char(ShaDaReadDef *const sd_reader) return (int)ret; } -/// Wrapper for writing to file descriptors -/// -/// @return -1 or number of bytes written. -static ptrdiff_t write_file(ShaDaWriteDef *const sd_writer, const void *const dest, - const size_t size) - FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT -{ - const ptrdiff_t ret = file_write(&sd_writer->cookie, dest, size); - if (ret < 0) { - sd_writer->error = os_strerror((int)ret); - return -1; - } - return ret; -} - /// Wrapper for closing file descriptors opened for reading static void close_sd_reader(ShaDaReadDef *const sd_reader) FUNC_ATTR_NONNULL_ALL @@ -659,13 +624,6 @@ static void close_sd_reader(ShaDaReadDef *const sd_reader) xfree(sd_reader->cookie); } -/// Wrapper for closing file descriptors opened for writing -static void close_sd_writer(ShaDaWriteDef *const sd_writer) - FUNC_ATTR_NONNULL_ALL -{ - close_file(&sd_writer->cookie); -} - /// Wrapper for read that reads to IObuff and ignores bytes read /// /// Used for skipping. @@ -753,7 +711,7 @@ static int open_shada_file_for_reading(const char *const fname, ShaDaReadDef *sd } /// Wrapper for closing file descriptors -static void close_file(void *cookie) +static void close_file(FileDescriptor *cookie) { const int error = file_close(cookie, !!p_fs); if (error != 0) { @@ -762,16 +720,17 @@ static void close_file(void *cookie) } } -/// Msgpack callback for writing to ShaDaWriteDef* +/// Msgpack callback for writing to FileDescriptor* static int msgpack_sd_writer_write(void *data, const char *buf, size_t len) { - ShaDaWriteDef *const sd_writer = (ShaDaWriteDef *)data; - ptrdiff_t written_bytes = sd_writer->write(sd_writer, buf, len); - if (written_bytes == -1) { + FileDescriptor *const sd_writer = (FileDescriptor *)data; + const ptrdiff_t ret = file_write(sd_writer, buf, len); + if (ret < 0) { semsg(_(SERR "System error while writing ShaDa file: %s"), - sd_writer->error); + os_strerror((int)ret)); return -1; } + return 0; } @@ -2524,7 +2483,7 @@ static int hist_type2char(const int type) /// @param[in] sd_reader Structure containing file reader definition. If it is /// not NULL then contents of this file will be merged /// with current Neovim runtime. -static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer, ShaDaReadDef *const sd_reader) +static ShaDaWriteResult shada_write(FileDescriptor *const sd_writer, ShaDaReadDef *const sd_reader) FUNC_ATTR_NONNULL_ARG(1) { ShaDaWriteResult ret = kSDWriteSuccessful; @@ -2998,11 +2957,7 @@ int shada_write_file(const char *const file, bool nomerge) char *const fname = shada_filename(file); char *tempname = NULL; - ShaDaWriteDef sd_writer = { - .write = &write_file, - .close = &close_sd_writer, - .error = NULL, - }; + FileDescriptor sd_writer; ShaDaReadDef sd_reader = { .close = NULL }; bool did_open_writer = false; @@ -3034,7 +2989,7 @@ int shada_write_file(const char *const file, bool nomerge) // 3: If somebody happened to delete the file after it was opened for // reading use u=rw permissions. shada_write_file_open: {} - error = file_open(&sd_writer.cookie, tempname, kFileCreateOnly|kFileNoSymlink, perm); + error = file_open(&sd_writer, tempname, kFileCreateOnly|kFileNoSymlink, perm); if (error) { if (error == UV_EEXIST || error == UV_ELOOP) { // File already exists, try another name @@ -3080,7 +3035,7 @@ shada_write_file_nomerge: {} } *tail = tail_save; } - int error = file_open(&sd_writer.cookie, fname, kFileCreate|kFileTruncate, 0600); + int error = file_open(&sd_writer, fname, kFileCreate|kFileTruncate, 0600); if (error) { semsg(_(SERR "System error while opening ShaDa file %s for writing: %s"), fname, os_strerror(error)); @@ -3104,9 +3059,7 @@ shada_write_file_nomerge: {} verbose_leave(); } - const ShaDaWriteResult sw_ret = shada_write(&sd_writer, (nomerge - ? NULL - : &sd_reader)); + const ShaDaWriteResult sw_ret = shada_write(&sd_writer, (nomerge ? NULL : &sd_reader)); assert(sw_ret != kSDWriteIgnError); if (!nomerge) { sd_reader.close(&sd_reader); @@ -3136,7 +3089,7 @@ shada_write_file_nomerge: {} || old_info.stat.st_gid != getgid()) { const uv_uid_t old_uid = (uv_uid_t)old_info.stat.st_uid; const uv_gid_t old_gid = (uv_gid_t)old_info.stat.st_gid; - const int fchown_ret = os_fchown(file_fd(&sd_writer.cookie), + const int fchown_ret = os_fchown(file_fd(&sd_writer), old_uid, old_gid); if (fchown_ret != 0) { semsg(_(RNERR "Failed setting uid and gid for file %s: %s"), @@ -3169,7 +3122,7 @@ shada_write_file_did_not_remove: } xfree(tempname); } - sd_writer.close(&sd_writer); + close_file(&sd_writer); xfree(fname); return OK; |