Remove dependency for {unistd,stdlib}.h in vcore.h (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / eventfd.c
1 /* Copyright (c) 2015 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Implementation of glibc's eventfd interface, hooking in to #eventfd */
6
7 #include <sys/eventfd.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14
15 /* Gets a new EFD instance, returning the FD on success. */
16 int eventfd(int initval, int flags)
17 {
18         const char *pathname = "#eventfd/efd";
19         int oflags = 0;
20         int efd;
21
22         /* we choose semaphore mode by passing 'sem' as the device spec */
23         if (flags & EFD_SEMAPHORE)
24                 pathname = "#eventfd.sem/efd";
25         if (flags & EFD_CLOEXEC)
26                 oflags |= O_CLOEXEC;
27         if (flags & EFD_NONBLOCK)
28                 oflags |= O_NONBLOCK;
29         efd = open(pathname, O_READ | O_WRITE | oflags);
30         if (efd < 0)
31                 return efd;
32         /* default initval for an #eventfd is 0. */
33         if (initval) {
34                 if (eventfd_write(efd, initval)) {
35                         close(efd);
36                         return -1;
37                 }
38         }
39         return efd;
40 }
41
42 /* Reads into *value, in host-endian format, from the efd.  Returns 0 on
43  * success.  */
44 int eventfd_read(int efd, eventfd_t *value)
45 {
46         int ret;
47         char num64[32];
48         ret = read(efd, num64, sizeof(num64));
49         if (ret <= 0)
50                 return -1;
51         *value = strtoul(num64, 0, 0);
52         return 0;
53 }
54
55 /* Writes value, in host-endian format, into the efd.  Returns 0 on success. */
56 int eventfd_write(int efd, eventfd_t value)
57 {
58         int ret;
59         char num64[32];
60         ret = snprintf(num64, sizeof(num64), "0x%llx", value);
61         if (write(efd, num64, ret) == ret)
62                 return 0;
63         else
64                 return -1;
65 }