micro_inetd/0000755000175000017500000000000010243433122012616 5ustar danieldanielmicro_inetd/micro_inetd.10000644000175000017500000000452210260555000015176 0ustar danieldaniel.TH micro_inetd 1 "17 December 2000" .SH NAME micro_inetd - simple network service spawner .SH SYNOPSIS micro_inetd port program [args ...] .SH DESCRIPTION Like inetd, this program listens on the net for requests and spawns a server to handle them. However, it only handles one port and one program. The intended use is when you have a server that expects to be run by inetd, but you only want to run it temporarily and don't want to bother with putting it into /etc/services and /etc/inetd.conf and restarting inetd. Instead, just start up micro_inetd, and when you're done just ^C it. .PP Other limitations: .TP 5 * Full inetd lets you specify the socket type as one of stream, dgram, raw, rdm, or seqpacket; micro_inetd only implements stream. .TP 5 * Full inetd lets you specify wait or nowait; micro_inetd only implements nowait. .TP 5 * Full inetd lets you specify a user-id to run the server as; micro_inetd doesn't try to switch user-ids. .SH "SEE ALSO" inetd(8), inetd.conf(5) .SH AUTHOR Copyright (C) 1996,2000 by Jef Poskanzer . All rights reserved. .\" 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 .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR 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. micro_inetd/Makefile0000644000175000017500000000105207414514615014271 0ustar danieldaniel# Makefile for micro_inetd # CONFIGURE: If you are using a SystemV-based operating system, such as # Solaris, you will need to uncomment this definition. #SYSV_LIBS = -lnsl -lsocket CC = gcc CFLAGS = -O LDFLAGS = -s $(SYSV_LIBS) BINDIR = /usr/local/bin MANDIR = /usr/local/man/man1 all: micro_inetd micro_inetd: micro_inetd.c $(CC) $(CFLAGS) micro_inetd.c $(LDFLAGS) -o micro_inetd install: all rm -f $(BINDIR)/micro_inetd cp micro_inetd $(BINDIR) rm -f $(MANDIR)/micro_inetd.1 cp micro_inetd.1 $(MANDIR) clean: rm -f micro_inetd *.o core micro_inetd/README0000644000175000017500000000176210243433037013511 0ustar danieldaniel micro_inetd - simple network service spawner Like inetd, this program listens on the net for requests and spawns a server to handle them. However, it only handles one port and one program. The intended use is when you have a server that expects to be run by inetd, but you only want to run it temporarily and don't want to bother with putting it into /etc/services and /etc/inetd.conf and restarting inetd. Instead, just start up micro_inetd, and when you're done just ^C it. See the manual entry for more details. Files in this distribution: README this Makefile guess micro_inetd.c source file micro_inetd.1 manual entry To build: If you're on a SysV-like machine (which includes old Linux systems but not new Linux systems), edit the Makefile and uncomment the SYSV_LIBS line. Otherwise, just do a make. Feedback is welcome - send bug reports, enhancements, checks, money orders, etc. to the addresses below. Jef Poskanzer jef@mail.acme.com http://www.acme.com/jef/ micro_inetd/micro_inetd0000755000175000017500000000763007560040136015055 0ustar danieldanielELFFreeBSD4P 4 (444ԀԀ    /usr/libexec/ld-elf.so.1      ,*T0 6l%>"F"K$SX\P]|"c nLtu||""̅" "<܅"l!",-l  libc.so.3_DYNAMIC_GLOBAL_OFFSET_TABLE__init_finiwaitpid__errorforkfprintf__sFexitclose__prognameatexitperrorsocketacceptbindlistenmemsetsetsockoptatoidup2environexecvsignal_etext_edata__bss_start_endend/usr/local/lib:/usr/X11R6/lib/:/usr/lib 8<@DHLPTX\`dhlp t x| 50%4%8h%<h%@h%Dh%Hh %Lh(%Ph0%Th8p%Xh@`%\hHP%`hP@%dhX0%hh` %lhh%php%thx%xh%|hUWVSҍ}u\ ~(}t"E8t8/u H @8u츀t Rmh`cSWVcP]US = t;uЃw]US(=(tЃ;u]ÐUWVS] }s{%Pjj1hxjWDžllPEPVà }8thju/uWjj}jvVpjSxjSp jSeSOW7h=jS.RU5hhLjUhxjrvjEPj t }A8t78 t hÉUWVSf}jjuƃ }hjaEjEPjhV}hUj.jj]SU U 1EfEjSVi }h jhV}hje[^_Ðacceptexeclusage: %s port program [args...] waitpidsocketsetsockopt SO_REUSEADDRbindlistenr…҅"2BRbr T   ,ĄGCC: (GNU) 2.7.2.3GCC: (GNU) 2.7.2.3GCC: (GNU) 2.7.2.3GCC: (GNU) 2.7.2.301.0101.0101.0101.01.symtab.strtab.shstrtab.interp.hash.dynsym.dynstr.rel.bss.rel.plt.init.plt.text.fini.rodata.data.ctors.dtors.got.dynamic.bss.comment.noteԀ#) 19 B ĄKTTQ\\0V \ b dj p w$$ ~,, T   PP` P micro_inetd/micro_inetd.c0000644000175000017500000001335110260554755015300 0ustar danieldaniel/* micro_inetd - simple network service spawner ** ** Copyright (C)1996,2000 by Jef Poskanzer . ** All rights reserved. ** ** 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 ** notice, this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(AF_INET6) && defined(IN6_IS_ADDR_V4MAPPED) #define USE_IPV6 #endif static void usage(); static int initialize_listen_socket( int pf, int af, unsigned short port ); static void child_handler( int sig ); static char* argv0; int main( int argc, char* argv[] ) { unsigned short port; char** child_argv; int listen_fd, conn_fd; struct sockaddr_in sin; int sz; fd_set lfdset; int maxfd; argv0 = argv[0]; /* Get arguments. */ if ( argc < 3 ) usage(); port = (unsigned short) atoi( argv[1] ); child_argv = argv + 2; /* Initialize listen socket. If we have v6 use that, since its sockets ** will accept v4 connections too. Otherwise just use v4. */ #ifdef USE_IPV6 listen_fd = initialize_listen_socket( PF_INET6, AF_INET6, port ); #else /* USE_IPV6 */ listen_fd = initialize_listen_socket( PF_INET, AF_INET, port ); #endif /* USE_IPV6 */ /* Set up a signal handler for child reaping. */ (void) signal( SIGCHLD, child_handler ); for (;;) { /* Accept a new connection. */ sz = sizeof(sin); conn_fd = accept( listen_fd, (struct sockaddr*) &sin, &sz ); if ( conn_fd < 0 ) { if ( errno == EINTR ) /* because of SIGCHLD (or ptrace) */ continue; perror( "accept" ); exit( 1 ); } /* Fork a sub-process. */ if ( fork() == 0 ) { /* Close standard descriptors and the listen socket. */ (void) close( 0 ); (void) close( 1 ); (void) close( 2 ); (void) close( listen_fd ); /* Dup the connection onto the standard descriptors. */ (void) dup2( conn_fd, 0 ); (void) dup2( conn_fd, 1 ); (void) dup2( conn_fd, 2 ); (void) close( conn_fd ); /* Run the program. */ (void) execv( child_argv[0], child_argv ); /* Something went wrong. */ perror( "execl" ); exit( 1 ); } /* Parent process. */ (void) close( conn_fd ); } } static void usage() { (void) fprintf( stderr, "usage: %s port program [args...]\n", argv0 ); exit( 1 ); } static void child_handler( int sig ) { pid_t pid; int status; /* Set up the signal handler again. Don't need to do this on BSD ** systems, but it doesn't hurt. */ (void) signal( SIGCHLD, child_handler ); /* Reap defunct children until there aren't any more. */ for (;;) { pid = waitpid( (pid_t) -1, &status, WNOHANG ); if ( (int) pid == 0 ) /* none left */ break; if ( (int) pid < 0 ) { if ( errno == EINTR ) /* because of ptrace */ continue; /* ECHILD shouldn't happen with the WNOHANG option, but with ** some kernels it does anyway. Ignore it. */ if ( errno != ECHILD ) perror( "waitpid" ); break; } } } static int initialize_listen_socket( int pf, int af, unsigned short port ) { int listen_fd; int on; #ifdef USE_IPV6 struct sockaddr_in6 sa; #else /* USE_IPV6 */ struct sockaddr_in sa; #endif /* USE_IPV6 */ /* Create socket. */ listen_fd = socket( pf, SOCK_STREAM, 0 ); if ( listen_fd < 0 ) { perror( "socket" ); exit( 1 ); } /* Allow reuse of local addresses. */ on = 1; if ( setsockopt( listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(on) ) < 0 ) { perror( "setsockopt SO_REUSEADDR" ); exit( 1 ); } /* Set up the sockaddr. */ (void) memset( (char*) &sa, 0, sizeof(sa) ); #ifdef USE_IPV6 sa.sin6_family = af; sa.sin6_addr = in6addr_any; sa.sin6_port = htons( port ); #else /* USE_IPV6 */ sa.sin_family = af; sa.sin_addr.s_addr = htonl( INADDR_ANY ); sa.sin_port = htons( port ); #endif /* USE_IPV6 */ /* Bind it to the socket. */ if ( bind( listen_fd, (struct sockaddr*) &sa, sizeof(sa) ) < 0 ) { perror( "bind" ); exit( 1 ); } /* Start a listen going. */ if ( listen( listen_fd, 1024 ) < 0 ) { perror( "listen" ); exit( 1 ); } return listen_fd; }