]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Adds check for no protocol and some minor CLI fixes.
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 17 Mar 2010 11:19:22 +0000 (12:19 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 17 Mar 2010 11:19:22 +0000 (12:19 +0100)
- Adds check to deny config file with no specified protocol to prevent
  loading of empty config file.
- Moves CLI init before config parse to receive immediate error message
  when cannot open control socket.
- Fixes socket name path check and other error handling in CLI init.

conf/conf.c
sysdep/unix/io.c
sysdep/unix/main.c
sysdep/unix/unix.h

index 58eb10a6c7947ded8bf30722b0294ffcd95d09fb..604a412c459a6625c4d3b588c5f6b9a28fb2ccbf 100644 (file)
@@ -114,6 +114,8 @@ config_parse(struct config *c)
   rt_preconfig(c);
   cf_parse();
   protos_postconfig(c);
+  if (EMPTY_LIST(c->protos))
+    cf_error("No protocol is specified in the config file");
 #ifdef IPV6
   if (!c->router_id)
     cf_error("Router ID must be configured manually on IPv6 routers");
index 02d59abb98aafee2fd22e1546e1e919066a6caf6..d86c8cb8018bd0a70636a2af2ff9a528b3b21c9b 100644 (file)
@@ -1075,7 +1075,7 @@ bad_no_log:
   return -1;
 }
 
-int
+void
 sk_open_unix(sock *s, char *name)
 {
   int fd;
@@ -1084,15 +1084,13 @@ sk_open_unix(sock *s, char *name)
 
   fd = socket(AF_UNIX, SOCK_STREAM, 0);
   if (fd < 0)
-    die("sk_open_unix: socket: %m");
+    ERR("socket");
   s->fd = fd;
   if (err = sk_setup(s))
     goto bad;
   unlink(name);
-  if (strlen(name) >= sizeof(sa.sun_path))
-    die("sk_open_unix: path too long");
 
+  /* Path length checked in test_old_bird() */
   sa.sun_family = AF_UNIX;
   strcpy(sa.sun_path, name);
   if (bind(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) < 0)
@@ -1100,13 +1098,11 @@ sk_open_unix(sock *s, char *name)
   if (listen(fd, 8))
     ERR("listen");
   sk_insert(s);
-  return 0;
+  return;
 
-bad:
+ bad:
   log(L_ERR "sk_open_unix: %s: %m", err);
-  close(fd);
-  s->fd = -1;
-  return -1;
+  die("Unable to create control socket %s", name);
 }
 
 static int
@@ -1519,9 +1515,10 @@ test_old_bird(char *path)
   struct sockaddr_un sa;
 
   fd = socket(AF_UNIX, SOCK_STREAM, 0);
-
   if (fd < 0)
     die("Cannot create socket: %m");
+  if (strlen(path) >= sizeof(sa.sun_path))
+    die("Socket path too long");
   bzero(&sa, sizeof(sa));
   sa.sun_family = AF_UNIX;
   strcpy(sa.sun_path, path);
index 2245692ca36b6f14380d5c559f98a88226042366..e0e0d63669703e4f4cfafda0df0b876b35fd3a10 100644 (file)
@@ -298,8 +298,7 @@ cli_init_unix(void)
   s->type = SK_UNIX_PASSIVE;
   s->rx_hook = cli_connect;
   s->rbsize = 1024;
-  if (sk_open_unix(s, path_control_socket) < 0)
-    die("Unable to create control socket %s", path_control_socket);
+  sk_open_unix(s, path_control_socket);
 }
 
 /*
@@ -457,6 +456,9 @@ main(int argc, char **argv)
   rt_init();
   if_init();
 
+  if (!parse_and_exit)
+    cli_init_unix();
+
   protos_build();
   proto_build(&proto_unix_kernel);
   proto_build(&proto_unix_iface);
@@ -483,8 +485,6 @@ main(int argc, char **argv)
 
   signal_init();
 
-  cli_init_unix();
-
 #ifdef LOCAL_DEBUG
   async_dump_flag = 1;
 #endif
index 0b179e001f14388753c5d6e15b23e09a44fd5628..4de74f289cd460000f0d367bbea81e992cc007e4 100644 (file)
@@ -49,7 +49,7 @@ void io_init(void);
 void io_loop(void);
 void fill_in_sockaddr(sockaddr *sa, ip_addr a, unsigned port);
 void get_sockaddr(sockaddr *sa, ip_addr *a, unsigned *port, int check);
-int sk_open_unix(struct birdsock *s, char *name);
+void sk_open_unix(struct birdsock *s, char *name);
 void *tracked_fopen(struct pool *, char *name, char *mode);
 void test_old_bird(char *path);