svn commit: r224055 - in user/hrs/ipv6/usr.sbin: rtadvctl rtadvd
Hiroki Sato
hrs at FreeBSD.org
Fri Jul 15 06:54:22 UTC 2011
Author: hrs
Date: Fri Jul 15 06:54:21 2011
New Revision: 224055
URL: http://svn.freebsd.org/changeset/base/224055
Log:
Implement enable and disable subcommands.
Modified:
user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8
user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c
user/hrs/ipv6/usr.sbin/rtadvd/control_server.c
user/hrs/ipv6/usr.sbin/rtadvd/control_server.h
user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c
user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h
Modified: user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8 Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.8 Fri Jul 15 06:54:21 2011 (r224055)
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 14, 2011
+.Dd July 15, 2011
.Dt RTADVCTL 8
.Os
.Sh NAME
@@ -61,8 +61,22 @@ inactive interfaces and some statistics.
The subcommands are as follows:
.Bl -tag -width indent
.\"
-.It reload
-Specifies to reload the configuration file.
+.It reload Op interfaces...
+Specifies to reload the configuration file. If one or more
+.Ar interface
+is specified, configuration entries for the interfaces will be reloaded
+selectively.
+.It enable interfaces...
+Specifies to mark the interface as enable and to try to reload the
+configuration entry.
+This subcommand is useful for dynamically-added interfaces.
+.Pp
+The
+.Xr rtadvd 8
+daemon marks an interface as enable if the interface exists and the
+configuration file has a valid entry for that when it is invoked.
+.It disable interfaces...
+Specifies to mark the interface as disable.
.It shutdown
Makes the
.Xr rtadvd 8
Modified: user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvctl/rtadvctl.c Fri Jul 15 06:54:21 2011 (r224055)
@@ -107,9 +107,9 @@ static struct dispatch_table {
{ "show", action_show },
{ "reload", action_reload },
{ "shutdown", action_shutdown },
- { NULL, NULL },
{ "enable", action_enable },
{ "disable", action_disable },
+ { NULL, NULL },
{ "echo", action_echo },
{ "version", action_version },
{ NULL, NULL },
@@ -294,33 +294,69 @@ action_propset(char *argv)
return (action_plgeneric(CM_TYPE_REQ_SET_PROP, argv, buf));
}
-/* XXX */
static int
-action_enable(int argc, char **argv)
+action_disable(int argc, char **argv)
{
- argc = argc;
- argv = argv;
+ char *action_argv;
+ char argv_disable[IFNAMSIZ + sizeof(":disable=")];
+ int i;
+ int error;
- return (0);
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_disable, "%s:disable=", argv[i]);
+ action_argv = argv_disable;
+ error += action_propset(action_argv);
+ }
+
+ return(error);
}
-/* XXX */
static int
-action_disable(int argc, char **argv)
+action_enable(int argc, char **argv)
{
- argc = argc;
- argv = argv;
+ char *action_argv;
+ char argv_enable[IFNAMSIZ + sizeof(":enable=")];
+ int i;
+ int error;
- return (0);
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_enable, "%s:enable=", argv[i]);
+ action_argv = argv_enable;
+ error += action_propset(action_argv);
+ }
+
+ return(error);
}
static int
-action_reload(int argc __unused, char **argv __unused)
+action_reload(int argc, char **argv)
{
char *action_argv;
+ char argv_reload[IFNAMSIZ + sizeof(":reload=")];
+ int i;
+ int error;
- action_argv = strdup("reload");
- return(action_propset(action_argv));
+ if (argc == 0) {
+ action_argv = strdup(":reload=");
+ return(action_propset(action_argv));
+ }
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_reload, "%s:reload=", argv[i]);
+ action_argv = argv_reload;
+ error += action_propset(action_argv);
+ }
+
+ return(error);
}
static int
Modified: user/hrs/ipv6/usr.sbin/rtadvd/control_server.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/control_server.c Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/control_server.c Fri Jul 15 06:54:21 2011 (r224055)
@@ -55,15 +55,18 @@
#include "control_server.h"
#include "timer.h"
-static sig_atomic_t p_do_reload;
-static sig_atomic_t p_do_die;
-
-void set_do_reload(int sig __unused) { p_do_reload = 1; }
-void set_do_die(int sig __unused) { p_do_die = 1; }
-void reset_do_reload(void) { p_do_reload = 0; }
-void reset_do_die(void) { p_do_die = 0; }
-int do_reload(void) { return (p_do_reload); }
-int do_die(void) { return (p_do_die); }
+static char *do_reload_ifname;
+static int do_reload;
+static int do_shutdown;
+
+void set_do_reload(int sig __unused) { do_reload = 1; }
+void set_do_reload_ifname(char *ifname){ do_reload_ifname = ifname; }
+void set_do_shutdown(int sig __unused) { do_shutdown = 1; }
+void reset_do_reload(void) { do_reload = 0; do_reload_ifname = NULL; }
+void reset_do_shutdown(void) { do_shutdown = 0; }
+int is_do_reload(void) { return (do_reload); }
+int is_do_shutdown(void) { return (do_shutdown); }
+char *reload_ifname(void) { return (do_reload_ifname); }
#define DEF_PL_HANDLER(key) { #key, cmsg_getprop_##key }
@@ -78,6 +81,10 @@ static int cmsg_getprop_rdnss(struct ctr
static int cmsg_getprop_dnssl(struct ctrl_msg_pl *);
static int cmsg_getprop_rti(struct ctrl_msg_pl *);
+static int cmsg_setprop_reload(struct ctrl_msg_pl *);
+static int cmsg_setprop_enable(struct ctrl_msg_pl *);
+static int cmsg_setprop_disable(struct ctrl_msg_pl *);
+
static struct dispatch_table {
const char *dt_comm;
int (*dt_act)(struct ctrl_msg_pl *cp);
@@ -535,10 +542,14 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
if (cp == NULL || cp->cp_key == NULL)
return (1);
- if (strncmp(cp->cp_key, "reload", 8) == 0)
- set_do_reload(0);
- else if (strncmp(cp->cp_key, "shutdown", 8) == 0)
- set_do_die(0);
+ if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0)
+ cmsg_setprop_reload(cp);
+ else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0)
+ set_do_shutdown(0);
+ else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0)
+ cmsg_setprop_enable(cp);
+ else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0)
+ cmsg_setprop_disable(cp);
else if (strncmp(cp->cp_key, "echo", 8) == 0)
; /* do nothing */
else
@@ -547,6 +558,64 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
return (0);
}
+static int
+cmsg_setprop_reload(struct ctrl_msg_pl *cp)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ set_do_reload_ifname(cp->cp_ifname);
+ set_do_reload(1);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_enable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 1;
+ set_do_reload_ifname(ifi->ifi_ifname);
+ set_do_reload(0);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_disable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 0;
+
+ return (0);
+}
+
int
cmsg_handler_server(int fd)
{
Modified: user/hrs/ipv6/usr.sbin/rtadvd/control_server.h
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/control_server.h Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/control_server.h Fri Jul 15 06:54:21 2011 (r224055)
@@ -33,8 +33,10 @@ int cmsg_setprop(struct ctrl_msg_pl *);
int cmsg_handler_server(int);
void set_do_reload(int);
-void set_do_die(int);
+void set_do_reload_ifname(char *);
+void set_do_shutdown(int);
void reset_do_reload(void);
-void reset_do_die(void);
-int do_reload(void);
-int do_die(void);
+void reset_do_shutdown(void);
+int is_do_reload(void);
+char *reload_ifname(void);
+int is_do_shutdown(void);
Modified: user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.c Fri Jul 15 06:54:21 2011 (r224055)
@@ -148,7 +148,7 @@ uint32_t ndopt_flags[] = {
[ND_OPT_DNSSL] = NDOPT_FLAG_DNSSL,
};
-static void die(void);
+static void rtadvd_shutdown(void);
static void sock_open(struct sockinfo *);
static void rtsock_open(struct sockinfo *);
static void rtadvd_input(struct sockinfo *);
@@ -282,8 +282,8 @@ main(int argc, char *argv[])
set[PFD_RTSOCK].fd = -1;
set[PFD_CSOCK].fd = ctrlsock.si_fd;
set[PFD_CSOCK].events = POLLIN;
- signal(SIGTERM, set_do_die);
- signal(SIGINT, set_do_die);
+ signal(SIGTERM, set_do_shutdown);
+ signal(SIGINT, set_do_shutdown);
signal(SIGHUP, set_do_reload);
error = csock_listen(&ctrlsock);
@@ -296,14 +296,19 @@ main(int argc, char *argv[])
set_do_reload(0);
while (1) {
- if (do_die())
- die();
+ if (is_do_shutdown())
+ rtadvd_shutdown();
- if (do_reload()) {
+ if (is_do_reload()) {
+ loadconfig_ifname(reload_ifname());
+ if (reload_ifname() == NULL)
+ syslog(LOG_INFO,
+ "configuration file reloaded.");
+ else
+ syslog(LOG_INFO,
+ "configuration file for %s reloaded.",
+ reload_ifname());
reset_do_reload();
- loadconfig_ifname(NULL);
- syslog(LOG_INFO,
- "configuration file reloaded.");
}
/* timeout handler update for active interfaces */
@@ -354,7 +359,7 @@ main(int argc, char *argv[])
}
static void
-die(void)
+rtadvd_shutdown(void)
{
struct rainfo *rai;
struct rdnss *rdn;
Modified: user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h
==============================================================================
--- user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h Fri Jul 15 05:57:09 2011 (r224054)
+++ user/hrs/ipv6/usr.sbin/rtadvd/rtadvd.h Fri Jul 15 06:54:21 2011 (r224055)
@@ -270,4 +270,4 @@ struct ifinfo *if_indextoifinfo(int);
struct prefix *find_prefix(struct rainfo *,
struct in6_addr *, int);
void rtadvd_set_reload(int);
-void rtadvd_set_die(int);
+void rtadvd_set_shutdown(int);
More information about the svn-src-user
mailing list