Fio 2.0.8
[fio.git] / os / windows / posix.c
index 27793cbd85fa7b1193d39d4312e0e3ba0776395a..9ef369e1d313af14440e7f38618afddafb8322a2 100755 (executable)
@@ -98,7 +98,7 @@ int gettimeofday(struct timeval *restrict tp, void *restrict tzp)
        unsigned long long unix_time, windows_time;
        const time_t MILLISECONDS_BETWEEN_1601_AND_1970 = 11644473600000;
 
-       // Ignore the timezone parameter
+       /* Ignore the timezone parameter */
        (void)tzp;
 
        /*
@@ -124,8 +124,17 @@ void syslog(int priority, const char *message, ... /* argument */)
 int sigaction(int sig, const struct sigaction *act,
                struct sigaction *oact)
 {
-       errno = ENOSYS;
-       return (-1);
+       int rc = 0;
+       void (*prev_handler)(int);
+
+       prev_handler = signal(sig, act->sa_handler);
+       if (oact != NULL)
+               oact->sa_handler = prev_handler;
+
+       if (prev_handler == SIG_ERR)
+               rc = -1;
+
+       return rc;
 }
 
 int lstat(const char * path, struct stat * buf)
@@ -191,12 +200,16 @@ int kill(pid_t pid, int sig)
        return (-1);
 }
 
-// This is assumed to be used only by the network code,
-// and so doesn't try and handle any of the other cases
+/*
+ * This is assumed to be used only by the network code,
+ * and so doesn't try and handle any of the other cases
+ */
 int fcntl(int fildes, int cmd, ...)
 {
-       // non-blocking mode doesn't work the same as in BSD sockets,
-       // so ignore it.
+       /*
+        * non-blocking mode doesn't work the same as in BSD sockets,
+        * so ignore it.
+        */
 #if 0
        va_list ap;
        int val, opt, status;
@@ -318,9 +331,43 @@ char *basename(char *path)
 
 int posix_fallocate(int fd, off_t offset, off_t len)
 {
-       log_err("%s is not implemented\n", __func__);
-       errno = ENOSYS;
-       return (-1);
+       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;
 }
 
 int ftruncate(int fildes, off_t length)
@@ -440,7 +487,7 @@ int posix_madvise(void *addr, size_t len, int advice)
        return ENOSYS;
 }
 
-// Windows doesn't support advice for memory pages. Just ignore it.
+/* Windows doesn't support advice for memory pages. Just ignore it. */
 int msync(void *addr, size_t len, int flags)
 {
        log_err("%s is not implemented\n", __func__);
@@ -532,7 +579,7 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout)
        int rc;
 
        if (timeout != -1)
-               to = &tv;               
+               to = &tv;
 
        to->tv_sec = timeout / 1000;
        to->tv_usec = (timeout % 1000) * 1000;
@@ -554,7 +601,7 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout)
                if (fds[i].events & POLLOUT)
                        FD_SET(fds[i].fd, &writefds);
 
-               FD_SET(fds[i].fd, &exceptfds);          
+               FD_SET(fds[i].fd, &exceptfds);
        }
 
        rc = select(nfds, &readfds, &writefds, &exceptfds, to);