diff options
author | Bang Kwang min <justine.bang@samsung.com> | 2012-08-27 17:49:37 +0900 |
---|---|---|
committer | Bang Kwang min <justine.bang@samsung.com> | 2012-08-27 17:49:37 +0900 |
commit | e710e60a94ac9960f28cad4a46e658047cd60eb6 (patch) | |
tree | da85a8d0bfcde19df987d01ab80a524d97d5682a /src/download-provider-receiver.c | |
parent | b1669907025392712c82b95fb42ff4fa3d932464 (diff) | |
download | download-provider-e710e60a94ac9960f28cad4a46e658047cd60eb6.tar.gz download-provider-e710e60a94ac9960f28cad4a46e658047cd60eb6.tar.bz2 download-provider-e710e60a94ac9960f28cad4a46e658047cd60eb6.zip |
Code Sync with Private GIT
changes )
Change the ownership of downloaded file
Add detached option when pthread is created
fix the failure getting history info from database
Resolve prevent defects for agent module
divide log level
fix the crash by double free
fix wrong checking of network status
fix first timeout takes a long time
Diffstat (limited to 'src/download-provider-receiver.c')
-rw-r--r-- | src/download-provider-receiver.c | 136 |
1 files changed, 86 insertions, 50 deletions
diff --git a/src/download-provider-receiver.c b/src/download-provider-receiver.c index 452ab69..2af1fb0 100644 --- a/src/download-provider-receiver.c +++ b/src/download-provider-receiver.c @@ -170,7 +170,7 @@ void *_start_download(void *args) // if start_download() return error cause of maximun download limitation, set state to DOWNLOAD_STATE_PENDED. if (da_ret == DA_ERR_ALREADY_MAX_DOWNLOAD) { - TRACE_DEBUG_MSG("change to pended request [%d]", da_ret); + TRACE_DEBUG_INFO_MSG("change to pended request [%d]", da_ret); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); clientinfo->state = DOWNLOAD_STATE_PENDED; clientinfo->err = DOWNLOAD_ERROR_TOO_MANY_DOWNLOADS; @@ -180,7 +180,7 @@ void *_start_download(void *args) CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); return 0; } else if (da_ret != DA_RESULT_OK) { - TRACE_DEBUG_MSG("Fail to request start [%d]", da_ret); + TRACE_DEBUG_INFO_MSG("Fail to request start [%d]", da_ret); /* FIXME : need to seperate in detail according to error return values */ CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); clientinfo->state = DOWNLOAD_STATE_FAILED; @@ -194,7 +194,7 @@ void *_start_download(void *args) CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); - TRACE_DEBUG_MSG("started download [%d]", da_ret); + TRACE_DEBUG_INFO_MSG("started download [%d]", da_ret); clientinfo->req_id = req_dl_id; clientinfo->state = DOWNLOAD_STATE_DOWNLOADING; @@ -229,7 +229,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c (request_clientinfo->clientfd, SOL_SOCKET, SO_PEERCRED, &request_clientinfo->credentials, &cr_len) == 0) { - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("Client Info : pid=%d, uid=%d, gid=%d\n", request_clientinfo->credentials.pid, request_clientinfo->credentials.uid, @@ -239,7 +239,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c download_controls type = ipc_receive_header(request_clientinfo->clientfd); - TRACE_DEBUG_MSG("[ACCEPT] HEADER : [%d] ", type); + TRACE_DEBUG_INFO_MSG("[ACCEPT] HEADER : [%d] ", type); // first of all, receive requestinfo . if (type <= 0 || ipc_receive_request_msg(request_clientinfo) < 0) { TRACE_DEBUG_MSG("Ignore this connection, Invalid command"); @@ -257,7 +257,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c (clientinfo_list, request_clientinfo->requestinfo->requestid); if (type == DOWNLOAD_CONTROL_STOP) { - TRACE_DEBUG_MSG("Request : DOWNLOAD_CONTROL_STOP"); + TRACE_DEBUG_INFO_MSG("Request : DOWNLOAD_CONTROL_STOP"); if (searchindex >= 0) { if (da_cancel_download (clientinfo_list[searchindex].clientinfo->req_id) @@ -327,7 +327,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c int searchindex = get_same_request_slot_index(clientinfo_list, request_clientinfo->requestinfo->requestid); if (searchindex < 0) { - TRACE_DEBUG_MSG("Not Found Same Request ID"); + TRACE_DEBUG_INFO_MSG("Not Found Same Request ID"); // Invalid id request_clientinfo->state = DOWNLOAD_STATE_FAILED; request_clientinfo->err = DOWNLOAD_ERROR_INVALID_PARAMETER; @@ -336,7 +336,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c return 0; } else { // found request id. // how to deal etag ? // connect to slot. - TRACE_DEBUG_MSG("Found Same Request ID slot[%d]", searchindex); + TRACE_DEBUG_INFO_MSG("Found Same Request ID slot[%d]", searchindex); CLIENT_MUTEX_LOCK(&(request_clientinfo->client_mutex)); // close previous socket. if (clientinfo_list[searchindex].clientinfo->clientfd > 0) @@ -380,7 +380,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c clientinfo_list[searchslot].clientinfo = request_clientinfo; - TRACE_DEBUG_MSG("New Connection slot [%d] max [%d] max once [%d]", + TRACE_DEBUG_INFO_MSG("New Connection slot [%d] max [%d] max once [%d]", searchslot, MAX_CLIENT, DA_MAX_DOWNLOAD_REQ_AT_ONCE); @@ -395,7 +395,7 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c (clientinfo_list[searchslot].clientinfo, DOWNLOAD_DB_STATE); ipc_send_request_stateinfo(clientinfo_list[searchslot].clientinfo); - TRACE_DEBUG_MSG ("Pended Request is saved to [%d/%d]", + TRACE_DEBUG_INFO_MSG ("Pended Request is saved to [%d/%d]", searchslot, MAX_CLIENT); CLIENT_MUTEX_UNLOCK(&(clientinfo_list[searchslot].clientinfo->client_mutex)); sleep(5); // provider need the time of refresh. @@ -406,8 +406,8 @@ int _handle_new_connection(download_clientinfo_slot *clientinfo_list, download_c (&clientinfo_list[searchslot].clientinfo->thread_pid, &g_download_provider_thread_attr, _start_download, &clientinfo_list[searchslot]) != 0) { - TRACE_DEBUG_MSG("failed to call pthread_create for client"); - TRACE_DEBUG_MSG("Change to pended job"); + TRACE_DEBUG_INFO_MSG("failed to call pthread_create for client"); + TRACE_DEBUG_INFO_MSG("Change to pended job"); CLIENT_MUTEX_LOCK(&(clientinfo_list[searchslot].clientinfo->client_mutex)); clientinfo_list[searchslot].clientinfo->state = DOWNLOAD_STATE_PENDED; @@ -437,7 +437,7 @@ int _handle_client_request(download_clientinfo* clientinfo) switch (msgType = ipc_receive_header(clientinfo->clientfd)) { case DOWNLOAD_CONTROL_STOP: - TRACE_DEBUG_MSG("DOWNLOAD_CONTROL_STOP"); + TRACE_DEBUG_INFO_MSG("DOWNLOAD_CONTROL_STOP"); da_ret = da_cancel_download(clientinfo->req_id); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); if (da_ret != DA_RESULT_OK) { @@ -460,7 +460,7 @@ int _handle_client_request(download_clientinfo* clientinfo) CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); break; case DOWNLOAD_CONTROL_PAUSE: - TRACE_DEBUG_MSG("DOWNLOAD_CONTROL_PAUSE"); + TRACE_DEBUG_INFO_MSG("DOWNLOAD_CONTROL_PAUSE"); da_ret = da_suspend_download(clientinfo->req_id); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); if (da_ret != DA_RESULT_OK) { @@ -476,7 +476,7 @@ int _handle_client_request(download_clientinfo* clientinfo) CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); break; case DOWNLOAD_CONTROL_RESUME: - TRACE_DEBUG_MSG("DOWNLOAD_CONTROL_RESUME"); + TRACE_DEBUG_INFO_MSG("DOWNLOAD_CONTROL_RESUME"); da_ret = da_resume_download(clientinfo->req_id); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); if (da_ret != DA_RESULT_OK) { @@ -492,13 +492,13 @@ int _handle_client_request(download_clientinfo* clientinfo) CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); break; case DOWNLOAD_CONTROL_GET_STATE_INFO: // sync call - TRACE_DEBUG_MSG("DOWNLOAD_CONTROL_GET_STATE_INFO"); + TRACE_DEBUG_INFO_MSG("DOWNLOAD_CONTROL_GET_STATE_INFO"); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); ipc_send_stateinfo(clientinfo); CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); break; case DOWNLOAD_CONTROL_GET_DOWNLOAD_INFO: // sync call - TRACE_DEBUG_MSG("DOWNLOAD_CONTROL_GET_DOWNLOAD_INFO"); + TRACE_DEBUG_INFO_MSG("DOWNLOAD_CONTROL_GET_DOWNLOAD_INFO"); CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex)); ipc_send_downloadinfo(clientinfo); CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); @@ -577,7 +577,7 @@ void *run_manage_download_server(void *args) } maxfd = listenfd; - TRACE_DEBUG_MSG("Ready to listen IPC [%d][%s]", listenfd, + TRACE_DEBUG_INFO_MSG("Ready to listen IPC [%d][%s]", listenfd, DOWNLOAD_PROVIDER_IPC); // allocation the array structure for managing the clients. @@ -625,6 +625,7 @@ void *run_manage_download_server(void *args) rset = g_download_provider_socket_readset; exceptset = g_download_provider_socket_exceptset; + memset(&timeout, 0x00, sizeof(struct timeval)); timeout.tv_sec = flexible_timeout; if (select((maxfd + 1), &rset, 0, &exceptset, &timeout) < 0) { @@ -647,7 +648,7 @@ void *run_manage_download_server(void *args) if (clientinfo_list[i].clientinfo->clientfd <= 0) continue; if (FD_ISSET(clientinfo_list[i].clientinfo->clientfd, &rset) > 0) { - TRACE_DEBUG_MSG("FD_ISSET [%d] readset slot[%d]", + TRACE_DEBUG_INFO_MSG("FD_ISSET [%d] readset slot[%d]", clientinfo_list[i].clientinfo->clientfd, i); _handle_client_request(clientinfo_list[i].clientinfo); } else if (FD_ISSET(clientinfo_list[i].clientinfo->clientfd, &exceptset) > 0) { @@ -661,7 +662,7 @@ void *run_manage_download_server(void *args) TerminateDaemon(SIGTERM); break; } else if (FD_ISSET(listenfd, &rset) > 0) { // new connection - TRACE_DEBUG_MSG("FD_ISSET listenfd rset"); + TRACE_DEBUG_INFO_MSG("FD_ISSET listenfd rset"); // reset timeout. flexible_timeout = DOWNLOAD_PROVIDER_CARE_CLIENT_MIN_INTERVAL; @@ -718,7 +719,7 @@ void *run_manage_download_server(void *args) if (clientinfo_list[searchslot].clientinfo) { if (clientinfo_list[searchslot].clientinfo->state == DOWNLOAD_STATE_PENDED) { - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("Retry Pended Request [%d/%d] state [%d/%d]", searchslot, MAX_CLIENT, count_downloading_threads, @@ -744,31 +745,61 @@ void *run_manage_download_server(void *args) DA_MAX_DOWNLOAD_REQ_AT_ONCE) { // Auto re-download feature. ethernet may be connected with other downloading items. connection_h network_handle = NULL; - connection_ethernet_state_e system_network_state - = CONNECTION_ETHERNET_STATE_DISCONNECTED; if (connection_create(&network_handle) < 0) { TRACE_DEBUG_MSG ("Failed connection_create"); continue; } + + connection_ethernet_state_e system_network_state + = CONNECTION_ETHERNET_STATE_DISCONNECTED; if (connection_get_ethernet_state(network_handle, &system_network_state) != CONNECTION_ERROR_NONE) TRACE_DEBUG_MSG ("Failed connection_get_ethernet_state"); + TRACE_DEBUG_INFO_MSG + ("ethernet check result : [%d]", (int)system_network_state); + + connection_cellular_state_e system_cellular_state + = CONNECTION_CELLULAR_STATE_OUT_OF_SERVICE; + if (connection_get_cellular_state(network_handle, + &system_cellular_state) != + CONNECTION_ERROR_NONE) + TRACE_DEBUG_MSG + ("Failed connection_get_ethernet_state"); + TRACE_DEBUG_INFO_MSG + ("cellula check result : [%d]", (int)system_cellular_state); + + connection_wifi_state_e system_wifi_state + = CONNECTION_WIFI_STATE_DEACTIVATED; + if (connection_get_wifi_state(network_handle, + &system_wifi_state) != + CONNECTION_ERROR_NONE) + TRACE_DEBUG_MSG + ("Failed connection_get_ethernet_state"); + TRACE_DEBUG_INFO_MSG + ("wifi check result : [%d]", (int)system_wifi_state); + if (connection_destroy(network_handle) != CONNECTION_ERROR_NONE) TRACE_DEBUG_MSG ("Failed connection_destroy"); - if (system_network_state != - CONNECTION_ETHERNET_STATE_CONNECTED) + + if (!(system_network_state + == CONNECTION_ETHERNET_STATE_CONNECTED + || system_cellular_state + == CONNECTION_CELLULAR_STATE_AVAILABLE + || system_wifi_state + == CONNECTION_WIFI_STATE_CONNECTED)) continue; + // check auto-retrying list regardless state. pended state is also included to checking list. int i = 0; download_dbinfo_list *db_list = download_provider_db_get_list(DOWNLOAD_STATE_NONE); if (!db_list || db_list->count <= 0) { - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("provider does not need to check DB anymore. in this life."); check_retry = 0; // provider does not need to check DB anymore. in this life. if (db_list) @@ -784,14 +815,14 @@ void *run_manage_download_server(void *args) if (get_same_request_slot_index (clientinfo_list,db_list->item[i].requestid) < 0) { // not found requestid in memory - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("Retry download [%d]", db_list->item[i].requestid); //search empty slot. copy db info to slot. searchslot = get_empty_slot_index(clientinfo_list); if (searchslot < 0) { - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("download-provider is busy, try later"); flexible_timeout = flexible_timeout * 2; @@ -816,7 +847,7 @@ void *run_manage_download_server(void *args) clientinfo_list[searchslot].clientinfo = request_clientinfo; - TRACE_DEBUG_MSG + TRACE_DEBUG_INFO_MSG ("Retry download [%d/%d][%d/%d]", searchslot, MAX_CLIENT, count_downloading_threads, @@ -853,7 +884,7 @@ void *run_manage_download_server(void *args) DOWNLOAD_PROVIDER_CARE_CLIENT_MAX_INTERVAL) flexible_timeout = DOWNLOAD_PROVIDER_CARE_CLIENT_MAX_INTERVAL; - TRACE_DEBUG_MSG("Next Timeout after [%ld] sec", + TRACE_DEBUG_INFO_MSG("Next Timeout after [%ld] sec", flexible_timeout); } // if (i >= MAX_CLIENT) { // timeout @@ -898,8 +929,8 @@ void __download_info_cb(user_download_info_t *download_info, void *user_data) TRACE_DEBUG_MSG("[CRITICAL] clientinfo is NULL"); return; } - TRACE_DEBUG_MSG("id[%d],size[%lu]", - download_info->da_dl_req_id, download_info->file_size) + TRACE_DEBUG_INFO_MSG("id[%d],size[%lu]", + download_info->da_dl_req_id, download_info->file_size); if (clientinfo->req_id != download_info->da_dl_req_id) { TRACE_DEBUG_MSG("[CRITICAL] req_id[%d] da_dl_req_id[%d}", @@ -914,7 +945,7 @@ void __download_info_cb(user_download_info_t *download_info, void *user_data) if (clientinfo->downloadinfo) clientinfo->downloadinfo->file_size = download_info->file_size; if (download_info->file_type) { - TRACE_DEBUG_MSG("mime[%s]", download_info->file_type); + TRACE_DEBUG_INFO_MSG("mime[%s]", download_info->file_type); len = strlen(download_info->file_type); if (len > (DP_MAX_STR_LEN - 1)) @@ -928,7 +959,7 @@ void __download_info_cb(user_download_info_t *download_info, void *user_data) } if (download_info->tmp_saved_path) { char *str = NULL; - TRACE_DEBUG_MSG("tmp path[%s]", download_info->tmp_saved_path); + TRACE_DEBUG_INFO_MSG("tmp path[%s]", download_info->tmp_saved_path); clientinfo->tmp_saved_path = strdup(download_info->tmp_saved_path); download_provider_db_requestinfo_update_column(clientinfo, @@ -944,7 +975,7 @@ void __download_info_cb(user_download_info_t *download_info, void *user_data) str, len); download_provider_db_requestinfo_update_column (clientinfo, DOWNLOAD_DB_FILENAME); - TRACE_DEBUG_MSG("content_name[%s]", + TRACE_DEBUG_INFO_MSG("content_name[%s]", clientinfo->downloadinfo-> content_name); } @@ -988,13 +1019,18 @@ void __downloading_info_cb(user_downloading_info_t *download_info, clientinfo->downloadinginfo->received_size = download_info->total_received_size; if (download_info->saved_path) { - TRACE_DEBUG_MSG("tmp path[%s]", download_info->saved_path); + TRACE_DEBUG_INFO_MSG("tmp path[%s]", download_info->saved_path); len = strlen(download_info->saved_path); if (len > (DP_MAX_PATH_LEN - 1)) len = DP_MAX_PATH_LEN - 1; if (clientinfo->downloadinginfo) strncpy(clientinfo->downloadinginfo->saved_path, download_info->saved_path, len); + /* FIXME : This should be reviewd again after smack rules is applied */ + if (chown(clientinfo->downloadinginfo->saved_path, + clientinfo->credentials.uid, + clientinfo->credentials.gid) < 0) + TRACE_DEBUG_INFO_MSG("Fail to chown [%s]", strerror(errno)); } static size_t updated_second; @@ -1027,7 +1063,7 @@ void __notify_cb(user_notify_info_t *notify_info, void *user_data) return; } - TRACE_DEBUG_MSG("id[%d],state[%d],err[%d]", + TRACE_DEBUG_INFO_MSG("id[%d],state[%d],err[%d]", notify_info->da_dl_req_id, notify_info->state, notify_info->err); if (clientinfo->req_id != notify_info->da_dl_req_id) { @@ -1049,11 +1085,11 @@ void __notify_cb(user_notify_info_t *notify_info, void *user_data) requestinfo->requestid); } download_provider_db_history_new(clientinfo); - TRACE_DEBUG_MSG("[TEST]Finish clientinfo[%p],fd[%d]", + TRACE_DEBUG_INFO_MSG("[TEST]Finish clientinfo[%p],fd[%d]", clientinfo, clientinfo->clientfd); } - TRACE_DEBUG_MSG("state[%d]", clientinfo->state); + TRACE_DEBUG_INFO_MSG("state[%d]", clientinfo->state); ipc_send_stateinfo(clientinfo); CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex)); @@ -1065,44 +1101,44 @@ int __change_state(da_state state) switch (state) { case DA_STATE_WAITING: case DA_STATE_DOWNLOAD_STARTED: - TRACE_DEBUG_MSG("DA_STATE_DOWNLOAD_STARTED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_DOWNLOAD_STARTED"); ret = DOWNLOAD_STATE_READY; break; case DA_STATE_DOWNLOADING: - TRACE_DEBUG_MSG("DA_STATE_DOWNLOADING"); + TRACE_DEBUG_INFO_MSG("DA_STATE_DOWNLOADING"); ret = DOWNLOAD_STATE_DOWNLOADING; break; case DA_STATE_DOWNLOAD_COMPLETE: - TRACE_DEBUG_MSG("DA_STATE_COMPLETE"); + TRACE_DEBUG_INFO_MSG("DA_STATE_COMPLETE"); ret = DOWNLOAD_STATE_INSTALLING; break; case DA_STATE_CANCELED: - TRACE_DEBUG_MSG("DA_STATE_CANCELED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_CANCELED"); ret = DOWNLOAD_STATE_STOPPED; break; case DA_STATE_CANCELED_ALL: - TRACE_DEBUG_MSG("DA_STATE_CANCELED_ALL"); + TRACE_DEBUG_INFO_MSG("DA_STATE_CANCELED_ALL"); break; case DA_STATE_SUSPENDED: - TRACE_DEBUG_MSG("DA_STATE_SUSPENDED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_SUSPENDED"); ret = DOWNLOAD_STATE_PAUSED; break; case DA_STATE_SUSPENDED_ALL: - TRACE_DEBUG_MSG("DA_STATE_SUSPENDED_ALL"); + TRACE_DEBUG_INFO_MSG("DA_STATE_SUSPENDED_ALL"); break; case DA_STATE_RESUMED: - TRACE_DEBUG_MSG("DA_STATE_RESUMED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_RESUMED"); ret = DOWNLOAD_STATE_DOWNLOADING; break; case DA_STATE_RESUMED_ALL: - TRACE_DEBUG_MSG("DA_STATE_RESUMED_ALL"); + TRACE_DEBUG_INFO_MSG("DA_STATE_RESUMED_ALL"); break; case DA_STATE_FINISHED: - TRACE_DEBUG_MSG("DA_STATE_FINISHED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_FINISHED"); ret = DOWNLOAD_STATE_FINISHED; break; case DA_STATE_FAILED: - TRACE_DEBUG_MSG("DA_STATE_FAILED"); + TRACE_DEBUG_INFO_MSG("DA_STATE_FAILED"); ret = DOWNLOAD_STATE_FAILED; break; default: |