Example #1
0
/*
 * get_file() - get a file from the server accessible via the given socket
 *              fd, and save it according to the save_name
 */
void get_file(int fd, char *get_name, char *save_name) 
{
    /* create get request */
    uint32_t request_size = strlen(get_name) + strlen("GET\n");
    char get[request_size];
    bzero(get, request_size);
    strcpy(get, "GET\n");
    strcat(get, get_name);

    /* send size of request */
    Send_Int(fd, request_size);
    /* send request */
    Send(fd, get, request_size);

    /* get size of header */
    uint32_t header_size = Receive_Int(fd);

    /* get header */
    char header_buf[header_size];
    bzero(header_buf, header_size);

    /* get response */
    if (Receive(fd, header_buf, header_size) != 0)
        die("Get_file", "Connection closed while reading header");

    /* check for OK */
    char * iter_buf = strtok(header_buf, "\n");
    if (strcmp(iter_buf, "OK"))
        die("Get_file server response error", iter_buf);
    
    /* check to make sure correct file was sent */
    iter_buf = strtok(NULL, "\n");
    if (strcmp(iter_buf, get_name))
        die("Get_file file error", "Incorrect file retrieved");

    /* check file size */
    char * t;
    iter_buf = strtok(NULL, "\n");
    int file_size = strtol(iter_buf, &t, 10);

    /* create new buffer for file content */
    char file_buf[file_size];
    bzero(file_buf, file_size);
    if (Receive(fd, file_buf, file_size) != 0)
        die("Get_file", "Connection closed while reading file");

    FILE * fp = fopen(save_name, "wb");
    fwrite(file_buf, sizeof(file_buf), 1, fp);
    fclose(fp);
}
Example #2
0
/*
Description: Setup state, Adjusting Day
State from Diagram: S10
*/	
state do_SET_DAY()
{
	GotoLCD_Location(1,1);
	Send_String("Set Day:");
	GotoLCD_Location(1,2);
	Send_Int(time[2]);
	
	
	if (bu==1)
	{
		clear_display();
		bu=0;
		if (time[2]<=30)
		time[2]++;
		else time[2]=1;
	}
	if (bd==1)
	{
		bd=0;
		clear_display();
		if (time[2]>=2)
		time[2]--;
		else time[2]=31;
	}
	

	if (bs==1)
	{
		clear_display();
		bs=0;
		issetup=0;
		return DISP_TEMP;
	}
	if (bf==1)
	{
		clear_display();
		bf=0;
		return SET_MONTH;
	}
		
	return SET_DAY;
}
Example #3
0
/*
Description: Setup state, Adjusting minute
State from Diagram: S09
*/	
state do_SET_MIN()
{
	GotoLCD_Location(1,1);
	Send_String("Set Minute:");
	GotoLCD_Location(1,2);
	Send_Int(time[4]);
	
	
		if (bu==1)
		{
			clear_display();
			bu=0;
			if (time[4]<=58)
			time[4]++;
			else time[4]=0;
		}
		if (bd==1)
		{
			bd=0;
			clear_display();
			if (time[4]>=1)
			time[4]--;
			else time[4]=59;
		}
		

	if (bs==1)
	{
		clear_display();
		bs=0;
		issetup=0;
		return DISP_TEMP;
	}
	if (bf==1)
	{
		clear_display();
		bf=0;
		return SET_DAY;
	}
		
	return SET_MIN;
}
Example #4
0
/*
Description: First Setup state, Adjusting hour
State from Diagram: S08
*/
state do_SET_HOUR()
{
		GotoLCD_Location(1,1);
		Send_String("Set Hour:");
		GotoLCD_Location(1,2);
		Send_Int(time[3]);
		
		
		if (bu==1)
		{
			clear_display();
			bu=0;
			if (time[3]<=22)
			time[3]++;
			else time[3]=0;
		}
		if (bd==1)
		{
			bd=0;
			clear_display();
			if (time[3]>=1)
			time[3]--;
			else time[3]=23;
		}
		

		if (bs==1)
		{
			clear_display();
			bs=0;
			issetup=0;
			return DISP_TEMP;
		}
		if (bf==1)
		{
			clear_display();
			bf=0;
			return SET_MIN;
		}
		
	return SET_HOUR;
}
Example #5
0
/*
Description: Setup state, Adjusting Year
State from Diagram: S12
*/	
state do_SET_YEAR()
{
	GotoLCD_Location(1,1);
	Send_String("Set Year:");
	GotoLCD_Location(1,2);
	Send_Int(time[0]);
	
	
	if (bu==1)
	{
		clear_display();
		bu=0;
		if (time[0]<=99)
		time[0]++;
		else time[0]=14;
	}
	if (bd==1)
	{
		bd=0;
		clear_display();
		if (time[0]>=15)
		time[0]--;
		else time[0]=99;
	}
	

	if (bs==1)
	{
		clear_display();
		bs=0;
		issetup=0;
		return DISP_TEMP;
	}
	if (bf==1)
	{
		clear_display();
		bf=0;
		return DISP_SETUP_MSG;
	}	
	return SET_YEAR;
}
Example #6
0
/*
Description: Setup state, Adjusting Month
State from Diagram: S11
*/	
state do_SET_MONTH()
{
	GotoLCD_Location(1,1);
	Send_String("Set Month:");
	GotoLCD_Location(1,2);
	Send_Int(time[1]);
	
	
	if (bu==1)
	{
		clear_display();
		bu=0;
		if (time[1]<=11)
		time[1]++;
		else time[1]=1;
	}
	if (bd==1)
	{
		bd=0;
		clear_display();
		if (time[1]>=2)
		time[1]--;
		else time[1]=12;
	}
	

	if (bs==1)
	{
		clear_display();
		bs=0;
		issetup=0;
		return DISP_TEMP;
	}
	if (bf==1)
	{
		clear_display();
		bf=0;
		return SET_YEAR;
	}	
	return SET_MONTH;
}
Example #7
0
/*
Description: Home state, displaying date, time and temperature
State from Diagram: S02
*/
state do_DISP_TEMP()
{
		
		GotoLCD_Location(1,1);
		if (time[3]<=9)
		{
			Send_String("0");
			Send_Int(time[3]);
		}
		else
		{
			Send_Int(time[3]);
		}
		Send_String(":");
		if (time[4]<=9)
		{
			Send_String("0");
			Send_Int(time[4]);
		}
		else
		{
			Send_Int(time[4]);
		}
		Send_String("  ");
		
		
		Send_Int(time[2]);
		Send_String(".");
		Send_Int(time[1]);
		Send_String(".");
		Send_Int(time[0]);
		
		GotoLCD_Location(1,2);
		Send_String("Temp.: ");
		Send_Double(weather.temp,2,1);
		Send_String("C");
		
		if(my_state != DISP_TEMP)	//if any interrupt has changed the destination state, shut up.
			return my_state;
			

		if (bd==1)
		{
			clear_display();
			bd=0;
			return DISP_HUM;
		}
		if (bu==1)
		{
			clear_display();
			bu=0;
			return DISP_LIGHT;
		}
		
		if (bs==1)
		{
			clear_display();
			bs=0;
			issetup=1;
			return SET_HOUR;
		}		
		
		if (bf==1)
		{
			clear_display();
			bf=0;
			isforecast =1;
			timer5s = 0;
			return DISP_FC;
		}
		

			return DISP_TEMP;

	
		
		
		}
