void list_sched(){
    struct queue_t *temp;
    struct process_control_block *pcb;
	int i = 0;
	enum QUEUES temp_current_group;
    if (scheduler == GROUP){
		temp_current_group = current_group;
        temp = get_process(current_group);
        while (i < 4){
			if (temp->head == null) {
				if (i == 3){
					printf("Nothing is scheduled to run (all groups empty)\n");
					break;
				}
				switch_group();
				temp = get_process(current_group);
			} else {
				printprocess(*temp->head);
				break;
			}
			i++;
		}
		current_group = temp_current_group;
    }
    else{
        pcb = iterate(0);
        if (pcb == null) {
            printf("Nothing is scheduled to run (ready queue empty)\n");
        } else {
            printprocess(*pcb);
        }
    }

}
void list_Q(enum QUEUES queue) {
    struct queue_t *structqueue = get_process(queue);
    struct process_control_block *temp = structqueue->head;
    printf("Start of %s.\n", enum_to_string(queue));
    while (temp) {
        printprocess(*temp);
        temp = temp->prev;
    }
    printf("End of %s.\n\n", enum_to_string(queue));

}
int DownLoadFtp(struct arg *s_info)
{
    char get[256],dataget[2048];
    char buf[2048];
    char port1[8],port2[8];//227 Entering Passive Mode (192,168,8,30,6,32) 6 is stored in port1, while 32 is stored in port2
    char headhost[256];
    char range[32];
    float f;
    unsigned long timeuse;
#define FALSE 0
#define TRUE 1
    //this function used to download assigned file from a1 bytes to a2 bytes from host, try 5 times 
    int connected =FALSE,bytesget;//bytesget stans for how many bytes get one time
    int i,j,starttext,boolprint=0;
    int sock,sockdata;//sockdata is used to download ftp data through another sock because ftp use 2 pipes
    int readen,portthread=0,nextthread=0;
    int inflen,index=0,offset=0;
    int bytesleft=(s_info->a2)-(s_info->a1)+1;
    struct timeval tv;
    
    if(s_info->threadnumber!=0){
    	while(g[(s_info->threadnumber)-1].booldown==0){

    		sleep(1);
		
	}
    }
    if(s_info->booldown==1&&s_info->allowotherdown==1)return 0;
    while(1){
        if((sock=ConnectHttp(host,portftp))<=0)sleep(1);
        else{

   		connected=TRUE;
   		break;
        }
    }
    if(connected){
        
        if(ReadEn(sock,5)>0){
        recv(sock,dataget,512,0);

	ClearBuf(dataget);
	}
	sprintf(headhost,"USER %s\r\n\r\n",user);
;
	if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){
		close(sock);
		sleep(5);
		
   		DownLoadFtp(s_info);
		return 0;
        }
	if(ReadEn(sock,5)>0){
	recv(sock,dataget,512,0);
	ClearBuf(dataget);
	}
	
	sprintf(headhost,"PASS %s\r\n\r\n",pass);
	if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){
		close(sock);
		sleep(5);
		
   		DownLoadFtp(s_info);
		return 0;
        }
	
	recv(sock,dataget,512,0);
	if(strstr(dataget,"421 No more connection")!=NULL){
		close(sock);
		sleep(5);
		
   		DownLoadFtp(s_info);
		return 0;
	}

        ClearBuf(dataget);
	
	sprintf(headhost,"TYPE I\r\n\r\n");
        
	if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){
		close(sock);
		sleep(5);
   		DownLoadFtp(s_info);
		return 0;
        }
	
	recv(sock,dataget,512,0);
	ClearBuf(dataget);
	
	sprintf(headhost,"PASV\r\n\r\n");

	if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){
   		printf("Error in sending HEAD\n");
		close(sock);
		sleep(5);
   		DownLoadFtp(s_info);
		return 0;
        }
	
	recv(sock,dataget,512,0);
        while(strstr(dataget,"227")==NULL){
		ClearBuf(dataget);
		if(ReadEn(sock,5)>0){
			recv(sock,dataget,512,0);
			
		}
	}
        if(strstr(dataget,"227 Entering Passive Mode")!=NULL){
		j=4;
		i=0;
		while(j>=1){
			if(*(strstr(dataget,"227 Entering Passive Mode")+i)==',')j--;
			i++;
		}
		j=i+1;
		while(1){
			if(*(strstr(dataget,"227 Entering Passive Mode")+j)==',')break;
			j++;
		}
		
		snprintf(port1,j-i+1,"%s",strstr(dataget,"227 Entering Passive Mode")+i);
		i=j+1;
		while(1){
			if(*(strstr(dataget,"227 Entering Passive Mode")+i)==')')break;
			i++;
		}
		snprintf(port2,i-j,"%s",strstr(dataget,"227 Entering Passive Mode")+j+1);
		portthread=256*atoi(port1)+atoi(port2);		
	}
	
		
	
	ClearBuf(dataget);
	
	sprintf(headhost,"REST %d\r\n\r\n",s_info->a1);
	if(send(sock,headhost,strlen(headhost),0)!=strlen(headhost)){
		close(sock);
		sleep(5);
   		DownLoadFtp(s_info);
		return 0;
        }
	if(ReadEn(sock,5)>0){
	recv(sock,dataget,512,0);
	ClearBuf(dataget);
       }
	if(portthread==0){
		close(sock);
		sleep(5);
		DownLoadFtp(s_info);
		return 0;
	}      
       sprintf(get,"RETR %s\r\n\r\n",path);

        
        if(send(sock,get,strlen(get),0)!=strlen(get)){
   		printf("Error in sending get\n");
		close(sock);
		sleep(5);
   		DownLoadFtp(s_info);
		return 0;
        }

        s_info->fd=open(filename,O_WRONLY|O_CREAT,0644);
	
        lseek(s_info->fd,s_info->a1,0);
        
       

	connected=FALSE;
	for(i=0;i<=5;i++){
        	if((sockdata=ConnectHttp(host,portthread))<=0)
   			sleep(1);
        	else{
   		connected=TRUE;
   		break;
        	}
    	}
	if(connected=FALSE){
		close(sock);
		sleep(5);
		DownLoadFtp(s_info);
		return 0;
	}

        ClearBuf(buf);
	
	boolprint=0;
	if(s_info->booldown==1&&s_info->allowotherdown==1)return 0;	
  	
	
        while(bytesleft>0){
		
        	readen =ReadEn(sockdata,30);
        	if(readen<1){
			close(sockdata);
			sleep(2);
			pthread_mutex_lock(&lock);
			s_info->booldown=0;
			s_info->allowotherdown=0;
            		pthread_mutex_unlock(&lock);
			DownLoadFtp(s_info);
			return 0;
		}
		
		pthread_mutex_lock(&lock);
		if(s_info->booldown==0){
			s_info->booldown=1;
			s_info->allowotherdown=0;
		}
		else if(s_info->allowotherdown==1)return 0;//this means the other thread is downloading its part
  		pthread_mutex_unlock(&lock);
		boolprint++;
		if(boolprint==10)boolprint=0;
   		if(bytesleft>=1024){
       			bytesget=recv(sockdata,buf,1024,MSG_DONTWAIT);
       			if(bytesget<0){
				close(sockdata);
				close(s_info->fd);
				pthread_mutex_lock(&lock);
				s_info->booldown=0;
				s_info->allowotherdown=0;
            			pthread_mutex_unlock(&lock);
				DownLoadFtp(s_info);
				return 0;	
			}
       			write(s_info->fd,buf,bytesget);
	      		bytesleft-=bytesget;
	      		offset+=bytesget;
			s_info->a1+=bytesget;
	      		sizeget+=bytesget;
	  	}
	  	else{

			bytesget=recv(sockdata,buf,bytesleft,MSG_DONTWAIT);
	      		if(bytesget<0){
				//s_info->a1+=offset;
				close(sockdata);
				close(s_info->fd);
				pthread_mutex_lock(&lock);
				s_info->booldown=0;
				s_info->allowotherdown=0;
            			pthread_mutex_unlock(&lock);
				DownLoadFtp(s_info);
				return 0;	
			}
	      		write(s_info->fd,buf,bytesget);
	      		offset+=bytesget;
			s_info->a1+=bytesget;
	      		sizeget+=bytesget;
	      		bytesleft-=bytesget;
			if(bytesleft<1024){
				nextthread++;
			if(g[s_info->threadnumber+nextthread].booldown==0&&g[s_info->threadnumber+nextthread].allowotherdown==1){
        			pthread_mutex_lock(&lock);
				g[s_info->threadnumber+nextthread].booldown=1;
        			pthread_mutex_unlock(&lock);
				bytesleft+=g[s_info->threadnumber+nextthread].a2-g[s_info->threadnumber+nextthread].a1+1;
				s_info->a2=g[s_info->threadnumber+nextthread].a2;
			}
			}
	  	}
		
		if(boolprint==0){
			pthread_mutex_lock(&lock);
			SaveThreadStat();
			pthread_mutex_unlock(&lock);
			gettimeofday(&tpend,NULL);
    			timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
    			timeuse/=1000000;
			printprocess(sizeget, filelength, timeuse);
		}

	  ClearBuf(buf);
	 }
	close(sock);
	close(sockdata);
        return 0;
    }
    else return -1;
}