static char * __xpath_node_array_print_short(const xpath_result_t *na) { ni_stringbuf_t buf; unsigned int n; if (na->type == XPATH_BOOLEAN) return xstrdup(__xpath_test_boolean(na)? "[true]" : "[false]"); if (na->count == 0) return xstrdup("[]"); ni_stringbuf_init(&buf); ni_stringbuf_putc(&buf, '['); for (n = 0; n < na->count; ++n) { const char *string; if (n) ni_stringbuf_puts(&buf, ", "); if (n >= 7) { ni_stringbuf_puts(&buf, "..."); break; } switch (na->type) { case XPATH_ELEMENT: string = na->node[n].value.node->name; ni_stringbuf_printf(&buf, "<%s>", string?: "ROOT"); break; case XPATH_INTEGER: ni_stringbuf_printf(&buf, "%ld", na->node[n].value.integer); break; case XPATH_STRING: string = na->node[n].value.string; if (strlen(string) > 32) ni_stringbuf_printf(&buf, "\"%.32s ...\"", string); else ni_stringbuf_printf(&buf, "\"%s\"", string); break; default: ni_stringbuf_puts(&buf, "???"); } } ni_stringbuf_putc(&buf, ']'); return buf.string; }
static void ni_json_string_escape(ni_stringbuf_t *buf, const char *str, const ni_json_format_options_t *options) { static const char *hex = "0123456789abcdefABCDEF"; size_t len = ni_string_len(str); size_t pos = 0, off = 0; unsigned char uc; const char *es; while (len--) { uc = str[pos]; es = ni_json_string_escape_map(uc, options); if (es) { if (pos - off > 0) ni_stringbuf_put(buf, str + off, pos - off); ni_stringbuf_puts(buf, es); off = ++pos; } else if (uc < ' ') { if (pos - off > 0) ni_stringbuf_put(buf, str + off, pos - off); ni_stringbuf_printf(buf, "\\u00%c%c", hex[uc >> 4], hex[uc & 0x0f]); off = ++pos; } else { pos++; } }
const char * ni_string_join(char **str, const ni_string_array_t *nsa, const char *sep) { ni_stringbuf_t buf; unsigned int i; if (nsa == NULL || sep == NULL || str == NULL) return NULL; ni_stringbuf_init(&buf); for (i=0; i < nsa->count; ++i) { if (i) ni_stringbuf_puts(&buf, sep); ni_stringbuf_puts(&buf, nsa->data[i]); } ni_string_dup(str, buf.string); ni_stringbuf_destroy(&buf); return *str; }
static void show_exec_info(int argc, char **argv) { ni_stringbuf_t args = NI_STRINGBUF_INIT_DYNAMIC; int i; for (i = 0; i < argc && argv[i]; ++i) { if (i != 0) ni_stringbuf_putc(&args, ' '); ni_stringbuf_puts(&args, argv[i]); } ni_debug_application("Executing: %s", args.string); ni_stringbuf_destroy(&args); }
void xml_writer_printf(xml_writer_t *writer, const char *fmt, ...) { char temp[256]; va_list ap; va_start(ap, fmt); if (writer->file) { vfprintf(writer->file, fmt, ap); } else { vsnprintf(temp, sizeof(temp), fmt, ap); if (writer->hash) ni_hashctx_puts(writer->hash, temp); else ni_stringbuf_puts(&writer->buffer, temp); } va_end(ap); }
int ni_stringbuf_vprintf(ni_stringbuf_t *sb, const char *fmt, va_list ap) { char *s = NULL; int n; n = vasprintf(&s, fmt, ap); if (n < 0) return -1; if (sb->dynamic && sb->string == NULL) { sb->string = s; sb->size = sb->len = n; } else { ni_stringbuf_puts(sb, s); free(s); } return sb->len; }
void __ni_ifsysctl_vars_map(ni_var_array_t *vars, const char *key, const char *val) { ni_stringbuf_t buf = NI_STRINGBUF_INIT_DYNAMIC; const char *ptr; /* Normalize the net.ipv4.ip_forward alias */ if (!strcmp(key, "net.ipv4.ip_forward")) key = "net.ipv4.conf.all.forwarding"; /* * Filter out net.ipv4.conf.* and net.ipv6.conf.* only. */ if (strncmp(key, "net.ipv4.conf.", sizeof("net.ipv4.conf.")-1) && strncmp(key, "net.ipv6.conf.", sizeof("net.ipv6.conf.")-1)) return; /* * Resolve $INTERFACE and $SYSCTL_IF wildcard crap */ if ((ptr = strstr(key, "$INTERFACE"))) { ni_stringbuf_puts(&buf, key); ni_stringbuf_truncate(&buf, ptr - key); ni_stringbuf_puts(&buf, "default"); ptr += sizeof("$INTERFACE")-1; ni_stringbuf_puts(&buf, ptr); key = buf.string; } else if ((ptr = strstr(key, "$SYSCTL_IF"))) { ni_stringbuf_puts(&buf, key); ni_stringbuf_truncate(&buf, ptr - key); ni_stringbuf_puts(&buf, "default"); ptr += sizeof("$SYSCTL_IF")-1; ni_stringbuf_puts(&buf, ptr); key = buf.string; } /* * And finally add it to the array */ ni_var_array_set(vars, key, val); ni_stringbuf_destroy(&buf); }
/* * Decode an RFC3397 DNS search order option. */ static int ni_dhcp_decode_dnssearch(ni_buffer_t *optbuf, ni_string_array_t *list, const char *what) { ni_stringbuf_t namebuf = NI_STRINGBUF_INIT_DYNAMIC; unsigned char *base = ni_buffer_head(optbuf); unsigned int base_offset = optbuf->head; size_t len; ni_string_array_destroy(list); while (ni_buffer_count(optbuf) && !optbuf->underflow) { ni_buffer_t *bp = optbuf; ni_buffer_t jumpbuf; while (1) { unsigned int pos = bp->head - base_offset; unsigned int pointer; char label[64]; int length; if ((length = ni_buffer_getc(bp)) < 0) goto failure; /* unexpected EOF */ if (length == 0) break; /* end of this name */ switch (length & 0xC0) { case 0: /* Plain name component */ if (ni_buffer_get(bp, label, length) < 0) goto failure; label[length] = '\0'; if (!ni_stringbuf_empty(&namebuf)) ni_stringbuf_putc(&namebuf, '.'); ni_stringbuf_puts(&namebuf, label); break; case 0xC0: /* Pointer */ pointer = (length & 0x3F) << 8; if ((length = ni_buffer_getc(bp)) < 0) goto failure; pointer |= length; if (pointer >= pos) goto failure; ni_buffer_init_reader(&jumpbuf, base, pos); jumpbuf.head = pointer; bp = &jumpbuf; break; default: goto failure; } } if (!ni_stringbuf_empty(&namebuf)) { len = ni_string_len(namebuf.string); if (ni_check_domain_name(namebuf.string, len, 0)) { ni_string_array_append(list, namebuf.string); } else { ni_debug_dhcp("Discarded suspect %s: %s", what, ni_print_suspect(namebuf.string, len)); } } ni_stringbuf_destroy(&namebuf); } return 0; failure: ni_stringbuf_destroy(&namebuf); ni_string_array_destroy(list); return -1; }