#include #include #include #include #include #include #include #include ssize_t nwrite (int fd, const void *buf, size_t count) { ssize_t ret = 0; ssize_t written = 0; for (written = 0; written != count; written += ret) { ret = write (fd, buf + written, count - written); if (ret < 0) { if (errno == EINTR) ret = 0; else goto out; } } ret = written; out: return ret; } int file_write (char *filename, int bs, int count) { int fd = 0; int ret = -1; int i = 0; char *buf = NULL; bs = bs * 1024; buf = (char *) malloc (bs); if (buf == NULL) goto out; memset (buf, 0, bs); fd = open (filename, O_RDWR|O_CREAT|O_SYNC, 0600); while (i < count) { ret = nwrite(fd, buf, bs); if (ret == -1) { close (fd); goto out; } i++; } ret = fdatasync(fd); if (ret) { close (fd); goto out; } ret = close(fd); if (ret) goto out; ret = 0; out: if (buf) free (buf); return ret; } int main (int argc, char **argv) { if (argc != 4) { printf("Usage: %s \n", argv[0]); return EXIT_FAILURE; } if (file_write (argv[1], atoi(argv[2]), atoi(argv[3])) < 0) { perror ("write failed"); return EXIT_FAILURE; } return EXIT_SUCCESS; }