dm.h revision 629baa8c
1/*
2
3Copyright 1988, 1998  The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included
12in all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of The Open Group shall
23not be used in advertising or otherwise to promote the sale, use or
24other dealings in this Software without prior written authorization
25from The Open Group.
26
27*/
28
29/*
30 * xdm - display manager daemon
31 * Author:  Keith Packard, MIT X Consortium
32 *
33 * dm.h
34 *
35 * public interfaces for greet/verify functionality
36 */
37
38#ifndef _DM_H_
39# define _DM_H_ 1
40
41# ifdef HAVE_CONFIG_H
42#  include "config.h"
43# endif
44
45# include <X11/Xos.h>
46# include <X11/Xfuncs.h>
47# include <X11/Xfuncproto.h>
48# include <X11/Xmd.h>
49# include <X11/Xauth.h>
50# include <X11/Intrinsic.h>
51
52# if defined(X_POSIX_C_SOURCE)
53#  define _POSIX_C_SOURCE X_POSIX_C_SOURCE
54#  include <setjmp.h>
55#  include <limits.h>
56#  undef _POSIX_C_SOURCE
57# else
58#  include <setjmp.h>
59#  include <limits.h>
60# endif
61# include <time.h>
62# define Time_t time_t
63
64/* If XDMCP symbol defined, compile to run XDMCP protocol */
65
66# define XDMCP
67
68# ifdef XDMCP
69#  include <X11/Xdmcp.h>
70# endif
71
72# ifdef pegasus
73#  undef dirty		/* Some bozo put a macro called dirty in sys/param.h */
74# endif /* pegasus */
75
76# ifndef X_NOT_POSIX
77#  ifdef _POSIX_SOURCE
78#   include <sys/wait.h>
79#  else
80#   define _POSIX_SOURCE
81#   ifdef __SCO__
82#    include <sys/procset.h>
83#    include <sys/siginfo.h>
84#   endif
85#   include <sys/wait.h>
86#   undef _POSIX_SOURCE
87#  endif
88#  define waitCode(w)	(WIFEXITED(w) ? WEXITSTATUS(w) : 0)
89#  define waitSig(w)	(WIFSIGNALED(w) ? WTERMSIG(w) : 0)
90#  define waitCore(w)    0	/* not in POSIX.  so what? */
91typedef int		waitType;
92# else /* X_NOT_POSIX */
93#  ifdef SYSV
94#   define waitCode(w)	(((w) >> 8) & 0x7f)
95#   define waitSig(w)	((w) & 0xff)
96#   define waitCore(w)	(((w) >> 15) & 0x01)
97typedef int		waitType;
98#  else /* SYSV */
99#   include <sys/wait.h>
100#   define waitCode(w)	((w).w_T.w_Retcode)
101#   define waitSig(w)	((w).w_T.w_Termsig)
102#   define waitCore(w)	((w).w_T.w_Coredump)
103typedef union wait	waitType;
104#  endif
105# endif /* X_NOT_POSIX */
106
107# ifdef USE_PAM
108#  include <security/pam_appl.h>
109# endif
110
111# ifdef CSRG_BASED
112#  include <sys/param.h>
113#  ifdef HAVE_SETUSERCONTEXT
114#   include <login_cap.h>
115#   include <pwd.h>
116#   ifdef USE_BSDAUTH
117#    include <bsd_auth.h>
118#   endif
119#  endif
120# endif
121
122# define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code))
123# define waitVal(w)	waitCompose(waitSig(w), waitCore(w), waitCode(w))
124
125typedef enum displayStatus { running, notRunning, zombie, phoenix } DisplayStatus;
126
127# ifndef FD_ZERO
128typedef	struct	my_fd_set { int fds_bits[1]; } my_fd_set;
129#  define FD_ZERO(fdp)	bzero ((fdp), sizeof (*(fdp)))
130#  define FD_SET(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |=  (1 << ((f) % (sizeof (int) * 8))))
131#  define FD_CLR(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8))))
132#  define FD_ISSET(f,fdp)	((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8))))
133#  define FD_TYPE	my_fd_set
134# else
135#  define FD_TYPE	fd_set
136# endif
137
138/*
139 * local     - server runs on local host
140 * foreign   - server runs on remote host
141 * permanent - session restarted when it exits
142 * transient - session not restarted when it exits
143 * fromFile  - started via entry in servers file
144 * fromXDMCP - started with XDMCP
145 */
146
147typedef struct displayType {
148	unsigned int	location:1;
149	unsigned int	lifetime:1;
150	unsigned int	origin:1;
151} DisplayType;
152
153# define Local		1
154# define Foreign	0
155
156# define Permanent	1
157# define Transient	0
158
159# define FromFile	1
160# define FromXDMCP	0
161
162extern DisplayType parseDisplayType (char *string, int *usedDefault);
163
164typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState;
165
166struct display {
167	struct display	*next;
168	/* Xservers file / XDMCP information */
169	char		*name;		/* DISPLAY name */
170	char		*class;		/* display class (may be NULL) */
171	DisplayType	displayType;	/* method to handle with */
172	char		**argv;		/* program name and arguments */
173
174	/* display state */
175	DisplayStatus	status;		/* current status */
176	pid_t		pid;		/* process id of child */
177	pid_t		serverPid;	/* process id of server (-1 if none) */
178	FileState	state;		/* state during HUP processing */
179	int		startTries;	/* current start try */
180	Time_t		lastReserv;     /* time of last reserver crash */
181	int		reservTries;	/* current reserver try */
182# ifdef XDMCP
183	/* XDMCP state */
184	CARD32		sessionID;	/* ID of active session */
185	XdmcpNetaddr    peer;		/* display peer address */
186	int		peerlen;	/* length of peer address */
187	XdmcpNetaddr    from;		/* XDMCP port of display */
188	int		fromlen;
189	CARD16		displayNumber;
190	int		useChooser;	/* Run the chooser for this display */
191	ARRAY8		clientAddr;	/* for chooser picking */
192	CARD16		connectionType;	/* ... */
193	int		xdmcpFd;
194# endif
195	/* server management resources */
196	int		serverAttempts;	/* number of attempts at running X */
197	int		openDelay;	/* open delay time */
198	int		openRepeat;	/* open attempts to make */
199	int		openTimeout;	/* abort open attempt timeout */
200	int		startAttempts;	/* number of attempts at starting */
201	int		reservAttempts;	/* allowed start-IO error sequences */
202	int		pingInterval;	/* interval between XSync */
203	int		pingTimeout;	/* timeout for XSync */
204	int		terminateServer;/* restart for each session */
205	int		grabServer;	/* keep server grabbed for Login */
206	int		grabTimeout;	/* time to wait for grab */
207	int		resetSignal;	/* signal to reset server */
208	int		termSignal;	/* signal to terminate server */
209	int		resetForAuth;	/* server reads auth file at reset */
210	char            *keymaps;       /* binary compat with DEC */
211	char		*greeterLib;	/* greeter shared library name */
212
213	/* session resources */
214	char		*resources;	/* resource file */
215	char		*xrdb;		/* xrdb program */
216	char		*setup;		/* Xsetup program */
217	char		*startup;	/* Xstartup program */
218	char		*reset;		/* Xreset program */
219	char		*session;	/* Xsession program */
220	char		*userPath;	/* path set for session */
221	char		*systemPath;	/* path set for startup/reset */
222	char		*systemShell;	/* interpreter for startup/reset */
223	char		*failsafeClient;/* a client to start when the session fails */
224	char		*chooser;	/* chooser program */
225
226	/* authorization resources */
227	int		authorize;	/* enable authorization */
228	char		**authNames;	/* authorization protocol names */
229	unsigned short	*authNameLens;	/* authorization protocol name lens */
230	char		*clientAuthFile;/* client specified auth file */
231	char		*userAuthDir;	/* backup directory for tickets */
232	int		authComplain;	/* complain when no auth for XDMCP */
233
234	/* information potentially derived from resources */
235	int		authNameNum;	/* number of protocol names */
236	Xauth		**authorizations;/* authorization data */
237	int		authNum;	/* number of authorizations */
238	char		*authFile;	/* file to store authorization in */
239
240	int		version;	/* to keep dynamic greeter clued in */
241	/* add new fields only after here.  And preferably at the end. */
242
243	/* Hack for making "Willing to manage" configurable */
244	char		*willing;	/* "Willing to manage" program */
245	Display		*dpy;		/* Display */
246	char		*windowPath;	/* path to server "window" */
247};
248
249# ifdef XDMCP
250
251#  define PROTO_TIMEOUT	(30 * 60)   /* 30 minutes should be long enough */
252#  define XDM_BROKEN_INTERVAL (120)   /* server crashing more than once within */
253                                    /* two minutes is assumed to be broken!  */
254struct protoDisplay {
255	struct protoDisplay	*next;
256	XdmcpNetaddr		address;   /* UDP address */
257	int			addrlen;    /* UDP address length */
258	unsigned long		date;	    /* creation date */
259	CARD16			displayNumber;
260	CARD16			connectionType;
261	ARRAY8			connectionAddress;
262	CARD32			sessionID;
263	Xauth			*fileAuthorization;
264	Xauth			*xdmcpAuthorization;
265	ARRAY8			authenticationName;
266	ARRAY8			authenticationData;
267	XdmAuthKeyRec		key;
268};
269# endif /* XDMCP */
270
271struct greet_info {
272	char		*name;		/* user name */
273	char		*password;	/* user password */
274	char		*string;	/* random string */
275	char            *passwd;        /* binary compat with DEC */
276	int		version;	/* for dynamic greeter to see */
277	/* add new fields below this line, and preferably at the end */
278	Boolean		allow_null_passwd; /* allow null password on login */
279	Boolean		allow_root_login; /* allow direct root login */
280};
281
282typedef void (*ChooserFunc)(CARD16 connectionType, ARRAY8Ptr addr, char *closure);
283typedef void (*ListenFunc)(ARRAY8Ptr addr, void **closure);
284
285struct verify_info {
286	int		uid;		/* user id */
287	int		gid;		/* group id */
288	char		**argv;		/* arguments to session */
289	char		**userEnviron;	/* environment for session */
290	char		**systemEnviron;/* environment for startup/reset */
291	int		version;	/* for dynamic greeter to see */
292	/* add new fields below this line, and preferably at the end */
293};
294
295/* display manager exit status definitions */
296
297# define OBEYSESS_DISPLAY	0	/* obey multipleSessions resource */
298# define REMANAGE_DISPLAY	1	/* force remanage */
299# define UNMANAGE_DISPLAY	2	/* force deletion */
300# define RESERVER_DISPLAY	3	/* force server termination */
301# define OPENFAILED_DISPLAY	4	/* XOpenDisplay failed, retry */
302
303# ifndef TRUE
304#  define TRUE	1
305#  define FALSE	0
306# endif
307
308extern char	*config;
309
310extern char	*servers;
311extern int	request_port;
312extern int	debugLevel;
313extern char	*errorLogFile;
314extern int	daemonMode;
315extern char	*pidFile;
316extern int	lockPidFile;
317extern char	*authDir;
318extern int	autoRescan;
319extern int	removeDomainname;
320extern char	*keyFile;
321extern char	*accessFile;
322extern char	**exportList;
323# if !defined(HAVE_ARC4RANDOM)
324extern char	*randomFile;
325extern char	*prngdSocket;
326extern int	prngdPort;
327# endif
328
329extern char	*greeterLib;
330extern char	*willing;
331extern int	choiceTimeout;	/* chooser choice timeout */
332
333extern struct display	*FindDisplayByName (char *name),
334			*FindDisplayBySessionID (CARD32 sessionID),
335			*FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber),
336			*FindDisplayByPid (pid_t pid),
337			*FindDisplayByServerPid (pid_t serverPid),
338			*NewDisplay (char *name, char *class);
339
340extern struct protoDisplay	*FindProtoDisplay (
341					XdmcpNetaddr address,
342					int          addrlen,
343					CARD16       displayNumber);
344extern struct protoDisplay	*NewProtoDisplay (
345					XdmcpNetaddr address,
346					int	     addrlen,
347					CARD16	     displayNumber,
348					CARD16	     connectionType,
349					ARRAY8Ptr    connectionAddress,
350					CARD32	     sessionID);
351
352/* in Login.c */
353extern void DrawFail (Widget ctx);
354
355/* in access.c */
356extern ARRAY8Ptr getLocalAddress (void);
357extern int AcceptableDisplayAddress (ARRAY8Ptr clientAddress, CARD16 connectionType, xdmOpCode type);
358extern int ForEachMatchingIndirectHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
359extern int ScanAccessDatabase (void);
360extern int UseChooser (ARRAY8Ptr clientAddress, CARD16 connectionType);
361extern void ForEachChooserHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
362extern void ForEachListenAddr(ListenFunc listenfunction,
363  ListenFunc mcastfcuntion, void **closure);
364
365/* in choose.c */
366extern ARRAY8Ptr IndirectChoice (ARRAY8Ptr clientAddress, CARD16 connectionType);
367extern int IsIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
368extern int RememberIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
369extern void ForgetIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType);
370extern void ProcessChooserSocket (int fd);
371
372/* in chooser.c */
373extern void RunChooser (struct display *d);
374
375/* in daemon.c */
376extern void BecomeDaemon (void);
377extern void BecomeOrphan (void);
378
379/* in dm.c */
380extern void CloseOnFork (void);
381extern void RegisterCloseOnFork (int fd);
382extern void StartDisplay (struct display *d);
383# ifndef HAVE_SETPROCTITLE
384extern void SetTitle (char *name, ...);
385# endif
386
387/* in dpylist.c */
388extern int AnyDisplaysLeft (void);
389extern void ForEachDisplay (void (*f)(struct display *));
390extern void RemoveDisplay (struct display *old);
391
392/* in file.c */
393extern void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable);
394
395/* in netaddr.c */
396extern char *NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp);
397extern char *NetaddrPort(XdmcpNetaddr netaddrp, int *lenp);
398extern int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr);
399extern int NetaddrFamily (XdmcpNetaddr netaddrp);
400extern int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2);
401
402/* in policy.c */
403# if 0
404extern ARRAY8Ptr Accept (/* struct sockaddr *from, int fromlen, CARD16 displayNumber */);
405# endif
406extern ARRAY8Ptr ChooseAuthentication (ARRAYofARRAY8Ptr authenticationNames);
407extern int CheckAuthentication (struct protoDisplay *pdpy, ARRAY8Ptr displayID, ARRAY8Ptr name, ARRAY8Ptr data);
408extern int SelectAuthorizationTypeIndex (ARRAY8Ptr authenticationName, ARRAYofARRAY8Ptr authorizationNames);
409extern int SelectConnectionTypeIndex (ARRAY16Ptr connectionTypes, ARRAYofARRAY8Ptr connectionAddresses);
410extern int Willing (ARRAY8Ptr addr, CARD16 connectionType, ARRAY8Ptr authenticationName, ARRAY8Ptr status, xdmOpCode type);
411
412/* in protodpy.c */
413extern void DisposeProtoDisplay(struct protoDisplay *pdpy);
414
415/* in reset.c */
416extern void pseudoReset (Display *dpy);
417
418/* in resource.c */
419extern void InitResources (int argc, char **argv);
420extern void LoadDMResources (void);
421extern void LoadServerResources (struct display *d);
422extern void LoadSessionResources (struct display *d);
423extern void ReinitResources (void);
424
425/* in session.c */
426# ifdef USE_PAM
427extern pam_handle_t **thepamhp(void);
428extern pam_handle_t *thepamh(void);
429# endif
430extern char **defaultEnv (void);
431extern char **systemEnv (struct display *d, char *user, char *home);
432extern int PingServer(struct display *d, Display *alternateDpy);
433extern int source (char **environ, char *file);
434extern void ClearCloseOnFork (int fd);
435extern void DeleteXloginResources (struct display *d, Display *dpy);
436extern void LoadXloginResources (struct display *d);
437extern void ManageSession (struct display *d);
438extern void SecureDisplay (struct display *d, Display *dpy);
439extern void SessionExit (struct display *d, int status, int removeAuth);
440extern void SessionPingFailed (struct display *d);
441extern void SetupDisplay (struct display *d);
442extern void UnsecureDisplay (struct display *d, Display *dpy);
443extern void execute(char **argv, char **environ);
444
445/* server.c */
446extern char *_SysErrorMsg (int n);
447extern int StartServer (struct display *d);
448extern int WaitForServer (struct display *d);
449extern void ResetServer (struct display *d);
450
451/* socket.c or streams.c */
452extern int GetChooserAddr (char *addr, int *lenp);
453extern void CreateWellKnownSockets (void);
454extern void UpdateListenSockets (void);
455extern void CloseListenSockets (void);
456extern void ProcessListenSockets (fd_set *readmask);
457
458/* in util.c */
459# ifndef HAVE_ASPRINTF
460#  define asprintf Asprintf
461extern int Asprintf(char ** ret, const char *restrict format, ...)
462    _X_ATTRIBUTE_PRINTF(2,3);
463# endif
464extern char *localHostname (void);
465extern char **parseArgs (char **argv, char *string);
466extern char **setEnv (char **e, char *name, char *value);
467extern char **putEnv(const char *string, char **env);
468extern char *getEnv (char **e, char *name);
469extern void CleanUpChild (void);
470extern void freeArgs (char **argv);
471extern void freeEnv (char **env);
472extern void printEnv (char **e);
473
474/* in verify.c */
475extern int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify);
476
477/* in xdmcp.c */
478extern char *NetworkAddressToHostname (CARD16 connectionType, ARRAY8Ptr connectionAddress);
479extern int AnyWellKnownSockets (void);
480extern void DestroyWellKnownSockets (void);
481extern void SendFailed (struct display *d, char *reason);
482extern void StopDisplay (struct display *d);
483extern void WaitForChild (void);
484extern void WaitForSomething (void);
485extern void init_session_id(void);
486extern void registerHostname(char *name, int namelen);
487extern void ProcessRequestSocket(int fd);
488
489/*
490 * CloseOnFork flags
491 */
492
493# define CLOSE_ALWAYS	    0
494# define LEAVE_FOR_DISPLAY  1
495
496# include <stdlib.h>
497
498# define SIGVAL RETSIGTYPE
499
500# if defined(X_NOT_POSIX) || defined(__UNIXOS2__) || defined(__NetBSD__) && defined(__sparc__)
501#  if defined(SYSV) || defined(__UNIXOS2__)
502#   define SIGNALS_RESET_WHEN_CAUGHT
503#   define UNRELIABLE_SIGNALS
504#  endif
505#  define Setjmp(e)	setjmp(e)
506#  define Longjmp(e,v)	longjmp(e,v)
507#  define Jmp_buf		jmp_buf
508# else
509#  define Setjmp(e)   sigsetjmp(e,1)
510#  define Longjmp(e,v)	siglongjmp(e,v)
511#  define Jmp_buf		sigjmp_buf
512# endif
513
514typedef SIGVAL (*SIGFUNC)(int);
515
516SIGVAL (*Signal(int, SIGFUNC Handler))(int);
517
518#endif /* _DM_H_ */
519