113 #define DICT_SOCKMAP_DEF_TIMEOUT 100
114 #define DICT_SOCKMAP_DEF_MAX_REPLY 100000
115 #define DICT_SOCKMAP_DEF_MAX_IDLE 10
116 #define DICT_SOCKMAP_DEF_MAX_TTL 100
131 static HTABLE *dict_sockmap_handles;
138 #define DICT_SOCKMAP_RH_NAME(ht) (ht)->key
139 #define DICT_SOCKMAP_RH_HANDLE(ht) \
140 ((DICT_SOCKMAP_REFC_HANDLE *) (ht)->value)->client_handle
141 #define DICT_SOCKMAP_RH_REFCOUNT(ht) \
142 ((DICT_SOCKMAP_REFC_HANDLE *) (ht)->value)->refcount
147 #define DICT_SOCKMAP_PROT_OK "OK"
148 #define DICT_SOCKMAP_PROT_NOTFOUND "NOTFOUND"
149 #define DICT_SOCKMAP_PROT_TEMP "TEMP"
150 #define DICT_SOCKMAP_PROT_TIMEOUT "TIMEOUT"
151 #define DICT_SOCKMAP_PROT_PERM "PERM"
156 #define STR(x) vstring_str(x)
157 #define LEN(x) VSTRING_LEN(x)
161 static const char *dict_sockmap_lookup(
DICT *dict,
const char *key)
163 const char *myname =
"dict_sockmap_lookup";
170 const char *error_class;
173 msg_info(
"%s: key %s", myname, key);
189 for (except_count = 0; ; except_count++) {
232 && errno != ETIMEDOUT) {
241 msg_warn(
"table %s:%s lookup error: %s",
257 return (reply_payload);
264 error_class =
"temporary";
267 error_class =
"timeout";
270 error_class =
"permanent";
273 error_class =
"unknown";
276 while (reply_payload &&
ISSPACE(*reply_payload))
278 msg_warn(
"%s:%s socketmap server %s error%s%.200s",
279 dict->
type, dict->
name, error_class,
280 reply_payload && *reply_payload ?
": " :
"",
281 reply_payload && *reply_payload ?
288 static void dict_sockmap_close(
DICT *dict)
290 const char *myname =
"dict_sockmap_close";
293 if (dict_sockmap_handles == 0 || dict_sockmap_handles->
used == 0)
294 msg_panic(
"%s: attempt to close a non-existent map", myname);
312 char *saved_name = 0;
320 #define DICT_SOCKMAP_OPEN_RETURN(d) do { \
322 if (saved_name != 0) \
323 myfree(saved_name); \
330 if (open_flags != O_RDONLY)
332 open_flags, dict_flags,
333 "%s:%s map requires O_RDONLY access mode",
337 open_flags, dict_flags,
338 "%s:%s map is not allowed for security-sensitive data",
347 open_flags, dict_flags,
348 "%s requires server:socketmap argument",
357 if (dict_sockmap_handles == 0)
359 if ((client_info =
htable_locate(dict_sockmap_handles, saved_name)) == 0) {
362 saved_name, (
void *) ref_handle);
367 dict_sockmap_max_idle, dict_sockmap_max_ttl);
VSTREAM * auto_clnt_access(AUTO_CLNT *auto_clnt)
HTABLE_INFO * htable_locate(HTABLE *table, const char *key)
char * mystrdup(const char *str)
#define DICT_FLAG_NO_UNAUTH
void(* close)(struct DICT *)
NORETURN msg_panic(const char *fmt,...)
VSTRING * netstring_get(VSTREAM *stream, VSTRING *buf, ssize_t limit)
#define DICT_SOCKMAP_DEF_MAX_REPLY
#define DICT_SOCKMAP_PROT_NOTFOUND
void netstring_setup(VSTREAM *stream, int timeout)
#define DICT_TYPE_SOCKMAP
#define DICT_SOCKMAP_RH_NAME(ht)
#define vstream_setjmp(stream)
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
#define VSTRING_TERMINATE(vp)
HTABLE * htable_create(ssize_t size)
AUTO_CLNT * auto_clnt_create(const char *service, int timeout, int max_idle, int max_ttl)
void msg_warn(const char *fmt,...)
#define DICT_SOCKMAP_DEF_TIMEOUT
VSTRING * vstring_alloc(ssize_t len)
#define DICT_SOCKMAP_PROT_PERM
const char * netstring_strerror(int err)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define DICT_SOCKMAP_DEF_MAX_TTL
char * lowercase(char *string)
void auto_clnt_free(AUTO_CLNT *auto_clnt)
const char *(* lookup)(struct DICT *, const char *)
#define DICT_SOCKMAP_RH_HANDLE(ht)
#define DICT_FLAG_PATTERN
#define DICT_SOCKMAP_PROT_TEMP
#define DICT_SOCKMAP_PROT_TIMEOUT
#define NETSTRING_ERR_EOF
#define DICT_SOCKMAP_RH_REFCOUNT(ht)
void auto_clnt_recover(AUTO_CLNT *auto_clnt)
#define DICT_SOCKMAP_PROT_OK
VSTRING * vstring_free(VSTRING *vp)
char * split_at(char *string, int delimiter)
#define DICT_FLAG_FOLD_MUL
#define DICT_SOCKMAP_DEF_MAX_IDLE
#define DICT_SOCKMAP_OPEN_RETURN(d)
DICT * dict_alloc(const char *, const char *, ssize_t)
char * printable(char *string, int replacement)
void htable_delete(HTABLE *table, const char *key, void(*free_fn)(void *))
char * split_at_right(char *string, int delimiter)
DICT * dict_sockmap_open(const char *mapname, int open_flags, int dict_flags)
HTABLE_INFO * client_info
AUTO_CLNT * client_handle
#define NETSTRING_PUT_BUF(str, buf)
DICT * dict_surrogate(const char *dict_type, const char *dict_name, int open_flags, int dict_flags, const char *fmt,...)
void * mymalloc(ssize_t len)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)