Справочник по консольным командам Toybox для Android 12


  Ver.0.8.4     Ver.0.8.9     Pending  

Путь: Toys/Other, команды версии: Ver.4     Ver.9


eject

Комментарии в файле eject.c :

usage: eject [-stT] [DEVICE]

Извлечь DEVICE или по умолчанию /dev/cdrom
  • -s Устройство SCSI
  • -t Закрыть лоток
  • -T Открыть/закрыть лоток (переключатель)

  • usage: eject [-stT] [DEVICE]

    Eject DEVICE or default /dev/cdrom
  • -s SCSI device
  • -t Close tray
  • -T Open/close tray (toggle)

  • Исходный текст в файле eject.c

    #define FOR_eject
    #include "toys.h"
    #include <scsi/sg.h>
    #include <scsi/scsi.h>
    #include <linux/cdrom.h>
    
    // SCSI's overcomplicated way of requesting eject
    static void remove_scsi(int fd)
    {
      unsigned i;
      sg_io_hdr_t *header = (sg_io_hdr_t *)(toybuf+64);
      char sg_driver_cmd[][6] = {
        { ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0 },
        { START_STOP, 0, 0, 0, 1, 0 }, //start the motor
        { START_STOP, 0, 0, 0, 2, 0 } //eject the media
      };
    
      header->interface_id = 'S';
      header->cmd_len = 6;
      header->mx_sb_len = 32;
      header->dxfer_direction = SG_DXFER_NONE;
      header->dxferp = toybuf + 32;
      header->sbp = (void *)toybuf;
      header->timeout = 2000;
    
      for (i = 0; i < ARRAY_LEN(sg_driver_cmd); i++) {
        header->cmdp = (void *)sg_driver_cmd[i];
        xioctl(fd, SG_IO, header);
      }
    
      // force kernel to reread partition table when new disc is inserted
      ioctl(fd, BLKRRPART);
    }
    
    void eject_main(void)
    {
      int fd = xopen(*toys.optargs ? : "/dev/cdrom", O_RDONLY | O_NONBLOCK);
    
      if (FLAG(s)) remove_scsi(fd);
      else if (FLAG(T) && CDS_TRAY_OPEN == ioctl(fd, CDROM_DRIVE_STATUS, toybuf))
        xioctl(fd, CDROMCLOSETRAY, toybuf);
      else xioctl(fd, CDROMEJECT, toybuf);
      if (CFG_TOYBOX_FREE) xclose(fd);
    }