#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; }