X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_io.c;h=72a02a0f97f52b030b3c1ab45cefa84b742c4bf4;hb=95084fee7261488e27be38d9c50957f82a75f416;hp=9a11556bdbaee21765d8fabbe5af3db70f74a4f6;hpb=6b020861bcd821c005e218f45d9c6cea8a9d0947;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_io.c b/libmemcached/memcached_io.c index 9a11556b..72a02a0f 100644 --- a/libmemcached/memcached_io.c +++ b/libmemcached/memcached_io.c @@ -338,6 +338,7 @@ static ssize_t io_flush(memcached_server_st *ptr, if ((sent_length= write(ptr->fd, local_write_ptr, write_length)) == -1) { + ptr->cached_errno= errno; switch (errno) { case ENOBUFS: @@ -355,7 +356,6 @@ static ssize_t io_flush(memcached_server_st *ptr, } default: memcached_quit_server(ptr, 1); - ptr->cached_errno= errno; *error= MEMCACHED_ERRNO; return -1; } @@ -409,3 +409,48 @@ memcached_return memcached_safe_read(memcached_server_st *ptr, return MEMCACHED_SUCCESS; } + +memcached_return memcached_io_readline(memcached_server_st *ptr, + char *buffer_ptr, + size_t size) +{ + bool line_complete= false; + int total_nr= 0; + + while (!line_complete) + { + if (ptr->read_buffer_length == 0) + { + /* + * We don't have any data in the buffer, so let's fill the read + * buffer. Call the standard read function to avoid duplicating + * the logic. + */ + if (memcached_io_read(ptr, buffer_ptr, 1) != 1) + return MEMCACHED_UNKNOWN_READ_FAILURE; + + if (*buffer_ptr == '\n') + line_complete= true; + + ++buffer_ptr; + ++total_nr; + } + + /* Now let's look in the buffer and copy as we go! */ + while (ptr->read_buffer_length && total_nr < size && !line_complete) + { + *buffer_ptr = *ptr->read_ptr; + if (*buffer_ptr == '\n') + line_complete = true; + --ptr->read_buffer_length; + ++ptr->read_ptr; + ++total_nr; + ++buffer_ptr; + } + + if (total_nr == size) + return MEMCACHED_PROTOCOL_ERROR; + } + + return MEMCACHED_SUCCESS; +}