Beispiel #1
0
/* create open */
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
	int ret, new_sockfd;
	struct sock *new_sk;
	struct sock *sk;

	socket_idesc_check(sockfd, sk);

	if (((addr == NULL) && (addrlen != NULL))
			|| ((addr != NULL) && (addrlen == NULL))
			|| ((addrlen != NULL) && (*addrlen <= 0))) {
		return SET_ERRNO(EINVAL);
	}

	ret = kaccept(sk, addr, addrlen, sk->idesc.idesc_flags, &new_sk);
	if (ret < 0) {
		return SET_ERRNO(-ret);
	}

	new_sockfd = get_index(new_sk);
	if (new_sockfd < 0) {
		ksocket_close(new_sk);
		return SET_ERRNO(-new_sockfd);
	}

	return new_sockfd;
}
Beispiel #2
0
/*This function creates a server process listening at the socket rport*/
int tcp_serv (void *arg) 
{
    struct sockaddr_in relay_srv_addr, stClntAddr;
    int iAddrlen;
    int on = 1;
    ksocket_t sockfd_chld;

    /* kernel thread name*/
    sprintf(current->comm, "krelaysrv");
    allow_signal(SIGKILL);
    allow_signal(SIGTERM);

    /*Create socket*/
    if ((SockfdRelayClntSide = ksocket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
	printk(KERN_ERR "Can't create socket.");

    memset(&relay_srv_addr, 0, sizeof(relay_srv_addr));
    relay_srv_addr.sin_family      = AF_INET;
    relay_srv_addr.sin_addr.s_addr = INADDR_ANY;
    relay_srv_addr.sin_port        = htons(StrToInt((char *)(pListenPort->data)));

    if (ksetsockopt(SockfdRelayClntSide, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
    {
        printk(KERN_ERR "ksetsockopt(SO_REUSEADDR) failed\n");
    }
  
    /*Bind our local addrress so that  client can send*/ 
    if (kbind(SockfdRelayClntSide, (struct sockaddr *) &relay_srv_addr, sizeof(relay_srv_addr)) < 0)
    {
        printk(KERN_ERR "Can't bind local address\n");
        return -1;
    }

    /*  Make socket a listening socket  */
    if (klisten(SockfdRelayClntSide, 15) < 0)
    {
        printk(KERN_ERR "Call to listen failed.");
        return -1;
    }
   
     /*  Loop infinitely to accept and service connections  */
    while ( 1 ) 
    {
	/*  Wait for connection  */
        if ( (sockfd_chld = kaccept(SockfdRelayClntSide, (struct sockaddr *) &stClntAddr, &iAddrlen)) < 0 )
        {
            printk(KERN_ERR "Error calling accept()");
            return -1;
        }           
        
        ChldThdPid[iThdCnt] = kernel_thread ((void *)RedirectProc, sockfd_chld, 0);	
       
        if (iThdCnt == (MAX_THD_IDX - 1))
                    iThdCnt = 0;
        else
                    iThdCnt++;
                

        //Sleep for some time
  //      mdelay (1);

    }
    
    (void)kclose (SockfdRelayClntSide);
    return -1;    /*  We shouldn't get here  */
}