int wanted = vsnprintf( *sptr = NULL, 0, fmt, argv );
if( (wanted > 0) && ((*sptr = malloc( 1 + wanted )) != NULL) )
- return vsprintf( *sptr, fmt, argv );
+ return vsprintf( *sptr, fmt, argv );
return wanted;
}
}
-void
-kick_transport(TRANSPORT* t)
+void kick_transport(TRANSPORT* t)
{
if (t && !t->kicked)
{
void send_packet(PACKET *p, TRANSPORT *t)
{
- D("go send packet\n");
+ D("go send packet\n");
if(t != NULL && t->connection_state != CS_OFFLINE) {
#ifdef SUPPORT_ENCRYPT
// 현재 연결이 암호화 모드이고 암호화 handshaking관련 메시지가 아니면, 메시지 암호화
- if (t->encryption == ENCR_ON && p->msg.command != A_ENCR) {
+ if (t->encryption == ENCR_ON && p->msg.command != A_ENCR) {
security_encrypt(t->sessionID, p->data, &(p->msg.data_length));
- }
- else if(t->encryption == ENCR_OFF) {
+ }
+ else if(t->encryption == ENCR_OFF) {
- }
+ }
#endif
- D("before encoding to %s\n", t->serial);
+ D("before encoding to %s\n", t->serial);
encoding_packet(p);
D("after encoding to %s\n", t->serial);
D("sended packet to %s\n", t->serial);
}
else {
- D("transport is null\n");
+ D("transport is null\n");
if (t == NULL) {
D("Transport is null \n");
errno = 0;
//LCOV_EXCL_START
#ifdef SUPPORT_ENCRYPT
/*
-desc. : 암호화 모드 변경 실패 시, sdbd에게 실패 메시지 전송
-parameter : [in] SDB_SOCKET* sock : local socket
- [in] TRANSPORT* t : 현재 연결 중인 atransport
- [in] unsigned failed_value : 실패 값
+ desc. : 암호화 모드 변경 실패 시, sdbd에게 실패 메시지 전송
+ parameter : [in] SDB_SOCKET* sock : local socket
+ [in] TRANSPORT* t : 현재 연결 중인 atransport
+ [in] unsigned failed_value : 실패 값
*/
void send_encr_fail(SDB_SOCKET* sock, TRANSPORT* t, unsigned failed_value)
{
- D("calling send_encr_fail");
- apacket *p;
- p = get_apacket();
- p->msg.command = A_ENCR; // 암호화 handshaking 메시지
- p->msg.arg0 = failed_value; // 실패 값
- p->msg.arg1 = sock->local_id; // client를 구분하는 값
- send_packet(p, t);
- put_apacket(p);
+ D("calling send_encr_fail");
+ apacket *p;
+ p = get_apacket();
+ p->msg.command = A_ENCR; // 암호화 handshaking 메시지
+ p->msg.arg0 = failed_value; // 실패 값
+ p->msg.arg1 = sock->local_id; // client를 구분하는 값
+ send_packet(p, t);
+ put_apacket(p);
}
#endif
//LCOV_EXCL_STOP
LOG_INFO("T(%s) remote read start\n", t->serial);
if(t->read_from_remote(t, &p->msg, sizeof(MESSAGE))) {
- break;
+ break;
}
- if(check_header(p, t)) {
- break;
- }
- if(p->msg.data_length) {
- if(t->read_from_remote(t, p->data, p->msg.data_length)){
- break;
- }
+ if(check_header(p, t)) {
+ break;
+ }
+ if(p->msg.data_length) {
+ if(t->read_from_remote(t, p->data, p->msg.data_length)){
+ break;
+ }
#ifdef SUPPORT_ENCRYPT
- //security_decrypt(t->sfd, p);
+ //security_decrypt(t->sfd, p);
// 현재 연결이 암호화 모드이고, 암호화 handshaking 관련 메시지가 아닌 경우면, 메시지 복호화
- if (t->encryption == ENCR_ON && p->msg.command != A_ENCR) {
- security_decrypt(t->sessionID, p->data, &(p->msg.data_length));
- }
+ if (t->encryption == ENCR_ON && p->msg.command != A_ENCR) {
+ security_decrypt(t->sessionID, p->data, &(p->msg.data_length));
+ }
#endif
- }
- if(check_data(p)) {
- break;
- }
+ }
+ if(check_data(p)) {
+ break;
+ }
- dump_packet(t->serial, "remote_read", p);
- D("%s: received remote packet, sending to transport\n",
- t->serial);
- handle_packet(p, t);
+ dump_packet(t->serial, "remote_read", p);
+ D("%s: received remote packet, sending to transport\n",
+ t->serial);
+ handle_packet(p, t);
}
- LOG_INFO("T(%s) remote read fail. terminate transport\n", t->serial);
- put_apacket(p);
+ LOG_INFO("T(%s) remote read fail. terminate transport\n", t->serial);
+ put_apacket(p);
- if(t->suspended == 1) {
- LOG_INFO("T(%s) connection is closed in suspended mode\n");
- sdb_close(t->sfd);
- while(1) {
+ if(t->suspended == 1) {
+ LOG_INFO("T(%s) connection is closed in suspended mode\n");
+ sdb_close(t->sfd);
+ while(1) {
- t->sfd = sdb_host_connect(t->host, t->sdb_port, SOCK_STREAM);
+ t->sfd = sdb_host_connect(t->host, t->sdb_port, SOCK_STREAM);
- if( t->sfd < 0) {
- LOG_INFO("T(%s) dies during suspended mode\n");
- break;
- }
+ if( t->sfd < 0) {
+ LOG_INFO("T(%s) dies during suspended mode\n");
+ break;
+ }
close_on_exec(t->sfd);
disable_tcp_nagle(t->sfd);
}
sdb_close(t->sfd);
LOG_INFO("T(%s) still in suspended mode, sleep 2 sec\n");
- sdb_sleep_ms(2000);
- }
- }
+ sdb_sleep_ms(2000);
+ }
+ }
t->connection_state = CS_OFFLINE;
LOG_FATAL("cannot create output thread\n");
}
- /* put us on the master device list */
+ /* put us on the master device list */
sdb_mutex_lock(&transport_lock, "transport register_transport");
t->node = prepend(&transport_list, t);
sdb_mutex_unlock(&transport_lock, "transport register_transport");
char* end = buf + bufsize;
int len;
- /* XXX OVERRUN PROBLEMS XXX */
+ /* XXX OVERRUN PROBLEMS XXX */
sdb_mutex_lock(&transport_lock, "transport list_transports");
LIST_NODE* curptr = transport_list;
len = snprintf(p, end - p, "%-20s\t%-10s\t%s\n", device_serial, localPort, remotePort);
if (p + len >= end) {
/* discard last line if buffer is too short */
- break;
+ break;
}
p += len;
}
#if 0
int register_device_con_transport(int s, const char *serial) {
- if(current_local_transports >= SDB_LOCAL_TRANSPORT_MAX) {
+ if(current_local_transports >= SDB_LOCAL_TRANSPORT_MAX) {
LOG_ERROR("Too many tcp connection\n");
return -1;
}
int length = readx(_fd, &t_packet, sizeof(t_packet));
if(length == -1) {
- LOG_DEBUG("wakeup_select_func(): cannot read FD(%d) transport packet\n", _fd);
+ LOG_DEBUG("wakeup_select_func(): cannot read FD(%d) transport packet\n", _fd);
}
TRANSPORT* t= t_packet->t;
//TODO REMOTE_DEVICE_CONNECT
//CNXN cannot be distinguished using remote_con_flag
-// if(t->remote_cnxn_socket != NULL && cmd == A_CNXN) {
-// dump_packet("remote_con", "wakeup_select_func", p);
-// sock = t->remote_cnxn_socket->data;
-// if(sock != NULL) {
-// remove_first(&(t->remote_cnxn_socket), no_free);
-// LOG_INFO("LS_L(%X)\n", sock->local_id);
-// p->ptr = (void*)(&p->msg);
-// p->len = sizeof(MESSAGE) + p->msg.data_length;
-// local_socket_enqueue(sock, p);
-// }
-// goto endup;
-// }
-// //If transport is remote device, packet should not have to be decoded.
-// if((local_id & remote_con_flag) && t->type != kTransportRemoteDevCon) {
-// LOG_INFO("LS_L(%X), LS_R(%X), LS_E(%X)\n", decoding_to_local_ls_id(local_id),
-// decoding_to_remote_ls_id(local_id), local_id);
-// sock = find_local_socket(decoding_to_local_ls_id(local_id));
-// p->msg.arg1 = decoding_to_remote_ls_id(local_id);
-// p->ptr = (void*)(&p->msg);
-// p->len = sizeof(MESSAGE) + p->msg.data_length;
-// local_socket_enqueue(sock, p);
-// goto endup;
-// }
+ // if(t->remote_cnxn_socket != NULL && cmd == A_CNXN) {
+ // dump_packet("remote_con", "wakeup_select_func", p);
+ // sock = t->remote_cnxn_socket->data;
+ // if(sock != NULL) {
+ // remove_first(&(t->remote_cnxn_socket), no_free);
+ // LOG_INFO("LS_L(%X)\n", sock->local_id);
+ // p->ptr = (void*)(&p->msg);
+ // p->len = sizeof(MESSAGE) + p->msg.data_length;
+ // local_socket_enqueue(sock, p);
+ // }
+ // goto endup;
+ // }
+ // //If transport is remote device, packet should not have to be decoded.
+ // if((local_id & remote_con_flag) && t->type != kTransportRemoteDevCon) {
+ // LOG_INFO("LS_L(%X), LS_R(%X), LS_E(%X)\n", decoding_to_local_ls_id(local_id),
+ // decoding_to_remote_ls_id(local_id), local_id);
+ // sock = find_local_socket(decoding_to_local_ls_id(local_id));
+ // p->msg.arg1 = decoding_to_remote_ls_id(local_id);
+ // p->ptr = (void*)(&p->msg);
+ // p->len = sizeof(MESSAGE) + p->msg.data_length;
+ // local_socket_enqueue(sock, p);
+ // goto endup;
+ // }
sock = find_local_socket(local_id);
if(c_state != CS_OFFLINE && sock != NULL) {
* Can receive A_CNXN multiple times if we apply connection timeout
* Block code which kills connection when it gets A_CNXN multiple times
*/
-// if(t->connection_state != CS_OFFLINE) {
-// t->connection_state = CS_OFFLINE;
-// run_transport_close(t);
-// }
+ // if(t->connection_state != CS_OFFLINE) {
+ // t->connection_state = CS_OFFLINE;
+ // run_transport_close(t);
+ // }
update_version(t, p->msg.arg0, p->msg.arg1);
parse_banner((char*) p->data, t);
}
send_auth_publickey(t);
LOG_DEBUG("send auth ok !!\n");
}
-#if 0 // daemon code (never happened in sdb server)
- } else if (p->msg.arg0 == ADB_AUTH_SIGNATURE) {
- if (adb_auth_verify(t->token, p->data, p->msg.data_length)) {
- adb_auth_verified(t);
- t->failed_auth_attempts = 0;
- } else {
- if (t->failed_auth_attempts++ > 10)
- sdb_sleep_ms(1000);
- send_auth_request(t);
- }
- } else if (p->msg.arg0 == ADB_AUTH_RSAPUBLICKEY) {
- adb_auth_confirm_key(p->data, p->msg.data_length, t);
-#endif
}
- }
+ }
#ifdef SUPPORT_ENCRYPT
- else if(cmd == A_ENCR){ // 암호화 handshaking메시지인 경우
- PACKET* enc_p = get_apacket();
- if(p->msg.arg0 == ENCR_SET_ON_REQ){ // hello 메시지인 경우
- if(security_parse_client_hello(t->sessionID, p->data, &(p->msg.data_length)) == 1) // hello 메시지 파싱
- {
- if(security_gen_server_ack(t->sessionID, enc_p->data, &(enc_p->msg.data_length)) == 1) // ack 메시지 생성
- {
- enc_p->msg.command = A_ENCR; // 암호화 handshaking 메시지
- enc_p->msg.arg0 = ENCR_SET_ON_OK; // ack 메시지
- enc_p->msg.arg1 = sock->local_id; // client구분하는 값
- send_packet(enc_p, t);
-
- D("security_gen_server_ack success");
- } else { // ack 메시지 생성 실패
- LOG_ERROR("security_gen_server_ack failed");
- security_deinit(t->sessionID);
- send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
- t->encryption = ENCR_OFF; // 암호화 모드는 off
- sendfailmsg(sock->fd, "Encryption ON failed");
- local_socket_close(sock);
-
- }
- } else { // hello 메시지 파싱 실패
- LOG_ERROR("security_parse_client_hello failed");
- security_deinit(t->sessionID);
- send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
- t->encryption = ENCR_OFF; // 암호화 모드는 off
- sendfailmsg(sock->fd, "Encryption ON failed");
- local_socket_close(sock);
- }
- }
- else if(p->msg.arg0 == ENCR_SET_ON_OK){ // ack 메시지인 경우
- if(security_parse_client_ack(t->sessionID, p->data, &(p->msg.data_length)) == 1) // ack 메시지 파싱
- {
- t->encryption = ENCR_ON; // 모든 handshaking이 끝난 후 현재 연결에 대해서는 암호화 모드 ON
- sendokmsg(sock->fd, "Encryption is ON");
- }
- else{ // ack 메시지 파싱 실패
- LOG_ERROR("security_parse_client_ack failed");
- security_deinit(t->sessionID);
- send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
- t->encryption = ENCR_OFF; // 암호화 모드는 off
- sendfailmsg(sock->fd, "Encryption ON failed");
- }
- local_socket_close(sock);
-
- }
- else if(p->msg.arg0 == ENCR_SET_OFF){ // 암호화 모드 off 메시지
- if(t->encryption == ENCR_ON && security_deinit(t->sessionID) == 1) // 현재 연결에 대해 암호화 모드가 on상태이면
- {
- t->encryption = ENCR_OFF; // 현재 연결에 대한 암호화 모드를 off
- sendokmsg(sock->fd, "Encryption is OFF");
- }
- else{
- if(sock != NULL) {
- send_encr_fail(sock, t, ENCR_OFF_FAIL);
- sendfailmsg(sock->fd, "Encryption OFF failed");
- }
- LOG_ERROR("security_deinit failed");
- }
- local_socket_close(sock);
- }
- else if(p->msg.arg0 == ENCR_GET){ // 암호화 모드 get 메시지
- if(t->encryption == ENCR_ON && !strncmp((char*)p->data, "encryption:on", p->msg.data_length)) // 현재 연결이 암호화 모드 on이고, sdbd의 암호화 모드가 on인 경우
- {
- sendokmsg(sock->fd, "Encryption is ON");
- }
- else if(t->encryption == ENCR_OFF && !strncmp((char*)p->data, "encryption:off", p->msg.data_length)) // 현재 연결이 암호화 모드 off이고, sdbd의 암호화 모드가 off인 경우
- {
- sendokmsg(sock->fd, "Encryption is OFF");
- }
- else
- {
- sendfailmsg(sock->fd, "Getting Encryption status failed, try encyrption on/off");
- }
- local_socket_close(sock);
- }
- else if(p->msg.arg0 == ENCR_ON_FAIL){ // sdbd에서 암호화 모드 on에 실패했을 경우 받는 메시지
- t->encryption = ENCR_OFF; // 암호화를 on하다가 실패한 경우, 현재 연결에 대한 암호화 모드를 off
- sendfailmsg(sock->fd, "Encryption ON failed");
- local_socket_close(sock);
- }
- else if(p->msg.arg0 == ENCR_OFF_FAIL){ // sdbd에서 암호화 모드 off에 실패했을 경우 받는 메시지
- //t->encryption = ENCR_ON;
- if (sock != NULL) {
- sendfailmsg(sock->fd, "Encryption OFF failed");
- local_socket_close(sock);
- }
- }
- put_apacket(enc_p);
-
- }
+ else if(cmd == A_ENCR){ // 암호화 handshaking메시지인 경우
+ PACKET* enc_p = get_apacket();
+ if(p->msg.arg0 == ENCR_SET_ON_REQ){ // hello 메시지인 경우
+ if(security_parse_client_hello(t->sessionID, p->data, &(p->msg.data_length)) == 1) // hello 메시지 파싱
+ {
+ if(security_gen_server_ack(t->sessionID, enc_p->data, &(enc_p->msg.data_length)) == 1) // ack 메시지 생성
+ {
+ enc_p->msg.command = A_ENCR; // 암호화 handshaking 메시지
+ enc_p->msg.arg0 = ENCR_SET_ON_OK; // ack 메시지
+ enc_p->msg.arg1 = sock->local_id; // client구분하는 값
+ send_packet(enc_p, t);
+
+ D("security_gen_server_ack success");
+ } else { // ack 메시지 생성 실패
+ LOG_ERROR("security_gen_server_ack failed");
+ security_deinit(t->sessionID);
+ send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
+ t->encryption = ENCR_OFF; // 암호화 모드는 off
+ sendfailmsg(sock->fd, "Encryption ON failed");
+ local_socket_close(sock);
+
+ }
+ } else { // hello 메시지 파싱 실패
+ LOG_ERROR("security_parse_client_hello failed");
+ security_deinit(t->sessionID);
+ send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
+ t->encryption = ENCR_OFF; // 암호화 모드는 off
+ sendfailmsg(sock->fd, "Encryption ON failed");
+ local_socket_close(sock);
+ }
+ }
+ else if(p->msg.arg0 == ENCR_SET_ON_OK){ // ack 메시지인 경우
+ if(security_parse_client_ack(t->sessionID, p->data, &(p->msg.data_length)) == 1) // ack 메시지 파싱
+ {
+ t->encryption = ENCR_ON; // 모든 handshaking이 끝난 후 현재 연결에 대해서는 암호화 모드 ON
+ sendokmsg(sock->fd, "Encryption is ON");
+ }
+ else{ // ack 메시지 파싱 실패
+ LOG_ERROR("security_parse_client_ack failed");
+ security_deinit(t->sessionID);
+ send_encr_fail(sock, t, ENCR_ON_FAIL); // 암호화 모드 on을 실패했다는 메시지를 sdbd로 보냄
+ t->encryption = ENCR_OFF; // 암호화 모드는 off
+ sendfailmsg(sock->fd, "Encryption ON failed");
+ }
+ local_socket_close(sock);
+
+ }
+ else if(p->msg.arg0 == ENCR_SET_OFF){ // 암호화 모드 off 메시지
+ if(t->encryption == ENCR_ON && security_deinit(t->sessionID) == 1) // 현재 연결에 대해 암호화 모드가 on상태이면
+ {
+ t->encryption = ENCR_OFF; // 현재 연결에 대한 암호화 모드를 off
+ sendokmsg(sock->fd, "Encryption is OFF");
+ }
+ else{
+ if(sock != NULL) {
+ send_encr_fail(sock, t, ENCR_OFF_FAIL);
+ sendfailmsg(sock->fd, "Encryption OFF failed");
+ }
+ LOG_ERROR("security_deinit failed");
+ }
+ local_socket_close(sock);
+ }
+ else if(p->msg.arg0 == ENCR_GET){ // 암호화 모드 get 메시지
+ if(t->encryption == ENCR_ON && !strncmp((char*)p->data, "encryption:on", p->msg.data_length)) // 현재 연결이 암호화 모드 on이고, sdbd의 암호화 모드가 on인 경우
+ {
+ sendokmsg(sock->fd, "Encryption is ON");
+ }
+ else if(t->encryption == ENCR_OFF && !strncmp((char*)p->data, "encryption:off", p->msg.data_length)) // 현재 연결이 암호화 모드 off이고, sdbd의 암호화 모드가 off인 경우
+ {
+ sendokmsg(sock->fd, "Encryption is OFF");
+ }
+ else
+ {
+ sendfailmsg(sock->fd, "Getting Encryption status failed, try encyrption on/off");
+ }
+ local_socket_close(sock);
+ }
+ else if(p->msg.arg0 == ENCR_ON_FAIL){ // sdbd에서 암호화 모드 on에 실패했을 경우 받는 메시지
+ t->encryption = ENCR_OFF; // 암호화를 on하다가 실패한 경우, 현재 연결에 대한 암호화 모드를 off
+ sendfailmsg(sock->fd, "Encryption ON failed");
+ local_socket_close(sock);
+ }
+ else if(p->msg.arg0 == ENCR_OFF_FAIL){ // sdbd에서 암호화 모드 off에 실패했을 경우 받는 메시지
+ //t->encryption = ENCR_ON;
+ if (sock != NULL) {
+ sendfailmsg(sock->fd, "Encryption OFF failed");
+ local_socket_close(sock);
+ }
+ }
+ put_apacket(enc_p);
+
+ }
#endif
put_apacket(p);
send_packet(p, t);
put_apacket(p);
}
-
-#if 0 // daemon code (never used in sdb server)
-void send_auth_request(atransport *t)
-{
- D("Calling send_auth_request\n");
- apacket *p;
- int ret;
-
- ret = adb_auth_generate_token(t->token, sizeof(t->token));
- if (ret != sizeof(t->token)) {
- D("Error generating token ret=%d\n", ret);
- return;
- }
-
- p = get_apacket();
- memcpy(p->data, t->token, ret);
- p->msg.command = A_AUTH;
- p->msg.arg0 = ADB_AUTH_TOKEN;
- p->msg.data_length = ret;
- send_packet(p, t);
- put_apacket(p);
-}
-
-void adb_auth_verified(atransport *t)
-{
- handle_online(t);
-}
-
-void handle_online(atransport *t)
-{
- D("adb: online\n");
- t->online = 1;
-}
-
-void handle_offline(atransport *t)
-{
- D("adb: offline\n");
- //Close the associated usb
- t->online = 0;
-}
-
-#endif