Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/blocklist/test/cltest.c
39478 views
1
/* $NetBSD: cltest.c,v 1.6 2015/01/22 05:44:28 christos Exp $ */
2
3
/*-
4
* Copyright (c) 2015 The NetBSD Foundation, Inc.
5
* All rights reserved.
6
*
7
* This code is derived from software contributed to The NetBSD Foundation
8
* by Christos Zoulas.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
* POSSIBILITY OF SUCH DAMAGE.
30
*/
31
#ifdef HAVE_CONFIG_H
32
#include "config.h"
33
#endif
34
35
#include <sys/cdefs.h>
36
__RCSID("$NetBSD: cltest.c,v 1.6 2015/01/22 05:44:28 christos Exp $");
37
38
#include <sys/types.h>
39
#include <sys/socket.h>
40
#include <netinet/in.h>
41
#include <arpa/inet.h>
42
43
#include <stdio.h>
44
#include <string.h>
45
#include <unistd.h>
46
#include <stdlib.h>
47
#include <err.h>
48
#ifdef HAVE_UTIL_H
49
#include <util.h>
50
#endif
51
52
static __dead void
53
usage(int c)
54
{
55
warnx("Unknown option `%c'", (char)c);
56
fprintf(stderr, "Usage: %s [-u] [-a <addr>] [-m <msg>] [-p <port>]\n",
57
getprogname());
58
exit(EXIT_FAILURE);
59
}
60
61
static void
62
getaddr(const char *a, in_port_t p, struct sockaddr_storage *ss,
63
socklen_t *slen)
64
{
65
int c;
66
67
memset(ss, 0, sizeof(*ss));
68
p = htons(p);
69
70
if (strchr(a, ':')) {
71
struct sockaddr_in6 *s6 = (void *)ss;
72
c = inet_pton(AF_INET6, a, &s6->sin6_addr);
73
s6->sin6_family = AF_INET6;
74
*slen = sizeof(*s6);
75
s6->sin6_port = p;
76
} else {
77
struct sockaddr_in *s = (void *)ss;
78
c = inet_pton(AF_INET, a, &s->sin_addr);
79
s->sin_family = AF_INET;
80
*slen = sizeof(*s);
81
s->sin_port = p;
82
}
83
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
84
ss->ss_len = (uint8_t)*slen;
85
#endif
86
if (c == -1)
87
err(EXIT_FAILURE, "Invalid address `%s'", a);
88
}
89
90
int
91
main(int argc, char *argv[])
92
{
93
int sfd;
94
int c;
95
struct sockaddr_storage ss;
96
const char *msg = "hello";
97
const char *addr = "127.0.0.1";
98
int type = SOCK_STREAM;
99
in_port_t port = 6161;
100
socklen_t slen;
101
char buf[128];
102
103
while ((c = getopt(argc, argv, "a:m:p:u")) != -1) {
104
switch (c) {
105
case 'a':
106
addr = optarg;
107
break;
108
case 'm':
109
msg = optarg;
110
break;
111
case 'p':
112
port = (in_port_t)atoi(optarg);
113
break;
114
case 'u':
115
type = SOCK_DGRAM;
116
break;
117
default:
118
usage(c);
119
}
120
}
121
122
getaddr(addr, port, &ss, &slen);
123
124
if ((sfd = socket(AF_INET, type, 0)) == -1)
125
err(EXIT_FAILURE, "socket");
126
127
sockaddr_snprintf(buf, sizeof(buf), "%a:%p", (const void *)&ss);
128
printf("connecting to: %s\n", buf);
129
if (connect(sfd, (const void *)&ss, slen) == -1)
130
err(EXIT_FAILURE, "connect");
131
132
size_t len = strlen(msg) + 1;
133
if (write(sfd, msg, len) != (ssize_t)len)
134
err(EXIT_FAILURE, "write");
135
return 0;
136
}
137
138