int attr_vprint64(VSTREAM *fp, int flags, va_list ap) { const char *myname = "attr_print64"; int attr_type; char *attr_name; unsigned int_val; unsigned long long_val; char *str_val; HTABLE_INFO **ht_info_list; HTABLE_INFO **ht; /* * Sanity check. */ if (flags & ~ATTR_FLAG_ALL) msg_panic("%s: bad flags: 0x%x", myname, flags); /* * Iterate over all (type, name, value) triples, and produce output on * the fly. */ while ((attr_type = va_arg(ap, int)) != ATTR_TYPE_END) { switch (attr_type) { case ATTR_TYPE_NUM: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); int_val = va_arg(ap, int); VSTREAM_PUTC(':', fp); attr_print64_num(fp, (unsigned) int_val); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %u", attr_name, int_val); break; case ATTR_TYPE_LONG: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); long_val = va_arg(ap, long); VSTREAM_PUTC(':', fp); attr_print64_long_num(fp, (unsigned long) long_val); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %lu", attr_name, long_val); break; case ATTR_TYPE_STR: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); str_val = va_arg(ap, char *); VSTREAM_PUTC(':', fp); attr_print64_str(fp, str_val, strlen(str_val)); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %s", attr_name, str_val); break; case ATTR_TYPE_HASH: ht_info_list = htable_list(va_arg(ap, HTABLE *)); for (ht = ht_info_list; *ht; ht++) { attr_print64_str(fp, ht[0]->key, strlen(ht[0]->key)); VSTREAM_PUTC(':', fp); attr_print64_str(fp, ht[0]->value, strlen(ht[0]->value)); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr name %s value %s", ht[0]->key, ht[0]->value); } myfree((char *) ht_info_list); break; default: msg_panic("%s: unknown type code: %d", myname, attr_type); } } if ((flags & ATTR_FLAG_MORE) == 0) VSTREAM_PUTC('\n', fp); return (vstream_ferror(fp)); }
int attr_vprint64(VSTREAM *fp, int flags, va_list ap) { const char *myname = "attr_print64"; int attr_type; char *attr_name; unsigned int_val; unsigned long long_val; char *str_val; HTABLE_INFO **ht_info_list; HTABLE_INFO **ht; ssize_t len_val; ATTR_PRINT_SLAVE_FN print_fn; void *print_arg; /* * Sanity check. */ if (flags & ~ATTR_FLAG_ALL) msg_panic("%s: bad flags: 0x%x", myname, flags); /* * Iterate over all (type, name, value) triples, and produce output on * the fly. */ while ((attr_type = va_arg(ap, int)) != ATTR_TYPE_END) { switch (attr_type) { case ATTR_TYPE_INT: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); int_val = va_arg(ap, int); VSTREAM_PUTC(':', fp); attr_print64_num(fp, (unsigned) int_val); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %u", attr_name, int_val); break; case ATTR_TYPE_LONG: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); long_val = va_arg(ap, long); VSTREAM_PUTC(':', fp); attr_print64_long_num(fp, (unsigned long) long_val); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %lu", attr_name, long_val); break; case ATTR_TYPE_STR: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); str_val = va_arg(ap, char *); VSTREAM_PUTC(':', fp); attr_print64_str(fp, str_val, strlen(str_val)); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = %s", attr_name, str_val); break; case ATTR_TYPE_DATA: attr_name = va_arg(ap, char *); attr_print64_str(fp, attr_name, strlen(attr_name)); len_val = va_arg(ap, ssize_t); str_val = va_arg(ap, char *); VSTREAM_PUTC(':', fp); attr_print64_str(fp, str_val, len_val); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr %s = [data %ld bytes]", attr_name, (long) len_val); break; case ATTR_TYPE_FUNC: print_fn = va_arg(ap, ATTR_PRINT_SLAVE_FN); print_arg = va_arg(ap, void *); print_fn(attr_print64, fp, flags | ATTR_FLAG_MORE, print_arg); break; case ATTR_TYPE_HASH: attr_print64_str(fp, ATTR_NAME_OPEN, sizeof(ATTR_NAME_OPEN) - 1); VSTREAM_PUTC('\n', fp); ht_info_list = htable_list(va_arg(ap, HTABLE *)); for (ht = ht_info_list; *ht; ht++) { attr_print64_str(fp, ht[0]->key, strlen(ht[0]->key)); VSTREAM_PUTC(':', fp); attr_print64_str(fp, ht[0]->value, strlen(ht[0]->value)); VSTREAM_PUTC('\n', fp); if (msg_verbose) msg_info("send attr name %s value %s", ht[0]->key, (char *) ht[0]->value); } myfree((void *) ht_info_list); attr_print64_str(fp, ATTR_NAME_CLOSE, sizeof(ATTR_NAME_CLOSE) - 1); VSTREAM_PUTC('\n', fp); break; default: msg_panic("%s: unknown type code: %d", myname, attr_type); } } if ((flags & ATTR_FLAG_MORE) == 0) VSTREAM_PUTC('\n', fp); return (vstream_ferror(fp)); }