void cmd_open(void) { uint8_t mode; /* Принимаем режим */ mode = wrecv(); // Принимаем имя файла recvString(); // Режим передачи и подтверждение sendStart(ERR_WAIT); // Открываем/создаем файл/папку if(mode == O_SWAP) { fs_swap(); } else if(mode == O_DELETE) { fs_delete(); } else if(mode == O_OPEN) { fs_open(); } else if(mode < 3) { fs_open0(mode); } else { lastError = ERR_INVALID_COMMAND; } // Ок if(!lastError) lastError = ERR_OK_CMD; }
void recvString(void) { uint8_t c; uint8_t* p = buf; do { c = wrecv(); if(p != buf + FS_MAXFILE) *p++ = c; else lastError = ERR_RECV_STRING; } while(c); }
void cmd_lseek(void) { uint8_t mode; DWORD off; // Принимаем режим и смещение mode = wrecv(); recvBin((uint8_t*)&off, 4); // Режим передачи и подтверждение sendStart(ERR_WAIT); // Размер файла if(mode==100) { if(fs_getfilesize()) return; } // Размер диска else if(mode==101) { if(fs_gettotal()) return; } // Свободное место на диске else if(mode==102) { if(fs_getfree()) return; } else { /* Устаналиваем смещение. fs_tmp сохраняется */ if(fs_lseek(off, mode)) return; } // Передаем результат send(ERR_OK_CMD); sendBin((uint8_t*)&fs_tmp, 4); lastError = 0; // На всякий случай, результат уже передан }
void recvBin(uint8_t* d, WORD l) { for(; l; --l) { *d++ = wrecv(); } }
int main(void) { uint8_t c; DATA_OUT // Шина данных (DDRD) DDRC = 0b00000000; // Шина адреса DDRB = 0b00101101; // Шина адреса, карта и светодиод PORTB = 0b00010001; // Подтягивающий резистор на MISO и светодиод // Пауза, пока не стабилизируется питание _delay_ms(100); // while(1) { // error(); // } // Запуск файловой системы if(fs_init()) error(); strcpy_P((char*)buf, PSTR("boot/boot.rk")); if(fs_open()) error(); if(fs_getfilesize()) error(); if(fs_tmp < 7) error(); if(fs_tmp > 128) error(); if(fs_read0(rom, (WORD)fs_tmp)) error(); // Гасим светодиод PORTB |= _BV(PB0); while(1) { // Эмуляция ПЗУ RomEmu(); // Зажигаем светодиод PORTB |= _BV(PB0); // Проверяем наличие карты sendStart(ERR_START); send(ERR_WAIT); if(fs_check()) { send(ERR_DISK_ERR); } else { send(ERR_OK_DISK); recvStart(); c = wrecv(); // Сбрасываем ошибку lastError = 0; // Принимаем аргументы switch(c) { case 0: cmd_boot(); break; case 1: cmd_ver(); break; case 2: cmd_exec(); break; case 3: cmd_find(); break; case 4: cmd_open(); break; case 5: cmd_lseek(); break; case 6: cmd_read(); break; case 7: cmd_write(); break; case 8: cmd_move(); break; default: lastError = ERR_INVALID_COMMAND; } // Вывод ошибки if(lastError) sendStart(lastError); } // Порт рабоатет на выход wait(); DATA_OUT // Гасим светодиод PORTB &=~_BV(PB0); _delay_ms(500); } }
int worker(fd) { masterfd=fd; fd_set rd; int len,ret; struct winsize ws; struct termios tp, tr; pMSG msg = (pMSG)malloc(sizeof(MSG)); strncpy((char *)msg->term,"TERM=",strlen("TERM=")); strncpy((char *)msg->term+5,getenv( "TERM" ),strlen(getenv( "TERM" ))); if( ioctl( 0, TIOCGWINSZ, &ws ) < 0 ) { perror( "ioctl()" ); return 1; } msg->ws_row=ws.ws_row; msg->ws_col=ws.ws_col; char pwd[21]; write(STDOUT_FILENO,"Password: "******"%20[0-9a-zA-Z ]s", pwd); strncpy((char *)msg->pwd,pwd,strlen(pwd)); ret = wsend(fd, msg, sizeof(MSG)); free(msg); if( isatty( 1 ) ) { if( tcgetattr( 1, &tp ) < 0 ) { perror( "tcgetattr()" ); return 1; } memcpy( (void *) &tr, (void *) &tp, sizeof( tr ) ); tr.c_iflag |= IGNPAR; tr.c_iflag &= ~(ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXANY|IXOFF); tr.c_lflag &= ~(ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHONL|IEXTEN); tr.c_oflag &= ~OPOST; tr.c_cc[VMIN] = 1; tr.c_cc[VTIME] = 0; if( tcsetattr( 1, TCSADRAIN, &tr ) < 0 ) { perror( "tcsetattr()" ); return 1; } } signal(SIGWINCH, sendws); while( 1 ) { FD_ZERO( &rd ); FD_SET( 0, &rd ); FD_SET( fd, &rd ); if( select( fd + 1, &rd, NULL, NULL, NULL ) < 0 ) { if (errno == EINTR) continue; perror( "select" ); break; } if( FD_ISSET( fd, &rd ) ) { if ((ret = wrecv(fd , message)) > 0) { ret=write(1, &message, ret); if(ret<=0) { perror("write"); break; } } else break; } if( FD_ISSET( 0, &rd ) ) { len = read( 0, message, BUFSIZ ); if( len == 0 ) { fprintf( stderr, "stdin: eof\n" ); break; } if( len < 0 ) { perror( "read" ); break; } ret=wsend(fd, &message, len); } } printf("%s","Connection lost."); if( isatty( 1 ) ) { tcsetattr( 1, TCSADRAIN, &tp ); } return 0; }