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;
}
Exemple #2
0
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;
}