Skip to content
Snippets Groups Projects
ftpsrvr.c 106 KiB
Newer Older

	while(server_socket!=INVALID_SOCKET) {

		/* now wait for connection */

		tv.tv_sec=2;
		tv.tv_usec=0;

		FD_ZERO(&socket_set);
		FD_SET(server_socket,&socket_set);

		if((i=select(server_socket+1,&socket_set,NULL,NULL,&tv))<1) {
			if(i==0) {
				mswait(1);
				continue;
			}
			if(ERROR_VALUE==EINTR)
				lprintf("0000 FTP Server listening interrupted");
			else if(ERROR_VALUE == ENOTSOCK)
            	lprintf("0000 FTP Server sockets closed");
			else
				lprintf("0000 !ERROR %d selecting sockets",ERROR_VALUE);
			break;
		}

		client_addr_len = sizeof(client_addr);
		client_socket = accept(server_socket, (struct sockaddr *)&client_addr
        	,&client_addr_len);

		if(client_socket == INVALID_SOCKET)
		{
rswindell's avatar
rswindell committed
			if(ERROR_VALUE == ENOTSOCK || ERROR_VALUE == EINTR)
            	lprintf("0000 FTP socket closed while listening");
				lprintf("0000 !accept failed (ERROR %d)", ERROR_VALUE);
			continue;	/* Jun-08-2001 was break; */
		}
		if(startup->socket_open!=NULL)
			startup->socket_open(TRUE);
		sockets++;

		if(active_clients>=startup->max_clients) {
			lprintf("%04d !MAXMIMUM CLIENTS (%d) reached, access denied"
				,client_socket, startup->max_clients);
			sockprintf(client_socket,"421 Maximum active clients reached, please try again later.");
			mswait(3000);
			close_socket(&client_socket,__LINE__);
			continue;
		}

		if((ftp=malloc(sizeof(ftp_t)))==NULL) {
			lprintf("%04d !ERROR allocating %d bytes of memory for ftp_t"
				,client_socket,sizeof(ftp_t));
			sockprintf(client_socket,"421 System error, please try again later.");
			mswait(3000);
			close_socket(&client_socket,__LINE__);
			continue;
		}

		ftp->socket=client_socket;
		ftp->client_addr=client_addr;

		_beginthread (ctrl_thread, 0, ftp);
	}

	if(active_clients) {
		lprintf("0000 Waiting for %d active clients to disconnect...", active_clients);
		start=time(NULL);
		while(active_clients) {
			if(time(NULL)-start>TIMEOUT_THREAD_WAIT) {
				lprintf("0000 !TIMEOUT waiting for %d active clients ",active_clients);
			mswait(100);