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