1 #include "compat-util.h"
5 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
6 static int have_fdatasync
= 1;
8 static int have_fdatasync
;
11 /* TODO: sync_file_range() if on Linux */
13 static int usage(const char * argv0
)
15 fprintf(stderr
, "Usage: %s [-d] [-D] FILE...\n", argv0
);
19 static int do_sync(const char *path
, int data_only
, int directory
)
22 const char *errfunc
= "";
24 if ((fd
= open(path
, O_RDWR
|O_NOATIME
)) < 0) {
25 if (errno
== EISDIR
) {
33 if (data_only
&& have_fdatasync
) {
34 if (fdatasync(fd
) < 0) {
35 errfunc
= "fdatasync";
55 if (!(dpath
= strdup(path
))){
59 if (!(dir
= opendir(dirname(dpath
)))) {
63 if (fsync(dirfd(dir
)) < 0) {
64 errfunc
= "(directory) fsync";
67 if (closedir(dir
) < 0) {
76 fprintf(stderr
, "%s: %s(): %s\n", path
, errfunc
, strerror(errno
));
80 int main(int argc
, char * const argv
[])
87 while ((opt
= getopt(argc
, argv
, "dD")) != -1) {
97 return usage(argv
[0]);
102 return usage(argv
[0]);
104 for (; argi
< argc
; ++argi
) {
105 if (do_sync(argv
[argi
], data_only
, directory
) < 0)