Пример #1
0
static void response_client_open_int(response_client_t *uclient, char *conn_str) {
    char *first, *second, *third;
    int len, port;

    memset(uclient->connect_str, 0, sizeof(uclient->connect_str));
    strncpy(uclient->connect_str, conn_str, strlen(conn_str));
    len = strlen(uclient->connect_str);
    uclient->connect_str[len] = '\0';

    first = conn_str;
    second = strchr(first, ':');
    EXIT_IF_TRUE(second == NULL, "Invalid connection string\n");
    *second = '\0';
    second++;
    if( 0 == strcmp(first, "udp") ) {
        third = strchr(second, ':');
        EXIT_IF_TRUE(third == NULL, "Invalid connection string for udp socket\n");
        *third = '\0';
        third++;
        port =  atoi(third);
        open_udp_socket(uclient, second, port);
    }
    else if( 0 == strcmp(first, "tty") ) {
        open_tty(uclient, second);
    }

}
Пример #2
0
void asterisk_acc_unpack_socket(char *buff, perm_node_t **key_list, asterisk_acc_table_t *asterisk_acc_table, opool_t *opool) {
    int i;
    json_object *new_obj, *jvalue;
    opool_item_t *item, *item2;
    perm_node_t *key_element, *value_element, *data_list;

    perm_node_t *temp, *entry;
    perm_node_t *temp2, *entry2;
    perm_node_t *data_list2;

    char id[10], pwd[10];

	new_obj = json_tokener_parse(buff);
	//printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));

    for(i = 0; i < json_object_array_length(new_obj); i++)
	{ 
        item = opool_get(opool);
        EXIT_IF_TRUE(item == NULL, "Cannot get from object pool\n");
        key_element = (perm_node_t *)item->data;

        item2 = opool_get(opool);
        EXIT_IF_TRUE(item == NULL, "Cannot get from object pool\n");
        value_element = (perm_node_t *)item2->data;

        json_object *obj = json_object_array_get_idx(new_obj, i);

        json_object_object_get_ex(obj, "account", &jvalue);
        strcpy(id, json_object_get_string(jvalue));

        json_object_object_get_ex(obj, "password", &jvalue);
        strcpy(pwd, json_object_get_string(jvalue));

        ansi_copy_str(key_element->value, id);
        ansi_copy_str(value_element->value, pwd);

        data_list = (perm_node_t *)ht_get_item(asterisk_acc_table, (void *)id);
        if (data_list == NULL) {
            DL_APPEND(*key_list, key_element);
            DL_APPEND(data_list, value_element);
            ht_add_item(asterisk_acc_table, id, data_list);
        }
        else {
            DL_APPEND(data_list, value_element);
        }
    }

}
Пример #3
0
static void open_tty($UPROTO$_server_t *userver, char *path) {
    (void)userver;
    (void)path;
#if 0
    struct termios options;
    
    userver->fd = open(path, O_RDWR | O_NOCTTY);
    EXIT_IF_TRUE(userver->fd < 0, "Cannot open port");
    fcntl(userver->fd, F_SETFL, 0);

    tcgetattr(userver->fd, &options);

    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);

    options.c_cflag |= (CREAD |CLOCAL);
    options.c_cflag &= ~CSIZE; /* Mask the character size bits */
    options.c_cflag |= CS8;    /* Select 8 data bits */
    options.c_cflag &= ~CRTSCTS;
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
    //options->c_lflag |= (ICANON | ECHO | ECHOE); // Canonical mode

    options.c_lflag &= ~(ICANON | ECHO); // RAW mode
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 2; // measured in 0.1 second

    tcsetattr(userver->fd, TCSANOW, &options);
