SCS_DISCONNECTED /* Connection failed or connection closed. */
};
-static struct stream_class *stream_classes[] = {
+static const struct stream_class *stream_classes[] = {
&tcp_stream_class,
&unix_stream_class,
#ifdef HAVE_OPENSSL
#endif
};
-static struct pstream_class *pstream_classes[] = {
+static const struct pstream_class *pstream_classes[] = {
&ptcp_pstream_class,
&punix_pstream_class,
#ifdef HAVE_OPENSSL
size_t i;
for (i = 0; i < ARRAY_SIZE(stream_classes); i++) {
- struct stream_class *class = stream_classes[i];
+ const struct stream_class *class = stream_classes[i];
assert(class->name != NULL);
assert(class->open != NULL);
if (class->close || class->recv || class->send || class->run
}
for (i = 0; i < ARRAY_SIZE(pstream_classes); i++) {
- struct pstream_class *class = pstream_classes[i];
+ const struct pstream_class *class = pstream_classes[i];
assert(class->name != NULL);
assert(class->listen != NULL);
if (class->close || class->accept || class->wait) {
* a null pointer into '*classp' if 'name' is in the wrong form or if no such
* class exists. */
static int
-stream_lookup_class(const char *name, struct stream_class **classp)
+stream_lookup_class(const char *name, const struct stream_class **classp)
{
size_t prefix_len;
size_t i;
return EAFNOSUPPORT;
}
for (i = 0; i < ARRAY_SIZE(stream_classes); i++) {
- struct stream_class *class = stream_classes[i];
+ const struct stream_class *class = stream_classes[i];
if (strlen(class->name) == prefix_len
&& !memcmp(class->name, name, prefix_len)) {
*classp = class;
int
stream_verify_name(const char *name)
{
- struct stream_class *class;
+ const struct stream_class *class;
return stream_lookup_class(name, &class);
}
int
stream_open(const char *name, struct stream **streamp)
{
- struct stream_class *class;
+ const struct stream_class *class;
struct stream *stream;
char *suffix_copy;
int error;
* a null pointer into '*classp' if 'name' is in the wrong form or if no such
* class exists. */
static int
-pstream_lookup_class(const char *name, struct pstream_class **classp)
+pstream_lookup_class(const char *name, const struct pstream_class **classp)
{
size_t prefix_len;
size_t i;
return EAFNOSUPPORT;
}
for (i = 0; i < ARRAY_SIZE(pstream_classes); i++) {
- struct pstream_class *class = pstream_classes[i];
+ const struct pstream_class *class = pstream_classes[i];
if (strlen(class->name) == prefix_len
&& !memcmp(class->name, name, prefix_len)) {
*classp = class;
int
pstream_verify_name(const char *name)
{
- struct pstream_class *class;
+ const struct pstream_class *class;
return pstream_lookup_class(name, &class);
}
int
pstream_open(const char *name, struct pstream **pstreamp)
{
- struct pstream_class *class;
+ const struct pstream_class *class;
struct pstream *pstream;
char *suffix_copy;
int error;
*
* The caller retains ownership of 'name'. */
void
-stream_init(struct stream *stream, struct stream_class *class,
+stream_init(struct stream *stream, const struct stream_class *class,
int connect_status, const char *name)
{
memset(stream, 0, sizeof *stream);
}
void
-pstream_init(struct pstream *pstream, struct pstream_class *class,
+pstream_init(struct pstream *pstream, const struct pstream_class *class,
const char *name)
{
pstream->class = class;
return error;
}
-\f
+
+/*
+ * This function extracts IP address and port from the target string.
+ *
+ * - On success, function returns true and fills *sin structure with port
+ * and IP address. If port was absent in target string then it will use
+ * corresponding default port value.
+ * - On error, function returns false and *sin contains garbage.
+ */
+bool
+stream_parse_target_with_default_ports(const char *target,
+ uint16_t default_tcp_port,
+ uint16_t default_ssl_port,
+ struct sockaddr_in *sin)
+{
+ return (!strncmp(target, "tcp:", 4)
+ && inet_parse_active(target + 4, default_tcp_port, sin)) ||
+ (!strncmp(target, "ssl:", 4)
+ && inet_parse_active(target + 4, default_ssl_port, sin));
+}
+
/* Attempts to guess the content type of a stream whose first few bytes were
* the 'size' bytes of 'data'. */
static enum stream_content_type