X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-unix.c;h=dbee135d97d0eb10e210ab65c6fccd6a32313560;hb=f40869bdf6feca4d3ff7c59a1fb1f7ac101bc967;hp=a5dfd55b898d4935960c13d331cf60176ff10fc1;hpb=c34b65c731a1b6dae014efe8895141e5b2fe758a;p=sliver-openvswitch.git diff --git a/lib/stream-unix.c b/lib/stream-unix.c index a5dfd55b8..dbee135d9 100644 --- a/lib/stream-unix.c +++ b/lib/stream-unix.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ #include #include "stream.h" -#include #include #include #include #include +#include #include #include #include @@ -29,46 +29,46 @@ #include "packets.h" #include "poll-loop.h" #include "socket-util.h" +#include "dirs.h" #include "util.h" #include "stream-provider.h" #include "stream-fd.h" - #include "vlog.h" -#define THIS_MODULE VLM_stream_unix -/* Active UNIX socket. */ +VLOG_DEFINE_THIS_MODULE(stream_unix); -/* Number of unix sockets created so far, to ensure binding path uniqueness. */ -static int n_unix_sockets; +/* Active UNIX socket. */ static int -unix_open(const char *name, char *suffix, struct stream **streamp) +unix_open(const char *name, char *suffix, struct stream **streamp, + uint8_t dscp OVS_UNUSED) { - const char *connect_path = suffix; - char *bind_path; + char *connect_path; int fd; - bind_path = xasprintf("/tmp/stream-unix.%ld.%d", - (long int) getpid(), n_unix_sockets++); - fd = make_unix_socket(SOCK_STREAM, true, false, bind_path, connect_path); + connect_path = abs_file_name(ovs_rundir(), suffix); + fd = make_unix_socket(SOCK_STREAM, true, NULL, connect_path); + if (fd < 0) { - VLOG_ERR("%s: connection to %s failed: %s", - bind_path, connect_path, strerror(-fd)); - free(bind_path); + VLOG_DBG("%s: connection failed (%s)", connect_path, strerror(-fd)); + free(connect_path); return -fd; } - return new_fd_stream(name, fd, check_connection_completion(fd), - bind_path, streamp); + free(connect_path); + return new_fd_stream(name, fd, check_connection_completion(fd), streamp); } -struct stream_class unix_stream_class = { +const struct stream_class unix_stream_class = { "unix", /* name */ + false, /* needs_probes */ unix_open, /* open */ NULL, /* close */ NULL, /* connect */ NULL, /* recv */ NULL, /* send */ + NULL, /* run */ + NULL, /* run_wait */ NULL, /* wait */ }; @@ -78,31 +78,29 @@ static int punix_accept(int fd, const struct sockaddr *sa, size_t sa_len, struct stream **streamp); static int -punix_open(const char *name UNUSED, char *suffix, struct pstream **pstreamp) +punix_open(const char *name OVS_UNUSED, char *suffix, + struct pstream **pstreamp, uint8_t dscp OVS_UNUSED) { + char *bind_path; int fd, error; - fd = make_unix_socket(SOCK_STREAM, true, true, suffix, NULL); + bind_path = abs_file_name(ovs_rundir(), suffix); + fd = make_unix_socket(SOCK_STREAM, true, bind_path, NULL); if (fd < 0) { - VLOG_ERR("%s: binding failed: %s", suffix, strerror(errno)); + VLOG_ERR("%s: binding failed: %s", bind_path, strerror(errno)); + free(bind_path); return errno; } - error = set_nonblocking(fd); - if (error) { - close(fd); - return error; - } - if (listen(fd, 10) < 0) { error = errno; VLOG_ERR("%s: listen: %s", name, strerror(error)); close(fd); + free(bind_path); return error; } - return new_fd_pstream("punix", fd, punix_accept, - xstrdup(suffix), pstreamp); + return new_fd_pstream(name, fd, punix_accept, NULL, bind_path, pstreamp); } static int @@ -118,14 +116,16 @@ punix_accept(int fd, const struct sockaddr *sa, size_t sa_len, } else { strcpy(name, "unix"); } - return new_fd_stream(name, fd, 0, NULL, streamp); + return new_fd_stream(name, fd, 0, streamp); } -struct pstream_class punix_pstream_class = { +const struct pstream_class punix_pstream_class = { "punix", + false, punix_open, NULL, NULL, - NULL + NULL, + NULL, };