+ const int BUFFER_SIZE = 64*1024*1024;
+ int rc = 0;
+ char *buf;
+ unsigned int write_len;
+ unsigned int bytes_written;
+ off_t bytes_remaining = len;
+
+ if (len == 0 || offset < 0)
+ return EINVAL;
+
+ buf = malloc(BUFFER_SIZE);
+
+ if (buf == NULL)
+ return ENOMEM;
+
+ memset(buf, 0, BUFFER_SIZE);
+
+ if (lseek(fd, offset, SEEK_SET) == -1)
+ return errno;
+
+ while (bytes_remaining > 0) {
+ if (bytes_remaining < BUFFER_SIZE)
+ write_len = (unsigned int)bytes_remaining;
+ else
+ write_len = BUFFER_SIZE;
+
+ bytes_written = _write(fd, buf, write_len);
+ if (bytes_written == -1) {
+ rc = errno;
+ break;
+ }
+
+ bytes_remaining -= bytes_written;
+ }
+
+ free(buf);
+ return rc;