Example #8
0
/*
Description: Humidity state, displaying date, time and humidity
State from Diagram: S04
*/	
state do_DISP_HUM()
{
			GotoLCD_Location(1,1);
		if (time[3]<=9)
		{
			Send_String("0");
			Send_Int(time[3]);
		}
		else
		{
			Send_Int(time[3]);
		}
		Send_String(":");
		if (time[4]<=9)
		{
			Send_String("0");
			Send_Int(time[4]);
		}
		else
		{
			Send_Int(time[4]);
		}
		Send_String("  ");
		
		
		Send_Int(time[2]);
		Send_String(".");
		Send_Int(time[1]);
		Send_String(".");
		Send_Int(time[0]);
		
		GotoLCD_Location(1,2);
		Send_String("Humidity: ");	
		Send_Double((weather.hum)-17000,2,0); //don't ask me why the value is 17000 + humidity in percent, but works
		Send_String(" %       ");
		
		if(my_state != DISP_HUM)	//if any interrupt has changed the destination state, shut up.
			return my_state;	
			
		if (bu==1)
		{
			clear_display();
			bu=0;
			return DISP_TEMP;
		}
		if (bd==1)
		{
			clear_display();
			bd=0;
			return DISP_PRESS;
		}		
		if (bs==1)
		{
			clear_display();
			issetup=1;
			bs=0;
			return SET_HOUR;
		}
		if (bf==1)
		{
			clear_display();
			bf=0;
			isforecast =1;
			timer5s = 0;			
			return DISP_FC;
		}		
		
			return DISP_HUM;
		
		
}
Example #9
0
/*
 * - file_server() - etc
 */
