dm.h revision b7d26471
1629baa8cSmrg/*
2629baa8cSmrg
3629baa8cSmrgCopyright 1988, 1998  The Open Group
4629baa8cSmrg
5629baa8cSmrgPermission to use, copy, modify, distribute, and sell this software and its
6629baa8cSmrgdocumentation for any purpose is hereby granted without fee, provided that
7629baa8cSmrgthe above copyright notice appear in all copies and that both that
8629baa8cSmrgcopyright notice and this permission notice appear in supporting
9629baa8cSmrgdocumentation.
10629baa8cSmrg
11629baa8cSmrgThe above copyright notice and this permission notice shall be included
12629baa8cSmrgin all copies or substantial portions of the Software.
13629baa8cSmrg
14629baa8cSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15629baa8cSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16629baa8cSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17629baa8cSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18629baa8cSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19629baa8cSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20629baa8cSmrgOTHER DEALINGS IN THE SOFTWARE.
21629baa8cSmrg
22629baa8cSmrgExcept as contained in this notice, the name of The Open Group shall
23629baa8cSmrgnot be used in advertising or otherwise to promote the sale, use or
24629baa8cSmrgother dealings in this Software without prior written authorization
25629baa8cSmrgfrom The Open Group.
26629baa8cSmrg
27629baa8cSmrg*/
28629baa8cSmrg
29629baa8cSmrg/*
30629baa8cSmrg * xdm - display manager daemon
31629baa8cSmrg * Author:  Keith Packard, MIT X Consortium
32629baa8cSmrg *
33629baa8cSmrg * dm.h
34629baa8cSmrg *
35629baa8cSmrg * public interfaces for greet/verify functionality
36629baa8cSmrg */
37629baa8cSmrg
38629baa8cSmrg#ifndef _DM_H_
39629baa8cSmrg# define _DM_H_ 1
40629baa8cSmrg
41629baa8cSmrg# ifdef HAVE_CONFIG_H
42629baa8cSmrg#  include "config.h"
43629baa8cSmrg# endif
44629baa8cSmrg
45629baa8cSmrg# include <X11/Xos.h>
46629baa8cSmrg# include <X11/Xfuncs.h>
47629baa8cSmrg# include <X11/Xfuncproto.h>
48629baa8cSmrg# include <X11/Xmd.h>
49629baa8cSmrg# include <X11/Xauth.h>
50629baa8cSmrg# include <X11/Intrinsic.h>
51629baa8cSmrg
52629baa8cSmrg# if defined(X_POSIX_C_SOURCE)
53629baa8cSmrg#  define _POSIX_C_SOURCE X_POSIX_C_SOURCE
54629baa8cSmrg#  include <setjmp.h>
55629baa8cSmrg#  include <limits.h>
56629baa8cSmrg#  undef _POSIX_C_SOURCE
57629baa8cSmrg# else
58629baa8cSmrg#  include <setjmp.h>
59629baa8cSmrg#  include <limits.h>
60629baa8cSmrg# endif
61629baa8cSmrg# include <time.h>
62629baa8cSmrg# define Time_t time_t
63629baa8cSmrg
64629baa8cSmrg/* If XDMCP symbol defined, compile to run XDMCP protocol */
65629baa8cSmrg
66629baa8cSmrg# define XDMCP
67629baa8cSmrg
68629baa8cSmrg# ifdef XDMCP
69629baa8cSmrg#  include <X11/Xdmcp.h>
70629baa8cSmrg# endif
71629baa8cSmrg
72629baa8cSmrg# ifdef pegasus
73629baa8cSmrg#  undef dirty		/* Some bozo put a macro called dirty in sys/param.h */
74629baa8cSmrg# endif /* pegasus */
75629baa8cSmrg
76629baa8cSmrg# ifndef X_NOT_POSIX
77629baa8cSmrg#  ifdef _POSIX_SOURCE
78629baa8cSmrg#   include <sys/wait.h>
79629baa8cSmrg#  else
80629baa8cSmrg#   define _POSIX_SOURCE
81629baa8cSmrg#   include <sys/wait.h>
82629baa8cSmrg#   undef _POSIX_SOURCE
83629baa8cSmrg#  endif
84629baa8cSmrg#  define waitCode(w)	(WIFEXITED(w) ? WEXITSTATUS(w) : 0)
85629baa8cSmrg#  define waitSig(w)	(WIFSIGNALED(w) ? WTERMSIG(w) : 0)
86629baa8cSmrg#  define waitCore(w)    0	/* not in POSIX.  so what? */
87629baa8cSmrgtypedef int		waitType;
88629baa8cSmrg# else /* X_NOT_POSIX */
89629baa8cSmrg#  ifdef SYSV
90629baa8cSmrg#   define waitCode(w)	(((w) >> 8) & 0x7f)
91629baa8cSmrg#   define waitSig(w)	((w) & 0xff)
92629baa8cSmrg#   define waitCore(w)	(((w) >> 15) & 0x01)
93629baa8cSmrgtypedef int		waitType;
94629baa8cSmrg#  else /* SYSV */
95629baa8cSmrg#   include <sys/wait.h>
96629baa8cSmrg#   define waitCode(w)	((w).w_T.w_Retcode)
97629baa8cSmrg#   define waitSig(w)	((w).w_T.w_Termsig)
98629baa8cSmrg#   define waitCore(w)	((w).w_T.w_Coredump)
99629baa8cSmrgtypedef union wait	waitType;
100629baa8cSmrg#  endif
101629baa8cSmrg# endif /* X_NOT_POSIX */
102629baa8cSmrg
103629baa8cSmrg# ifdef USE_PAM
104b7d26471Smrg#  ifdef HAVE_SECURITY_PAM_APPL_H
105b7d26471Smrg#   include <security/pam_appl.h>
106b7d26471Smrg#  elif defined(HAVE_PAM_PAM_APPL_H)
107b7d26471Smrg#   include <pam/pam_appl.h>
108b7d26471Smrg#  else
109b7d26471Smrg#   error "Unable to determine pam headers"
110b7d26471Smrg#  endif
111629baa8cSmrg# endif
112629baa8cSmrg
113629baa8cSmrg# ifdef CSRG_BASED
114629baa8cSmrg#  include <sys/param.h>
115629baa8cSmrg#  ifdef HAVE_SETUSERCONTEXT
116629baa8cSmrg#   include <login_cap.h>
117629baa8cSmrg#   include <pwd.h>
118629baa8cSmrg#   ifdef USE_BSDAUTH
119629baa8cSmrg#    include <bsd_auth.h>
120629baa8cSmrg#   endif
121629baa8cSmrg#  endif
122629baa8cSmrg# endif
123629baa8cSmrg
124629baa8cSmrg# define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code))
125629baa8cSmrg# define waitVal(w)	waitCompose(waitSig(w), waitCore(w), waitCode(w))
126629baa8cSmrg
127629baa8cSmrgtypedef enum displayStatus { running, notRunning, zombie, phoenix } DisplayStatus;
128629baa8cSmrg
129629baa8cSmrg# ifndef FD_ZERO
130629baa8cSmrgtypedef	struct	my_fd_set { int fds_bits[1]; } my_fd_set;
131629baa8cSmrg#  define FD_ZERO(fdp)	bzero ((fdp), sizeof (*(fdp)))
132629baa8cSmrg#  define FD_SET(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |=  (1 << ((f) % (sizeof (int) * 8))))
133629baa8cSmrg#  define FD_CLR(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8))))
134629baa8cSmrg#  define FD_ISSET(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8))))
135629baa8cSmrg#  define FD_TYPE	my_fd_set
136629baa8cSmrg# else
137629baa8cSmrg#  define FD_TYPE	fd_set
138629baa8cSmrg# endif
139629baa8cSmrg
140629baa8cSmrg/*
141629baa8cSmrg * local     - server runs on local host
142629baa8cSmrg * foreign   - server runs on remote host
143629baa8cSmrg * permanent - session restarted when it exits
144629baa8cSmrg * transient - session not restarted when it exits
145629baa8cSmrg * fromFile  - started via entry in servers file
146629baa8cSmrg * fromXDMCP - started with XDMCP
147629baa8cSmrg */
148629baa8cSmrg
149629baa8cSmrgtypedef struct displayType {
150629baa8cSmrg	unsigned int	location:1;
151629baa8cSmrg	unsigned int	lifetime:1;
152629baa8cSmrg	unsigned int	origin:1;
153629baa8cSmrg} DisplayType;
154629baa8cSmrg
155629baa8cSmrg# define Local		1
156629baa8cSmrg# define Foreign	0
157629baa8cSmrg
158629baa8cSmrg# define Permanent	1
159629baa8cSmrg# define Transient	0
160629baa8cSmrg
161629baa8cSmrg# define FromFile	1
162629baa8cSmrg# define FromXDMCP	0
163629baa8cSmrg
164629baa8cSmrgextern DisplayType parseDisplayType (char *string, int *usedDefault);
165629baa8cSmrg
166629baa8cSmrgtypedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState;
167629baa8cSmrg
168629baa8cSmrgstruct display {
169629baa8cSmrg	struct display	*next;
170629baa8cSmrg	/* Xservers file / XDMCP information */
171629baa8cSmrg	char		*name;		/* DISPLAY name */
172629baa8cSmrg	char		*class;		/* display class (may be NULL) */
173629baa8cSmrg	DisplayType	displayType;	/* method to handle with */
174629baa8cSmrg	char		**argv;		/* program name and arguments */
175629baa8cSmrg
176629baa8cSmrg	/* display state */
177629baa8cSmrg	DisplayStatus	status;		/* current status */
178629baa8cSmrg	pid_t		pid;		/* process id of child */
179629baa8cSmrg	pid_t		serverPid;	/* process id of server (-1 if none) */
180629baa8cSmrg	FileState	state;		/* state during HUP processing */
181629baa8cSmrg	int		startTries;	/* current start try */
182629baa8cSmrg	Time_t		lastReserv;     /* time of last reserver crash */
183629baa8cSmrg	int		reservTries;	/* current reserver try */
184629baa8cSmrg# ifdef XDMCP
185629baa8cSmrg	/* XDMCP state */
186629baa8cSmrg	CARD32		sessionID;	/* ID of active session */
187629baa8cSmrg	XdmcpNetaddr    peer;		/* display peer address */
188629baa8cSmrg	int		peerlen;	/* length of peer address */
189629baa8cSmrg	XdmcpNetaddr    from;		/* XDMCP port of display */
190629baa8cSmrg	int		fromlen;
191629baa8cSmrg	CARD16		displayNumber;
192629baa8cSmrg	int		useChooser;	/* Run the chooser for this display */
193629baa8cSmrg	ARRAY8		clientAddr;	/* for chooser picking */
194629baa8cSmrg	CARD16		connectionType;	/* ... */
195629baa8cSmrg	int		xdmcpFd;
196629baa8cSmrg# endif
197629baa8cSmrg	/* server management resources */
198629baa8cSmrg	int		serverAttempts;	/* number of attempts at running X */
199629baa8cSmrg	int		openDelay;	/* open delay time */
200629baa8cSmrg	int		openRepeat;	/* open attempts to make */
201629baa8cSmrg	int		openTimeout;	/* abort open attempt timeout */
202629baa8cSmrg	int		startAttempts;	/* number of attempts at starting */
203629baa8cSmrg	int		reservAttempts;	/* allowed start-IO error sequences */
204629baa8cSmrg	int		pingInterval;	/* interval between XSync */
205629baa8cSmrg	int		pingTimeout;	/* timeout for XSync */
206629baa8cSmrg	int		terminateServer;/* restart for each session */
207629baa8cSmrg	int		grabServer;	/* keep server grabbed for Login */
208629baa8cSmrg	int		grabTimeout;	/* time to wait for grab */
209629baa8cSmrg	int		resetSignal;	/* signal to reset server */
210629baa8cSmrg	int		termSignal;	/* signal to terminate server */
211629baa8cSmrg	int		resetForAuth;	/* server reads auth file at reset */
212629baa8cSmrg	char            *keymaps;       /* binary compat with DEC */
213629baa8cSmrg	char		*greeterLib;	/* greeter shared library name */
214629baa8cSmrg
215629baa8cSmrg	/* session resources */
216629baa8cSmrg	char		*resources;	/* resource file */
217629baa8cSmrg	char		*xrdb;		/* xrdb program */
218629baa8cSmrg	char		*setup;		/* Xsetup program */
219629baa8cSmrg	char		*startup;	/* Xstartup program */
220629baa8cSmrg	char		*reset;		/* Xreset program */
221629baa8cSmrg	char		*session;	/* Xsession program */
222629baa8cSmrg	char		*userPath;	/* path set for session */
223629baa8cSmrg	char		*systemPath;	/* path set for startup/reset */
224629baa8cSmrg	char		*systemShell;	/* interpreter for startup/reset */
225629baa8cSmrg	char		*failsafeClient;/* a client to start when the session fails */
226629baa8cSmrg	char		*chooser;	/* chooser program */
227629baa8cSmrg
228629baa8cSmrg	/* authorization resources */
229629baa8cSmrg	int		authorize;	/* enable authorization */
230629baa8cSmrg	char		**authNames;	/* authorization protocol names */
231629baa8cSmrg	unsigned short	*authNameLens;	/* authorization protocol name lens */
232629baa8cSmrg	char		*clientAuthFile;/* client specified auth file */
233629baa8cSmrg	char		*userAuthDir;	/* backup directory for tickets */
234629baa8cSmrg	int		authComplain;	/* complain when no auth for XDMCP */
235629baa8cSmrg
236629baa8cSmrg	/* information potentially derived from resources */
237629baa8cSmrg	int		authNameNum;	/* number of protocol names */
238629baa8cSmrg	Xauth		**authorizations;/* authorization data */
239629baa8cSmrg	int		authNum;	/* number of authorizations */
240629baa8cSmrg	char		*authFile;	/* file to store authorization in */
241629baa8cSmrg
242629baa8cSmrg	int		version;	/* to keep dynamic greeter clued in */
243629baa8cSmrg	/* add new fields only after here.  And preferably at the end. */
244629baa8cSmrg
245629baa8cSmrg	/* Hack for making "Willing to manage" configurable */
246629baa8cSmrg	char		*willing;	/* "Willing to manage" program */
247629baa8cSmrg	Display		*dpy;		/* Display */
248629baa8cSmrg	char		*windowPath;	/* path to server "window" */
249629baa8cSmrg};
250629baa8cSmrg
251629baa8cSmrg# ifdef XDMCP
252629baa8cSmrg
253629baa8cSmrg#  define PROTO_TIMEOUT	(30 * 60)   /* 30 minutes should be long enough */
254629baa8cSmrg#  define XDM_BROKEN_INTERVAL (120)   /* server crashing more than once within */
255629baa8cSmrg                                    /* two minutes is assumed to be broken!  */
256629baa8cSmrgstruct protoDisplay {
257629baa8cSmrg	struct protoDisplay	*next;
258629baa8cSmrg	XdmcpNetaddr		address;   /* UDP address */
259629baa8cSmrg	int			addrlen;    /* UDP address length */
260629baa8cSmrg	unsigned long		date;	    /* creation date */
261629baa8cSmrg	CARD16			displayNumber;
262629baa8cSmrg	CARD16			connectionType;
263629baa8cSmrg	ARRAY8			connectionAddress;
264629baa8cSmrg	CARD32			sessionID;
265629baa8cSmrg	Xauth			*fileAuthorization;
266629baa8cSmrg	Xauth			*xdmcpAuthorization;
267629baa8cSmrg	ARRAY8			authenticationName;
268629baa8cSmrg	ARRAY8			authenticationData;
269629baa8cSmrg	XdmAuthKeyRec		key;
270629baa8cSmrg};
271629baa8cSmrg# endif /* XDMCP */
272629baa8cSmrg
273629baa8cSmrgstruct greet_info {
274629baa8cSmrg	char		*name;		/* user name */
275629baa8cSmrg	char		*password;	/* user password */
276629baa8cSmrg	char		*string;	/* random string */
277629baa8cSmrg	char            *passwd;        /* binary compat with DEC */
278629baa8cSmrg	int		version;	/* for dynamic greeter to see */
279629baa8cSmrg	/* add new fields below this line, and preferably at the end */
280629baa8cSmrg	Boolean		allow_null_passwd; /* allow null password on login */
281629baa8cSmrg	Boolean		allow_root_login; /* allow direct root login */
282629baa8cSmrg};
283629baa8cSmrg
284629baa8cSmrgtypedef void (*ChooserFunc)(CARD16 connectionType, ARRAY8Ptr addr, char *closure);
285629baa8cSmrgtypedef void (*ListenFunc)(ARRAY8Ptr addr, void **closure);
286629baa8cSmrg
287629baa8cSmrgstruct verify_info {
288629baa8cSmrg	int		uid;		/* user id */
289629baa8cSmrg	int		gid;		/* group id */
290629baa8cSmrg	char		**argv;		/* arguments to session */
291629baa8cSmrg	char		**userEnviron;	/* environment for session */
292629baa8cSmrg	char		**systemEnviron;/* environment for startup/reset */
293629baa8cSmrg	int		version;	/* for dynamic greeter to see */
294629baa8cSmrg	/* add new fields below this line, and preferably at the end */
295629baa8cSmrg};
296629baa8cSmrg
297629baa8cSmrg/* display manager exit status definitions */
298629baa8cSmrg
299629baa8cSmrg# define OBEYSESS_DISPLAY	0	/* obey multipleSessions resource */
300629baa8cSmrg# define REMANAGE_DISPLAY	1	/* force remanage */
301629baa8cSmrg# define UNMANAGE_DISPLAY	2	/* force deletion */
302629baa8cSmrg# define RESERVER_DISPLAY	3	/* force server termination */
303629baa8cSmrg# define OPENFAILED_DISPLAY	4	/* XOpenDisplay failed, retry */
304629baa8cSmrg
305629baa8cSmrg# ifndef TRUE
306629baa8cSmrg#  define TRUE	1
307629baa8cSmrg#  define FALSE	0
308629baa8cSmrg# endif
309629baa8cSmrg
310629baa8cSmrgextern char	*config;
311629baa8cSmrg
312629baa8cSmrgextern char	*servers;
313629baa8cSmrgextern int	request_port;
314629baa8cSmrgextern int	debugLevel;
315629baa8cSmrgextern char	*errorLogFile;
316629baa8cSmrgextern int	daemonMode;
317629baa8cSmrgextern char	*pidFile;
318629baa8cSmrgextern int	lockPidFile;
319629baa8cSmrgextern char	*authDir;
320629baa8cSmrgextern int	autoRescan;
321629baa8cSmrgextern int	removeDomainname;
322629baa8cSmrgextern char	*keyFile;
323629baa8cSmrgextern char	*accessFile;
324629baa8cSmrgextern char	**exportList;
325629baa8cSmrg# if !defined(HAVE_ARC4RANDOM)
326629baa8cSmrgextern char	*randomFile;
327629baa8cSmrgextern char	*prngdSocket;
328629baa8cSmrgextern int	prngdPort;
329629baa8cSmrg# endif
330629baa8cSmrg
331629baa8cSmrgextern char	*greeterLib;
332629baa8cSmrgextern char	*willing;
333629baa8cSmrgextern int	choiceTimeout;	/* chooser choice timeout */
334629baa8cSmrg
335629baa8cSmrgextern struct display	*FindDisplayByName (char *name),
336629baa8cSmrg			*FindDisplayBySessionID (CARD32 sessionID),
337629baa8cSmrg			*FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber),
338629baa8cSmrg			*FindDisplayByPid (pid_t pid),
339629baa8cSmrg			*FindDisplayByServerPid (pid_t serverPid),
340629baa8cSmrg			*NewDisplay (char *name, char *class);
341629baa8cSmrg
342629baa8cSmrgextern struct protoDisplay	*FindProtoDisplay (
343629baa8cSmrg					XdmcpNetaddr address,
344629baa8cSmrg					int          addrlen,
345629baa8cSmrg					CARD16       displayNumber);
346629baa8cSmrgextern struct protoDisplay	*NewProtoDisplay (
347629baa8cSmrg					XdmcpNetaddr address,
348629baa8cSmrg					int	     addrlen,
349629baa8cSmrg					CARD16	     displayNumber,
350629baa8cSmrg					CARD16	     connectionType,
351629baa8cSmrg					ARRAY8Ptr    connectionAddress,
352629baa8cSmrg					CARD32	     sessionID);
353629baa8cSmrg
354629baa8cSmrg/* in Login.c */
355629baa8cSmrgextern void DrawFail (Widget ctx);
356629baa8cSmrg
357629baa8cSmrg/* in access.c */
358629baa8cSmrgextern ARRAY8Ptr getLocalAddress (void);
359629baa8cSmrgextern int AcceptableDisplayAddress (ARRAY8Ptr clientAddress, CARD16 connectionType, xdmOpCode type);
360629baa8cSmrgextern int ForEachMatchingIndirectHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
361629baa8cSmrgextern int ScanAccessDatabase (void);
362629baa8cSmrgextern int UseChooser (ARRAY8Ptr clientAddress, CARD16 connectionType);
363629baa8cSmrgextern void ForEachChooserHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
364629baa8cSmrgextern void ForEachListenAddr(ListenFunc listenfunction,
365629baa8cSmrg  ListenFunc mcastfcuntion, void **closure);
366629baa8cSmrg
367629baa8cSmrg/* in choose.c */
368629baa8cSmrgextern ARRAY8Ptr IndirectChoice (ARRAY8Ptr clientAddress, CARD16 connectionType);
369629baa8cSmrgextern int IsIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
370629baa8cSmrgextern int RememberIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
371629baa8cSmrgextern void ForgetIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType);
372629baa8cSmrgextern void ProcessChooserSocket (int fd);
373629baa8cSmrg
374629baa8cSmrg/* in chooser.c */
375b7d26471Smrgextern void RunChooser (struct display *d) _X_NORETURN;
376629baa8cSmrg
377629baa8cSmrg/* in daemon.c */
378629baa8cSmrgextern void BecomeDaemon (void);
379629baa8cSmrgextern void BecomeOrphan (void);
380629baa8cSmrg
381629baa8cSmrg/* in dm.c */
382629baa8cSmrgextern void CloseOnFork (void);
383629baa8cSmrgextern void RegisterCloseOnFork (int fd);
384629baa8cSmrgextern void StartDisplay (struct display *d);
385629baa8cSmrg# ifndef HAVE_SETPROCTITLE
386629baa8cSmrgextern void SetTitle (char *name, ...);
387629baa8cSmrg# endif
388629baa8cSmrg
389629baa8cSmrg/* in dpylist.c */
390629baa8cSmrgextern int AnyDisplaysLeft (void);
391629baa8cSmrgextern void ForEachDisplay (void (*f)(struct display *));
392629baa8cSmrgextern void RemoveDisplay (struct display *old);
393629baa8cSmrg
394629baa8cSmrg/* in file.c */
395629baa8cSmrgextern void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable);
396629baa8cSmrg
397629baa8cSmrg/* in netaddr.c */
398629baa8cSmrgextern char *NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp);
399629baa8cSmrgextern char *NetaddrPort(XdmcpNetaddr netaddrp, int *lenp);
400629baa8cSmrgextern int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr);
401629baa8cSmrgextern int NetaddrFamily (XdmcpNetaddr netaddrp);
402629baa8cSmrgextern int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2);
403629baa8cSmrg
404629baa8cSmrg/* in policy.c */
405629baa8cSmrgextern ARRAY8Ptr ChooseAuthentication (ARRAYofARRAY8Ptr authenticationNames);
406629baa8cSmrgextern int CheckAuthentication (struct protoDisplay *pdpy, ARRAY8Ptr displayID, ARRAY8Ptr name, ARRAY8Ptr data);
407629baa8cSmrgextern int SelectAuthorizationTypeIndex (ARRAY8Ptr authenticationName, ARRAYofARRAY8Ptr authorizationNames);
408629baa8cSmrgextern int SelectConnectionTypeIndex (ARRAY16Ptr connectionTypes, ARRAYofARRAY8Ptr connectionAddresses);
409629baa8cSmrgextern int Willing (ARRAY8Ptr addr, CARD16 connectionType, ARRAY8Ptr authenticationName, ARRAY8Ptr status, xdmOpCode type);
410629baa8cSmrg
411629baa8cSmrg/* in protodpy.c */
412629baa8cSmrgextern void DisposeProtoDisplay(struct protoDisplay *pdpy);
413629baa8cSmrg
414629baa8cSmrg/* in reset.c */
415629baa8cSmrgextern void pseudoReset (Display *dpy);
416629baa8cSmrg
417629baa8cSmrg/* in resource.c */
418629baa8cSmrgextern void InitResources (int argc, char **argv);
419629baa8cSmrgextern void LoadDMResources (void);
420629baa8cSmrgextern void LoadServerResources (struct display *d);
421629baa8cSmrgextern void LoadSessionResources (struct display *d);
422629baa8cSmrgextern void ReinitResources (void);
423629baa8cSmrg
424629baa8cSmrg/* in session.c */
425629baa8cSmrg# ifdef USE_PAM
426629baa8cSmrgextern pam_handle_t **thepamhp(void);
427629baa8cSmrgextern pam_handle_t *thepamh(void);
428629baa8cSmrg# endif
429629baa8cSmrgextern char **defaultEnv (void);
430629baa8cSmrgextern char **systemEnv (struct display *d, char *user, char *home);
431629baa8cSmrgextern int PingServer(struct display *d, Display *alternateDpy);
432629baa8cSmrgextern int source (char **environ, char *file);
433629baa8cSmrgextern void ClearCloseOnFork (int fd);
434629baa8cSmrgextern void DeleteXloginResources (struct display *d, Display *dpy);
435629baa8cSmrgextern void LoadXloginResources (struct display *d);
436b7d26471Smrgextern void ManageSession (struct display *d) _X_NORETURN;
437629baa8cSmrgextern void SecureDisplay (struct display *d, Display *dpy);
438b7d26471Smrgextern void SessionExit (struct display *d, int status, int removeAuth) _X_NORETURN;
439b7d26471Smrgextern void SessionPingFailed (struct display *d) _X_NORETURN;
440629baa8cSmrgextern void SetupDisplay (struct display *d);
441629baa8cSmrgextern void UnsecureDisplay (struct display *d, Display *dpy);
442629baa8cSmrgextern void execute(char **argv, char **environ);
443629baa8cSmrg
444629baa8cSmrg/* server.c */
445b7d26471Smrgextern const char *_SysErrorMsg (int n);
446629baa8cSmrgextern int StartServer (struct display *d);
447629baa8cSmrgextern int WaitForServer (struct display *d);
448629baa8cSmrgextern void ResetServer (struct display *d);
449629baa8cSmrg
450b7d26471Smrg/* socket.c */
451629baa8cSmrgextern int GetChooserAddr (char *addr, int *lenp);
452629baa8cSmrgextern void CreateWellKnownSockets (void);
453629baa8cSmrgextern void UpdateListenSockets (void);
454629baa8cSmrgextern void CloseListenSockets (void);
455629baa8cSmrgextern void ProcessListenSockets (fd_set *readmask);
456629baa8cSmrg
457629baa8cSmrg/* in util.c */
458629baa8cSmrg# ifndef HAVE_ASPRINTF
459629baa8cSmrg#  define asprintf Asprintf
460629baa8cSmrgextern int Asprintf(char ** ret, const char *restrict format, ...)
461629baa8cSmrg    _X_ATTRIBUTE_PRINTF(2,3);
462629baa8cSmrg# endif
463629baa8cSmrgextern char *localHostname (void);
464b7d26471Smrgextern char **parseArgs (char **argv, const char *string);
465b7d26471Smrgextern char **setEnv (char **e, const char *name, const char *value);
466629baa8cSmrgextern char **putEnv(const char *string, char **env);
467b7d26471Smrgextern char *getEnv (char **e, const char *name);
468629baa8cSmrgextern void CleanUpChild (void);
469629baa8cSmrgextern void freeArgs (char **argv);
470629baa8cSmrgextern void freeEnv (char **env);
471629baa8cSmrgextern void printEnv (char **e);
472629baa8cSmrg
473629baa8cSmrg/* in verify.c */
474629baa8cSmrgextern int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify);
475629baa8cSmrg
476629baa8cSmrg/* in xdmcp.c */
477629baa8cSmrgextern char *NetworkAddressToHostname (CARD16 connectionType, ARRAY8Ptr connectionAddress);
478629baa8cSmrgextern int AnyWellKnownSockets (void);
479629baa8cSmrgextern void DestroyWellKnownSockets (void);
480b7d26471Smrgextern void SendFailed (struct display *d, const char *reason);
481629baa8cSmrgextern void StopDisplay (struct display *d);
482629baa8cSmrgextern void WaitForChild (void);
483629baa8cSmrgextern void WaitForSomething (void);
484629baa8cSmrgextern void init_session_id(void);
485629baa8cSmrgextern void registerHostname(char *name, int namelen);
486629baa8cSmrgextern void ProcessRequestSocket(int fd);
487629baa8cSmrg
488629baa8cSmrg/*
489629baa8cSmrg * CloseOnFork flags
490629baa8cSmrg */
491629baa8cSmrg
492629baa8cSmrg# define CLOSE_ALWAYS	    0
493629baa8cSmrg# define LEAVE_FOR_DISPLAY  1
494629baa8cSmrg
495629baa8cSmrg# include <stdlib.h>
496629baa8cSmrg
497b7d26471Smrg# if defined(X_NOT_POSIX) || defined(__NetBSD__) && defined(__sparc__)
498b7d26471Smrg#  if defined(SYSV)
499629baa8cSmrg#   define SIGNALS_RESET_WHEN_CAUGHT
500629baa8cSmrg#   define UNRELIABLE_SIGNALS
501629baa8cSmrg#  endif
502629baa8cSmrg#  define Setjmp(e)	setjmp(e)
503629baa8cSmrg#  define Longjmp(e,v)	longjmp(e,v)
504629baa8cSmrg#  define Jmp_buf		jmp_buf
505629baa8cSmrg# else
506629baa8cSmrg#  define Setjmp(e)   sigsetjmp(e,1)
507629baa8cSmrg#  define Longjmp(e,v)	siglongjmp(e,v)
508629baa8cSmrg#  define Jmp_buf		sigjmp_buf
509629baa8cSmrg# endif
510629baa8cSmrg
511b7d26471Smrgtypedef void (*SIGFUNC)(int);
512629baa8cSmrg
513b7d26471Smrgvoid (*Signal(int, SIGFUNC Handler))(int);
514629baa8cSmrg
515629baa8cSmrg#endif /* _DM_H_ */
516