Пример #1
0
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;
}
Пример #2
0
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;
     }
  }
}