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