inetd.h revision 154503
1/*
2 * Copyright (c) 1983, 1991, 1993, 1994
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/usr.sbin/inetd/inetd.h 154503 2006-01-18 07:47:46Z delphij $
30 */
31
32#include <sys/time.h>
33#include <sys/socket.h>
34#include <sys/un.h>
35#include <sys/queue.h>
36
37#include <netinet/in.h>
38
39#include <stdio.h>
40
41#define BUFSIZE 8192
42#define LINESIZ 72
43
44#define NORM_TYPE	0
45#define MUX_TYPE	1
46#define MUXPLUS_TYPE	2
47#define TTCP_TYPE	3
48#define FAITH_TYPE	4
49#define ISMUX(sep)	(((sep)->se_type == MUX_TYPE) || \
50			 ((sep)->se_type == MUXPLUS_TYPE))
51#define ISMUXPLUS(sep)	((sep)->se_type == MUXPLUS_TYPE)
52#define ISTTCP(sep)	((sep)->se_type == TTCP_TYPE)
53
54struct procinfo {
55	LIST_ENTRY(procinfo) pr_link;
56	pid_t		pr_pid;		/* child pid */
57	struct conninfo	*pr_conn;
58};
59
60struct conninfo {
61	LIST_ENTRY(conninfo) co_link;
62	struct sockaddr_storage	co_addr;	/* source address */
63	int		co_numchild;	/* current number of children */
64	struct procinfo	**co_proc;	/* array of child proc entry */
65};
66
67#define PERIPSIZE	256
68
69struct	servtab {
70	char	*se_service;		/* name of service */
71	int	se_socktype;		/* type of socket to use */
72	int	se_family;		/* address family */
73	char	*se_proto;		/* protocol used */
74	int	se_maxchild;		/* max number of children */
75	int	se_maxcpm;		/* max connects per IP per minute */
76	int	se_numchild;		/* current number of children */
77	int	se_free;		/* free when numchild == 0 */
78#ifdef SANITY_CHECK
79	pid_t	*se_pids;		/* array of child pids */
80#endif
81	char	*se_user;		/* user name to run as */
82	char    *se_group;              /* group name to run as */
83#ifdef  LOGIN_CAP
84	char    *se_class;              /* login class name to run with */
85#endif
86	struct	biltin *se_bi;		/* if built-in, description */
87	char	*se_server;		/* server program */
88	char	*se_server_name;	/* server program without path */
89#define	MAXARGV 20
90	char	*se_argv[MAXARGV+1];	/* program arguments */
91#ifdef IPSEC
92	char	*se_policy;		/* IPsec policy string */
93#endif
94	int	se_fd;			/* open descriptor */
95	union {				/* bound address */
96		struct	sockaddr se_un_ctrladdr;
97		struct	sockaddr_in se_un_ctrladdr4;
98		struct	sockaddr_in6 se_un_ctrladdr6;
99	        struct  sockaddr_un se_un_ctrladdr_un;
100	} se_un;
101#define se_ctrladdr	se_un.se_un_ctrladdr
102#define se_ctrladdr4	se_un.se_un_ctrladdr4
103#define se_ctrladdr6	se_un.se_un_ctrladdr6
104#define se_ctrladdr_un   se_un.se_un_ctrladdr_un
105  	socklen_t	se_ctrladdr_size;
106	uid_t	se_sockuid;		/* Owner for unix domain socket */
107	gid_t	se_sockgid;		/* Group for unix domain socket */
108	mode_t	se_sockmode;		/* Mode for unix domain socket */
109	u_char	se_type;		/* type: normal, mux, or mux+ */
110	u_char	se_checked;		/* looked at during merge */
111	u_char	se_accept;		/* i.e., wait/nowait mode */
112	u_char	se_rpc;			/* ==1 if RPC service */
113	int	se_rpc_prog;		/* RPC program number */
114	u_int	se_rpc_lowvers;		/* RPC low version */
115	u_int	se_rpc_highvers;	/* RPC high version */
116	int	se_count;		/* number started since se_time */
117	struct	timeval se_time;	/* start of se_count */
118	struct	servtab *se_next;
119	struct se_flags {
120		u_int se_nomapped : 1;
121		u_int se_reset : 1;
122	} se_flags;
123	int	se_maxperip;		/* max number of children per src */
124	LIST_HEAD(, conninfo) se_conn[PERIPSIZE];
125};
126
127#define	se_nomapped		se_flags.se_nomapped
128#define	se_reset		se_flags.se_reset
129
130int		check_loop(const struct sockaddr *, const struct servtab *sep);
131int		getvalue(const char *, int *, const char *);
132char	       *newstr(const char *);
133void		inetd_setproctitle(const char *, int);
134void		print_service(const char *, const struct servtab *);
135char	       *sskip(char **);
136char	       *skip(char **);
137struct servtab *tcpmux(int);
138
139extern int	 debug;
140extern struct servtab *servtab;
141
142typedef void (bi_fn_t)(int, struct servtab *);
143
144struct biltin {
145	const char *bi_service;		/* internally provided service name */
146	int	bi_socktype;		/* type of socket supported */
147	short	bi_fork;		/* 1 if should fork before call */
148	int	bi_maxchild;		/* max number of children, -1=default */
149	bi_fn_t	*bi_fn;			/* function which performs it */
150};
151
152void	watch(short, uintptr_t, void *, u_int, int);
153#define	WATCH_SOCK(fd, data)	watch(EVFILT_READ, fd, data, 0, 1)
154#define	UNWATCH_SOCK(fd, data)	watch(EVFILT_READ, fd, data, 0, 0)
155#define	WATCH_SIG(sig, data)	watch(EVFILT_SIGNAL, sig, data, 0, 1)
156#define	UNWATCH_SIG(sig, data)	watch(EVFILT_SIGNAL, sig, data, 0, 0)
157#define	WATCH_PROC(proc, data)	 watch(EVFILT_PROC, proc, data, NOTE_EXIT, 1)
158#define	UNWATCH_PROC(proc, data) watch(EVFILT_PROC, proc, data, NOTE_EXIT, 0)
159#define	WATCH_FD(fd, data)	watch(EVFILT_VNODE, fd, data, NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_RENAME, 1)
160#define	UNWATCH_FD(fd, data)	watch(EVFILT_VNODE, fd, data, NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_RENAME, 0)
161
162