83 #define STR(x) vstring_str(x)
84 #define VSTREQ(v,s) (strcmp(STR(v),s) == 0)
94 static int dict_proxy_sequence(
DICT *dict,
int function,
95 const char **key,
const char **value)
97 const char *myname =
"dict_proxy_sequence";
133 if (
msg_verbose || count > 1 || (errno && errno != EPIPE && errno != ENOENT))
137 msg_info(
"%s: table=%s flags=%s func=%d -> status=%d key=%s val=%s",
139 function, status,
STR(dict_proxy->
reskey),
143 msg_fatal(
"%s sequence failed for table \"%s\" function %d: "
147 msg_fatal(
"%s service is not configured for table \"%s\"",
163 msg_warn(
"%s sequence failed for table \"%s\" function %d: "
164 "unexpected reply status %d",
165 dict_proxy->
service, dict->
name,
function, status);
175 static const char *dict_proxy_lookup(
DICT *dict,
const char *key)
177 const char *myname =
"dict_proxy_lookup";
210 if (
msg_verbose || count > 1 || (errno && errno != EPIPE && errno != ENOENT))
214 msg_info(
"%s: table=%s flags=%s key=%s -> status=%d result=%s",
220 msg_fatal(
"%s lookup failed for table \"%s\" key \"%s\": "
224 msg_fatal(
"%s service is not configured for table \"%s\"",
235 msg_warn(
"%s lookup failed for table \"%s\" key \"%s\": "
236 "unexpected reply status %d",
247 static int dict_proxy_update(
DICT *dict,
const char *key,
const char *value)
249 const char *myname =
"dict_proxy_update";
280 if (
msg_verbose || count > 1 || (errno && errno != EPIPE && errno != ENOENT))
284 msg_info(
"%s: table=%s flags=%s key=%s value=%s -> status=%d",
289 msg_fatal(
"%s update failed for table \"%s\" key \"%s\": "
293 msg_fatal(
"%s update access is not configured for table \"%s\"",
304 msg_warn(
"%s update failed for table \"%s\" key \"%s\": "
305 "unexpected reply status %d",
316 static int dict_proxy_delete(
DICT *dict,
const char *key)
318 const char *myname =
"dict_proxy_delete";
348 if (
msg_verbose || count > 1 || (errno && errno != EPIPE && errno !=
353 msg_info(
"%s: table=%s flags=%s key=%s -> status=%d",
358 msg_fatal(
"%s delete failed for table \"%s\" key \"%s\": "
362 msg_fatal(
"%s update access is not configured for table \"%s\"",
373 msg_warn(
"%s delete failed for table \"%s\" key \"%s\": "
374 "unexpected reply status %d",
385 static void dict_proxy_close(
DICT *dict)
398 const char *myname =
"dict_proxy_open";
415 return (
dict_open(map, open_flags, dict_flags));
427 if (open_flags == O_RDONLY) {
428 pstream = &proxymap_stream;
430 }
else if ((open_flags & O_RDWR) == O_RDWR) {
431 pstream = &proxywrite_stream;
434 msg_fatal(
"%s: %s map open requires O_RDONLY or O_RDWR mode",
439 service, (
char *) 0);
440 if (access(relative_path, F_OK) == 0)
461 dict_proxy->
dict.
close = dict_proxy_close;
465 dict_proxy->
clnt = *pstream;
486 if (
msg_verbose || (errno != EPIPE && errno != ENOENT))
490 msg_info(
"%s: connect to map=%s status=%d server_flags=%s",
491 myname, dict_proxy->
dict.
name, status,
495 msg_fatal(
"%s open failed for table \"%s\": invalid request",
498 msg_fatal(
"%s service is not configured for table \"%s\"",
505 msg_warn(
"%s open failed for table \"%s\": unexpected status %d",
char * var_proxymap_service
VSTREAM * clnt_stream_access(CLNT_STREAM *clnt_stream)
#define DICT_FLAG_RQST_MASK
void(* close)(struct DICT *)
int(* delete)(struct DICT *, const char *)
#define PROXY_REQ_SEQUENCE
#define RECV_ATTR_INT(name, val)
char * var_proxywrite_service
DICT * dict_open(const char *, int, int)
#define VSTRING_TERMINATE(vp)
DICT * dict_proxy_open(const char *map, int open_flags, int dict_flags)
int(* update)(struct DICT *, const char *, const char *)
#define DICT_STAT_SUCCESS
#define PROXY_STAT_CONFIG
CLNT_STREAM * clnt_stream_create(const char *class, const char *service, int timeout, int ttl)
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
const char * dict_flags_str(int dict_flags)
#define DICT_FLAG_INST_MASK
#define SEND_ATTR_INT(name, val)
const char *(* lookup)(struct DICT *, const char *)
NORETURN msg_fatal(const char *fmt,...)
#define DICT_ERR_VAL_RETURN(dict, err, val)
int vstream_fflush(VSTREAM *stream)
char * concatenate(const char *arg0,...)
#define DICT_FLAG_IMPL_MASK
VSTRING * vstring_free(VSTRING *vp)
void clnt_stream_recover(CLNT_STREAM *clnt_stream)
int(* sequence)(struct DICT *, int, const char **, const char **)
DICT * dict_alloc(const char *, const char *, ssize_t)
#define SEND_ATTR_STR(name, val)
#define DICT_FLAG_NO_PROXY
#define MAIL_CLASS_PRIVATE
#define RECV_ATTR_STR(name, val)
void msg_info(const char *fmt,...)