//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); unsigned char * page_mask(char * page_build_ptr, int page_end); int page_get(FILE * input_stream, int page_pos); //Variables---------------------------------------------------------- char cmd_arr[3]; bool timer_state; unsigned 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+1) = frame_mask|(*page_build_ptr&nibble_lo); page_mask_ptr = page_mask_ptr + 2; page_build_ptr++; } return page_mask_ptr-2*page_end; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Get Page int page_get(FILE * input_stream, int p_cnt){ int j = 0; //init loc Variables int c_cnt = 0; if(p_cnt==0){ //check for Start for(int k=0; k<9; k++){ page_buf[0] = fgetc(input_stream); } } else{ c_cnt = 16; } while(j0x2F){ page_buf[j+m] -= 0x30; } else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){ page_buf[j+m] -= 0x37; } } page_buf[j] = ((page_buf[j]<<4)&nibble_hi)| (page_buf[j+1]&nibble_lo); c_cnt++; j++; } } return page_size; }