Path: blob/main/tools/regression/sockets/shutdown/shutdown.c
48254 views
/*-1* Copyright (C) 2005 The FreeBSD Project. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6* 1. Redistributions of source code must retain the above copyright7* notice, this list of conditions and the following disclaimer.8* 2. Redistributions in binary form must reproduce the above copyright9* notice, this list of conditions and the following disclaimer in the10* documentation and/or other materials provided with the distribution.11*12* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND13* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE14* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE15* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE16* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL17* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS18* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)19* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT20* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY21* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF22* SUCH DAMAGE.23*/2425#include <sys/types.h>26#include <sys/socket.h>2728#include <netinet/in.h>29#include <arpa/inet.h>3031#include <err.h>32#include <errno.h>33#include <stdio.h>34#include <string.h>35#include <unistd.h>3637int38main(void)39{40struct sockaddr_in sock;41socklen_t len;42int listen_sock, connect_sock;43u_short port;4445listen_sock = -1;4647/* Shutdown(2) on an invalid file descriptor has to return EBADF. */48if ((shutdown(listen_sock, SHUT_RDWR) != -1) && (errno != EBADF))49errx(-1, "shutdown() for invalid file descriptor does not "50"return EBADF");5152listen_sock = socket(PF_INET, SOCK_STREAM, 0);53if (listen_sock == -1)54errx(-1,55"socket(PF_INET, SOCK_STREAM, 0) for listen socket: %s",56strerror(errno));5758bzero(&sock, sizeof(sock));59sock.sin_len = sizeof(sock);60sock.sin_family = AF_INET;61sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);62sock.sin_port = 0;6364if (bind(listen_sock, (struct sockaddr *)&sock, sizeof(sock)) < 0)65errx(-1, "bind(%s, %d) for listen socket: %s",66inet_ntoa(sock.sin_addr), sock.sin_port, strerror(errno));6768len = sizeof(sock);69if (getsockname(listen_sock, (struct sockaddr *)&sock, &len) < 0)70errx(-1, "getsockname() for listen socket: %s",71strerror(errno));72port = sock.sin_port;7374if (listen(listen_sock, -1) < 0)75errx(-1, "listen() for listen socket: %s", strerror(errno));7677connect_sock = socket(PF_INET, SOCK_STREAM, 0);78if (connect_sock == -1)79errx(-1, "socket(PF_INET, SOCK_STREAM, 0) for connect "80"socket: %s", strerror(errno));8182bzero(&sock, sizeof(sock));83sock.sin_len = sizeof(sock);84sock.sin_family = AF_INET;85sock.sin_addr.s_addr = htonl(INADDR_LOOPBACK);86sock.sin_port = port;8788if (connect(connect_sock, (struct sockaddr *)&sock, sizeof(sock)) < 0)89errx(-1, "connect() for connect socket: %s", strerror(errno));90/* Try to pass an invalid flags. */91if ((shutdown(connect_sock, SHUT_RD - 1) != -1) && (errno != EINVAL))92errx(-1, "shutdown(SHUT_RD - 1) does not return EINVAL");93if ((shutdown(connect_sock, SHUT_RDWR + 1) != -1) && (errno != EINVAL))94errx(-1, "shutdown(SHUT_RDWR + 1) does not return EINVAL");9596if (shutdown(connect_sock, SHUT_RD) < 0)97errx(-1, "shutdown(SHUT_RD) for connect socket: %s",98strerror(errno));99if (shutdown(connect_sock, SHUT_WR) < 0)100errx(-1, "shutdown(SHUT_WR) for connect socket: %s",101strerror(errno));102103close(connect_sock);104close(listen_sock);105106return (0);107}108109110