Date: Fri, 15 Jul 2011 06:54:21 +0000 (UTC) From: Hiroki Sato <hrs@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r224055 - in user/hrs/ipv6/usr.sbin: rtadvctl rtadvd Message-ID: <201107150654.p6F6sLL7064747@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107150654.p6F6sLL7064747>