diff options
author | ajs <ajs> | 2005-01-28 21:11:46 +0000 |
---|---|---|
committer | ajs <ajs> | 2005-01-28 21:11:46 +0000 |
commit | b1aa147d09b0e06992cdb39ed11b46df0a3b984f (patch) | |
tree | 786c03a44c77ebedf98616053157fdbfa5d4135a /vtysh/vtysh.c | |
parent | afb8b6055c5e54be762e220cf9b7b65a22266733 (diff) |
2005-01-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* vtysh.h: Remove obsolete VTYSH_INDEX_* defines. Fix many prototypes
for functions with no arguments (must specify argument list as void).
* vtysh.c: Enhance vtysh_client array to include the daemon's name
and bitmask and socket path (in addition to the fd). This allows
us to use loop constructs for various operations that need to be
applied to all client daemons, and it facilitates better error
messages. Also fix some prototypes with void argument lists.
(vclient_close) Issue a warning message indicating which daemon's
socket is being closed.
(vtysh_execute_func,vtysh_config_from_file) Use a for loop to
call vtysh_client_execute.
(vtysh_write_terminal,write_config_integrated) Use a for loop to
call vtysh_client_config.
(vtysh_write_memory) Use a for loop to call vtysh_client_execute.
(vtysh_show_daemons) Use a for loop.
(vtysh_connect) The struct vtysh_client is now statically initialized,
so do not initialize it here.
(vtysh_connect_all) Use a for loop to call vtysh_connect. Set
ripd_client pointer for use in vtysh_exit_ripd_only.
Diffstat (limited to 'vtysh/vtysh.c')
-rw-r--r-- | vtysh/vtysh.c | 246 |
1 files changed, 104 insertions, 142 deletions
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index a9929c52..fb41b0d1 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -45,7 +45,25 @@ char *vtysh_pager_name = NULL; struct vtysh_client { int fd; -} vtysh_client[VTYSH_INDEX_MAX]; + const char *name; + int flag; + const char *path; +} vtysh_client[] = +{ + { .fd = -1, .name = "zebra", .flag = VTYSH_ZEBRA, .path = ZEBRA_VTYSH_PATH}, + { .fd = -1, .name = "ripd", .flag = VTYSH_RIPD, .path = RIP_VTYSH_PATH}, + { .fd = -1, .name = "ripngd", .flag = VTYSH_RIPNGD, .path = RIPNG_VTYSH_PATH}, + { .fd = -1, .name = "ospfd", .flag = VTYSH_OSPFD, .path = OSPF_VTYSH_PATH}, + { .fd = -1, .name = "ospf6d", .flag = VTYSH_OSPF6D, .path = OSPF6_VTYSH_PATH}, + { .fd = -1, .name = "bgpd", .flag = VTYSH_BGPD, .path = BGP_VTYSH_PATH}, + { .fd = -1, .name = "isisd", .flag = VTYSH_ISISD, .path = ISIS_VTYSH_PATH}, +}; + +#define VTYSH_INDEX_MAX (sizeof(vtysh_client)/sizeof(vtysh_client[0])) + +/* We need direct access to ripd to implement vtysh_exit_ripd_only. */ +static struct vtysh_client *ripd_client = NULL; + /* Using integrated config from Quagga.conf. Default is no. */ int vtysh_writeconfig_integrated = 0; @@ -55,9 +73,14 @@ extern char config_default[]; static void vclient_close (struct vtysh_client *vclient) { - if (vclient->fd > 0) - close (vclient->fd); - vclient->fd = -1; + if (vclient->fd >= 0) + { + fprintf(stderr, + "Warning: closing connection to %s because of an I/O error!\n", + vclient->name); + close (vclient->fd); + vclient->fd = -1; + } } /* Following filled with debug code to trace a problematic condition @@ -227,14 +250,15 @@ vtysh_client_execute (struct vtysh_client *vclient, const char *line, FILE *fp) } void -vtysh_exit_ripd_only () +vtysh_exit_ripd_only (void) { - vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], "exit", stdout); + if (ripd_client) + vtysh_client_execute (ripd_client, "exit", stdout); } void -vtysh_pager_init () +vtysh_pager_init (void) { char *pager_defined; @@ -251,6 +275,7 @@ static void vtysh_execute_func (const char *line, int pager) { int ret, cmd_stat; + u_int i; vector vline; struct cmd_element *cmd; FILE *fp = NULL; @@ -345,26 +370,13 @@ vtysh_execute_func (const char *line, int pager) if (! strcmp(cmd->string,"configure terminal")) { - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ZEBRA], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIPNG], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], - line, fp); - if (cmd_stat != CMD_WARNING) - cmd_stat = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ISIS], - line, fp); + for (i = 0; i < VTYSH_INDEX_MAX; i++) + { + cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp); + if (cmd_stat == CMD_WARNING) + break; + } + if (cmd_stat) { line = "end"; @@ -396,34 +408,19 @@ vtysh_execute_func (const char *line, int pager) } } - if (cmd->daemon & VTYSH_ZEBRA) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ZEBRA], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_RIPD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_RIPNGD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIPNG], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_OSPFD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_OSPF6D) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_BGPD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], line, fp) - != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_ISISD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ISIS], line, fp) - != CMD_SUCCESS) - break; + cmd_stat = CMD_SUCCESS; + for (i = 0; i < VTYSH_INDEX_MAX; i++) + { + if (cmd->daemon & vtysh_client[i].flag) + { + cmd_stat = vtysh_client_execute(&vtysh_client[i], line, fp); + if (cmd_stat != CMD_SUCCESS) + break; + } + } + if (cmd_stat != CMD_SUCCESS) + break; + if (cmd->func) (*cmd->func) (cmd, vty, 0, NULL); } @@ -520,34 +517,22 @@ vtysh_config_from_file (struct vty *vty, FILE *fp) break; case CMD_SUCCESS_DAEMON: { - if (cmd->daemon & VTYSH_ZEBRA) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ZEBRA], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_RIPD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_RIPNGD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIPNG], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_OSPFD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_OSPF6D) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_BGPD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], - vty->buf, stdout) != CMD_SUCCESS) - break; - if (cmd->daemon & VTYSH_ISISD) - if (vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ISIS], - vty->buf, stdout) != CMD_SUCCESS) - break; + u_int i; + int cmd_stat = CMD_SUCCESS; + + for (i = 0; i < VTYSH_INDEX_MAX; i++) + { + if (cmd->daemon && vtysh_client[i].flag) + { + cmd_stat = vtysh_client_execute (&vtysh_client[i], + vty->buf, stdout); + if (cmd_stat != CMD_SUCCESS) + break; + } + } + if (cmd_stat != CMD_SUCCESS) + break; + if (cmd->func) (*cmd->func) (cmd, vty, 0, NULL); } @@ -558,7 +543,7 @@ vtysh_config_from_file (struct vty *vty, FILE *fp) /* We don't care about the point of the cursor when '?' is typed. */ int -vtysh_rl_describe () +vtysh_rl_describe (void) { int ret; unsigned int i; @@ -819,7 +804,7 @@ extern struct cmd_node vty_node; /* When '^Z' is received from vty, move down to the enable mode. */ int -vtysh_end () +vtysh_end (void) { switch (vty->node) { @@ -1604,6 +1589,7 @@ DEFUN (vtysh_write_terminal, "Write running configuration to memory, network, or terminal\n" "Write to terminal\n") { + u_int i; int ret; char line[] = "write terminal\n"; FILE *fp = NULL; @@ -1625,13 +1611,8 @@ DEFUN (vtysh_write_terminal, VTY_NEWLINE); vty_out (vty, "!%s", VTY_NEWLINE); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ZEBRA], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIP], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIPNG], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_OSPF], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_OSPF6], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_BGP], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ISIS], line); + for (i = 0; i < VTYSH_INDEX_MAX; i++) + ret = vtysh_client_config (&vtysh_client[i], line); /* Integrate vtysh specific configuration. */ vtysh_config_write (); @@ -1676,6 +1657,7 @@ DEFUN (no_vtysh_integrated_config, static int write_config_integrated(void) { + u_int i; int ret; char line[] = "write terminal\n"; FILE *fp; @@ -1701,13 +1683,8 @@ write_config_integrated(void) return CMD_SUCCESS; } - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ZEBRA], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIP], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_RIPNG], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_OSPF], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_OSPF6], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_BGP], line); - ret = vtysh_client_config (&vtysh_client[VTYSH_INDEX_ISIS], line); + for (i = 0; i < VTYSH_INDEX_MAX; i++) + ret = vtysh_client_config (&vtysh_client[i], line); vtysh_config_dump (fp); @@ -1735,6 +1712,7 @@ DEFUN (vtysh_write_memory, { int ret = CMD_SUCCESS; char line[] = "write memory\n"; + u_int i; /* If integrated Quagga.conf explicitely set. */ if (vtysh_writeconfig_integrated) @@ -1742,13 +1720,8 @@ DEFUN (vtysh_write_memory, fprintf (stdout,"Building Configuration...\n"); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ZEBRA], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIP], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_RIPNG], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_OSPF6], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_BGP], line, stdout); - ret = vtysh_client_execute (&vtysh_client[VTYSH_INDEX_ISIS], line, stdout); + for (i = 0; i < VTYSH_INDEX_MAX; i++) + ret = vtysh_client_execute (&vtysh_client[i], line, stdout); fprintf (stdout,"[OK]\n"); @@ -1835,20 +1808,11 @@ DEFUN (vtysh_show_daemons, SHOW_STR "Show list of running daemons\n") { - if ( vtysh_client[VTYSH_INDEX_ZEBRA].fd > 0 ) - vty_out(vty, " zebra"); - if ( vtysh_client[VTYSH_INDEX_RIP].fd > 0 ) - vty_out(vty, " ripd"); - if ( vtysh_client[VTYSH_INDEX_RIPNG].fd > 0 ) - vty_out(vty, " ripngd"); - if ( vtysh_client[VTYSH_INDEX_OSPF].fd > 0 ) - vty_out(vty, " ospfd"); - if ( vtysh_client[VTYSH_INDEX_OSPF6].fd > 0 ) - vty_out(vty, " ospf6d"); - if ( vtysh_client[VTYSH_INDEX_BGP].fd > 0 ) - vty_out(vty, " bgpd"); - if ( vtysh_client[VTYSH_INDEX_ISIS].fd > 0 ) - vty_out(vty, " isisd"); + u_int i; + + for (i = 0; i < VTYSH_INDEX_MAX; i++) + if ( vtysh_client[i].fd >= 0 ) + vty_out(vty, " %s", vtysh_client[i].name); vty_out(vty, "%s", VTY_NEWLINE); return CMD_SUCCESS; @@ -2028,22 +1992,19 @@ vtysh_install_default (enum node_type node) /* Making connection to protocol daemon. */ static int -vtysh_connect (struct vtysh_client *vclient, const char *path) +vtysh_connect (struct vtysh_client *vclient) { int ret; int sock, len; struct sockaddr_un addr; struct stat s_stat; - memset (vclient, 0, sizeof (struct vtysh_client)); - vclient->fd = -1; - /* Stat socket to see if we have permission to access it. */ - ret = stat (path, &s_stat); + ret = stat (vclient->path, &s_stat); if (ret < 0 && errno != ENOENT) { fprintf (stderr, "vtysh_connect(%s): stat = %s\n", - path, safe_strerror(errno)); + vclient->path, safe_strerror(errno)); exit(1); } @@ -2052,7 +2013,7 @@ vtysh_connect (struct vtysh_client *vclient, const char *path) if (! S_ISSOCK(s_stat.st_mode)) { fprintf (stderr, "vtysh_connect(%s): Not a socket\n", - path); + vclient->path); exit (1); } @@ -2062,7 +2023,7 @@ vtysh_connect (struct vtysh_client *vclient, const char *path) if (sock < 0) { #ifdef DEBUG - fprintf(stderr, "vtysh_connect(%s): socket = %s\n", path, + fprintf(stderr, "vtysh_connect(%s): socket = %s\n", vclient->path, safe_strerror(errno)); #endif /* DEBUG */ return -1; @@ -2070,7 +2031,7 @@ vtysh_connect (struct vtysh_client *vclient, const char *path) memset (&addr, 0, sizeof (struct sockaddr_un)); addr.sun_family = AF_UNIX; - strncpy (addr.sun_path, path, strlen (path)); + strncpy (addr.sun_path, vclient->path, strlen (vclient->path)); #ifdef HAVE_SUN_LEN len = addr.sun_len = SUN_LEN(&addr); #else @@ -2081,7 +2042,7 @@ vtysh_connect (struct vtysh_client *vclient, const char *path) if (ret < 0) { #ifdef DEBUG - fprintf(stderr, "vtysh_connect(%s): connect = %s\n", path, + fprintf(stderr, "vtysh_connect(%s): connect = %s\n", vclient->path, safe_strerror(errno)); #endif /* DEBUG */ close (sock); @@ -2093,16 +2054,17 @@ vtysh_connect (struct vtysh_client *vclient, const char *path) } void -vtysh_connect_all() +vtysh_connect_all(void) { - /* Clear each daemons client structure. */ - vtysh_connect (&vtysh_client[VTYSH_INDEX_ZEBRA], ZEBRA_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_RIP], RIP_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_RIPNG], RIPNG_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_OSPF], OSPF_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_OSPF6], OSPF6_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_BGP], BGP_VTYSH_PATH); - vtysh_connect (&vtysh_client[VTYSH_INDEX_ISIS], ISIS_VTYSH_PATH); + u_int i; + + for (i = 0; i < VTYSH_INDEX_MAX; i++) + { + vtysh_connect(&vtysh_client[i]); + /* We need direct access to ripd in vtysh_exit_ripd_only. */ + if (vtysh_client[i].flag == VTYSH_RIPD) + ripd_client = &vtysh_client[i]; + } } /* To disable readline's filename completion. */ @@ -2113,7 +2075,7 @@ vtysh_completion_entry_function (const char *ignore, int invoking_key) } void -vtysh_readline_init () +vtysh_readline_init (void) { /* readline related settings. */ rl_bind_key ('?', vtysh_rl_describe); @@ -2125,7 +2087,7 @@ vtysh_readline_init () } char * -vtysh_prompt () +vtysh_prompt (void) { struct utsname names; static char buf[100]; @@ -2146,7 +2108,7 @@ vtysh_prompt () } void -vtysh_init_vty () +vtysh_init_vty (void) { /* Make vty structure. */ vty = vty_new (); |