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