struct socket* cpt_connect(struct sockaddr_in* sock_addr)
{
	int retval;
	struct socket *sock;
	
	retval = sock_create(AF_INET,SOCK_STREAM,0,&sock);

	if (retval < 0) {
		printk("cpt_connect: error creating socket\n");
		return NULL;
	}

	retval = sock->ops->connect(sock,(struct sockaddr *)sock_addr,sizeof(struct sockaddr_in),0);

	if (retval < 0) {
		printk("cpt_connect: error on connect: %d\n",retval);
		sock_release(sock);
		return NULL;
	}

	return sock;
}

struct socket* cpt_listen(void)
{
	struct socket *sock;
	struct sockaddr_in servaddr;

	if (sock_create(AF_INET,SOCK_STREAM,0,&sock) < 0){
		printk("rst_listen: error creating socket\n");
		return NULL;
	}

	memset(&servaddr,0,sizeof(servaddr));

	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(CPT_PORT_REMOTE_DUMP);

	if(sock->ops->bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
		printk("rst_listen: bind error\n");
		sock_release(sock);
		return NULL;
	}

	if (sock->ops->listen(sock,5) < 0) {
		printk("rst_listen: listen error\n");
		sock_release(sock);
		return NULL;
	}

	return sock;
}

struct socket* cpt_accept(struct socket* sock)
{
	//struct inode* inode;
	struct socket* newsock;
	int err;
	struct sockaddr_in sin;
	int slen;

	err = sock_create_lite(AF_INET, SOCK_STREAM, 0, &newsock);
	if (err < 0) {
		printk("rst_accept: error creating socket(2)\n");
		return NULL;
	}


	/*
	if (!(newsock = sock_alloc())) {
		printk("rst_accept: error creating socket(2)\n");
		return NULL;
	}
	*/
	//inode = newsock->inode;
	newsock->type = sock->type;
	newsock->ops = sock->ops;

	/*if (sock->ops->dup(newsock,sock) < 0) {
		printk("rst_accept: error dupping socket\n");
		sock_release(newsock);
		return NULL;
	}*/

	if ((err = newsock->ops->accept(sock,newsock,0)) < 0) {
		sock_release(newsock);
		return ERR_PTR(err);
	}

	slen = sizeof(sin);

	if ( (err = newsock->ops->getname(newsock,(struct sockaddr*)&sin,&slen,1)) < 0) {
		printk("rst_accept: error on getname: %d\n",err);
		sock_release(newsock);
		return ERR_PTR(err);
	}

	//newsock = socki_lookup(inode);

	return newsock;	
}
