diff --git a/NSFileHandleExt.m b/NSFileHandleExt.m index 6d30cc9..54b9098 100644 --- a/NSFileHandleExt.m +++ b/NSFileHandleExt.m @@ -27,42 +27,46 @@ char *buffer = (char*)malloc(bufferSize + 1); if (buffer == NULL) [[NSException exceptionWithName:@"No memory left" reason:@"No more memory for allocating buffer" userInfo:nil] raise]; + buffer[0] = '\0'; - int bytesReceived = 0, n = 1; + int bytesReceived = 0, n = 0; - while (n > 0) { - n = read(fd, buffer + bytesReceived++, 1); + while (1) { + n = read(fd, buffer + bytesReceived, 1); + + if (n == 0) + break; if (n < 0) { - if (errno == EINTR) { - n = 1; - bytesReceived--; - } else { - [[NSException exceptionWithName:@"Socket error" reason:@"Remote host closed connection" userInfo:nil] raise]; - } - } + if (errno == EINTR) + continue; + + free(buffer); + NSString *reason = [NSString stringWithFormat:@"%s:%d: read() error: %s", __PRETTY_FUNCTION__, __LINE__, strerror(errno)]; + [[NSException exceptionWithName:@"Socket error" reason:reason userInfo:nil] raise]; + } + + bytesReceived++; if (bytesReceived >= bufferSize) { // Make buffer bigger bufferSize += BUFFER_SIZE; - buffer = (char*)realloc(buffer, bufferSize + 1); + buffer = (char *)reallocf(buffer, bufferSize + 1); if (buffer == NULL) [[NSException exceptionWithName:@"No memory left" reason:@"No more memory for allocating buffer" userInfo:nil] raise]; } - switch (*(buffer + bytesReceived - 1)) { - case '\n': - buffer[bytesReceived-1] = '\0'; - NSString* s = [NSString stringWithCString: buffer encoding: NSUTF8StringEncoding]; - if ([s length] == 0) - s = [NSString stringWithCString: buffer encoding: NSISOLatin1StringEncoding]; - return s; - case '\r': - bytesReceived--; + char receivedByte = buffer[bytesReceived-1]; + if (receivedByte == '\n') { + bytesReceived--; + break; } + + if (receivedByte == '\r') + bytesReceived--; } - buffer[bytesReceived-1] = '\0'; + buffer[bytesReceived] = '\0'; NSString *retVal = [NSString stringWithCString: buffer encoding: NSUTF8StringEncoding]; if ([retVal length] == 0) retVal = [NSString stringWithCString: buffer encoding: NSISOLatin1StringEncoding];