write.c revision 158882
117721Speter 217721Speter/* 317721Speter * write.c 417721Speter * 517721Speter * Copyright (c) 2002 Archie L. Cobbs 617721Speter * All rights reserved. 717721Speter * 817721Speter * Subject to the following obligations and disclaimer of warranty, use and 917721Speter * redistribution of this software, in source or object code forms, with or 1017721Speter * without modifications are expressly permitted by Archie L. Cobbs; 1117721Speter * provided, however, that: 1217721Speter * 1. Any and all reproductions of the source or object code must include the 1317721Speter * copyright notice above and the following disclaimer of warranties 1417721Speter * 1517721Speter * THIS SOFTWARE IS BEING PROVIDED BY ARCHIE L. COBBS AS IS", AND TO 1617721Speter * THE MAXIMUM EXTENT PERMITTED BY LAW, ARCHIE L. COBBS MAKES NO 1717721Speter * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE, 1817721Speter * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF 1917721Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. 2017721Speter * ARCHIE L. COBBS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY 2117721Speter * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS 2217721Speter * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE. 2317721Speter * IN NO EVENT SHALL ARCHIE L. COBBS BE LIABLE FOR ANY DAMAGES 2425839Speter * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING 2525839Speter * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 2625839Speter * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR 2717721Speter * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY 2817721Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2917721Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3017721Speter * THIS SOFTWARE, EVEN IF ARCHIE L. COBBS IS ADVISED OF THE POSSIBILITY 3117721Speter * OF SUCH DAMAGE. 3217721Speter * 3317721Speter * $FreeBSD: head/usr.sbin/ngctl/write.c 158882 2006-05-24 14:46:55Z glebius $ 3417721Speter */ 3517721Speter 3617721Speter#include <sys/types.h> 3717721Speter#include <sys/socket.h> 3817721Speter 3925839Speter#include <err.h> 4025839Speter#include <stdio.h> 4117721Speter#include <string.h> 4217721Speter#include <unistd.h> 4317721Speter 4417721Speter#include <netgraph/ng_socket.h> 4517721Speter 4617721Speter#include "ngctl.h" 4717721Speter 4817721Speter#define BUF_SIZE 8192 4917721Speter 5017721Speterstatic int WriteCmd(int ac, char **av); 5125839Speter 5225839Speterconst struct ngcmd write_cmd = { 5325839Speter WriteCmd, 5425839Speter "write hook < -f file | byte ... >", 5525839Speter "Send a data packet down the hook named by \"hook\".", 5617721Speter "The data may be contained in a file, or may be described directly" 5717721Speter " on the command line by supplying a sequence of bytes.", 5825839Speter { "w" } 5917721Speter}; 6017721Speter 6117721Speterstatic int 6217721SpeterWriteCmd(int ac, char **av) 6317721Speter{ 6425839Speter u_int32_t sagbuf[64]; 6525839Speter struct sockaddr_ng *sag = (struct sockaddr_ng *)sagbuf; 6625839Speter u_char buf[BUF_SIZE]; 6725839Speter const char *hook; 6825839Speter FILE *fp; 6917721Speter u_int len; 7017721Speter int byte; 7117721Speter int i; 7225839Speter 7317721Speter /* Get arguments */ 7417721Speter if (ac < 3) 7517721Speter return(CMDRTN_USAGE); 7617721Speter hook = av[1]; 7717721Speter 7817721Speter /* Get data */ 7925839Speter if (strcmp(av[2], "-f") == 0) { 8017721Speter if (ac != 4) 8117721Speter return(CMDRTN_USAGE); 8217721Speter if ((fp = fopen(av[3], "r")) == NULL) { 8325839Speter warn("can't read file \"%s\"", av[3]); 8417721Speter return(CMDRTN_ERROR); 8517721Speter } 8617721Speter if ((len = fread(buf, 1, sizeof(buf), fp)) == 0) { 8717721Speter if (ferror(fp)) 8817721Speter warn("can't read file \"%s\"", av[3]); 8917721Speter else 9017721Speter warnx("file \"%s\" is empty", av[3]); 9117721Speter fclose(fp); 9217721Speter return(CMDRTN_ERROR); 9317721Speter } 9417721Speter fclose(fp); 9517721Speter } else { 9617721Speter for (i = 2, len = 0; i < ac && len < sizeof(buf); i++, len++) { 9717721Speter if (sscanf(av[i], "%i", &byte) != 1 9817721Speter || (byte < -128 || byte > 255)) { 9917721Speter warnx("invalid byte \"%s\"", av[i]); 10017721Speter return(CMDRTN_ERROR); 10117721Speter } 10217721Speter buf[len] = (u_char)byte; 10317721Speter } 10417721Speter if (len == 0) 10517721Speter return(CMDRTN_USAGE); 10617721Speter } 10717721Speter 10817721Speter /* Send data */ 10917721Speter sag->sg_len = 3 + strlen(hook); 11017721Speter sag->sg_family = AF_NETGRAPH; 11125839Speter strlcpy(sag->sg_data, hook, sizeof(sagbuf) - 2); 11217721Speter if (sendto(dsock, buf, len, 11317721Speter 0, (struct sockaddr *)sag, sag->sg_len) == -1) { 11417721Speter warn("writing to hook \"%s\"", hook); 11517721Speter return(CMDRTN_ERROR); 11625839Speter } 11717721Speter 11817721Speter /* Done */ 11917721Speter return(CMDRTN_OK); 12017721Speter} 12117721Speter 12217721Speter