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; }
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; }
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); }
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; }