Example #1
0
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;
}
Example #2
0
File: json.c Project: gsanso/wicked
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++;
		}
	}
Example #3
0
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;
}
Example #4
0
File: main.c Project: kmroz/wicked
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);
}
Example #5
0
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);
}
Example #6
0
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;
}
Example #7
0
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);
}
Example #8
0
/*
 * 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;
}