Fix minor typo in discover-client file descriptor check
[petitboot] / ui / common / joystick.c
1 /*
2  *  Copyright (C) 2009 Sony Computer Entertainment Inc.
3  *  Copyright 2009 Sony Corp.
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; version 2 of the License.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #if defined(HAVE_CONFIG_H)
20 #include "config.h"
21 #endif
22
23 #define _GNU_SOURCE
24 #include <assert.h>
25 #include <errno.h>
26 #include <fcntl.h>
27 #include <string.h>
28 #include <sys/stat.h>
29 #include <sys/types.h>
30
31 #include "log/log.h"
32 #include "talloc/talloc.h"
33 #include "joystick.h"
34
35 /**
36  * pjs_process_event - Read joystick event and map to UI key code.
37  *
38  * Returns a map routine UI key code or zero.
39  */
40
41 int pjs_process_event(const struct pjs *pjs)
42 {
43         int result;
44         struct js_event e;
45
46         assert(pjs->fd);
47
48         result = read(pjs->fd, &e, sizeof(e));
49
50         if (result != sizeof(e)) {
51                 pb_log("%s: read failed: %s\n", __func__, strerror(errno));
52                 return 0;
53         }
54
55         return pjs->map(&e);
56 }
57
58 /**
59  * pjs_destructor - The talloc destructor for a joystick handler.
60  */
61
62 static int pjs_destructor(void *arg)
63 {
64         struct pjs *pjs = pjs_from_arg(arg);
65
66         close(pjs->fd);
67         pjs->fd = 0;
68
69         return 0;
70 }
71
72 /**
73  * pjs_init - Initialize the joystick event handler.
74  */
75
76 struct pjs *pjs_init(void *ctx, int (*map)(const struct js_event *))
77 {
78         static const char dev_name[] = "/dev/input/js0";
79         struct pjs *pjs;
80
81         pjs = talloc_zero(ctx, struct pjs);
82
83         if (!pjs)
84                 return NULL;
85
86         pjs->map = map;
87         pjs->fd = open(dev_name, O_RDONLY | O_NONBLOCK);
88
89         if (pjs->fd < 0) {
90                 pb_log("%s: open %s failed: %s\n", __func__, dev_name,
91                         strerror(errno));
92                 goto out_err;
93         }
94
95         talloc_set_destructor(pjs, pjs_destructor);
96
97         pb_log("%s: using %s\n", __func__, dev_name);
98
99         return pjs;
100
101 out_err:
102         close(pjs->fd);
103         pjs->fd = 0;
104         talloc_free(pjs);
105         return NULL;
106 }