2 +--------------------------------------------------------------------+
3 | libmemcached - C/C++ Client Library for memcached |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted under the terms of the BSD license. |
7 | You should have received a copy of the license in a bundled file |
8 | named LICENSE; in case you did not receive a copy you can review |
9 | the terms online at: https://opensource.org/licenses/BSD-3-Clause |
10 +--------------------------------------------------------------------+
11 | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ |
12 | Copyright (c) 2020 Michael Wallner <mike@php.net> |
13 +--------------------------------------------------------------------+
16 #include "libmemcached/common.h"
17 #include "libmemcached/options.hpp"
19 #include "libmemcached/csl/context.h"
21 const char *memcached_parse_filename(memcached_st
*memc
) {
22 assert_msg(memc
, "Invalid memcached_st");
23 return memcached_array_string(memc
->configure
.filename
);
26 size_t memcached_parse_filename_length(memcached_st
*memc
) {
27 return memcached_array_size(memc
->configure
.filename
);
30 static memcached_return_t
_parse_file_options(memcached_st
&self
, memcached_array_st
*real_name
) {
31 FILE *fp
= fopen(memcached_array_string(real_name
), "r");
33 memcached_string_t error_message
= memcached_array_to_string(real_name
);
34 memcached_return_t rc
= memcached_set_errno(self
, errno
, MEMCACHED_AT
, error_message
);
39 memcached_return_t rc
= MEMCACHED_INVALID_ARGUMENTS
;
40 while (fgets(buffer
, sizeof(buffer
), fp
)) {
41 size_t length
= strlen(buffer
);
43 if (length
== 1 and buffer
[0] == '\n')
46 if (memcached_failed(rc
= memcached_parse_configuration(&self
, buffer
, length
)))
54 memcached_return_t
libmemcached_check_configuration(const char *option_string
, size_t length
,
55 char *error_buffer
, size_t error_buffer_size
) {
56 memcached_st memc
, *memc_ptr
;
58 if (option_string
== NULL
or length
== 0) {
59 return MEMCACHED_INVALID_ARGUMENTS
;
62 if (error_buffer
and error_buffer_size
) {
66 if (not(memc_ptr
= memcached_create(&memc
))) {
67 return MEMCACHED_MEMORY_ALLOCATION_FAILURE
;
70 memcached_return_t rc
= memcached_parse_configuration(memc_ptr
, option_string
, length
);
71 if (memcached_failed(rc
) and error_buffer
and error_buffer_size
) {
72 strncpy(error_buffer
, memcached_last_error_message(memc_ptr
), error_buffer_size
);
73 error_buffer
[error_buffer_size
- 1] = 0;
76 bool has_filename
= memcached_behavior_get(memc_ptr
, MEMCACHED_BEHAVIOR_LOAD_FROM_FILE
);
77 if (memcached_success(rc
) and has_filename
) {
78 assert_msg(memcached_parse_filename(memc_ptr
), "Invalid configuration file");
79 assert_msg(memcached_parse_filename_length(memc_ptr
), "Invalid configuration file");
80 rc
= _parse_file_options(*memc_ptr
, memc_ptr
->configure
.filename
);
82 if (memcached_failed(rc
) and error_buffer
and error_buffer_size
) {
83 strncpy(error_buffer
, memcached_last_error_message(memc_ptr
), error_buffer_size
);
84 error_buffer
[error_buffer_size
- 1] = 0;
88 memcached_free(memc_ptr
);
93 memcached_return_t
memcached_parse_configuration(memcached_st
*self
, char const *option_string
,
95 WATCHPOINT_ASSERT(self
);
97 return MEMCACHED_INVALID_ARGUMENTS
;
100 memcached_return_t rc
;
101 Context
context(option_string
, length
, self
, rc
);
108 void memcached_set_configuration_file(memcached_st
*self
, const char *filename
,
109 size_t filename_length
) {
110 assert_msg(filename
, "Invalid filename");
111 assert_msg(filename_length
, "Invalid filename_length");
112 memcached_array_free(self
->configure
.filename
);
113 self
->configure
.filename
= memcached_strcpy(self
, filename
, filename_length
);
116 memcached_return_t
memcached_parse_configure_file(memcached_st
&self
, const char *filename
,
119 return memcached_set_error(self
, MEMCACHED_INVALID_ARGUMENTS
, MEMCACHED_AT
);
122 WATCHPOINT_ASSERT(self
);
124 return memcached_set_error(self
, MEMCACHED_INVALID_ARGUMENTS
, MEMCACHED_AT
);
127 memcached_array_st
*tmp_array
= memcached_strcpy(&self
, filename
, length
);
130 return memcached_set_error(self
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
133 memcached_return_t rc
= memcached_parse_configure_file(self
, *tmp_array
);
134 memcached_array_free(tmp_array
);
139 memcached_return_t
memcached_parse_configure_file(memcached_st
&self
,
140 memcached_array_st
&filename
) {
141 WATCHPOINT_ASSERT(memcached_array_size(&filename
));
142 if (not memcached_array_size(&filename
)) {
143 return memcached_set_error(self
, MEMCACHED_INVALID_ARGUMENTS
, MEMCACHED_AT
);
146 return _parse_file_options(self
, &filename
);