Add option to set SO_REUSEADDR to socket_bind() and use it.

This commit is contained in:
Daniel O'Connor 2012-06-24 14:25:58 +09:30
parent 4861ff9252
commit 719d1fe72c
4 changed files with 19 additions and 21 deletions

View File

@ -74,7 +74,7 @@ monitor_setup_sockets(void) {
/* ignore SIGPIPE so that we don't explode */
signal(SIGPIPE, SIG_IGN);
if ((monitor_named_socket = socket_bind(confValueGet("monitor.socket", DEFAULT_MONITOR_SOCKET_NAME))) == -1) {
if ((monitor_named_socket = socket_bind(confValueGet("monitor.socket", DEFAULT_MONITOR_SOCKET_NAME), 0)) == -1) {
WHY_perror("bind");
goto error;
}

View File

@ -21,27 +21,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <sys/stat.h>
int mdp_socket = -1;
int overlay_mdp_setup_sockets()
{
struct sockaddr_un name;
socklen_t len;
int reuseP, send_buffer_size;
int
overlay_mdp_setup_sockets(void) {
int send_buffer_size;
if (mdp_socket != -1)
return 0;
socket_setname(&name, confValueGet("mdp.socket", DEFAULT_MDP_SOCKET_NAME), &len);
mdp_socket = socket(AF_UNIX, SOCK_DGRAM, 0);
reuseP = 1;
if(setsockopt(mdp_socket, SOL_SOCKET, SO_REUSEADDR,
&reuseP, sizeof(reuseP)) < 0) {
WARN_perror("setsockopt");
goto error;
}
if (bind(mdp_socket, (struct sockaddr *)&name, len) == -1) {
WARN_perror("bind");
goto error;
if ((mdp_socket = socket_bind(confValueGet("mdp.socket", DEFAULT_MDP_SOCKET_NAME), 1)) == -1) {
WHY_perror("socket_bind");
goto error;
}
send_buffer_size = 64 * 1024;

View File

@ -39,14 +39,23 @@
* more than one servald on a given system.
*/
int
socket_bind(const char *name) {
int s, oerrno;
socket_bind(const char *name, int reuse) {
int s, oerrno, reuseP;
struct sockaddr_un sockname;
socklen_t len;
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
return -1;
if (reuse) {
reuseP = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
&reuseP, sizeof(reuseP)) < 0) {
close(s);
return -1;
}
}
socket_setname(&sockname, name, &len);
unlink(sockname.sun_path);

View File

@ -1,4 +1,4 @@
int socket_bind(const char *name);
int socket_bind(const char *name, int reuse);
void socket_setname(struct sockaddr_un *sockname, const char *name, socklen_t *len);
void socket_done(const char *name);