//Inculde Header Files----------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include //Enumerations------------------------------------------------------- typedef enum {false, true} bool; typedef enum {fuse_read, fuse_write, page_read, page_write, prog_check} mode; //Constants---------------------------------------------------------- #define nibble_lo 0x0F #define nibble_hi 0xF0 #define frame_mask 0x90 #define page_size 64 //Structs------------------------------------------------------------ typedef struct { char mode; char opt_lo; char opt_hi; } cmd_t; //Makros------------------------------------------------------------- #define error_handler(err_no, err_str) \ errno = err_no; \ perror(err_str); \ exit(EXIT_FAILURE); //Protoypes---------------------------------------------------------- void * signal_thread(void * arg_ptr); void set_timer(int sec, int usec); char * cmd_build(mode cmd_mode, char cmd_option); char * page_build(char size); char * page_mask(char * page_build_ptr); char * page_get(FILE * input_stream); //Variables---------------------------------------------------------- char cmd_arr[3]; bool timer_state; char page_buf[64]; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Signal Thread void * signal_thread(void * arg_ptr){ sigset_t * signal_ptr = (sigset_t *)arg_ptr; int signal_nr, signal_err; signal_err = sigwait(signal_ptr, &signal_nr); if(signal_err!=0){ error_handler(signal_err, "Problem with Signal"); } else if(signal_nr!=SIGALRM){ fprintf(stderr, "Wrong Signal \n"); } timer_state = false; return NULL; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Set Timer void set_timer(int sec, int usec){ struct itimerval timer; int timer_err, signal_err; timer.it_interval.tv_sec = sec; timer.it_interval.tv_usec = usec; timer.it_value.tv_sec = sec; timer.it_value.tv_usec = usec; timer_err = setitimer(ITIMER_REAL, &timer, NULL); if(timer_err!=0){ error_handler(timer_err, "Error setting Timer"); } timer_state = true; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Build Command char * cmd_build(mode cmd_mode, char cmd_option){ cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t)); (*cmd_ptr).mode = frame_mask|cmd_mode; (*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo); (*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo); char * frame_ptr = &((*cmd_ptr).mode); return frame_ptr; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Build Page char * page_build(char size){ char page[size]; for(int i=0; i>4); page_mask_ptr = page_mask_ptr + 2; } page_mask_ptr = &page[0]; return page_mask_ptr; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Get Page char * page_get(FILE * input_stream){ int count = 7; char * page_buf_ptr = (char*)malloc(page_size*sizeof(char)); for(int i=0; i6){ if(*page_buf_ptr==0x3A){ count=0; } else{ for(int j=0; j<2; j++){ if(*(page_buf_ptr+j)<0x39){ *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x30; } else{ *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x37; } } *page_buf_ptr = ((*page_buf_ptr<<4)&nibble_hi)| ((*page_buf_ptr+1)&nibble_lo); i++; page_buf_ptr++; } } else{ count++; } } return page_buf_ptr-page_size; }