/* open */ int listen(int sockfd, int backlog) { int ret; struct sock *sk; socket_idesc_check(sockfd, sk); ret = klisten(sk, backlog); if (ret < 0) { return SET_ERRNO(-ret); } return 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 */ }