169793Sobrien/*
269793Sobrien * config.c
315702Sphk *
415702Sphk * Copyright (c) 1996-1999 Whistle Communications, Inc.
515702Sphk * All rights reserved.
615702Sphk *
715702Sphk * Subject to the following obligations and disclaimer of warranty, use and
815773Sphk * redistribution of this software, in source or object code forms, with or
915773Sphk * without modifications are expressly permitted by Whistle Communications;
1015702Sphk * provided, however, that:
1119813Sphk * 1. Any and all reproductions of the source or object code must include the
1215702Sphk *    copyright notice above and the following disclaimer of warranties; and
1315702Sphk * 2. No rights are granted, in any manner or form, to use Whistle
1415702Sphk *    Communications, Inc. trademarks, including the mark "WHISTLE
1515702Sphk *    COMMUNICATIONS" on advertising, endorsements, or otherwise except as
1615702Sphk *    such appears in the above copyright notice or in the software.
17118583Simp *
1815702Sphk * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
1915702Sphk * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
2015702Sphk * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
2115702Sphk * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
2215702Sphk * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
2315702Sphk * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
2415702Sphk * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
2515702Sphk * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
2615702Sphk * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
2715702Sphk * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
2815702Sphk * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
2915702Sphk * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
3015702Sphk * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
3115702Sphk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3215702Sphk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3369793Sobrien * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
3415702Sphk * OF SUCH DAMAGE.
3515702Sphk *
3615773Sphk * $FreeBSD$
3719813Sphk */
3815702Sphk
3915702Sphk#include <err.h>
4015702Sphk#include <errno.h>
4115773Sphk#include <netgraph.h>
4215773Sphk#include <stdio.h>
4315773Sphk#include <string.h>
4415773Sphk#include <unistd.h>
4519813Sphk
4619813Sphk#include "ngctl.h"
4715702Sphk
4815702Sphk#define NOCONFIG	"<no config>"
4915702Sphk
5015773Sphkstatic int ConfigCmd(int ac, char **av);
5115773Sphk
5215773Sphkconst struct ngcmd config_cmd = {
5315702Sphk	ConfigCmd,
5415702Sphk	"config <path> [arguments]",
5515702Sphk	"get or set configuration of node at <path>",
5615702Sphk	NULL,
5715702Sphk	{ NULL }
5815773Sphk};
5915773Sphk
6029526Scharnierstatic int
6129526ScharnierConfigCmd(int ac, char **av)
6229526Scharnier{
6315773Sphk	u_char sbuf[sizeof(struct ng_mesg) + NG_TEXTRESPONSE];
6415773Sphk	struct ng_mesg *const resp = (struct ng_mesg *) sbuf;
6515773Sphk	char *const status = (char *) resp->data;
6615773Sphk	char *path;
6715773Sphk	char buf[NG_TEXTRESPONSE];
6815773Sphk	int nostat = 0, i;
6915773Sphk
7015773Sphk	/* Get arguments */
7115702Sphk	if (ac < 2)
7215702Sphk		return (CMDRTN_USAGE);
7319813Sphk	path = av[1];
7419813Sphk
7515702Sphk	*buf = '\0';
7619813Sphk	for (i = 2; i < ac; i++) {
7715702Sphk		if (i != 2)
7819813Sphk			strcat(buf, " ");
7915702Sphk		strcat(buf, av[i]);
8019813Sphk	}
8119813Sphk
8215702Sphk	/* Get node config summary */
8319813Sphk	if (*buf != '\0')
8415702Sphk		i = NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
8519813Sphk	            NGM_TEXT_CONFIG, buf, strlen(buf) + 1);
8615702Sphk	else
8719813Sphk		i = NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
8815702Sphk	            NGM_TEXT_CONFIG, NULL, 0);
8919813Sphk	if (i < 0) {
9019813Sphk		switch (errno) {
9115702Sphk		case EINVAL:
9219813Sphk			nostat = 1;
9315702Sphk			break;
9419813Sphk		default:
9515702Sphk			warn("send msg");
9615702Sphk			return (CMDRTN_ERROR);
9715702Sphk		}
9815702Sphk	} else {
9915702Sphk		if (NgRecvMsg(csock, resp, sizeof(sbuf), NULL) < 0
10019813Sphk		    || (resp->header.flags & NGF_RESP) == 0)
10119813Sphk			nostat = 1;
10215702Sphk	}
10315702Sphk
10415702Sphk	/* Show it */
10515702Sphk	if (nostat)
10615702Sphk		printf("No config available for \"%s\"\n", path);
10715702Sphk	else
10815702Sphk		printf("Config for \"%s\":\n%s\n", path, status);
10915702Sphk	return (CMDRTN_OK);
11019813Sphk}
11129526Scharnier
11215702Sphk