Пример #1
0
static ssize_t _read_pktbuf ( timeshift_file_t *tsf, int fd, pktbuf_t **pktbuf )
{
  ssize_t r, cnt = 0;
  size_t sz;

  /* Size */
  r = _read_buf(tsf, fd, &sz, sizeof(sz));
  if (r < 0) return -1;
  if (r != sizeof(sz)) return 0;
  cnt += r;

  /* Empty And Sanity Check */
  if (!sz || sz > 1024 * 1024) {
    *pktbuf = NULL;
    return cnt;
  }

  /* Data */
  *pktbuf = pktbuf_alloc(NULL, sz);
  r = _read_buf(tsf, fd, (*pktbuf)->pb_data, sz);
  if (r != sz) {
    free((*pktbuf)->pb_data);
    free(*pktbuf);
    return r < 0 ? -1 : 0;
  }
  cnt += r;

  return cnt;
}
Пример #2
0
void keyboard_isr(void)
{
    uint8_t scancode;
    bool make;

    scancode = _read_buf();

    // is this keystroke a make or a break?
    make = !(0x80 & scancode);

    // clear the break bit
    scancode &= 0x7f;

    switch (scancode) {
        case LCTRL:
            _.ctrl = make;
            goto keyboard_isr_end;

        case LSHIFT:
            _.lshift = make;
            goto keyboard_isr_end;

        case RSHIFT:
            _.rshift = make;      
            goto keyboard_isr_end;
    }

    if (!make)
        goto keyboard_isr_end;
   
    {
        char c;

        // map control characters 
        switch (c = _keymap[scancode][!!_.shift]) {
            case 'u':
                if (_.ctrl)
                    c = '\r';   // line kill
                break;
    
            case 'l':
                if (_.ctrl)
                    c = 127;
                break;

            case 127:   // DEL -> backspace
                c = '\b';       // erase
                break;
        }

        if (c)
            console_put_ibuf(c);
    }

keyboard_isr_end:
    _.shift = _.lshift || _.rshift;
    pic_send_eoi(KEYBOARD_IRQ_NUM);
    return;   
}
Пример #3
0
    int
    read_buf(const char      *fusepath,
             fuse_bufvec    **bufp,
             size_t           size,
             off_t            offset,
             fuse_file_info  *ffi)
    {
      FileInfo *fi = reinterpret_cast<FileInfo*>(ffi->fh);

      return _read_buf(fi->fd,
                       bufp,
                       size,
                       offset);
    }
Пример #4
0
static ssize_t _read_msg ( timeshift_file_t *tsf, int fd, streaming_message_t **sm )
{
  ssize_t r, cnt = 0;
  size_t sz;
  streaming_message_type_t type;
  int64_t time;
  void *data;
  int code;

  /* Clear */
  *sm = NULL;

  /* Size */
  r = _read_buf(tsf, fd, &sz, sizeof(sz));
  if (r < 0) return -1;
  if (r != sizeof(sz)) return 0;
  cnt += r;

  /* EOF */
  if (sz == 0) return cnt;

  /* Wrong data size */
  if (sz > 1024 * 1024) return -1;

  /* Type */
  r = _read_buf(tsf, fd, &type, sizeof(type));
  if (r < 0) return -1;
  if (r != sizeof(type)) return 0;
  cnt += r;

  /* Time */
  r = _read_buf(tsf, fd, &time, sizeof(time));
  if (r < 0) return -1;
  if (r != sizeof(time)) return 0;
  cnt += r;

  /* Adjust size */
  sz -= sizeof(type) + sizeof(time);
  cnt += sz;

  /* Standard messages */
  switch (type) {

    /* Unhandled */
    case SMT_START:
    case SMT_NOSTART:
    case SMT_NOSTART_WARN:
    case SMT_SERVICE_STATUS:
    case SMT_DESCRAMBLE_INFO:
      return -1;
      break;

    /* Code */
    case SMT_STOP:
    case SMT_EXIT:
    case SMT_SPEED:
      if (sz != sizeof(code)) return -1;
      r = _read_buf(tsf, fd, &code, sz);
      if (r != sz) {
        if (r < 0) return -1;
        return 0;
      }
      *sm = streaming_msg_create_code(type, code);
      break;

    /* Data */
    case SMT_SKIP:
    case SMT_SIGNAL_STATUS:
    case SMT_MPEGTS:
    case SMT_PACKET:
      data = malloc(sz);
      r = _read_buf(tsf, fd, data, sz);
      if (r != sz) {
        free(data);
        if (r < 0) return -1;
        return 0;
      }
      if (type == SMT_PACKET) {
        th_pkt_t *pkt = data;
        pkt->pkt_payload  = pkt->pkt_meta = NULL;
        pkt->pkt_refcount = 0;
        *sm = streaming_msg_create_pkt(pkt);
        r   = _read_pktbuf(tsf, fd, &pkt->pkt_meta);
        if (r < 0) {
          streaming_msg_free(*sm);
          return r;
        }
        cnt += r;
        r   = _read_pktbuf(tsf, fd, &pkt->pkt_payload);
        if (r < 0) {
          streaming_msg_free(*sm);
          return r;
        }
        cnt += r;
      } else {
        *sm = streaming_msg_create_data(type, data);
      }
      (*sm)->sm_time = time;
      break;

    default:
      return -1;
  }

  /* OK */
  return cnt;
}