Date: Sat, 10 Jul 1999 23:42:53 -0600 From: Wes Peters <wes@softweyr.com> To: Warner Losh <imp@village.org> Cc: Sheldon Hearn <sheldonh@uunet.co.za>, "Brian F. Feldman" <green@FreeBSD.ORG>, hackers@FreeBSD.ORG Subject: Re: a BSD identd Message-ID: <37882EDD.1003BD9E@softweyr.com> References: <56059.931624857@axl.noc.iafrica.com> <199907102148.PAA33143@harmony.village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Warner Losh wrote:
>
> Yes. I'd love to replace my perl script:
>
> #!/usr/local/bin/perl
> ($a, $b) = split(/[,\n\r ]+/,<>);
> print "$a , $b : USERID : UNIX : Warm-Fuzzy\r\n";
>
> with something a little less heavy-weight.
OK, here's roughly the same thing as a stand-alone server in C (for the
absolute fastest lies in the west. ;^)
It's been a while since I've done any programming above the guts of the
IP level, so feel free to critique the bejabbers out of this. I don't
think I'm leaking any memory or file descriptors, or otherwise doing
something stupid, but I spent about 10 minutes on this code. Purists
will note that the parsing of the client request is REALLY SIMPLE. ;^)
/*
* Copyright (c) 1999 Softweyr LLC. All rights reserved.
*
* identd: a simple server for RFC1413 Identification Service that refuses
* to give away critical system information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notices, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notices, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTWEYR LLC OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define IDENT_PORT 113
char *pname;
const int STARS_SHINE = 1;
int
main(int argc, char *argv[])
{
int serv_sock, client_sock, cli_len;
size_t iolen;
struct sockaddr_in cli_addr, serv_addr;
char iobuf[BUFSIZ], *ioptr;
pname = argv[0];
/*
* Create a TCP socket and bind it to the ident port.
*/
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
if (serv_sock < 0)
{
perror("opening server socket");
return -1;
}
bzero((char *) &serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(IDENT_PORT);
if (bind(serv_sock, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)
{
perror("binding server socket to ident port");
return -1;
}
listen(serv_sock, 5);
while (STARS_SHINE)
{
/*
* Gather host connections and answer them immediately.
*/
cli_len = sizeof (cli_addr);
bzero((char *) &cli_addr, sizeof (cli_addr));
client_sock = accept(serv_sock, (struct sockaddr *) &cli_addr, &cli_len);
if (client_sock < 0)
{
perror("accepting connection on server socket");
break;
}
if ((iolen = read(client_sock, iobuf, BUFSIZ)) < 0)
{
perror("reading from client");
close(client_sock);
break;
}
iobuf[iolen] = '\0';
ioptr = strchr(iobuf, '\r');
if (ioptr == NULL)
{
perror("invalid client request");
close(client_sock);
break;
}
iolen = ioptr - iobuf;
strncpy(ioptr, " : USERID : UNIX : Warm-Fuzzy\r\n", BUFSIZ - iolen);
if (write(client_sock, iobuf, strlen(iobuf)) < strlen(iobuf))
{
perror("writing response to client");
}
close(client_sock);
}
/*
* Not normally reached, but those stars may go out some day...
*/
close(serv_sock);
return 0;
}
--
"Where am I, and what am I doing in this handbasket?"
Wes Peters Softweyr LLC
http://softweyr.com/ wes@softweyr.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?37882EDD.1003BD9E>
