/* * 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); }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* 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; }
/* * - 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); } }
/* * 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)); }
/* * 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); }