Date: Sun, 7 Mar 2004 04:31:24 +0300 (MSK) From: Gleb Smirnoff <glebius@cell.sick.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/63863: [patch] implement NGM_ELECTROCUTE Message-ID: <200403070131.i271VOH4060488@cell.sick.ru> Resent-Message-ID: <200403070140.i271eGmU068105@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 63863 >Category: kern >Synopsis: [patch] implement NGM_ELECTROCUTE >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Mar 06 17:40:16 PST 2004 >Closed-Date: >Last-Modified: >Originator: Gleb Smirnoff >Release: FreeBSD 5.2-CURRENT i386 >Organization: >Environment: System: FreeBSD morannon.bestcom.ru 5.2-CURRENT FreeBSD 5.2-CURRENT #3: Mon Mar 1 21:49:20 MSK 2004 glebius@morannon.bestcom.ru:/usr/obj/usr/src/sys/MORANNON i386 >Description: Implement a new generic netgraph message - "electrocute", which shuts down the node it was sent to, and all connected nodes recursively. This idea was suggested by Archie Cobbs in his article: http://www.daemonnews.org/200003/netgraph.html One problem is that the word "electrocute" itself is too long. For my point of view it'll be better to call it "flush" or "destroy". >How-To-Repeat: Create a complicated graph. Shutdown it using shutdown message multiple times. Think about electrocution :) >Fix: Here are two diffs: to netgraph base and to ngctl utility. --- netgraph.h.orig Mon Mar 1 21:36:58 2004 +++ netgraph.h Sun Mar 7 03:06:34 2004 @@ -349,6 +349,7 @@ #define NG_FORCE_WRITER 0x00000004 /* Never multithread this node */ #define NG_CLOSING 0x00000008 /* ng_rmnode() at work */ #define NG_REALLY_DIE 0x00000010 /* "persistant" node is unloading */ +#define NG_ELECTROCUTING 0x00000020 /* node is already touched by electrocution */ #define NGF_TYPE1 0x10000000 /* reserved for type specific storage */ #define NGF_TYPE2 0x20000000 /* reserved for type specific storage */ #define NGF_TYPE3 0x40000000 /* reserved for type specific storage */ --- ng_message.h.orig Sun Mar 7 03:07:39 2004 +++ ng_message.h Sun Mar 7 03:07:53 2004 @@ -131,6 +131,7 @@ #define NGM_BINARY2ASCII (12|NGM_READONLY)/* convert ng_mesg to ascii */ #define NGM_ASCII2BINARY (13|NGM_READONLY)/* convert ascii to ng_mesg */ #define NGM_TEXT_CONFIG 14 /* (optional) get/set text config */ +#define NGM_ELECTROCUTE 15 /* shut down node and attached graph */ /* * Flow control and intra node control messages. --- ng_base.c.orig Mon Mar 1 20:51:10 2004 +++ ng_base.c Sun Mar 7 03:59:18 2004 @@ -525,6 +525,13 @@ &ng_parse_ng_mesg_type, &ng_parse_ng_mesg_type }, + { + NGM_GENERIC_COOKIE, + NGM_ELECTROCUTE, + "electrocute", + NULL, + NULL + }, { 0 } }; @@ -2475,6 +2482,39 @@ case NGM_SHUTDOWN: ng_rmnode(here, NULL, NULL, 0); break; + case NGM_ELECTROCUTE: + { + hook_p hook; + + /* Check if it's already shutting down */ + if ((here->nd_flags & NG_ELECTROCUTING) != 0) + break; + + here->nd_flags |= NG_ELECTROCUTING; + + LIST_FOREACH(hook, &here->nd_hooks, hk_hooks) { + struct ng_mesg *msg; + + /* In case of closed graph we can encounter a node + * which has already received message */ + if (NG_NODE_NOT_VALID(NG_PEER_NODE(hook))) + continue; + + NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_ELECTROCUTE, 0, M_NOWAIT); + if (msg == NULL) { + error = ENOBUFS; + break; + } + + NG_SEND_MSG_HOOK(error, here, msg, hook, 0); + if (error) + break; + + } + + ng_rmnode(here, NULL, NULL, 0); + break; + } case NGM_MKPEER: { struct ngm_mkpeer *const mkp = (struct ngm_mkpeer *) msg->data; diff -Nu ngctl.orig/Makefile ngctl/Makefile --- ngctl.orig/Makefile Sun Mar 7 04:07:52 2004 +++ ngctl/Makefile Sun Mar 7 03:13:01 2004 @@ -4,7 +4,8 @@ PROG= ngctl MAN= ngctl.8 SRCS= main.c mkpeer.c config.c connect.c dot.c name.c show.c list.c \ - msg.c debug.c shutdown.c rmhook.c status.c types.c write.c + msg.c debug.c shutdown.c rmhook.c status.c types.c write.c \ + electrocute.c WARNS?= 3 DPADD= ${LIBNETGRAPH} LDADD= -lnetgraph diff -Nu ngctl.orig/electrocute.c ngctl/electrocute.c --- ngctl.orig/electrocute.c Thu Jan 1 03:00:00 1970 +++ ngctl/electrocute.c Mon Mar 1 23:27:59 2004 @@ -0,0 +1,73 @@ + +/* + * electrocute.c + * + * Copyright (c) 1996-1999 Whistle Communications, Inc. + * All rights reserved. + * + * Subject to the following obligations and disclaimer of warranty, use and + * redistribution of this software, in source or object code forms, with or + * without modifications are expressly permitted by Whistle Communications; + * provided, however, that: + * 1. Any and all reproductions of the source or object code must include the + * copyright notice above and the following disclaimer of warranties; and + * 2. No rights are granted, in any manner or form, to use Whistle + * Communications, Inc. trademarks, including the mark "WHISTLE + * COMMUNICATIONS" on advertising, endorsements, or otherwise except as + * such appears in the above copyright notice or in the software. + * + * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO + * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE, + * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. + * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY + * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS + * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE. + * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES + * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING + * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * $FreeBSD: src/usr.sbin/ngctl/shutdown.c,v 1.2 1999/11/30 02:45:32 archie Exp $ + */ + +#include "ngctl.h" + +static int ElectrocuteCmd(int ac, char **av); + +const struct ngcmd electrocute_cmd = { + ElectrocuteCmd, + "electrocute <path>", + "Shutdown the node and attached graph at <path>", + NULL, + { "destroy", "rmgraph" } +}; + +static int +ElectrocuteCmd(int ac, char **av) +{ + char *path; + + /* Get arguments */ + switch (ac) { + case 2: + path = av[1]; + break; + default: + return(CMDRTN_USAGE); + } + + /* Shutdown node */ + if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, + NGM_ELECTROCUTE, NULL, 0) < 0) { + warn("electrocute"); + return(CMDRTN_ERROR); + } + return(CMDRTN_OK); +} diff -Nu ngctl.orig/main.c ngctl/main.c --- ngctl.orig/main.c Sun Mar 7 04:07:52 2004 +++ ngctl/main.c Sun Mar 7 03:14:04 2004 @@ -72,6 +72,7 @@ &rmhook_cmd, &show_cmd, &shutdown_cmd, + &electrocute_cmd, &status_cmd, &types_cmd, &write_cmd, diff -Nu ngctl.orig/ngctl.h ngctl/ngctl.h --- ngctl.orig/ngctl.h Sun Mar 7 04:07:52 2004 +++ ngctl/ngctl.h Sun Mar 7 03:13:27 2004 @@ -88,6 +88,7 @@ extern const struct ngcmd rmhook_cmd; extern const struct ngcmd show_cmd; extern const struct ngcmd shutdown_cmd; +extern const struct ngcmd electrocute_cmd; extern const struct ngcmd status_cmd; extern const struct ngcmd types_cmd; extern const struct ngcmd write_cmd; >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403070131.i271VOH4060488>