Remove use of system(). Not very portable
[awesomized/libmemcached] / libmemcached / do.c
1 /* LibMemcached
2 * Copyright (C) 2006-2010 Brian Aker
3 * All rights reserved.
4 *
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
7 *
8 * Summary:
9 *
10 */
11
12 #include "common.h"
13
14 memcached_return_t memcached_do(memcached_server_write_instance_st ptr, const void *command,
15 size_t command_length, bool with_flush)
16 {
17 memcached_return_t rc;
18 ssize_t sent_length;
19
20 WATCHPOINT_ASSERT(command_length);
21 WATCHPOINT_ASSERT(command);
22
23 if ((rc= memcached_connect(ptr)) != MEMCACHED_SUCCESS)
24 {
25 WATCHPOINT_ERROR(rc);
26 return rc;
27 }
28
29 /*
30 ** Since non buffering ops in UDP mode dont check to make sure they will fit
31 ** before they start writing, if there is any data in buffer, clear it out,
32 ** otherwise we might get a partial write.
33 **/
34 if (ptr->type == MEMCACHED_CONNECTION_UDP && with_flush && ptr->write_buffer_offset > UDP_DATAGRAM_HEADER_LENGTH)
35 {
36 memcached_io_write(ptr, NULL, 0, true);
37 }
38
39 sent_length= memcached_io_write(ptr, command, command_length, with_flush);
40
41 if (sent_length == -1 || (size_t)sent_length != command_length)
42 {
43 rc= MEMCACHED_WRITE_FAILURE;
44 }
45 else if ((ptr->root->flags.no_reply) == 0)
46 {
47 memcached_server_response_increment(ptr);
48 }
49
50 return rc;
51 }
52
53 memcached_return_t memcached_vdo(memcached_server_write_instance_st ptr,
54 const struct __write_vector_st *vector, size_t count,
55 bool with_flush)
56 {
57 memcached_return_t rc;
58 ssize_t sent_length;
59
60 WATCHPOINT_ASSERT(count);
61 WATCHPOINT_ASSERT(vector);
62
63 if ((rc= memcached_connect(ptr)) != MEMCACHED_SUCCESS)
64 {
65 WATCHPOINT_ERROR(rc);
66 return rc;
67 }
68
69 /*
70 ** Since non buffering ops in UDP mode dont check to make sure they will fit
71 ** before they start writing, if there is any data in buffer, clear it out,
72 ** otherwise we might get a partial write.
73 **/
74 if (ptr->type == MEMCACHED_CONNECTION_UDP && with_flush && ptr->write_buffer_offset > UDP_DATAGRAM_HEADER_LENGTH)
75 {
76 memcached_io_write(ptr, NULL, 0, true);
77 }
78
79 sent_length= memcached_io_writev(ptr, vector, count, with_flush);
80
81 size_t command_length= 0;
82 for (uint32_t x= 0; x < count; ++x, vector++)
83 {
84 command_length+= vector->length;
85 }
86
87 if (sent_length == -1 || (size_t)sent_length != command_length)
88 {
89 rc= MEMCACHED_WRITE_FAILURE;
90 WATCHPOINT_ERROR(rc);
91 WATCHPOINT_ERRNO(errno);
92 }
93 else if ((ptr->root->flags.no_reply) == 0)
94 {
95 memcached_server_response_increment(ptr);
96 }
97
98 return rc;
99 }