Beispiel #1
0
EC_BOOL csrv_clean(CSRV *csrv)
{
    if(CMPI_ERROR_SOCKFD != CSRV_SOCKFD(csrv))
    {
        csocket_close(CSRV_SOCKFD(csrv));
        CSRV_SOCKFD(csrv)  = CMPI_ERROR_SOCKFD;
    }

    if(CMPI_ERROR_SOCKFD != CSRV_UNIX_SOCKFD(csrv))
    {
        csocket_close(CSRV_UNIX_SOCKFD(csrv));
        CSRV_UNIX_SOCKFD(csrv)  = CMPI_ERROR_SOCKFD;
    }

    CSRV_IPADDR(csrv)  = CMPI_ERROR_IPADDR;
    CSRV_PORT(csrv)    = CMPI_ERROR_SRVPORT;
    CSRV_MD_ID(csrv)   = ERR_MODULE_ID;

    CSRV_INIT_CSOCKET_CNODE(csrv)   = NULL_PTR;
    CSRV_ADD_CSOCKET_CNODE(csrv)    = NULL_PTR;
    CSRV_DEL_CSOCKET_CNODE(csrv)    = NULL_PTR;
 
    CSRV_RD_EVENT_HANDLER(csrv)     = NULL_PTR;
    CSRV_WR_EVENT_HANDLER(csrv)     = NULL_PTR;
    CSRV_TIMEOUT_HANDLER(csrv)      = NULL_PTR;
    CSRV_COMPLETE_HANDLER(csrv)     = NULL_PTR;
    CSRV_CLOSE_HANDLER(csrv)        = NULL_PTR;

    if(NULL_PTR != CSRV_CSSL_NODE(csrv))
    {
        cssl_node_free(CSRV_CSSL_NODE(csrv));
        CSRV_CSSL_NODE(csrv) = NULL_PTR;
    }
    return (EC_TRUE);
}
Beispiel #2
0
EC_BOOL cextclnt_clean(CEXTCLNT *cextclnt)
{
    if(CMPI_ERROR_SOCKFD != CEXTCLNT_SOCKFD(cextclnt))
    {
        csocket_close(CEXTCLNT_SOCKFD(cextclnt));
        CEXTCLNT_SOCKFD(cextclnt) = CMPI_ERROR_SOCKFD;
    }
    CEXTCLNT_IPADDR(cextclnt) = CMPI_ERROR_IPADDR;
    return (EC_TRUE);
}
Beispiel #3
0
EC_BOOL cextsrv_clean(CEXTSRV *cextsrv)
{
    if(CMPI_ERROR_SOCKFD != CEXTSRV_SOCKFD(cextsrv))
    {
        csocket_close(CEXTSRV_SOCKFD(cextsrv));
        CEXTSRV_SOCKFD(cextsrv)  = CMPI_ERROR_SOCKFD;
    }

    CEXTSRV_IPADDR(cextsrv)  = CMPI_ERROR_IPADDR;
    CEXTSRV_PORT(cextsrv)    = CMPI_ERROR_SRVPORT;

    CEXTSRV_CMUTEX_CLEAN(cextsrv, LOC_CEXTSRV_0005);

    return (EC_TRUE);
}
Beispiel #4
0
CEXTSRV * cextsrv_start(const UINT32 srv_ipaddr, const UINT32 srv_port)
{
    CEXTSRV *cextsrv;
    int srv_sockfd;

    if(EC_FALSE == csocket_srv_start(srv_ipaddr, srv_port, CSOCKET_IS_BLOCK_MODE, &srv_sockfd))
    {
        dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDERR, "error:cextsrv_start: failed to listen on port %ld\n", srv_port);
        return (NULL_PTR);
    }

    cextsrv = cextsrv_new(srv_ipaddr, srv_port, srv_sockfd);
    if(NULL_PTR == cextsrv)
    {
        dbg_log(SEC_0069_CEXTSRV, 0)(LOGSTDOUT, "error:cextsrv_start: new cextsrv failed, close srv sockfd %d\n", srv_sockfd);
        csocket_close(srv_sockfd);
        return (NULL_PTR);
    }

    dbg_log(SEC_0069_CEXTSRV, 5)(LOGSTDOUT, "cextsrv_start: start srv sockfd %d on port %s:%ld\n", srv_sockfd, c_word_to_ipv4(srv_ipaddr), srv_port);
    return (cextsrv);
}
Beispiel #5
0
CSOCKET_CNODE *cconnp_reserve(CCONNP *cconnp)
{
    CSOCKET_CNODE *csocket_cnode;
    int            sockfd;

    if(EC_TRUE == cqueue_is_empty(CCONNP_IDLE_CONN_QUEUE(cconnp)))
    {
        CQUEUE_DATA *cqueue_data;
     
        /*if no idle, new one*/
        if(csocket_connect(CCONNP_SRV_IPADDR(cconnp), CCONNP_SRV_PORT(cconnp), CSOCKET_IS_NONBLOCK_MODE, &sockfd))
        {
            dbg_log(SEC_0154_CCONNP, 0)(LOGSTDOUT, "error:cconnp_reserve: connect server %s:%ld failed\n",
                                CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));
            return (NULL_PTR);
        }

        csocket_cnode = csocket_cnode_new(CCONNP_SRV_TCID(cconnp), sockfd, CSOCKET_TYPE_TCP, CCONNP_SRV_IPADDR(cconnp), CCONNP_SRV_PORT(cconnp));
        if(NULL_PTR == csocket_cnode)
        {
            dbg_log(SEC_0154_CCONNP, 0)(LOGSTDOUT, "error:cconnp_reserve: new csocket_cnode for socket %d to server %s:%ld failed\n",
                            sockfd, CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));
            csocket_close(sockfd);
            return (NULL_PTR);
        }

        cqueue_data = cqueue_push(CCONNP_IDLE_CONN_QUEUE(cconnp), (void *)csocket_cnode);
        if(NULL_PTR == cqueue_data)
        {
            dbg_log(SEC_0154_CCONNP, 0)(LOGSTDOUT, "error:cconnp_reserve: push socket %d to server %s:%ld failed\n",
                            sockfd, CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));
            csocket_cnode_free(csocket_cnode);
            return (NULL_PTR);
        }
     
        CSOCKET_CNODE_WORK_NODE(csocket_cnode)    = (void *)cqueue_data;
        CSOCKET_CNODE_WORK_OWNER(csocket_cnode)   = (void *)cconnp;
        CSOCKET_CNODE_WORK_RELEASE(csocket_cnode) = (CSOCKET_CNODE_WORK_REL)cconnp_erase;;
        CSOCKET_CNODE_WORK_STATUS(csocket_cnode)  = CSOCKET_CNODE_WORK_STATUS_IDLE;

        dbg_log(SEC_0154_CCONNP, 9)(LOGSTDOUT, "[DEBUG] cconnp_reserve: create and push sockfd %d to server %s:%ld done\n",
                        CSOCKET_CNODE_SOCKFD(csocket_cnode),
                        CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));      
    }

    /*reserve one idle*/
    csocket_cnode = cqueue_pop(CCONNP_IDLE_CONN_QUEUE(cconnp));
    if(NULL_PTR == csocket_cnode)
    {
        dbg_log(SEC_0154_CCONNP, 0)(LOGSTDOUT, "error:cconnp_reserve: server %s:%ld has no idle conn\n",
                        CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));
        return (NULL_PTR);
    }

    if(EC_TRUE == CSOCKET_CNODE_WORK_PUSHED(csocket_cnode))
    {
        /*when csocket_cnode was released and pushed to connp, RD event was set. here need to clear it*/
        cepoll_del_event(task_brd_default_get_cepoll(), CSOCKET_CNODE_SOCKFD(csocket_cnode), CEPOLL_RD_EVENT);
        CSOCKET_CNODE_WORK_PUSHED(csocket_cnode) = EC_FALSE;
    }
 
    CSOCKET_CNODE_WORK_NODE(csocket_cnode)    = NULL_PTR;
    CSOCKET_CNODE_WORK_OWNER(csocket_cnode)   = (void *)cconnp;
    CSOCKET_CNODE_WORK_RELEASE(csocket_cnode) = (CSOCKET_CNODE_WORK_REL)cconnp_release;
    CSOCKET_CNODE_WORK_STATUS(csocket_cnode)  = CSOCKET_CNODE_WORK_STATUS_NONE;

    dbg_log(SEC_0154_CCONNP, 9)(LOGSTDOUT, "[DEBUG] cconnp_reserve: pop sockfd %d from server %s:%ld done\n",
                    CSOCKET_CNODE_SOCKFD(csocket_cnode),
                    CCONNP_SRV_IPADDR_STR(cconnp), CCONNP_SRV_PORT(cconnp));  
    return (csocket_cnode);
}
Beispiel #6
0
int main(int argc, char ** argv)
{
  int bytes = 0;
  CSOCKET* sock=NULL;
  CLOG_INFO* log=NULL;
  CSTRING* buf = NULL;

  // open the logfile
  log = clog_open("./test_csocket.log", CTRACE, NULL, 0);

  if(3>argc) {
    clog(log, CFATAL, "USAGE: %s host user password", argv[0]);
    clog_close(log);
    return 1;
  }
  
  // create the new socket  
  sock = csocket_new(log);

  // initialize the socket
  csocket_init(log, sock, argv[1], 110);

  // connect
  csocket_connect(log, sock);

  // read/write
  buf = cstring_new(1024);
  bytes=csocket_read(log, sock, buf->string, 1024);
  fprintf(stdout, "%s", buf->string);

  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  cstring_strcat_imp(buf, "USER ", 5);
  cstring_strcat_imp(buf, argv[2], strlen(argv[2]));  
  cstring_strcat_imp(buf, "\r\n", 2);
  csocket_write(log, sock, buf->string, buf->length);
  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  bytes=csocket_read(log, sock, buf->string, 1024);
  fprintf(stdout, "%s", buf->string);

  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  cstring_strcat_imp(buf, "PASS ", 5);
  cstring_strcat_imp(buf, argv[3], strlen(argv[3]));
  cstring_strcat_imp(buf, "\r\n", 2);
  csocket_write(log, sock, buf->string, buf->length);
  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  bytes=csocket_read(log, sock, buf->string, 1024);
  fprintf(stdout, "%s", buf->string);

  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  cstring_strcat_imp(buf, "STAT\r\n", 6);
  csocket_write(log, sock, buf->string, buf->length);
  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  bytes=csocket_read(log, sock, buf->string, 1024);
  fprintf(stdout, "%s", buf->string);

  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  cstring_strcat_imp(buf, "QUIT\r\n", 6);
  csocket_write(log, sock, buf->string, buf->length);
  buf->length=0;
  memset(buf->string, 0, buf->memsize);
  bytes=csocket_read(log, sock, buf->string, 1024);
  fprintf(stdout, "%s", buf->string);

  cstring_free(&buf);

  // close the connection
  csocket_close(log, sock);

  // free the socket
  csocket_free(log, sock);

  // close the log
  clog_close(log);
  
  return 0;
}
Beispiel #7
0
EC_BOOL csrv_unix_accept_once(CSRV *csrv, EC_BOOL *continue_flag)
{
    UINT32  client_ipaddr; 
    EC_BOOL ret;
    int     client_conn_sockfd; 

    ret = csocket_unix_accept(CSRV_UNIX_SOCKFD(csrv), &(client_conn_sockfd), CSOCKET_IS_NONBLOCK_MODE);
    if(EC_TRUE == ret)
    {
        CSOCKET_CNODE *csocket_cnode;

        client_ipaddr = c_ipv4_to_word((const char *)"127.0.0.1");
     
        dbg_log(SEC_0112_CSRV, 1)(LOGSTDOUT, "csrv_unix_accept_once: handle new sockfd %d\n", client_conn_sockfd);

        csocket_cnode = csocket_cnode_unix_new(CMPI_ERROR_TCID, client_conn_sockfd, CSOCKET_TYPE_TCP, client_ipaddr, CMPI_ERROR_SRVPORT);/*here do not know the remote client srv port*/
        if(NULL_PTR == csocket_cnode)
        {
            dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_unix_accept_once:failed to alloc csocket cnode for sockfd %d, hence close it\n", client_conn_sockfd);
            csocket_close(client_conn_sockfd);
            return (EC_FALSE);
        }

        if(NULL_PTR != CSRV_ADD_CSOCKET_CNODE(csrv))
        {
            CSRV_ADD_CSOCKET_CNODE(csrv)(CSRV_MD_ID(csrv), csocket_cnode);
        }
     
#if (SWITCH_OFF == TASK_BRD_CEPOLL_SWITCH)
        if(1)
        {
            TASK_BRD      *task_brd;         
            CROUTINE_NODE *croutine_node;

            task_brd = task_brd_default_get();
         
            croutine_node = croutine_pool_load(TASK_REQ_CTHREAD_POOL(task_brd), (UINT32)csrv_handle, 2, csrv, csocket_cnode);
            if(NULL_PTR == croutine_node)
            {
                dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_unix_accept_once: cthread load failed\n");
                csocket_cnode_close(csocket_cnode);
                return (EC_FALSE);
            }
            CROUTINE_NODE_COND_RELEASE(croutine_node, LOC_CSRV_0004);
        }
#endif/*(SWITCH_OFF == TASK_BRD_CEPOLL_SWITCH)*/     

#if (SWITCH_ON == TASK_BRD_CEPOLL_SWITCH)
        /*note: CSOCKET_CNODE_PKT_HDR will be used for specific purpose*/
        BSET(CSOCKET_CNODE_PKT_HDR(csocket_cnode), 0, CSOCKET_CNODE_PKT_HDR_SIZE);

        CSOCKET_CNODE_MODI(csocket_cnode) = CSRV_MD_ID(csrv);
     
        cepoll_set_event(task_brd_default_get_cepoll(),
                          CSOCKET_CNODE_SOCKFD(csocket_cnode),
                          CEPOLL_RD_EVENT,
                          (CEPOLL_EVENT_HANDLER)CSRV_RD_EVENT_HANDLER(csrv),
                          (void *)csocket_cnode);

       cepoll_set_complete(task_brd_default_get_cepoll(),
                           CSOCKET_CNODE_SOCKFD(csocket_cnode),
                           (CEPOLL_EVENT_HANDLER)CSRV_COMPLETE_HANDLER(csrv),
                           (void *)csocket_cnode);
                        
       cepoll_set_shutdown(task_brd_default_get_cepoll(),
                           CSOCKET_CNODE_SOCKFD(csocket_cnode),
                           (CEPOLL_EVENT_HANDLER)CSRV_CLOSE_HANDLER(csrv),
                           (void *)csocket_cnode);

       cepoll_set_timeout(task_brd_default_get_cepoll(),
                           CSOCKET_CNODE_SOCKFD(csocket_cnode),
                           CSRV_TIMEOUT_NSEC(csrv),
                           (CEPOLL_EVENT_HANDLER)CSRV_TIMEOUT_HANDLER(csrv),
                           (void *)csocket_cnode);
#endif/*(SWITCH_ON == TASK_BRD_CEPOLL_SWITCH)*/
    }

    (*continue_flag) = ret;
 
    return (EC_TRUE);
}
Beispiel #8
0
CSRV * csrv_start(const UINT32 srv_ipaddr, const UINT32 srv_port, const UINT32 md_id,
                     const uint32_t timeout_nsec,
                     CSRV_INIT_CSOCKET_CNODE       init_csocket_cnode,
                     CSRV_ADD_CSOCKET_CNODE        add_csocket_cnode,
                     CSRV_DEL_CSOCKET_CNODE        del_csocket_cnode,
                     CSRV_RD_HANDLER_FUNC          rd_handler,
                     CSRV_WR_HANDLER_FUNC          wr_handler,
                     CSRV_TIMEOUT_HANDLER_FUNC     timeout_handler,
                     CSRV_COMPLETE_HANDLER_FUNC    complete_handler,
                     CSRV_CLOSE_HANDLER_FUNC       close_handler
                     )
{
    CSRV *csrv;
    int srv_sockfd;
    int srv_unix_sockfd;

    if(ERR_MODULE_ID == md_id)
    {
        dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_start: md id is invalid\n");
        return (NULL_PTR);
    }

    if(EC_FALSE == csocket_listen(srv_ipaddr, srv_port, &srv_sockfd))
    {
        dbg_log(SEC_0112_CSRV, 0)(LOGSTDERR, "error:csrv_start: failed to listen on %s:%ld\n",
                            c_word_to_ipv4(srv_ipaddr), srv_port);
        return (NULL_PTR);
    }

    srv_unix_sockfd = CMPI_ERROR_SOCKFD;
#if 0
    if(EC_FALSE == csocket_unix_listen(srv_ipaddr, srv_port, &srv_unix_sockfd))
    {
        dbg_log(SEC_0112_CSRV, 0)(LOGSTDERR, "error:csrv_start: failed to listen on unix@%s:%ld\n",
                            c_word_to_ipv4(srv_ipaddr), srv_port);
    }
#endif
    csrv = csrv_new();
    if(NULL_PTR == csrv)
    {
        dbg_log(SEC_0112_CSRV, 0)(LOGSTDOUT, "error:csrv_start: new csrv failed, close srv sockfd %d\n", srv_sockfd);
        csocket_close(srv_sockfd);
        return (NULL_PTR);
    }

    CSRV_IPADDR(csrv)               = srv_ipaddr;
    CSRV_PORT(csrv)                 = srv_port;
    CSRV_SOCKFD(csrv)               = srv_sockfd;
    CSRV_UNIX_SOCKFD(csrv)          = srv_unix_sockfd;

    CSRV_MD_ID(csrv)                = md_id;
    CSRV_TIMEOUT_NSEC(csrv)         = timeout_nsec;
 
    CSRV_INIT_CSOCKET_CNODE(csrv)   = NULL_PTR;
    CSRV_ADD_CSOCKET_CNODE(csrv)    = add_csocket_cnode;
    CSRV_DEL_CSOCKET_CNODE(csrv)    = del_csocket_cnode;
 
    CSRV_RD_EVENT_HANDLER(csrv)     = rd_handler;
    CSRV_WR_EVENT_HANDLER(csrv)     = wr_handler;
    CSRV_TIMEOUT_HANDLER(csrv)      = timeout_handler;
    CSRV_COMPLETE_HANDLER(csrv)     = complete_handler;
    CSRV_CLOSE_HANDLER(csrv)        = close_handler; 

    CSRV_CSSL_NODE(csrv)            = NULL_PTR;

#if (SWITCH_ON == TASK_BRD_CEPOLL_SWITCH)
    cepoll_set_event(task_brd_default_get_cepoll(),
                      CSRV_SOCKFD(csrv),
                      CEPOLL_RD_EVENT,
                      (CEPOLL_EVENT_HANDLER)csrv_accept,
                      (void *)csrv);
#if 0
    if(CMPI_ERROR_SOCKFD != CSRV_UNIX_SOCKFD(csrv))
    {
        cepoll_set_event(task_brd_default_get_cepoll(),
                          CSRV_UNIX_SOCKFD(csrv),
                          CEPOLL_RD_EVENT,
                          (CEPOLL_EVENT_HANDLER)csrv_unix_accept,
                          (void *)csrv); 
    }
#endif 
#endif/*(SWITCH_ON == TASK_BRD_CEPOLL_SWITCH)*/ 

    dbg_log(SEC_0112_CSRV, 5)(LOGSTDOUT, "csrv_start: start srv sockfd %d on port %s:%ld\n",
                       srv_sockfd, c_word_to_ipv4(srv_ipaddr), srv_port);
    return (csrv);
}