4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
\r
6 * Contact: Hakjoo Ko <hakjoo.ko@samsung.com>
\r
7 * Mahendra Kumar Prajapat <mahendra.p@samsung.com>
\r
8 * Harsha Shekar <h.shekar@samsung.com>
\r
11 * Licensed under the Apache License, Version 2.0 (the "License");
\r
12 * you may not use this file except in compliance with the License.
\r
13 * You may obtain a copy of the License at
\r
15 * http://www.apache.org/licenses/LICENSE-2.0
\r
17 * Unless required by applicable law or agreed to in writing, software
\r
18 * distributed under the License is distributed on an "AS IS" BASIS,
\r
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
20 * See the License for the specific language governing permissions and
\r
21 * limitations under the License.
\r
26 * @file drm_trusted_client_ipc.cpp
\r
27 * @brief DRM Trusted Client Inter process communication definitions.
\r
28 * @author Mahendra Kumar Prajapat (mahendra.p@samsung.com)
\r
29 * @author Harsha Shekar (h.shekar@samsung.com)
\r
31 * @history 0.1: DRM Trusted Client Inter process communication definitions.
\r
38 #include <sys/stat.h>
\r
40 #include <sys/types.h>
\r
41 #include <sys/socket.h>
\r
44 #include "drm_trusted_client_ipc.h"
\r
45 #include "drm_trusted_client_log.h"
\r
48 * This API is used to send a request to the Server to call corresponding API
\r
50 * @param[in] client_in Carries the input parameters of Trusted Client API to Server
\r
51 * @param[out] server_out Carries the output parameters of Trusted Client API from Server
\r
52 * @return 0 on success & other values on failure
\r
57 int drm_trusted_client_comm(drm_trusted_request_data_s *client_in, drm_trusted_response_data_s *server_out)
\r
60 struct sockaddr_un clientaddr;
\r
61 drm_trusted_request_data_s send_data;
\r
62 drm_trusted_response_data_s recv_data;
\r
63 int temp_len_sock = 0;
\r
65 drm_trusted_result_e result = DRM_TRUSTED_RETURN_SUCCESS;
\r
66 unsigned int offset = 0;
\r
68 int bytes_write = DRM_TRUSTED_MAX_CHUNK_SIZE;
\r
69 int bytes_read = DRM_TRUSTED_MAX_CHUNK_SIZE;
\r
71 /* memset the structures */
\r
72 memset(&send_data, 0x0, sizeof(drm_trusted_request_data_s));
\r
73 memset(&recv_data, 0x0, sizeof(drm_trusted_response_data_s));
\r
75 /* Create a socket */
\r
76 if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
\r
77 DRM_TRUSTED_CLIENT_EXCEPTION("socket error!!, sockfd = %d, error = %s",
\r
78 sockfd, strerror(errno));
\r
79 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
82 DRM_TRUSTED_CLIENT_LOG("Opened socket sockfd = %d",sockfd);
\r
84 /* Copy the data received from the client into local */
\r
85 memcpy(&send_data, client_in, sizeof(drm_trusted_request_data_s));
\r
87 /* Set parameters to be used in connect */
\r
88 temp_len_sock = strlen(DRM_TRUSTED_SOCK_PATH);
\r
90 memset(&clientaddr, 0x00, sizeof(clientaddr));
\r
91 clientaddr.sun_family = AF_UNIX;
\r
92 memcpy(clientaddr.sun_path, DRM_TRUSTED_SOCK_PATH, temp_len_sock);
\r
93 clientaddr.sun_path[temp_len_sock] = '\0';
\r
95 DRM_TRUSTED_CLIENT_LOG("Connecting socket sockfd = %d",sockfd);
\r
96 if ((retval = connect(sockfd, (struct sockaddr*) &clientaddr,
\r
97 sizeof(clientaddr))) < 0) {
\r
98 DRM_TRUSTED_CLIENT_EXCEPTION("connect error!!, retval = %d, error = %s",
\r
99 retval, strerror(errno));
\r
100 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
104 /* First write the static structures */
\r
105 DRM_TRUSTED_CLIENT_LOG("Writing socket sockfd = %d size=%d",sockfd,sizeof(drm_trusted_req_fixed_data_s));
\r
106 if ((retval = write(sockfd, (char*) &send_data.fixed_data,
\r
107 sizeof(drm_trusted_req_fixed_data_s))) < 0) {
\r
108 DRM_TRUSTED_CLIENT_EXCEPTION("write error!!, retval = %d, error = %s",
\r
109 retval, strerror(errno));
\r
110 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
113 DRM_TRUSTED_CLIENT_LOG("Written socket sockfd = %d retval=%d",sockfd,retval);
\r
115 /* Now send the additional data items if any */
\r
116 if (send_data.fixed_data.num_data_items > 0) {
\r
118 for (int i = 0; i < send_data.fixed_data.num_data_items; i++) {
\r
120 if (send_data.fixed_data.data_length[i] > DRM_TRUSTED_MAX_CHUNK_SIZE) {
\r
122 while (bytes_write > 0) {
\r
123 DRM_TRUSTED_CLIENT_LOG("Writing socket sockfd = %d size=%d",sockfd,bytes_write);
\r
124 if ((retval = write(sockfd,
\r
125 (void*)(send_data.data_items[i] + offset), bytes_write))
\r
127 DRM_TRUSTED_CLIENT_EXCEPTION(
\r
128 "write error!!, retval = %d, error = %s",
\r
129 retval, strerror(errno));
\r
130 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
133 DRM_TRUSTED_CLIENT_LOG("Written socket sockfd = %d retval=%d",sockfd,retval);
\r
135 offset += DRM_TRUSTED_MAX_CHUNK_SIZE;
\r
136 bytes_write = (int)(send_data.fixed_data.data_length[i] - offset) > (int)DRM_TRUSTED_MAX_CHUNK_SIZE ?
\r
137 DRM_TRUSTED_MAX_CHUNK_SIZE :
\r
138 (int)(send_data.fixed_data.data_length[i] - offset);
\r
140 DRM_TRUSTED_CLIENT_LOG("offset = %d, bytes_write = %d", offset, bytes_write);
\r
145 DRM_TRUSTED_CLIENT_LOG("Writing socket sockfd = %d size=%d",sockfd,send_data.fixed_data.data_length[i]);
\r
146 if ((retval = write(sockfd, send_data.data_items[i], send_data.fixed_data.data_length[i])) < 0) {
\r
147 DRM_TRUSTED_CLIENT_EXCEPTION("write error!!, retval = %d, error = %s",
\r
148 retval, strerror(errno));
\r
149 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
152 DRM_TRUSTED_CLIENT_LOG("Written socket sockfd = %d retval=%d",sockfd,retval);
\r
157 /* Set offset to be used again */
\r
160 /* Read the fixed data into the receive structure */
\r
161 DRM_TRUSTED_CLIENT_LOG("Reading socket sockfd = %d size=%d",sockfd,sizeof(drm_trusted_resp_fixed_data_s));
\r
162 if ((retval = read(sockfd, (char*) &recv_data.fixed_data,
\r
163 sizeof(drm_trusted_resp_fixed_data_s))) < 0) {
\r
164 DRM_TRUSTED_CLIENT_EXCEPTION("read error!!, retval = %d, error = %s",
\r
165 retval, strerror(errno));
\r
166 result = DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
169 DRM_TRUSTED_CLIENT_LOG("Read socket sockfd = %d retval=%d",sockfd,retval);
\r
171 if (recv_data.fixed_data.num_data_items > 0) {
\r
173 for (int loop = 0; loop < recv_data.fixed_data.num_data_items; loop++) {
\r
175 /* Allocate memory for the data items */
\r
176 recv_data.data_items[loop] = (char*) malloc(
\r
177 recv_data.fixed_data.data_length[loop]);
\r
178 if (!recv_data.data_items[loop]) {
\r
179 DRM_TRUSTED_CLIENT_EXCEPTION(
\r
180 "Memory Allocation Error!, buf = %p",
\r
181 recv_data.data_items[loop]);
\r
182 recv_data.fixed_data.resp_result =
\r
183 DRM_TRUSTED_RETURN_INSUFFICIENT_MEMORY;
\r
187 if (recv_data.fixed_data.data_length[loop] > DRM_TRUSTED_MAX_CHUNK_SIZE) {
\r
189 while (bytes_read > 0) {
\r
190 DRM_TRUSTED_CLIENT_LOG("Reading socket sockfd = %d size=%d",sockfd,bytes_read);
\r
191 if ((retval = read(sockfd,
\r
192 (void*)(recv_data.data_items[loop] + offset),
\r
193 bytes_read)) < 0) {
\r
194 DRM_TRUSTED_CLIENT_EXCEPTION(
\r
195 "Read error!!, retval = %d, error = %s", retval,
\r
197 recv_data.fixed_data.resp_result =
\r
198 DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
201 DRM_TRUSTED_CLIENT_LOG("Read socket sockfd = %d retval=%d",sockfd,retval);
\r
203 offset += DRM_TRUSTED_MAX_CHUNK_SIZE;
\r
204 bytes_read = (int)(recv_data.fixed_data.data_length[loop] - offset) > (int) DRM_TRUSTED_MAX_CHUNK_SIZE ?
\r
205 DRM_TRUSTED_MAX_CHUNK_SIZE :
\r
206 (int)(recv_data.fixed_data.data_length[loop] - offset);
\r
208 DRM_TRUSTED_CLIENT_LOG("offset = %d, bytes_write = %d", offset, bytes_read);
\r
214 DRM_TRUSTED_CLIENT_LOG("Reading socket sockfd = %d size=%d",sockfd,recv_data.fixed_data.data_length[loop]);
\r
215 if ((retval = read(sockfd,
\r
216 recv_data.data_items[loop],
\r
217 recv_data.fixed_data.data_length[loop])) < 0) {
\r
218 DRM_TRUSTED_CLIENT_EXCEPTION("Read error!!, retval = %d, error = %s",
\r
219 retval, strerror(errno));
\r
220 recv_data.fixed_data.resp_result =
\r
221 DRM_TRUSTED_RETURN_COMMUNICATION_ERROR;
\r
224 DRM_TRUSTED_CLIENT_LOG("Read socket sockfd = %d retval=%d",sockfd,retval);
\r
229 /* Copy the data from the server back to the client into the output parameter */
\r
230 memcpy(server_out, &recv_data, sizeof(drm_trusted_response_data_s));
\r
232 DRM_TRUSTED_CLIENT_LOG("drm_trusted_client_comm success!!!, result = %d", result);
\r
236 DRM_TRUSTED_CLIENT_LOG("Closing Socket:sockfd=%d",sockfd);
\r
237 retval = close(sockfd);
\r
238 DRM_TRUSTED_CLIENT_LOG("Closed Socket:sockfd=%d retval=%d",sockfd,retval);
\r