Mercurial > remote-gamepad-server
comparison service.c @ 0:e70ea46d6073
Initial import from http://wouhanegaine.free.fr/dev/DSPad02b_neo07.zip
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 22 Feb 2015 01:38:06 +0100 |
parents | |
children | f362b20de51e |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e70ea46d6073 |
---|---|
1 #include "service.h" | |
2 #include "uinput.h" | |
3 #include "ds.h" | |
4 #include "restartOp.h" | |
5 | |
6 #include <stdio.h> | |
7 #include <sys/types.h> | |
8 #include <sys/socket.h> | |
9 #include <netinet/in.h> | |
10 #include <stdlib.h> | |
11 #include <string.h> | |
12 | |
13 | |
14 /* | |
15 Create a socket | |
16 Returns socket descriptor (-1 if error) | |
17 */ | |
18 int create_socket(unsigned short *port, int type){ | |
19 int sock, autorisation , ok; | |
20 struct sockaddr_in add; | |
21 socklen_t l = sizeof(struct sockaddr_in); | |
22 | |
23 sock = socket(PF_INET, type, 0); | |
24 if(sock == -1){ | |
25 perror("socket"); | |
26 return -1; | |
27 } | |
28 | |
29 /* Pour pouvoir relancer immediatement un serveur TCP */ | |
30 /* ou lancer, sur une meme machine, */ | |
31 /* plusieurs recepteurs UDP sur */ | |
32 /* le meme port de diffusion (broadcast, multicast) */ | |
33 autorisation = 1; | |
34 ok = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &autorisation, sizeof(int)); | |
35 if(ok == -1){ | |
36 perror("setsockopt"); | |
37 return -1; | |
38 } | |
39 | |
40 memset(&add, 0, l) ; | |
41 add.sin_family = AF_INET ; | |
42 add.sin_port = htons(*port); | |
43 add.sin_addr.s_addr = htonl(INADDR_ANY); | |
44 | |
45 ok = bind(sock, (struct sockaddr*)&add, l); | |
46 if(ok == -1){ | |
47 perror("bind"); | |
48 return -1; | |
49 } | |
50 | |
51 ok = getsockname(sock, (struct sockaddr*)&add, &l); | |
52 if(ok == -1){ | |
53 perror("getsockname"); | |
54 return -1; | |
55 } | |
56 | |
57 *port = ntohs(add.sin_port); | |
58 return sock; | |
59 } | |
60 | |
61 | |
62 | |
63 /* | |
64 Receive a DS datagram | |
65 Returns size read or -1 | |
66 */ | |
67 ssize_t receive_ds_info(int socket, ds_t* ds){ | |
68 struct sockaddr_in add; | |
69 socklen_t l = sizeof(struct sockaddr_in); | |
70 | |
71 ssize_t result; | |
72 | |
73 result = recvfrom_rs(socket, ds, sizeof(ds_t), 0, (struct sockaddr*)&add, &l); | |
74 if(result == -1) perror("recvfrom_rs"); | |
75 return result; | |
76 } | |
77 | |
78 | |
79 /* | |
80 Start the listening service yeah! | |
81 */ | |
82 void start_service(void){ | |
83 | |
84 int uinput_fd; | |
85 int sock_fd; | |
86 uint16_t udp_port = base_port + curdev; | |
87 | |
88 ds_t ds; | |
89 ssize_t result; | |
90 | |
91 | |
92 fprintf(stdout, " [%d] Creation of service:\n", curdev); | |
93 | |
94 // Create joystick dev | |
95 uinput_fd = init_uinput_device(); | |
96 if(uinput_fd == -1){ | |
97 fprintf(stderr, " [%d] Joystick device failed\n", curdev); | |
98 exit(EXIT_FAILURE); | |
99 } | |
100 fprintf(stdout, " [%d] Joystick device OK\n", curdev); | |
101 | |
102 | |
103 // Create udp socket | |
104 sock_fd = create_socket(&udp_port, SOCK_DGRAM); | |
105 if(sock_fd == -1){ | |
106 fprintf(stderr, " [%d] Socket failed\n", curdev); | |
107 exit(EXIT_FAILURE); | |
108 } | |
109 fprintf(stdout, " [%d] Socket on port %d OK\n", curdev, udp_port); | |
110 | |
111 | |
112 // Device and Socket are ok :-D | |
113 fprintf(stdout, " [%d] Creation of service: OK\n", curdev); | |
114 | |
115 | |
116 /* Center device axis when created */ | |
117 do_uinput(uinput_fd, ABS_Y, DS_MAX_Y/2, EV_ABS); | |
118 do_uinput(uinput_fd, ABS_X, DS_MAX_X/2, EV_ABS); | |
119 | |
120 while(1){ | |
121 result = receive_ds_info(sock_fd, &ds); | |
122 if(result == -1){ | |
123 fprintf(stderr, " [%d] DS Info receive failed\n", curdev); | |
124 } | |
125 if(result > 0){ | |
126 ds_process_evt(&ds, uinput_fd); | |
127 } | |
128 } | |
129 | |
130 return; | |
131 } | |
132 | |
133 | |
134 |