X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-tcp.c;h=74db2f1e74f9cdbc607fb28642e96e067133f2f9;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=55e581878ab81f3e87f665520fff174e6ffbf5d4;hpb=e731d71bf47b8370e4bfa87827113eedd20b7398;p=sliver-openvswitch.git diff --git a/lib/stream-tcp.c b/lib/stream-tcp.c index 55e581878..74db2f1e7 100644 --- a/lib/stream-tcp.c +++ b/lib/stream-tcp.c @@ -55,9 +55,11 @@ new_tcp_stream(const char *name, int fd, int connect_status, retval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof on); if (retval) { - VLOG_ERR("%s: setsockopt(TCP_NODELAY): %s", name, ovs_strerror(errno)); - close(fd); - return errno; + int error = sock_errno(); + VLOG_ERR("%s: setsockopt(TCP_NODELAY): %s", + name, sock_strerror(error)); + closesocket(fd); + return error; } return new_fd_stream(name, fd, connect_status, streamp); @@ -89,6 +91,62 @@ const struct stream_class tcp_stream_class = { NULL, /* run_wait */ NULL, /* wait */ }; + +#ifdef _WIN32 +static int +windows_open(const char *name, char *suffix, struct stream **streamp, + uint8_t dscp) +{ + int error, port; + FILE *file; + char *suffix_new, *path; + + /* If the path does not contain a ':', assume it is relative to + * OVS_RUNDIR. */ + if (!strchr(suffix, ':')) { + path = xasprintf("%s/%s", ovs_rundir(), suffix); + } else { + path = strdup(suffix); + } + + file = fopen(path, "r"); + if (!file) { + error = errno; + VLOG_DBG("%s: could not open %s (%s)", name, suffix, + ovs_strerror(error)); + return error; + } + + error = fscanf(file, "%d", &port); + if (error != 1) { + VLOG_ERR("failed to read port from %s", suffix); + fclose(file); + return EINVAL; + } + fclose(file); + + suffix_new = xasprintf("127.0.0.1:%d", port); + + error = tcp_open(name, suffix_new, streamp, dscp); + + free(suffix_new); + free(path); + return error; +} + +const struct stream_class windows_stream_class = { + "unix", /* name */ + false, /* needs_probes */ + windows_open, /* open */ + NULL, /* close */ + NULL, /* connect */ + NULL, /* recv */ + NULL, /* send */ + NULL, /* run */ + NULL, /* run_wait */ + NULL, /* wait */ +}; +#endif /* Passive TCP. */ @@ -146,3 +204,60 @@ const struct pstream_class ptcp_pstream_class = { NULL, }; +#ifdef _WIN32 +static int +pwindows_open(const char *name OVS_UNUSED, char *suffix, + struct pstream **pstreamp, uint8_t dscp) +{ + int error; + char *suffix_new, *path; + FILE *file; + struct pstream *listener; + + suffix_new = xstrdup("0:127.0.0.1"); + error = ptcp_open(name, suffix_new, pstreamp, dscp); + if (error) { + goto exit; + } + listener = *pstreamp; + + /* If the path does not contain a ':', assume it is relative to + * OVS_RUNDIR. */ + if (!strchr(suffix, ':')) { + path = xasprintf("%s/%s", ovs_rundir(), suffix); + } else { + path = strdup(suffix); + } + + file = fopen(path, "w"); + if (!file) { + error = errno; + VLOG_DBG("could not open %s (%s)", path, ovs_strerror(error)); + goto exit; + } + + fprintf(file, "%d\n", ntohs(listener->bound_port)); + if (fflush(file) == EOF) { + error = EIO; + VLOG_ERR("write failed for %s", path); + fclose(file); + goto exit; + } + fclose(file); + free(path); + +exit: + free(suffix_new); + return error; +} + +const struct pstream_class pwindows_pstream_class = { + "punix", + false, + pwindows_open, + NULL, + NULL, + NULL, + NULL, +}; +#endif