Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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; // На всякий случай, результат уже передан
}
Пример #4
0
void recvBin(uint8_t* d, WORD l) {
  for(; l; --l) {
    *d++ = wrecv();
  }  
}
Пример #5
0
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);
  } 
}
Пример #6
0
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;
}