#endif
}
Пример #4
0
void on_riuc4_status(int port, riuc4_signal_t signal, uart4_status_t *ustatus) {
    SHOW_LOG(4, "on_riuc4_status port:%d, signal:%s\n", port, RIUC4_SIGNAL_NAME[signal]);

    static pj_thread_desc s_desc;
    static pj_thread_t *s_thread;
    ANSI_CHECK(__FILE__, pj_thread_register("adv_server", s_desc, &s_thread));

    switch(signal) {
        case RIUC_SIGNAL_SQ:
            SHOW_LOG(3, "Received SQ signal\n");
            gb_sender_report_sq(&riuc_data.gb_sender, riuc_data.node[port].id, port, ustatus->sq);
            if (ustatus->sq == 1) {
                node_start_session(&riuc_data.node[port]);
                gb_sender_report_rx(&riuc_data.gb_sender, riuc_data.node[port].id, port, 1);
            }
            else {
                node_stop_session(&riuc_data.node[port]);
                gb_sender_report_rx(&riuc_data.gb_sender, riuc_data.node[port].id, port, 0);
            }
            break;
        case RIUC_SIGNAL_PTT:
            SHOW_LOG(3, "Received PTT signal - node[%d]\n", port);
            gb_sender_report_tx(&riuc_data.gb_sender, riuc_data.node[port].id, port, ustatus->ptt);
            break;
        case RIUC_SIGNAL_RX:
            SHOW_LOG(3, "Received RX signal\n");
            break;
        case RIUC_SIGNAL_TX:
            SHOW_LOG(3, "Received TX signal\n");
            break;
        default:
            EXIT_IF_TRUE(1, "Unknow signal\n");
    } 
}
Пример #5
0
void lvc_pack(lvc_t *lvc, int len, char *val) {
    EXIT_IF_TRUE((lvc->pack_ptr + len) > lvc->len, "lvc buffer is overflown\n");

    SHOW_LOG(1, "len:%d\n", len);
    memcpy((lvc->data + lvc->pack_ptr), &len, sizeof(int));
    lvc->pack_ptr += sizeof(int);

    memcpy(lvc->data + lvc->pack_ptr, val, len);
    lvc->pack_ptr += len;
}
Пример #6
0
/*
void on_request_adv_server(adv_server_t *adv_server, adv_request_t *request) {
    //TODO
    SHOW_LOG(4, fprintf(stdout,"Received: ID = %s\nSDP addr %s:%d\n", request->adv_info.info_id, request->adv_info.sdp_mip, request->adv_info.sdp_port));
}
*/
void on_request_gmc_server(gmc_server_t *gmc_server, gmc_request_t *request) {
    node_t *node = gmc_server->user_data;
    SHOW_LOG(5, fprintf(stdout, "Receive something\n"));
    switch(request->msg_id) {
        case GMC_GROUP:
            SHOW_LOG(4, fprintf(stdout, "Received request:\nAction: %d - Adv_ip: %s\n", 
                    request->gmc_group.join, request->gmc_group.adv_ip));
            if (request->gmc_group.join == 1) {
                SHOW_LOG(4, fprintf(stdout, "Join %s\n", request->gmc_group.adv_ip));
                adv_server_join(&node->adv_server, request->gmc_group.adv_ip);
            }
            else if (request->gmc_group.join == 0) {
                SHOW_LOG(4, fprintf(stdout, "Leave %s\n", request->gmc_group.adv_ip));
                adv_server_leave(&node->adv_server, request->gmc_group.adv_ip);
            }
            else {
                EXIT_IF_TRUE(1, "Unknow action\n");
            }
            break;
        default:
            EXIT_IF_TRUE(1, "Unknow request\n");
    }
}
Пример #7
0
void do_disable_rx(int port_idx, int fd) {
    char data[] = "disrxX\r";
    data[5] = port_idx + '1';
    EXIT_IF_TRUE(7 != write(fd, data, 7), "Write error\n");
}
Пример #8
0
void do_enable_rx(int port_idx, int fd) {
    char data[] = "enrxX\r";
    data[4] = port_idx + '1';
    EXIT_IF_TRUE(6 != write(fd, data, 6), "Write error\n");
}
Пример #9
0
void do_check_rx(int port_idx, int fd) {
    char data[] = "rxX\r";
    data[2] = port_idx + '1';
    EXIT_IF_TRUE(4 != write(fd, data, 4), "Write error\n");
}
Пример #10
0
void do_check_ptt(int port_idx, int fd) {
    char data[] = "pttX\r";
    data[3] = port_idx + '1';
    EXIT_IF_TRUE(5 != write(fd, data, 5), "Write error\n");
}
Пример #11
0
int $UPROTO$_server_proc(void *param) {
    int ret;
    unsigned int len;
    
    int port;
    char *first, *second, *third;
    char cnt_str[30];

    pj_sockaddr_in caddr;
    char *caddr_str;
    pj_time_val timeout;

    pj_fd_set_t read_fds;

	char buffer[USERVER_BUFSIZE];
	$UPROTO$_request_t request;

    $UPROTO$_server_t *userver = ($UPROTO$_server_t *)param;
	ansi_copy_str(cnt_str, userver->connect_str);

    first = cnt_str;
    
    second = strchr(first, ':');
    EXIT_IF_TRUE(second == NULL, "Wrong connection string format\n");
    *second = '\0';
    second++;

    if(0 == strcmp(first, "udp")) {
        third = strchr(second, ':');
        EXIT_IF_TRUE(third == NULL, "Wrong connection string format\n");
        *third = '\0';
        third++;
        port = atoi(third);
        open_udp_socket(userver, second, port);
        if (userver->on_open_socket_f != NULL)
            userver->on_open_socket_f(userver);

        userver->recv_f = &udp_recvfrom;
        userver->send_f = &udp_sendto;
    }
    else if( 0 == strcmp(first, "tty") ) {
        open_tty(userver, second);
        userver->recv_f = &tty_recvfrom;
        userver->send_f = &tty_sendto;
    }
    else {
        EXIT_IF_TRUE(1, "Unsuported protocol\n");
    }

    // thread loop
    timeout.sec = 0;
    timeout.msec = 100;
    userver->is_end = 0;


    while( !userver->is_end ) {

        while (!userver->is_online) {
            SHOW_LOG(3, "Server is currently offline...\n");
            //usleep(8*1000*1000);
            pj_thread_sleep(1000);
        }

        PJ_FD_ZERO(&read_fds);
        PJ_FD_SET(userver->fd, &read_fds);

        pj_mutex_lock(userver->mutex);
        ret = pj_sock_select(userver->fd + 1, &read_fds, NULL, NULL, &timeout); 
        pj_mutex_unlock(userver->mutex);

        EXIT_IF_TRUE(ret < 0, "Error on server socket\n");

        if( PJ_FD_ISSET(userver->fd, &read_fds) ) {
            len = sizeof(caddr);
            pj_bzero(&caddr, len);

            pj_mutex_lock(userver->mutex);
            ret = userver->recv_f(userver->fd, buffer, USERVER_BUFSIZE, (void *)&caddr, &len);
            pj_mutex_unlock(userver->mutex);
            caddr_str = pj_inet_ntoa(caddr.sin_addr);

            if( ret > 0 ) {
                buffer[ret] = '\0';
                SHOW_LOG(5, "Received from client: %s\n", buffer);
                $UPROTO$_parse_request(buffer, ret, &request);
                userver->on_request_f(userver, &request, caddr_str);
            }
        }
        //usleep(100*1000);
        pj_thread_sleep(100);
        // if userver->fd is ready to write. When write finish, call userver->on_sent();
        // else --> time out
    }
	return 0;
}
Пример #12
0
void ht_create(hash_table_t *table_data, unsigned size) {
    table_data->hash_table = pj_hash_create(table_data->pool, size);
    EXIT_IF_TRUE(table_data->hash_table == NULL, "Error: pj_hash_create()\n");
}
Пример #13
0
void ht_init(hash_table_t *table_data, pj_pool_t *pool) {
    EXIT_IF_TRUE(pool == NULL, "Error: NULL pool\n");
    table_data->pool = pool;
}
Пример #14
0
int $UPROTO$_secure_server_proc(void *param) {
    int ret;
    unsigned int len;
    
    int port;
    char *first, *second, *third;
    char cnt_str[30];

    pj_sockaddr_in caddr;
    char *caddr_str;
    pj_time_val timeout;

    pj_fd_set_t read_fds;

	char buffer[USERVER_BUFSIZE];

	$UPROTO$_request_t request;

    // For lvc parsing
    lvc_t lvc;
    int len1;
    char *val;
    uint32_t *ts;
    char sts[32];
    char plain[USERVER_BUFSIZE];
    char *pph;
    char otp[32];
    pj_str_t pjstr;
    // End for lvc parsing

    $UPROTO$_server_t *userver = ($UPROTO$_server_t *)param;
	ansi_copy_str(cnt_str, userver->connect_str);

    first = cnt_str;
    
    second = strchr(first, ':');
    EXIT_IF_TRUE(second == NULL, "Wrong connection string format\n");
    *second = '\0';
    second++;

    if(0 == strcmp(first, "udp")) {
        third = strchr(second, ':');
        EXIT_IF_TRUE(third == NULL, "Wrong connection string format\n");
        *third = '\0';
        third++;
        port = atoi(third);
        open_udp_socket(userver, second, port);
        if (userver->on_open_socket_f != NULL)
            userver->on_open_socket_f(userver);

        userver->recv_f = &udp_recvfrom;
        userver->send_f = &udp_sendto;
    }
    else if( 0 == strcmp(first, "tty") ) {
        open_tty(userver, second);
        userver->recv_f = &tty_recvfrom;
        userver->send_f = &tty_sendto;
    }
    else {
        EXIT_IF_TRUE(1, "Unsuported protocol\n");
    }

    // thread loop
    timeout.sec = 0;
    timeout.msec = 100;
    userver->is_end = 0;


    while( !userver->is_end ) {

        while (!userver->is_online) {
            SHOW_LOG(3, "Server is currently offline...\n");
            pj_thread_sleep(1000);
        }

        PJ_FD_ZERO(&read_fds);
        PJ_FD_SET(userver->fd, &read_fds);

        pj_mutex_lock(userver->mutex);
        ret = pj_sock_select(userver->fd + 1, &read_fds, NULL, NULL, &timeout); 
        pj_mutex_unlock(userver->mutex);

        EXIT_IF_TRUE(ret < 0, "Error on server socket\n");

        if( PJ_FD_ISSET(userver->fd, &read_fds) ) {
            len = sizeof(caddr);
            pj_bzero(&caddr, len);

            pj_mutex_lock(userver->mutex);
            ret = userver->recv_f(userver->fd, buffer, USERVER_BUFSIZE, (void *)&caddr, &len);
            pj_mutex_unlock(userver->mutex);
            caddr_str = pj_inet_ntoa(caddr.sin_addr);

            if( ret > 0 ) {
                buffer[ret] = '\0';

                lvc_init(&lvc, buffer, ret);

                lvc_unpack(&lvc, &len, &val);
                pj_strset(&pjstr, val, len);
                pph = userver->get_pph_f(&pjstr);
                if( pph != NULL ) {

                    lvc_unpack(&lvc, &len, &val);
                    ts = (uint32_t *)val;
                    ts2str(*ts, sts);

                    lvc_unpack(&lvc, &len, &val);
                    
                    generate_otp(otp, pph, sts);
                    do_decrypt(val, len, plain, &len1, otp);
                    if( pj_ansi_strncmp(sts, plain, len1) == 0 ) {
                        lvc_unpack(&lvc, &len, &val);
                        do_decrypt(val, len, plain, &len1, otp);
                        plain[len1] = '\0';

                        $UPROTO$_parse_request(plain, len1, &request);
                        userver->on_request_f(userver, &request, caddr_str);
                    }
                }
                //else {
                //}
            }
        }
        pj_thread_sleep(100);
    }
	return 0;
}
Пример #15
0
void do_on_ptt(int port_idx, int fd) {
    char data[] = "onpttX\r";
    data[5] = port_idx + '1';
    EXIT_IF_TRUE(7 != write(fd, data, 7), "Write error\n");
}
Пример #16
0
void do_off_ptt(int port_idx, int fd) {
    char data[] = "offpttX\r";
    data[6] = port_idx + '1';
    EXIT_IF_TRUE(8 != write(fd, data, 8), "Write error\n");
}
Пример #17
0
int main(int argc, char* argv[])
{
    int lsocket = -1;   //侦听套接字 
    int dsocket = -1;   //连接套接字

    ushort mix_socket[2];
    memset(mix_socket, 0, sizeof(mix_socket));
 
 	P_EPOLL_STRUCT p_epoll = NULL;

    char buf[4096];
    int cnt = 0;
    int ready = 0;

    // STAGE1, build local listen
    EXIT_IF_TRUE ( (lsocket = st_buildsocket(10, SERV_PORT)) == -1);
    st_make_nonblock(lsocket);

    EXIT_IF_TRUE( (p_epoll = st_make_events(lsocket, 64)) == NULL);
	
    st_print("SERVER prepared OK!\n");

    int e_i = 0;

    while (TRUE)
    {
        ready = epoll_wait(p_epoll->event_fd, p_epoll->p_events, 64, 5000 /*5s*/);

        if (ready == -1) 
        {
            SYS_ABORT("EPOLL_WAIT ERROR!\n");
        }

        if( ready == 0)
        {
            st_print("PROCESS ALIVE!\n");
            continue;
        }

        for (e_i = 0; e_i < ready; ++e_i) 
        {
            if( (p_epoll->p_events[e_i].events & EPOLLERR) )            
            {
                st_d_error("Epoll Error!\n");
                close(p_epoll->p_events[e_i].data.fd);
                continue;
            }
            
            if ( ( p_epoll->p_events[e_i].events & EPOLLHUP ) ||
                 ( p_epoll->p_events[e_i].events & EPOLLRDHUP) )
            {
                st_d_error("Remote Disconnected!\n");
                close(p_epoll->p_events[e_i].data.fd);
                continue;
            }

            if (p_epoll->p_events[e_i].data.fd == lsocket) 
            {
                struct sockaddr in_addr;
                socklen_t in_len;

                dsocket = accept(lsocket,
                               (struct sockaddr *) &in_addr, &in_len);
                if (dsocket == -1) 
                {
                   st_d_error("accept lsocket error!\n");
                   continue;
                }

               	st_make_nonblock(dsocket);
                if (st_add_new_event(dsocket, p_epoll))
                {
                    st_d_error("Add socket:%d to event error!\n", dsocket);
                    close(dsocket);
                    dsocket = -1;   //INVALID
                    break;
                }

                st_print("Server accept new socket:%d\n", dsocket);

                if(mix_socket[0] == 0)
                	mix_socket[0] = dsocket;
                else
                	mix_socket[1] = dsocket;
           } 
           else     //数据转发部分
           {
                if(p_epoll->p_events[e_i].data.fd == mix_socket[0])
                {
                    memset(buf, 0, sizeof(buf)); 
                    cnt = recv(mix_socket[0], buf, sizeof(buf), 0);
                    if (cnt > 0)
                    {
                    	//write(1, buf, cnt);
                        send(mix_socket[1], buf, cnt, 0);
                    }   
                    continue;
                }
                else if(p_epoll->p_events[e_i].data.fd == mix_socket[1])
                {
                    memset(buf, 0, sizeof(buf));   
                    cnt = recv(mix_socket[1], buf, sizeof(buf), 0);
                    if (cnt > 0)
                    {
                    	//write(1, buf, cnt);
                        send(mix_socket[0], buf, cnt, 0);
                    }
                    continue;
                }
           }
       }
    }

    st_print("PROCESS TERMINATED!\n");

    return 0;
}