summaryrefslogtreecommitdiff
path: root/usr.sbin/bgpd/control.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bgpd/control.c')
-rw-r--r--usr.sbin/bgpd/control.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/usr.sbin/bgpd/control.c b/usr.sbin/bgpd/control.c
index 1ae375c1bdf..349db058783 100644
--- a/usr.sbin/bgpd/control.c
+++ b/usr.sbin/bgpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.2 2004/01/02 02:27:57 henning Exp $ */
+/* $OpenBSD: control.c,v 1.3 2004/01/02 09:02:50 henning Exp $ */
/*
* Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
@@ -17,6 +17,7 @@
*/
#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
@@ -38,22 +39,38 @@ struct ctl_conn *control_connbyfd(int);
int
control_init(void)
{
- struct sockaddr_un sun;
- int fd;
+ struct sockaddr_un sun;
+ int fd;
+ mode_t old_umask;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
log_err("control_init: socket");
return (-1);
}
+ old_umask = umask(S_IWGRP|S_IWOTH|S_IROTH|S_IXOTH);
bzero(&sun, sizeof(sun));
sun.sun_family = AF_UNIX;
strlcpy(sun.sun_path, SOCKET_NAME, sizeof(sun.sun_path));
+
+ if (unlink(SOCKET_NAME) == -1)
+ if (errno != ENOENT) {
+ log_err("unlink %s", SOCKET_NAME);
+ return (-1);
+ }
+
if (bind(fd, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
log_err("control_init: bind: %s", SOCKET_NAME);
return (-1);
}
+ if (chmod(SOCKET_NAME, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
+ log_err("control_init chmod");
+ return (-1);
+ }
+
+ umask(old_umask);
+
control_state.fd = fd;
return (fd);