diff options
-rw-r--r-- | vtysh/ChangeLog | 22 | ||||
-rw-r--r-- | vtysh/vtysh.c | 246 | ||||
-rw-r--r-- | vtysh/vtysh.h | 27 |
3 files changed, 135 insertions, 160 deletions
diff --git a/vtysh/ChangeLog b/vtysh/ChangeLog index e142f150..6822126e 100644 --- a/vtysh/ChangeLog +++ b/vtysh/ChangeLog @@ -1,3 +1,25 @@ +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. + 2005-01-23 Hasso Tepper <hasso at quagga.net> * vtysh.conf.sample: Fix typo "integrated-vtysh-conf" -> 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 (); diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h index e0c3a5b7..d619c294 100644 --- a/vtysh/vtysh.h +++ b/vtysh/vtysh.h @@ -33,30 +33,21 @@ #define VTYSH_RMAP VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD #define VTYSH_INTERFACE VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_ISISD -#define VTYSH_INDEX_ZEBRA 0 -#define VTYSH_INDEX_RIP 1 -#define VTYSH_INDEX_RIPNG 2 -#define VTYSH_INDEX_OSPF 3 -#define VTYSH_INDEX_OSPF6 4 -#define VTYSH_INDEX_BGP 5 -#define VTYSH_INDEX_ISIS 6 -#define VTYSH_INDEX_MAX 7 - /* vtysh local configuration file. */ #define VTYSH_DEFAULT_CONFIG "vtysh.conf" -void vtysh_init_vty (); -void vtysh_init_cmd (); -void vtysh_connect_all (); -void vtysh_readline_init (); -void vtysh_user_init (); +void vtysh_init_vty (void); +void vtysh_init_cmd (void); +void vtysh_connect_all (void); +void vtysh_readline_init (void); +void vtysh_user_init (void); void vtysh_execute (const char *); void vtysh_execute_no_pager (const char *); -char *vtysh_prompt (); +char *vtysh_prompt (void); -void vtysh_config_write (); +void vtysh_config_write (void); int vtysh_config_from_file (struct vty *, FILE *); @@ -66,9 +57,9 @@ void vtysh_config_parse (char *); void vtysh_config_dump (FILE *); -void vtysh_config_init (); +void vtysh_config_init (void); -void vtysh_pager_init (); +void vtysh_pager_init (void); /* Child process execution flag. */ extern int execute_flag; |