| @@ -113,18 +113,30 @@ bool Pty::IsEof() const | |||||
| size_t Pty::ReadData(char *data, size_t maxlen) | size_t Pty::ReadData(char *data, size_t maxlen) | ||||
| { | { | ||||
| #if defined HAVE_FORKPTY | #if defined HAVE_FORKPTY | ||||
| size_t sent = 0; | |||||
| /* Do we have data from previous call? */ | /* Do we have data from previous call? */ | ||||
| if (m_unread_len) | if (m_unread_len) | ||||
| { | { | ||||
| /* FIXME: check that m_unread_len < maxlen */ | |||||
| memcpy(data, m_unread_data, m_unread_len); | |||||
| size_t tocopy = min(maxlen, m_unread_len); | |||||
| data += m_unread_len; | |||||
| maxlen -= m_unread_len; | |||||
| memcpy(data, m_unread_data, tocopy); | |||||
| delete[] m_unread_data; | |||||
| m_unread_data = 0; | |||||
| m_unread_len = 0; | |||||
| data += tocopy; | |||||
| sent += tocopy; | |||||
| maxlen -= tocopy; | |||||
| if (tocopy < m_unread_len) | |||||
| { | |||||
| m_unread_len -= tocopy; | |||||
| memmove(m_unread_data, m_unread_data + tocopy, m_unread_len); | |||||
| } | |||||
| else | |||||
| { | |||||
| delete[] m_unread_data; | |||||
| m_unread_data = 0; | |||||
| m_unread_len = 0; | |||||
| } | |||||
| } | } | ||||
| fd_set fdset; | fd_set fdset; | ||||
| @@ -159,9 +171,11 @@ size_t Pty::ReadData(char *data, size_t maxlen) | |||||
| /* Data available but zero-length read: EOF */ | /* Data available but zero-length read: EOF */ | ||||
| if (nr <= 0) | if (nr <= 0) | ||||
| m_eof = true; | m_eof = true; | ||||
| else | |||||
| sent += nr; | |||||
| if (nr >= 0) | |||||
| return nr; | |||||
| if (sent >= 0) | |||||
| return sent; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -173,21 +187,23 @@ size_t Pty::ReadData(char *data, size_t maxlen) | |||||
| void Pty::UnreadData(char *data, size_t len) | void Pty::UnreadData(char *data, size_t len) | ||||
| { | { | ||||
| #if defined HAVE_FORKPTY | #if defined HAVE_FORKPTY | ||||
| char *new_data; | |||||
| /* Prepare unread buffer */ | |||||
| if (m_unread_data) | if (m_unread_data) | ||||
| { | { | ||||
| new_data = new char[m_unread_len + len]; | |||||
| memcpy(new_data + len, m_unread_data, m_unread_len); | |||||
| char *tmp = new char[m_unread_len + len]; | |||||
| memcpy(tmp + len, m_unread_data, m_unread_len); | |||||
| delete[] m_unread_data; | delete[] m_unread_data; | ||||
| m_unread_data = tmp; | |||||
| m_unread_len += len; | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| new_data = new char[len]; | |||||
| m_unread_data = new char[len]; | |||||
| m_unread_len = len; | |||||
| } | } | ||||
| memcpy(new_data, data, len); | |||||
| m_unread_data = new_data; | |||||
| /* Copy data to the unread buffer */ | |||||
| memcpy(m_unread_data, data, len); | |||||
| #endif | #endif | ||||
| } | } | ||||