diff options
| -rw-r--r-- | src/utils/os.h | 7 | ||||
| -rw-r--r-- | src/utils/os_internal.c | 6 | ||||
| -rw-r--r-- | src/utils/os_none.c | 6 | ||||
| -rw-r--r-- | src/utils/os_unix.c | 8 | ||||
| -rw-r--r-- | src/utils/os_win32.c | 18 | ||||
| -rw-r--r-- | wpa_supplicant/config_file.c | 2 |
6 files changed, 47 insertions, 0 deletions
diff --git a/src/utils/os.h b/src/utils/os.h index 77250d63..8913854b 100644 --- a/src/utils/os.h +++ b/src/utils/os.h @@ -247,6 +247,13 @@ char * os_readfile(const char *name, size_t *len); int os_file_exists(const char *fname); /** + * os_fsync - Sync a file's (for a given stream) state with storage device + * @stream: the stream to be flushed + * Returns: 0 if the operation succeeded or -1 on failure + */ +int os_fsync(FILE *stream); + +/** * os_zalloc - Allocate and zero memory * @size: Number of bytes to allocate * Returns: Pointer to allocated and zeroed memory or %NULL on failure diff --git a/src/utils/os_internal.c b/src/utils/os_internal.c index 77733ad9..b8fb2dbd 100644 --- a/src/utils/os_internal.c +++ b/src/utils/os_internal.c @@ -243,6 +243,12 @@ char * os_readfile(const char *name, size_t *len) } +int os_fsync(FILE *stream) +{ + return 0; +} + + void * os_zalloc(size_t size) { void *n = os_malloc(size); diff --git a/src/utils/os_none.c b/src/utils/os_none.c index 83fe0251..96d243db 100644 --- a/src/utils/os_none.c +++ b/src/utils/os_none.c @@ -102,6 +102,12 @@ char * os_readfile(const char *name, size_t *len) } +int os_fsync(FILE *stream) +{ + return 0; +} + + void * os_zalloc(size_t size) { return NULL; diff --git a/src/utils/os_unix.c b/src/utils/os_unix.c index e0c1125d..ac73f7a6 100644 --- a/src/utils/os_unix.c +++ b/src/utils/os_unix.c @@ -415,6 +415,14 @@ int os_file_exists(const char *fname) } +int os_fsync(FILE *stream) +{ + if (!fflush(stream)) + return fsync(fileno(stream)); + return -1; +} + + #ifndef WPA_TRACE void * os_zalloc(size_t size) { diff --git a/src/utils/os_win32.c b/src/utils/os_win32.c index 296ea13f..890abf4f 100644 --- a/src/utils/os_win32.c +++ b/src/utils/os_win32.c @@ -216,6 +216,24 @@ char * os_readfile(const char *name, size_t *len) } +int os_fsync(FILE *stream) +{ + HANDLE hFile; + + if (stream == NULL) + return -1; + + hFile = _get_osfhandle(_fileno(stream)); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + + if (!FlushFileBuffers(hFile)) + return -1; + + return 0; +} + + void * os_zalloc(size_t size) { return calloc(1, size); diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index ae34f102..aeea70c1 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -1353,6 +1353,8 @@ int wpa_config_write(const char *name, struct wpa_config *config) } #endif /* CONFIG_NO_CONFIG_BLOBS */ + os_fsync(f); + fclose(f); if (tmp_name) { |
