115dbc160SGeorge V. Neville-Neil /*
215dbc160SGeorge V. Neville-Neil * Copyright (c) 2016 Limelight Networks
315dbc160SGeorge V. Neville-Neil * All rights reserved.
415dbc160SGeorge V. Neville-Neil *
515dbc160SGeorge V. Neville-Neil * Redistribution and use in source and binary forms, with or without
615dbc160SGeorge V. Neville-Neil * modification, are permitted provided that the following conditions
715dbc160SGeorge V. Neville-Neil * are met:
815dbc160SGeorge V. Neville-Neil * 1. Redistributions of source code must retain the above copyright
915dbc160SGeorge V. Neville-Neil * notice, this list of conditions, and the following disclaimer,
1015dbc160SGeorge V. Neville-Neil * without modification.
1115dbc160SGeorge V. Neville-Neil * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1215dbc160SGeorge V. Neville-Neil * substantially similar to the "NO WARRANTY" disclaimer below
1315dbc160SGeorge V. Neville-Neil * ("Disclaimer") and any redistribution must be conditioned upon
1415dbc160SGeorge V. Neville-Neil * including a substantially similar Disclaimer requirement for further
1515dbc160SGeorge V. Neville-Neil * binary redistribution.
1615dbc160SGeorge V. Neville-Neil *
1715dbc160SGeorge V. Neville-Neil * NO WARRANTY
1815dbc160SGeorge V. Neville-Neil * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1915dbc160SGeorge V. Neville-Neil * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2015dbc160SGeorge V. Neville-Neil * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
2115dbc160SGeorge V. Neville-Neil * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2215dbc160SGeorge V. Neville-Neil * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2315dbc160SGeorge V. Neville-Neil * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2415dbc160SGeorge V. Neville-Neil * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2515dbc160SGeorge V. Neville-Neil * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2615dbc160SGeorge V. Neville-Neil * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2715dbc160SGeorge V. Neville-Neil * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2815dbc160SGeorge V. Neville-Neil * POSSIBILITY OF SUCH DAMAGES.
2915dbc160SGeorge V. Neville-Neil *
3015dbc160SGeorge V. Neville-Neil * Authors: George Neville-Neil
3115dbc160SGeorge V. Neville-Neil */
3215dbc160SGeorge V. Neville-Neil
3315dbc160SGeorge V. Neville-Neil #include <arpa/inet.h>
3415dbc160SGeorge V. Neville-Neil #include <netinet/in.h>
3515dbc160SGeorge V. Neville-Neil #include <sys/types.h>
3615dbc160SGeorge V. Neville-Neil #include <sys/socket.h>
3715dbc160SGeorge V. Neville-Neil
3815dbc160SGeorge V. Neville-Neil #include <err.h>
3915dbc160SGeorge V. Neville-Neil #include <sysexits.h>
4015dbc160SGeorge V. Neville-Neil #include <errno.h>
4115dbc160SGeorge V. Neville-Neil #include <fcntl.h>
4215dbc160SGeorge V. Neville-Neil #include <stdio.h>
4315dbc160SGeorge V. Neville-Neil #include <stdlib.h>
4415dbc160SGeorge V. Neville-Neil #include <string.h>
4515dbc160SGeorge V. Neville-Neil #include <unistd.h>
4615dbc160SGeorge V. Neville-Neil
4715dbc160SGeorge V. Neville-Neil #define buflen 80
4815dbc160SGeorge V. Neville-Neil
4915dbc160SGeorge V. Neville-Neil /*
5015dbc160SGeorge V. Neville-Neil * Setup a TCP server listening on a port for connections, all of
5115dbc160SGeorge V. Neville-Neil * which subseuqently have their user cookie set.
5215dbc160SGeorge V. Neville-Neil */
5315dbc160SGeorge V. Neville-Neil int
main(int argc,char ** argv)5415dbc160SGeorge V. Neville-Neil main(int argc, char **argv)
5515dbc160SGeorge V. Neville-Neil {
5615dbc160SGeorge V. Neville-Neil struct sockaddr_in srv;
5715dbc160SGeorge V. Neville-Neil int sock, accepted, port, cookie;
5815dbc160SGeorge V. Neville-Neil int ret;
5915dbc160SGeorge V. Neville-Neil char recvbuf[buflen];
6015dbc160SGeorge V. Neville-Neil
6115dbc160SGeorge V. Neville-Neil if (argc != 3) {
6215dbc160SGeorge V. Neville-Neil fprintf(stderr, "Usage: %s port cookie\n", argv[0]);
6315dbc160SGeorge V. Neville-Neil exit(2);
6415dbc160SGeorge V. Neville-Neil }
6515dbc160SGeorge V. Neville-Neil
6615dbc160SGeorge V. Neville-Neil port = atoi(argv[1]);
6715dbc160SGeorge V. Neville-Neil cookie = atoi(argv[2]);
6815dbc160SGeorge V. Neville-Neil
6915dbc160SGeorge V. Neville-Neil sock = socket(PF_INET, SOCK_STREAM, 0);
7015dbc160SGeorge V. Neville-Neil if (sock < 0)
7115dbc160SGeorge V. Neville-Neil err(EXIT_FAILURE, "socket");
7215dbc160SGeorge V. Neville-Neil
73*e5853fc5SEnji Cooper memset(&srv, 0, sizeof(srv));
7415dbc160SGeorge V. Neville-Neil srv.sin_len = sizeof(srv);
7515dbc160SGeorge V. Neville-Neil srv.sin_family = AF_INET;
7615dbc160SGeorge V. Neville-Neil srv.sin_port = htons(port);
7715dbc160SGeorge V. Neville-Neil srv.sin_addr.s_addr = INADDR_ANY;
7815dbc160SGeorge V. Neville-Neil
7915dbc160SGeorge V. Neville-Neil if (bind(sock, (struct sockaddr *)&srv, srv.sin_len) < 0)
8015dbc160SGeorge V. Neville-Neil err(EX_OSERR, "failed to bind to port %d", port);
8115dbc160SGeorge V. Neville-Neil
8215dbc160SGeorge V. Neville-Neil if (listen(sock, 5) < 0)
8315dbc160SGeorge V. Neville-Neil err(EX_OSERR, "failed to listen on socket");
8415dbc160SGeorge V. Neville-Neil
8515dbc160SGeorge V. Neville-Neil ret = setsockopt(sock, SOL_SOCKET, SO_USER_COOKIE, &cookie, sizeof(cookie));
8615dbc160SGeorge V. Neville-Neil if (ret < 0)
8715dbc160SGeorge V. Neville-Neil err(EX_OSERR, "setsockopt(SO_USER_COOKIE)");
8815dbc160SGeorge V. Neville-Neil
8915dbc160SGeorge V. Neville-Neil while (1) {
9015dbc160SGeorge V. Neville-Neil
9115dbc160SGeorge V. Neville-Neil accepted = accept(sock, NULL, 0);
9215dbc160SGeorge V. Neville-Neil
9315dbc160SGeorge V. Neville-Neil if (accepted < 0)
9415dbc160SGeorge V. Neville-Neil err(EX_OSERR, "accept failed");
9515dbc160SGeorge V. Neville-Neil
9615dbc160SGeorge V. Neville-Neil ret = setsockopt(accepted, SOL_SOCKET, SO_USER_COOKIE,
9715dbc160SGeorge V. Neville-Neil &cookie, sizeof(cookie));
9815dbc160SGeorge V. Neville-Neil if (ret < 0)
9915dbc160SGeorge V. Neville-Neil err(EX_OSERR, "setsockopt(SO_USER_COOKIE)");
10015dbc160SGeorge V. Neville-Neil
10115dbc160SGeorge V. Neville-Neil ret = read(accepted, &recvbuf, buflen);
10215dbc160SGeorge V. Neville-Neil
10315dbc160SGeorge V. Neville-Neil if (ret < 0)
10415dbc160SGeorge V. Neville-Neil warn("failed read");
10515dbc160SGeorge V. Neville-Neil
10615dbc160SGeorge V. Neville-Neil close(accepted);
10715dbc160SGeorge V. Neville-Neil }
10815dbc160SGeorge V. Neville-Neil
10915dbc160SGeorge V. Neville-Neil return (0);
11015dbc160SGeorge V. Neville-Neil }
111