2 * This file is part of samsung-ril.
4 * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr>
6 * samsung-ril is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * samsung-ril is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with samsung-ril. If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/types.h>
23 #include <sys/socket.h>
25 #include <sys/select.h>
27 #include <arpa/inet.h>
28 #include <netinet/in.h>
29 #include <cutils/sockets.h>
31 #define LOG_TAG "RIL-SRS"
32 #include <utils/Log.h>
34 #include "samsung-ril.h"
37 static int srs_server_send_message(int client_fd, struct srs_message *message)
41 struct srs_header header;
44 header.length = message->data_len + sizeof(header);
45 header.group = SRS_GROUP(message->command);
46 header.index = SRS_INDEX(message->command);
48 data = malloc(header.length);
49 memset(data, 0, header.length);
51 memcpy(data, &header, sizeof(header));
52 memcpy((void *) ((char*)data + sizeof(header)),
53 message->data, message->data_len);
56 FD_SET(client_fd, &fds);
58 select(FD_SETSIZE, NULL, &fds, NULL, NULL);
60 write(client_fd, data, header.length);
67 static int srs_server_send(int fd, unsigned short command, void *data,
70 struct srs_message message;
73 message.command = command;
75 message.data_len = data_len;
77 rc = srs_server_send_message(fd, &message);
82 static int srs_server_recv(int client_fd, struct srs_message *message)
84 void *raw_data = malloc(SRS_DATA_MAX_SIZE);
85 struct srs_header *header;
88 rc = read(client_fd, raw_data, SRS_DATA_MAX_SIZE);
89 if(rc < (int)sizeof(struct srs_header)) {
95 message->command = SRS_COMMAND(header);
96 message->data_len = header->length - sizeof(struct srs_header);
97 message->data = malloc(message->data_len);
99 memcpy(message->data, (char*)raw_data + sizeof(struct srs_header),
107 void srs_control_ping(int fd, struct srs_message *message)
111 if(message->data == NULL)
114 caffe=*((int *) message->data);
116 if(caffe == SRS_CONTROL_CAFFE) {
117 srs_server_send(fd, SRS_CONTROL_PING, &caffe, sizeof(caffe));
121 static int srs_server_open(void)
128 unlink(SRS_SOCKET_NAME);
129 server_fd = socket_local_server(SRS_SOCKET_NAME, ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
140 static void* srs_process_client(void *pfd)
142 struct srs_message srs_message;
146 LOGE("SRS client data is NULL");
150 client_fd = ((int*)pfd)[0];
157 FD_SET(client_fd, &fds);
159 select(FD_SETSIZE, &fds, NULL, NULL, NULL);
161 if (FD_ISSET(client_fd, &fds)) {
162 if (srs_server_recv(client_fd, &srs_message) < 0) {
163 LOGE("SRS recv failed, aborting!");
167 LOGD("SRS recv: command=%d data_len=%d",
168 srs_message.command, srs_message.data_len);
169 hex_dump(srs_message.data, srs_message.data_len);
171 srs_dispatch(client_fd, &srs_message);
173 if (srs_message.data != NULL)
174 free(srs_message.data);
183 LOGE("SRS server client ended!");
187 static int srs_read_loop(struct ril_client *client)
191 struct sockaddr_un client_addr;
195 LOGE("client is NULL, aborting!");
199 if(client->object == NULL) {
200 LOGE("client object is NULL, aborting!");
204 int server_fd = ((int*)client->object)[0];
208 LOGE("SRS client server_fd is negative, aborting!");
212 rc = accept(server_fd, (struct sockaddr*)&client_addr,
215 LOGE("SRS Failed to accept errno %d error %s",
216 errno, strerror(errno));
219 LOGI("SRS accepted fd %d", rc);
220 int *pfd = (int*)malloc(sizeof(int));
222 LOGE("out of memory for the client socket");
229 if (pthread_create(&t, NULL, srs_process_client, pfd)) {
230 LOGE("SRS failed to start client thread errno %d error %s",
231 errno, strerror(errno));
240 static int srs_create(struct ril_client *client)
242 int *srs_server = NULL;
244 LOGD("Creating new SRS client");
246 srs_server = malloc(sizeof(int));
248 LOGE("SRS out of memory for server fd");
252 client->object = (void *) srs_server;
253 if((*srs_server = srs_server_open()) < 0) {
254 LOGE("%s: samsung-ril-socket server open failed", __FUNCTION__);
267 static int srs_destroy(struct ril_client *client)
273 int *srs_server = (int*) client->object;
284 struct ril_client_funcs srs_client_funcs = {
285 .create = srs_create,
286 .destroy = srs_destroy,
287 .read_loop = srs_read_loop,