2009-11-04 15:02:32 -08:00
|
|
|
|
/*
|
2014-02-06 16:04:05 -08:00
|
|
|
|
* Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc.
|
2009-11-04 15:02:32 -08:00
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at:
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
#include "stream.h"
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <netinet/in.h>
|
2014-02-06 16:04:05 -08:00
|
|
|
|
#include <netdb.h>
|
2009-11-04 15:02:32 -08:00
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
2010-05-26 10:37:39 -07:00
|
|
|
|
#include <sys/socket.h>
|
2009-11-04 15:02:32 -08:00
|
|
|
|
#include <unistd.h>
|
2014-02-06 16:04:05 -08:00
|
|
|
|
#include "dynamic-string.h"
|
2009-11-04 15:02:32 -08:00
|
|
|
|
#include "packets.h"
|
|
|
|
|
#include "socket-util.h"
|
|
|
|
|
#include "util.h"
|
|
|
|
|
#include "stream-provider.h"
|
|
|
|
|
#include "stream-fd.h"
|
|
|
|
|
#include "vlog.h"
|
2010-07-16 11:02:49 -07:00
|
|
|
|
|
2010-10-19 14:47:01 -07:00
|
|
|
|
VLOG_DEFINE_THIS_MODULE(stream_tcp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
|
|
|
|
|
/* Active TCP. */
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
new_tcp_stream(const char *name, int fd, int connect_status,
|
2013-12-17 15:07:12 -08:00
|
|
|
|
struct stream **streamp)
|
2009-11-04 15:02:32 -08:00
|
|
|
|
{
|
2014-10-22 15:35:18 -07:00
|
|
|
|
if (connect_status == 0) {
|
|
|
|
|
setsockopt_tcp_nodelay(fd);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-10-22 15:35:18 -07:00
|
|
|
|
return new_fd_stream(name, fd, connect_status, AF_INET, streamp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
2012-03-10 15:58:10 -08:00
|
|
|
|
tcp_open(const char *name, char *suffix, struct stream **streamp, uint8_t dscp)
|
2009-11-04 15:02:32 -08:00
|
|
|
|
{
|
|
|
|
|
int fd, error;
|
|
|
|
|
|
2013-12-17 15:07:12 -08:00
|
|
|
|
error = inet_open_active(SOCK_STREAM, suffix, 0, NULL, &fd, dscp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
if (fd >= 0) {
|
2013-12-17 15:07:12 -08:00
|
|
|
|
return new_tcp_stream(name, fd, error, streamp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
} else {
|
2013-06-24 10:54:49 -07:00
|
|
|
|
VLOG_ERR("%s: connect: %s", name, ovs_strerror(error));
|
2009-11-04 15:02:32 -08:00
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-11-24 10:22:22 +09:00
|
|
|
|
const struct stream_class tcp_stream_class = {
|
2009-11-04 15:02:32 -08:00
|
|
|
|
"tcp", /* name */
|
2012-04-11 20:18:34 -07:00
|
|
|
|
true, /* needs_probes */
|
2009-11-04 15:02:32 -08:00
|
|
|
|
tcp_open, /* open */
|
|
|
|
|
NULL, /* close */
|
|
|
|
|
NULL, /* connect */
|
|
|
|
|
NULL, /* recv */
|
|
|
|
|
NULL, /* send */
|
2010-01-06 14:26:48 -08:00
|
|
|
|
NULL, /* run */
|
|
|
|
|
NULL, /* run_wait */
|
2009-11-04 15:02:32 -08:00
|
|
|
|
NULL, /* wait */
|
|
|
|
|
};
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
|
|
|
|
|
#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 {
|
2014-07-22 15:46:25 -07:00
|
|
|
|
path = xstrdup(suffix);
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
2009-11-04 15:02:32 -08:00
|
|
|
|
|
|
|
|
|
/* Passive TCP. */
|
|
|
|
|
|
2014-02-06 16:04:05 -08:00
|
|
|
|
static int ptcp_accept(int fd, const struct sockaddr_storage *,
|
|
|
|
|
size_t, struct stream **streamp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
|
|
|
|
|
static int
|
2014-10-01 10:38:23 -07:00
|
|
|
|
new_pstream(char *suffix, const char *name, struct pstream **pstreamp,
|
|
|
|
|
int dscp, char *unlink_path, bool kernel_print_port)
|
2009-11-04 15:02:32 -08:00
|
|
|
|
{
|
2014-02-06 16:04:05 -08:00
|
|
|
|
char bound_name[SS_NTOP_BUFSIZE + 16];
|
|
|
|
|
char addrbuf[SS_NTOP_BUFSIZE];
|
|
|
|
|
struct sockaddr_storage ss;
|
2013-04-18 16:37:05 -07:00
|
|
|
|
int error;
|
2014-05-19 11:58:14 -07:00
|
|
|
|
uint16_t port;
|
2009-11-04 15:02:32 -08:00
|
|
|
|
int fd;
|
2014-10-01 10:38:23 -07:00
|
|
|
|
char *conn_name = CONST_CAST(char *, name);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
|
2014-05-19 11:58:14 -07:00
|
|
|
|
fd = inet_open_passive(SOCK_STREAM, suffix, -1, &ss, dscp,
|
|
|
|
|
kernel_print_port);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
if (fd < 0) {
|
|
|
|
|
return -fd;
|
|
|
|
|
}
|
2010-01-07 13:55:35 -08:00
|
|
|
|
|
2014-02-06 16:04:05 -08:00
|
|
|
|
port = ss_get_port(&ss);
|
2014-10-01 10:38:23 -07:00
|
|
|
|
if (!conn_name) {
|
|
|
|
|
snprintf(bound_name, sizeof bound_name, "ptcp:%"PRIu16":%s",
|
|
|
|
|
port, ss_format_address(&ss, addrbuf, sizeof addrbuf));
|
|
|
|
|
conn_name = bound_name;
|
|
|
|
|
}
|
2014-02-06 16:04:05 -08:00
|
|
|
|
|
2014-10-01 10:38:23 -07:00
|
|
|
|
error = new_fd_pstream(conn_name, fd, ptcp_accept, set_dscp, unlink_path,
|
2013-04-18 16:37:05 -07:00
|
|
|
|
pstreamp);
|
|
|
|
|
if (!error) {
|
2014-02-06 16:04:05 -08:00
|
|
|
|
pstream_set_bound_port(*pstreamp, htons(port));
|
2013-04-18 16:37:05 -07:00
|
|
|
|
}
|
|
|
|
|
return error;
|
2009-11-04 15:02:32 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-19 11:58:14 -07:00
|
|
|
|
static int
|
|
|
|
|
ptcp_open(const char *name OVS_UNUSED, char *suffix, struct pstream **pstreamp,
|
|
|
|
|
uint8_t dscp)
|
|
|
|
|
{
|
2014-10-01 10:38:23 -07:00
|
|
|
|
return new_pstream(suffix, NULL, pstreamp, dscp, NULL, true);
|
2014-05-19 11:58:14 -07:00
|
|
|
|
}
|
|
|
|
|
|
2009-11-04 15:02:32 -08:00
|
|
|
|
static int
|
2014-02-06 16:04:05 -08:00
|
|
|
|
ptcp_accept(int fd, const struct sockaddr_storage *ss,
|
|
|
|
|
size_t ss_len OVS_UNUSED, struct stream **streamp)
|
2009-11-04 15:02:32 -08:00
|
|
|
|
{
|
2014-02-06 16:04:05 -08:00
|
|
|
|
char name[SS_NTOP_BUFSIZE + 16];
|
|
|
|
|
char addrbuf[SS_NTOP_BUFSIZE];
|
2009-11-04 15:02:32 -08:00
|
|
|
|
|
2014-02-06 16:04:05 -08:00
|
|
|
|
snprintf(name, sizeof name, "tcp:%s:%"PRIu16,
|
|
|
|
|
ss_format_address(ss, addrbuf, sizeof addrbuf),
|
|
|
|
|
ss_get_port(ss));
|
2013-12-17 15:07:12 -08:00
|
|
|
|
return new_tcp_stream(name, fd, 0, streamp);
|
2009-11-04 15:02:32 -08:00
|
|
|
|
}
|
|
|
|
|
|
2011-11-24 10:22:22 +09:00
|
|
|
|
const struct pstream_class ptcp_pstream_class = {
|
2009-11-04 15:02:32 -08:00
|
|
|
|
"ptcp",
|
2012-04-11 20:18:34 -07:00
|
|
|
|
true,
|
2009-11-04 15:02:32 -08:00
|
|
|
|
ptcp_open,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
2012-09-27 11:18:16 +09:00
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
2009-11-04 15:02:32 -08:00
|
|
|
|
};
|
|
|
|
|
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
static int
|
2014-10-01 10:38:23 -07:00
|
|
|
|
pwindows_open(const char *name, char *suffix, struct pstream **pstreamp,
|
|
|
|
|
uint8_t dscp)
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
{
|
|
|
|
|
int error;
|
|
|
|
|
char *suffix_new, *path;
|
|
|
|
|
FILE *file;
|
|
|
|
|
struct pstream *listener;
|
|
|
|
|
|
|
|
|
|
suffix_new = xstrdup("0:127.0.0.1");
|
2014-05-19 11:58:14 -07:00
|
|
|
|
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
/* 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 {
|
2014-07-22 15:46:25 -07:00
|
|
|
|
path = xstrdup(suffix);
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
}
|
|
|
|
|
|
2014-10-01 10:38:23 -07:00
|
|
|
|
error = new_pstream(suffix_new, name, pstreamp, dscp, path, false);
|
2014-06-02 10:20:34 -07:00
|
|
|
|
if (error) {
|
|
|
|
|
goto exit;
|
|
|
|
|
}
|
|
|
|
|
listener = *pstreamp;
|
|
|
|
|
|
stream: Introduce [p]windows_[p]stream_class.
On Linux, we heavily use --remote=punix:* to listen for
connections through unix domain sockets. We also use, unix:*
to connect to a daemon that is listening on unix domain sockets.
Many times, we create default unix domain sockets for listening
and many utilities connect to these sockets by default.
Windows does not have unix domain sockets. So far, we could just use
ptcp:* and tcp:* for listening and initiating connections respectively.
The drawback here is that one has to provide a specific TCP port.
For unit tests, it looks useful to let kernel choose that port.
As such, we can let that chosen kernel port be stored in the
file specified with punix:* and unix:*. For this purpose, introduce
a new [p]windows_[p]stream_class. Since it is just a wrapper around
[p]tcp_[p]stream_class, add it to stream-tcp.c.
commit cb54a8c (unixctl: Add support for Windows.) used the above concept
for only control channel connections (i.e., --unixctl for daemons and its
interaction with ovs-appctl). This commit adds the same support for
all unix domain sockets. Now that we have a separate class
[p]stream_class for hiding kernel assigned TCP port inside a file meant for
unix domain sockets in windows, make unixctl use it.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
2014-04-04 14:13:32 -07:00
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
exit:
|
|
|
|
|
free(suffix_new);
|
|
|
|
|
return error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const struct pstream_class pwindows_pstream_class = {
|
|
|
|
|
"punix",
|
|
|
|
|
false,
|
|
|
|
|
pwindows_open,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
};
|
|
|
|
|
#endif
|