bug-inetutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fwd: freeport(1)


From: Simon Josefsson
Subject: Re: Fwd: freeport(1)
Date: Tue, 25 Oct 2022 23:09:48 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux)

Hi

Thanks for the contribution.  Given the simplicity of this tool,
together with the inherent race condition, and the availability of a
shell script that offers similar functionality suggested by Alex Colomar
in a reply, my preference is that it is not worth the maintenance burden
to introduce a tool like this into GNU InetUtils.  I think the best
approach is to publish your work as a separate project, and if
eventually there is significant use of it on Unix platforms, we can
always reconsider and include a variant of it in GNU InetUtils.

/Simon

Alejandro Colomar <alx.manpages@gmail.com> writes:

> Hi,
>
> Bernd recommended me to consider inetutils for this program (see the
> forwarded mail), since net-tools is deprecated.
>
> Yes, it has a race condition by the nature of the port being free at
> the time the program prints it, but the kernel will not reuse it
> unless all other ports have been used first (AFAIK), so the chances
> are quite low, and also the program for which we will use it is just
> some introductory tutorial, and not something critical.
>
> Options for selecting the interface, and also to select a port range,
> could be implemented easily, and seem useful to me.  (Thanks, Bernd,
> for your recommendations and small review.)
>
> Would you be interested in adding this tool to inetutils?  I would
> help maintain it.
>
> Cheers,
>
> Alex
>
>
> -------- Forwarded Message --------
>
> [resent from a subscribed address; again, since it didn't work...]
> [D'oh, I hadn't confirmed subscription; sorry Mike for spamming you :/]
>
> Hi,
>
> As a side effect of doing some work for NGINX Unit, I developed the
> following program, which I think might be useful for the general
> public and not only for us.  Would you want to pick the program for
> the net-tools project?  I'd be able to help maintain it.  Also, since
> I'm also the maintainer of the Linux man-pages, you can expect that
> I'll provide a manual page for the program.
>
> The program is as simple as it gets.  A draft for the manual page would be:
>
>
> NAME
>      freeport - get a random unused port number
>
> SYNOPSIS
>      freeport
>
> DESCRIPTION
>      This program prints an available IPv4 port and exits.
>
>      The port is chosen at random from the ephemeral ports range
>      (see ip(7)).
>
> EXIT STATUS
>      0    Success
>      1    Error
>
>      On error, a message is printed on standard error.
>
>
> And the source code is:
>
>
> $ cat freeport.c
> /*
>   * SPDX-License-Identifier:  GPL-2.0-or-later
>   * Copyright 2022  NGINX, Inc.
>   * Copyright 2022  F5, Inc.
>   *
>   * Author:  Alejandro Colomar <alx@nginx.com>
>   */
>
>
> #include <netinet/in.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <strings.h>
> #include <sys/socket.h>
> #include <unistd.h>
>
>
> int32_t get_free_port(void);
>
>
> int
> main(void)
> {
>       int32_t  port;
>
>       port = get_free_port();
>       if (port == -1)
>               exit(EXIT_FAILURE);
>
>       printf("%d\n", port);
>       exit(EXIT_SUCCESS);
> }
>
>
> int32_t
> get_free_port(void)
> {
>       int                 sfd;
>       int32_t             port;
>       socklen_t           len;
>       struct sockaddr_in  addr;
>
>       sfd = socket(PF_INET, SOCK_STREAM, 0);
>       if (sfd == -1) {
>               perror("socket()");
>               return -1;
>       }
>
>       bzero(&addr, sizeof(addr));
>       addr.sin_family = AF_INET;
>       addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
>       addr.sin_port = htons(0);  // random port
>
>       len = sizeof(addr);
>       if (bind(sfd, (struct sockaddr *) &addr, len)) {
>               perror("bind()");
>               goto fail;
>       }
>
>       if (getsockname(sfd, (struct sockaddr *) &addr, &len)) {
>               perror("getsockname()");
>               goto fail;
>       }
>
>       port = ntohs(addr.sin_port);
>
> fail:
>       close(sfd);
>       return port;
> }
>
>
> Would you be interested in this program?
> It was written on Linux, and I'm not sure about its portability
> (didn't check), so one of the things to check for adding it to
> net-tools would be that.
>
>
> Cheers,
> Alex

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]