15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_sock" 2049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 21db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_sock_util.h" 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <arpa/inet.h> 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 25109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <netinet/in.h> 26109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <netinet/tcp.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 28109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <stdlib.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 30109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <sys/ioctl.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/socket.h> 32109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <sys/types.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/un.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <hardware/bluetooth.h> 37109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <hardware/bt_sock.h> 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bt_target.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 41109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bta_jv_api.h" 42109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bta_jv_co.h" 43109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_common.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_sock_sdp.h" 45109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_sock_thread.h" 46109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_util.h" 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 49109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btu.h" 50a11035b5ecbc6cbd9da5bd707683504c47e2744ePavlin Radoslavov#include "bt_common.h" 51109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "hcimsgs.h" 5244802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 53109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "port_api.h" 54109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "sdp_api.h" 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati#define asrt(s) if(!(s)) BTIF_TRACE_ERROR("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint sock_send_all(int sock_fd, const uint8_t* buf, int len) 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int s = len; 61574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(s) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 64574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov ssize_t ret; 65574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov OSI_NO_INTR(ret = send(sock_fd, buf, s, 0)); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(ret <= 0) 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 68e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return -1; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf += ret; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s -= ret; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint sock_recv_all(int sock_fd, uint8_t* buf, int len) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int r = len; 79574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while(r) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 82574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov ssize_t ret; 83574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov OSI_NO_INTR(ret = recv(sock_fd, buf, r, MSG_WAITALL)); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(ret <= 0) 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 86e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return -1; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buf += ret; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project r -= ret; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint sock_send_fd(int sock_fd, const uint8_t* buf, int len, int send_fd) 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct msghdr msg; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned char *buffer = (unsigned char *)buf; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&msg, 0, sizeof(msg)); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct cmsghdr *cmsg; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char msgbuf[CMSG_SPACE(1)]; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project asrt(send_fd != -1); 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(sock_fd == -1 || send_fd == -1) 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return -1; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Add any pending outbound file descriptors to the message 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // See "man cmsg" really 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.msg_control = msgbuf; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.msg_controllen = sizeof msgbuf; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmsg = CMSG_FIRSTHDR(&msg); 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmsg->cmsg_level = SOL_SOCKET; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmsg->cmsg_type = SCM_RIGHTS; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cmsg->cmsg_len = CMSG_LEN(sizeof send_fd); 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(CMSG_DATA(cmsg), &send_fd, sizeof send_fd); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // We only write our msg_control during the first write 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int ret_len = len; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (len > 0) { 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct iovec iv; 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&iv, 0, sizeof(iv)); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project iv.iov_base = buffer; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project iv.iov_len = len; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.msg_iov = &iv; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.msg_iovlen = 1; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 128574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov ssize_t ret; 129574dcfb73e3741d715f7d4394fe5d3bd587cb0d2Pavlin Radoslavov OSI_NO_INTR(ret = sendmsg(sock_fd, &msg, MSG_NOSIGNAL)); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret < 0) { 131e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s", 132689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project sock_fd, send_fd, (int)ret, errno, strerror(errno)); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = -1; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project buffer += ret; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= ret; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Wipes out any msg_control too 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&msg, 0, sizeof(msg)); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 143e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("close fd:%d after sent", send_fd); 1448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz // TODO: This seems wrong - if the FD is not opened in JAVA before this is called 1458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz // we get a "socket closed" exception in java, when reading from the socket... 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project close(send_fd); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ret_len; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* hex_table = "0123456789abcdef"; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void byte2hex(const char* data, char** str) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **str = hex_table[(*data >> 4) & 0xf]; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ++*str; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **str = hex_table[*data & 0xf]; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ++*str; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void byte2char(const char* data, char** str) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **str = *data < ' ' ? '.' : *data > '~' ? '.' : *data; 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ++(*str); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void word2hex(const char* data, char** hex) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2hex(&data[1], hex); 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2hex(&data[0], hex); 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid dump_bin(const char* title, const char* data, int size) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char line_buff[256]; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *line; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i, j, addr; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const int width = 16; 174db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_DEBUG(LOG_TAG, "%s, size:%d, dump started {", title, size); 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(size <= 0) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write offset 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project line = line_buff; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j = 0; j < width; j++) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2hex((const char*)&j, &line); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line = 0; 191db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_DEBUG(LOG_TAG, "%s", line_buff); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i = 0; i < size / width; i++) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project line = line_buff; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write address: 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project addr = i*width; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project word2hex((const char*)&addr, &line); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ':'; *line++ = ' '; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write hex of data 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j = 0; j < width; j++) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2hex(&data[j], &line); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write char of data 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j = 0; j < width; j++) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2char(data++, &line); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //wirte the end of line 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line = 0; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //output the line 212db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_DEBUG(LOG_TAG, "%s", line_buff); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //last line of left over if any 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int leftover = size % width; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(leftover > 0) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project line = line_buff; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write address: 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project addr = i*width; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project word2hex((const char*)&addr, &line); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ':'; *line++ = ' '; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write hex of data 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j = 0; j < leftover; j++) { 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2hex(&data[j], &line); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write hex padding 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(; j < width; j++) { 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line++ = ' '; 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write char of data 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j = 0; j < leftover; j++) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project byte2char(data++, &line); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //write the end of line 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *line = 0; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //output the line 240db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_DEBUG(LOG_TAG, "%s", line_buff); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 242db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_DEBUG(LOG_TAG, "%s, size:%d, dump ended }", title, size); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 245