uint CBuffer_GetLines2(CBuffer* cb, uint reqCount, int firstIdx, cbline_t const** list, int blflags) { uint result; lock(cb, true); result = bufferGetLines(cb, reqCount, firstIdx, list, blflags); lock(cb, false); return result; }
static void processClient(fd_set* master, int clientFd , int solFd, bufStore *buf) { char data[BUF_SIZE]; int nbytes = 0; TlvHeader header; struct iovec vec[2]; vec[0].iov_base = &header; vec[0].iov_len = sizeof(header); vec[1].iov_base = &data; vec[1].iov_len = BUF_SIZE; /* TODO: server should be able to handle data for a tlv over multiple reads */ nbytes = readv(clientFd, vec, 2); if (nbytes <= 0) { if (nbytes == 0) { syslog(LOG_INFO, "mTerm_server: Client socket %d hung up\n", clientFd); } else { syslog(LOG_ERR, "mTerm_server: Error on read fd=%d\n", clientFd); } closeClient(master, clientFd); } else if (nbytes < sizeof(TlvHeader)) { /* TODO: Potentially we should use a per-client buffer, for now close Client connection */ syslog(LOG_ERR, "mTerm_server: Error on read fd=%d\n", clientFd); closeClient(master, clientFd); } else if (header.length > (nbytes - sizeof(header))) { syslog(LOG_ERR, "mTerm_server: Error on read fd=%d\n", clientFd); closeClient(master, clientFd); } else { switch (header.type) { case ASCII_ESC: /* TODO: Server should store client pointers for last reference of buffer read per client, thus subsequent reads can be based on the last reference */ bufferGetLines(buf->file, clientFd, atoi(vec[1].iov_base), 0); break; case ASCII_DELETE: syslog(LOG_INFO, "mTerm_server: Client socket %d hung up\n", clientFd); closeClient(master, clientFd); break; case ASCII_CARAT: writeData(solFd, vec[1].iov_base, header.length, "tty"); break; default: syslog(LOG_ERR, "mTerm_server: Received unknown tlv\n"); break; } } }