static BOOL load_head( LOG_HEADER_T* head ) { BOOL create = FALSE; fs_handle_type file; sys_mkdir(LOG_DIR, 0700);//make directory.. if((file = pantech_fopen( LOG_PATH, O_RDONLY, S_IRUSR | S_IWUSR)) != NULL) { if( check_head_valid() == FALSE ) { create = TRUE; } pantech_fclose(file); } else { create = TRUE; } if( create == TRUE ) { if( create_log_file() == FALSE ) { return FALSE; } } file = open_log_file(); if( file == FS_NULL_HANDLE ) { return FALSE; } head->first_log_pos_ = get_value( file, FIRST_LOG_POS, 6 ); // FIRST LOG head->count_ = get_value( file, LOG_COUNT_POS, 4 ); // 로그수 head->head_ = get_value( file, HEAD_POS, 4 ); // head head->tail_ = get_value( file, TAIL_POS, 4 ); // tail head->free_head_ = get_value( file, FREE_HEAD_POS, 4 ); // free head if( head->first_log_pos_ == (UINT32)-1 || head->count_ == (UINT32)-1 || head->head_ == (UINT32)-1 || head->tail_ == (UINT32)-1 || head->free_head_ == (UINT32)-1 ) { goto _fail; } if( get_prev_next( file, head ) == FALSE ) { goto _fail; } pantech_fclose( file ); return TRUE; _fail: pantech_fclose( file ); return FALSE; }
MTC_STATIC void * script_service_thread( void *param) { int listening_socket, message_socket; struct sockaddr_un message_socket_addr; socklen_t message_socket_len; char thread_name[THREAD_NAME_LEN]; MTC_BOOLEAN term = FALSE; SCRIPT_DATA_REQUEST request; SCRIPT_DATA_RESPONSE response; MTC_U32 service_func_num; SCRIPT_SERVICE_FUNC *service_func; MTC_BOOLEAN reported = FALSE; int read_num, write_num, size; int ret; listening_socket = ((SCRIPT_SERVICE_THREAD_PARAM *) param)->socket; strcpy(thread_name, ((SCRIPT_SERVICE_THREAD_PARAM *) param)->thread_name); service_func_num = ((SCRIPT_SERVICE_THREAD_PARAM *) param)->funcnum; service_func = ((SCRIPT_SERVICE_THREAD_PARAM *) param)->func; do { fd_set fds; int nfds; struct timeval wait; int selected; char *bufptr; // // wait new connection // memset((void *)&request, 0, sizeof(request)); memset((void *)&response, 0, sizeof(response)); FD_ZERO(&fds); nfds = 0; FD_SET(listening_socket, &fds); nfds = listening_socket; wait = mstotv(POLLING_TIMEOUT); selected = select (nfds+1, &fds, NULL, NULL, &wait); if (selected == 0) { // select timeout goto continue_loop; } if (selected < 0) { // select failed log_message(MTC_LOG_WARNING, "SC: select failed (thread:%s). (sys %d)\n", thread_name, errno); // try to continue; sleep(10); goto continue_loop; } if (!FD_ISSET(listening_socket, &fds)) { log_message(MTC_LOG_WARNING, "SC: socket is not set after select (thread:%s).\n", thread_name); // only bug, ignore } // // accept // message_socket_len = sizeof(message_socket_addr); if ((message_socket = accept(listening_socket, (struct sockaddr *) &message_socket_addr, &message_socket_len)) < 0) { log_message(MTC_LOG_WARNING, "SC: accept failed (thread:%s). (sys %d)\n", thread_name, errno); goto continue_loop; } // // read request head // size = sizeof(request.head); read_num = 0; bufptr = (char *)&request; while (size - read_num > 0) { // select before read FD_ZERO(&fds); FD_SET(message_socket, &fds); nfds = message_socket; wait = mstotv(_Wh * 1000); selected = select (nfds+1, &fds, NULL, NULL, &wait); if (selected == 0) { // select timeout log_message(MTC_LOG_WARNING, "SC: select timeout (thread:%s).\n", thread_name); close(message_socket); goto continue_loop; } if (selected < 0) { // select failed log_message(MTC_LOG_WARNING, "SC: select failed (thread:%s). (sys %d)\n", thread_name, errno); close(message_socket); goto continue_loop; } // read if ((ret = read(message_socket, bufptr + read_num, size - read_num)) <= 0) { // EOF or fail log_message(MTC_LOG_WARNING, "SC: read failed in request head (thread:%s). (sys %d)\n", thread_name, errno); close (message_socket); goto continue_loop; } read_num += ret; } // // check head // if (check_head_valid(&request.head) != MTC_SUCCESS) { // invalid head if (reported == FALSE) { log_message(MTC_LOG_ERR, "Script service received an invalid message.\n"); reported = TRUE; } log_message(MTC_LOG_WARNING, "SC: invalild head (thread:%s).\n", thread_name); close (message_socket); goto continue_loop; } // // read request body // size = request.head.length; read_num = 0; bufptr = (char *)&request.body; while (size - read_num > 0) { // select before read FD_ZERO(&fds); FD_SET(message_socket, &fds); nfds = message_socket; wait = mstotv(_Wh * 1000); selected = select (nfds+1, &fds, NULL, NULL, &wait); if (selected == 0) { // select timeout log_message(MTC_LOG_WARNING, "SC: select timeout (thread:%s).\n", thread_name); close(message_socket); goto continue_loop; } if (selected < 0) { // select failed log_message(MTC_LOG_WARNING, "SC: select failed (thread:%s). (sys %d)\n", thread_name, errno); close(message_socket); goto continue_loop; } // read if ((ret = read(message_socket, bufptr + read_num, size - read_num)) <= 0) { // EOF or fail log_message(MTC_LOG_WARNING, "SC: read failed in request body (thread:%s). (sys %d)\n", thread_name, errno); close (message_socket); goto continue_loop; } read_num += ret; } // // call script service function; // response.head.magic = SCRIPT_MAGIC; response.head.response = 1; response.head.type = request.head.type; response.head.length = sizeof(response.body); if (request.head.type > service_func_num || service_func[request.head.type] == NULL) { // invalid type if (reported == FALSE) { log_message(MTC_LOG_ERR, "Script service received an invalid message.\n"); reported = TRUE; } log_message(MTC_LOG_WARNING, "SC: invalid type(%d) in head (thread:%s).\n", request.head.type, thread_name); close (message_socket); goto continue_loop; } ret = service_func[request.head.type](request.head.length, (void *) &request.body, &(response.head.length), (void *) &response.body); if (ret != MTC_SUCCESS) { // service func failed // internal error log_internal(MTC_LOG_ERR, "SC: service func for type %d failed (thread:%s) status=%d.\n", request.head.type, thread_name, ret); close (message_socket); goto continue_loop; } // // write response // size = sizeof(response.head) + response.head.length; write_num = 0; bufptr = (char *)&response; while (size - write_num > 0) { // select before write FD_ZERO(&fds); FD_SET(message_socket, &fds); nfds = message_socket; wait = mstotv(_Wh * 1000); selected = select (nfds+1, NULL, &fds, NULL, &wait); if (selected == 0) { // select timeout log_message(MTC_LOG_WARNING, "SC: select timeout (thread:%s).\n", thread_name); close(message_socket); goto continue_loop; } if (selected < 0) { // select failed log_message(MTC_LOG_WARNING, "SC: select failed (thread:%s). (sys %d)\n", thread_name, errno); close(message_socket); goto continue_loop; } if ((ret = write(message_socket, bufptr + write_num, size - write_num)) <= 0) { // EOF or fail log_message(MTC_LOG_WARNING, "SC: write failed in response (thread:%s). (sys %d)\n", thread_name, errno); close (message_socket); goto continue_loop; } write_num += ret; } // close connection graceful; close (message_socket); // check set_excluded script_service_check_after_set_excluded(request.head.type, response.head.length, (void *) &response.body); continue_loop: pthread_spin_lock(&lock); term = terminate; pthread_spin_unlock(&lock); } while (!term); return NULL; }