00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <config.h>
00017 #include <drizzled/internal/my_sys.h>
00018
00019 #include <errno.h>
00020 #include <fcntl.h>
00021
00022 #include <drizzled/error.h>
00023
00024 namespace drizzled
00025 {
00026 namespace internal
00027 {
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 int my_sync(int fd, myf my_flags)
00053 {
00054 int res;
00055
00056 do
00057 {
00058 #if defined(F_FULLFSYNC)
00059
00060
00061
00062
00063 if (!(res= fcntl(fd, F_FULLFSYNC, 0)))
00064 break;
00065
00066 #endif
00067 #if defined(HAVE_FDATASYNC)
00068 res= fdatasync(fd);
00069 #else
00070 res= fsync(fd);
00071 #endif
00072 } while (res == -1 && errno == EINTR);
00073
00074 if (res)
00075 {
00076 int er= errno;
00077 if (!(errno= er))
00078 errno= -1;
00079 if ((my_flags & MY_IGNORE_BADFD) &&
00080 (er == EBADF || er == EINVAL || er == EROFS))
00081 {
00082 res= 0;
00083 }
00084 else if (my_flags & MY_WME)
00085 my_error(EE_SYNC, MYF(ME_BELL+ME_WAITTANG), "unknown", errno);
00086 }
00087 return(res);
00088 }
00089
00090
00091 static const char cur_dir_name[]= {FN_CURLIB, 0};
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 #ifdef NEED_EXPLICIT_SYNC_DIR
00104 int my_sync_dir(const char *dir_name, myf my_flags)
00105 {
00106 int dir_fd;
00107 int res= 0;
00108 const char *correct_dir_name;
00109
00110 correct_dir_name= (dir_name[0] == 0) ? cur_dir_name : dir_name;
00111
00112
00113
00114
00115 if ((dir_fd= my_open(correct_dir_name, O_RDONLY, MYF(my_flags))) >= 0)
00116 {
00117 if (my_sync(dir_fd, MYF(my_flags | MY_IGNORE_BADFD)))
00118 res= 2;
00119 if (my_close(dir_fd, MYF(my_flags)))
00120 res= 3;
00121 }
00122 else
00123 res= 1;
00124 return(res);
00125 }
00126 #else
00127 int my_sync_dir(const char *, myf)
00128 {
00129 return 0;
00130 }
00131 #endif
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 #ifdef NEED_EXPLICIT_SYNC_DIR
00146 int my_sync_dir_by_file(const char *file_name, myf my_flags)
00147 {
00148 char dir_name[FN_REFLEN];
00149 size_t dir_name_length;
00150 dirname_part(dir_name, file_name, &dir_name_length);
00151 return my_sync_dir(dir_name, my_flags);
00152 }
00153 #else
00154 int my_sync_dir_by_file(const char *, myf)
00155 {
00156 return 0;
00157 }
00158 #endif
00159
00160 }
00161 }