182 #define STR(x) vstring_str(x)
183 #define LEN(x) VSTRING_LEN(x)
187 static int attr_scan0_string(
VSTREAM *fp,
VSTRING *plain_buf,
const char *context)
192 msg_warn(
"%s on %s while reading %s",
198 msg_warn(
"unexpected end-of-input from %s while reading %s",
203 msg_info(
"%s: %s", context, *
STR(plain_buf) ?
STR(plain_buf) :
"(end)");
212 static VSTRING *base64_buf = 0;
217 if ((ch = attr_scan0_string(fp, base64_buf, context)) < 0)
220 msg_warn(
"malformed base64 data from %s while reading %s: %.100s",
229 static int attr_scan0_number(
VSTREAM *fp,
unsigned *ptr,
VSTRING *str_buf,
235 if ((ch = attr_scan0_string(fp, str_buf, context)) < 0)
237 if (sscanf(
STR(str_buf),
"%u%c", ptr, &junk) != 1 || junk != 0) {
238 msg_warn(
"malformed numerical data from %s while reading %s: %.100s",
247 static int attr_scan0_long_number(
VSTREAM *fp,
unsigned long *ptr,
254 if ((ch = attr_scan0_string(fp, str_buf, context)) < 0)
256 if (sscanf(
STR(str_buf),
"%lu%c", ptr, &junk) != 1 || junk != 0) {
257 msg_warn(
"malformed numerical data from %s while reading %s: %.100s",
268 const char *myname =
"attr_scan0";
271 int wanted_type = -1;
273 unsigned int *number;
274 unsigned long *long_number;
286 msg_panic(
"%s: bad flags: 0x%x", myname, flags);
306 for (conversions = 0; ; conversions++) {
319 wanted_type = va_arg(ap,
int);
322 return (conversions);
323 wanted_name =
"(list terminator)";
325 wanted_name =
"(any attribute name or list terminator)";
326 hash_table = va_arg(ap,
HTABLE *);
328 wanted_name = va_arg(ap,
char *);
343 msg_info(
"%s: wanted attribute: %s",
345 if ((ch = attr_scan0_string(fp, name_buf,
348 if (
LEN(name_buf) == 0) {
351 return (conversions);
353 msg_warn(
"missing attribute %s in input from %s",
355 return (conversions);
364 wanted_name =
"(any attribute name or '}')";
376 && strcmp(wanted_name,
STR(name_buf)) == 0))
379 msg_warn(
"unexpected attribute %s from %s (expecting: %s)",
381 return (conversions);
387 (void) attr_scan0_string(fp, str_buf,
"input attribute value");
393 switch (wanted_type) {
395 number = va_arg(ap,
unsigned int *);
396 if ((ch = attr_scan0_number(fp, number, str_buf,
397 "input attribute value")) < 0)
401 long_number = va_arg(ap,
unsigned long *);
402 if ((ch = attr_scan0_long_number(fp, long_number, str_buf,
403 "input attribute value")) < 0)
407 string = va_arg(ap,
VSTRING *);
408 if ((ch = attr_scan0_string(fp,
string,
409 "input attribute value")) < 0)
413 string = va_arg(ap,
VSTRING *);
414 if ((ch = attr_scan0_data(fp,
string,
415 "input attribute value")) < 0)
420 scan_arg = va_arg(ap,
void *);
426 if ((ch = attr_scan0_string(fp, str_buf,
427 "input attribute value")) < 0)
431 msg_warn(
"duplicate attribute %s in input from %s",
433 return (conversions);
436 msg_warn(
"attribute count exceeds limit %d in input from %s",
438 return (conversions);
448 msg_panic(
"%s: unknown type code: %d", myname, wanted_type);
483 msg_info(
"%s: non-terminator '%c' (lookahead)",
500 int main(
int unused_argc,
char **used_argv)
528 for (ht = ht_info_list; *ht; ht++)
529 vstream_printf(
"(hash) %s %s\n", ht[0]->key, (
char *) ht[0]->value);
530 myfree((
void *) ht_info_list);
547 for (ht = ht_info_list; *ht; ht++)
548 vstream_printf(
"(hash) %s %s\n", ht[0]->key, (
char *) ht[0]->value);
549 myfree((
void *) ht_info_list);
void htable_free(HTABLE *table, void(*free_fn)(void *))
HTABLE_INFO * htable_locate(HTABLE *table, const char *key)
char * mystrdup(const char *str)
int vstring_get_null(VSTRING *vp, VSTREAM *fp)
NORETURN msg_panic(const char *fmt,...)
#define ATTR_FLAG_MISSING
int main(int argc, char **argv)
#define RECV_ATTR_INT(name, val)
#define RECV_ATTR_HASH(val)
HTABLE * htable_create(ssize_t size)
HTABLE_INFO ** htable_list(HTABLE *table)
#define vstream_ungetc(vp, ch)
#define vstream_ftimeout(vp)
#define RECV_ATTR_LONG(name, val)
VSTREAM * vstream_printf(const char *fmt,...)
void msg_warn(const char *fmt,...)
#define RECV_ATTR_DATA(name, val)
VSTRING * vstring_alloc(ssize_t len)
NORETURN msg_fatal(const char *fmt,...)
VSTRING * base64_decode(VSTRING *, const char *, ssize_t)
int vstream_fflush(VSTREAM *stream)
VSTRING * vstring_free(VSTRING *vp)
int attr_vscan0(VSTREAM *fp, int flags, va_list ap)
int attr_scan0(VSTREAM *fp, int flags,...)
void msg_vstream_init(const char *name, VSTREAM *vp)
int attr_scan_more0(VSTREAM *fp)
int(* ATTR_SCAN_SLAVE_FN)(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *)
#define RECV_ATTR_STR(name, val)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)