eventfd: Use write_hex_to_fd() (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 #include <sys/plan9_helpers.h>
15
16 /* Gets a new EFD instance, returning the FD on success. */
17 int eventfd(int initval, int flags)
18 {
19         const char *pathname = "#eventfd/efd";
20         int oflags = 0;
21         int efd;
22
23         /* we choose semaphore mode by passing 'sem' as the device spec */
24         if (flags & EFD_SEMAPHORE)
25                 pathname = "#eventfd.sem/efd";
26         if (flags & EFD_CLOEXEC)
27                 oflags |= O_CLOEXEC;
28         if (flags & EFD_NONBLOCK)
29                 oflags |= O_NONBLOCK;
30         efd = open(pathname, O_READ | O_WRITE | oflags);
31         if (efd < 0)
32                 return efd;
33         /* default initval for an #eventfd is 0. */
34         if (initval) {
35                 if (eventfd_write(efd, initval)) {
36                         close(efd);
37                         return -1;
38                 }
39         }
40         return efd;
41 }
42
43 /* Reads into *value, in host-endian format, from the efd.  Returns 0 on
44  * success.  */
45 int eventfd_read(int efd, eventfd_t *value)
46 {
47         int ret;
48         char num64[32];
49         ret = read(efd, num64, sizeof(num64));
50         if (ret <= 0)
51                 return -1;
52         *value = strtoul(num64, 0, 0);
53         return 0;
54 }
55
56 /* Writes value, in host-endian format, into the efd.  Returns 0 on success. */
57 int eventfd_write(int efd, eventfd_t value)
58 {
59         return write_hex_to_fd(efd, value);
60 }