void file_server(int connfd, int lru_size) {
    /* static vars for managing LRU cache */

    /* read the header size from the client */
    uint32_t headersize;
    headersize = Receive_Int(connfd);
    /* read the header from the client */
    char header[headersize];
    if(Receive(connfd, header, headersize) != 0) {
        die("SERVER FILE_SERVER", "Connection closed while reading header");
    }
    /* parse the header */
    char * request_type = strtok(header, "\n");
    int is_put = (strcmp(request_type, "PUT") == 0);
    int is_get = (strcmp(request_type, "GET") == 0);
    if(!is_put && !is_get) {
        send_error(connfd, "Request must begin with PUT or GET\n");
        return;
    }
    char * filename;
    if((filename = strtok(NULL, "\n")) == NULL) {
        send_error(connfd, "Request must include filename\n");
        return;
    }
    /* handle PUT */
    if(is_put) {
        char * filesize_str;
        if((filesize_str = strtok(NULL, "\n")) == NULL) {
            send_error(connfd, "PUT request must include filesize\n");
            return;
        }
        char * t;
        long filesize = strtol(filesize_str, &t, 10);
        if(filesize_str == t) {
            send_error(connfd, "Invalid filesize in PUT request\n");
            return;
        }
        char file[filesize];
        if(Receive(connfd, file, filesize) != 0) {
            die("SERVER PUT","Connection closed while reading file for PUT");
        }
        /* save the file buffer to the server */
        FILE * fp = fopen(filename, "wb");
        fwrite(file, sizeof(file), 1, fp);
        fclose(fp);
        /* tell the client the PUT was successful */
        char response[] = "OK\n";
        Send_Int(connfd, sizeof(response));
        Send(connfd, response, sizeof(response));
    }
    /* handle GET */
    else {
        FILE * fp = fopen(filename, "rb");
        if(fp == NULL) {
            send_error(connfd, "GET file not found\n");
            return;
        }
        fseek(fp, 0, SEEK_END);
        size_t filesize = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        unsigned char file[filesize];
        size_t bytes_read = fread(file, sizeof(unsigned char), filesize, fp);
        if(bytes_read != filesize) {
            fclose(fp);
            send_error(connfd, "GET file could not be read\n");
            return;
        }
        fclose(fp);

        /* convert filesize to string */
        int j = 1, temp_size = filesize / 10;
        while (temp_size)
        {
            j++;
            temp_size /= 10;
        }
        char size[j];
        sprintf(size, "%d", filesize);

        uint32_t response_headersize = strlen("OK\n") + strlen(filename) + j + 2;
        char response_header[response_headersize];
        bzero(response_header, response_headersize);
        strcpy(response_header, "OK\n");
        strcat(response_header, filename);
        strcat(response_header, "\n");
        strcat(response_header, size);
        strcat(response_header, "\n");

        /* send the header size */
        Send_Int(connfd, response_headersize);
        /* send the header */
        Send(connfd, response_header, response_headersize);
        /* send the file */
        Send(connfd, file, filesize);
    }
}
Example #10
0
/*
 * send_error() - send an error back to the client
 */
void send_error(int connfd, char * msg)
{
    fprintf(stderr, "Sending error message to client: %s", msg);
    Send_Int(connfd, strlen(msg));
    Send(connfd, msg, strlen(msg));
}
Example #11
0
/*
 * put_file() - send a file to the server accessible via the given socket fd
 */
void put_file(int fd, char *put_name) 
{
    /* open file and check for error */
    FILE * fp = fopen(put_name, "rb");   
    if (fp == NULL)
        die("Put_file file error", "file not found");
     
    /* get file size */
    fseek(fp, 0, SEEK_END);
    int file_size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char file_buf[file_size];

    /* store file in buffer */
    size_t bytes_read = fread(file_buf, sizeof(unsigned char), file_size, fp);
    if (bytes_read != file_size)
    {
            fclose(fp);
            die("Put_file fread error", "bytes_read != file_size");
    }

    /* hacky way to get number of digits in the file size */
    int j = 1, temp_size = file_size / 10; //acount for file_size of 0
    while (temp_size)
    {
        j++;
        temp_size /= 10;
    }
    /* close file */
    fclose(fp);

    /* file size as string */
    char str_fsize[j];
    sprintf(str_fsize, "%d", file_size); 
    
    /* create put request */
    uint32_t header_size = strlen("PUT") + strlen(put_name) + strlen(str_fsize) + 3;
    char put_header[header_size];
    bzero(put_header, header_size);
    strcpy(put_header, "PUT\n");
    strcat(put_header, put_name);
    strcat(put_header, "\n");
    strcat(put_header, str_fsize);
    strcat(put_header, "\n");

    /* send size of header */
    Send_Int(fd, header_size);
    /* send put request header */
    Send(fd, put_header, header_size);
    /* send put file */
    Send(fd, file_buf, file_size);

    /* get size of response header and create buffer */ 
    uint32_t rec_size = Receive_Int(fd);
    char response[rec_size];
    bzero(response, rec_size);

    /* get response */
    if (Receive(fd, response, rec_size) != 0)
        die("Put_file", "Connection closed while reading response");

    /* check response */
    if (strncmp(response, "OK\n", rec_size))
        die("Put_file server response error", response);
}