2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* (c) Copyright 1997 The Open Group */
25 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
26 * (c) Copyright 1993, 1994 International Business Machines Corp. *
27 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
28 * (c) Copyright 1993, 1994 Novell, Inc. *
31 * xdm - display manager daemon
33 * $TOG: dm.h /main/12 1998/04/06 13:21:59 mgreess $
35 * Copyright 1988 Massachusetts Institute of Technology
37 * Permission to use, copy, modify, and distribute this software and its
38 * documentation for any purpose and without fee is hereby granted, provided
39 * that the above copyright notice appear in all copies and that both that
40 * copyright notice and this permission notice appear in supporting
41 * documentation, and that the name of M.I.T. not be used in advertising or
42 * publicity pertaining to distribution of the software without specific,
43 * written prior permission. M.I.T. makes no representations about the
44 * suitability of this software for any purpose. It is provided "as is"
45 * without express or implied warranty.
47 * Author: Keith Packard, MIT X Consortium
53 * public interfaces for greet/verify functionality
61 /***************************************************************************
65 ***************************************************************************/
67 # include <errno.h> /* for errno */
68 # include <pwd.h> /* for passwd structure */
70 # include <stdlib.h> /* for exit(), malloc(), abort() */
71 # include <string.h> /* for string functions, bcopy(),
73 # include <sys/param.h> /* for NGROUPS */
74 # include <sys/types.h> /* for fd_set */
75 # include <netinet/in.h> /* for Internet socket stuff */
78 # include <strings.h> /* for BSD string functions */
81 # include <X11/Xlib.h>
84 # include <X11/Xauth.h>
85 # include <X11/Xdmcp.h>
86 #ifdef SVR4 /*** needed for bcopy bcmp ***/
87 #include <X11/Xlibint.h>
90 # include <X11/Xresource.h>
92 #ifndef LAST_SESSION_FILE
93 #define LAST_SESSION_FILE "/.dt/sessions/lastsession"
96 #ifndef CDE_INSTALLATION_TOP
97 #define CDE_INSTALLATION_TOP "/opt/dt"
100 #define DEF_PATH "/usr/bin:" /* same as PATH */
101 #define DEF_SUPATH "/usr/sbin:/usr/bin" /* same as ROOTPATH */
103 #define LANGLISTSIZE 2048
104 #define DELIM " \t" /* delimiters in language list */
107 /***************************************************************************
111 ***************************************************************************/
114 * Default directories containing locale information.
116 #if defined(_AIX) || defined (__osf__)
117 #define DEF_NLS_DIR "/usr/lib/nls/loc"
119 #define DEF_NLS_DIR "/usr/lib/nls/msg"
120 #elif defined(__uxp__) || defined(USL)
121 #define DEF_NLS_DIR "/usr/lib/locale"
123 #define DEF_NLS_DIR CDE_INSTALLATION_TOP "/lib/nls/msg"
127 #define DEF_X11_NLS_SHARE_DIR "/usr/openwin/share/locale"
128 #define DEF_X11_NLS_LIB_DIR "/usr/openwin/lib/locale"
131 /**************************************************************************
135 **************************************************************************/
137 /* Default dummy device name (/etc/utmp "tty line" for foreign displays ) */
138 #define DEF_NETWORK_DEV "/dev/dtremote"
141 * Pseudo-tty file creation routine
143 * For remote connections, the value for 'line' in /etc/utmp must also
144 * exist as a device in the /dev directory for commands such as 'finger'
145 * to operate properly.
147 * For most platforms, /dev/dtremote will simply be a symbolic link
148 * to the /dev/null device.
150 * For AIX, /dev/dtremote will be a character special file whose major
151 * and minor numbers are the same as /dev/null. This is the case since
152 * the AIX init command will chown and chmod the 'line' device if dtlogin
153 * dies while owned by init. If /dev/dtremote were a symlink to /dev/null,
154 * /dev/null whould be chown/chmod such that regular users could no longer
158 #define MK_NETWORK_DEV_PERMS (S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
159 #define MK_NETWORK_DEV(DEV) (mknod(DEV, MK_NETWORK_DEV_PERMS, makedev(2, 2)))
161 #define MK_NETWORK_DEV(DEV) (symlink("/dev/null",DEV))
164 /* Utmp rec prefix */
165 #define UTMPREC_PREFIX "dt"
167 #ifdef SIGNALRETURNSINT
174 #ifndef UID_NO_CHANGE
175 # define UID_NO_CHANGE ((uid_t) -1) /* for chown(2) and setresuid(2) */
178 #ifndef GID_NO_CHANGE
179 # define GID_NO_CHANGE ((gid_t) -1) /* for chown(2) and setresgid(2) */
188 #define bzero(x,y) memset((void *)(x),0,(y))/* use ANSI C version */
190 #define bzero(x,y) memset((x),0,(y)) /* use ANSI C version */
194 #define IsVerifyName(n) ((d->verifyName && (strcmp(d->verifyName,(n)) == 0 )) \
198 /***************************************************************************
202 ***************************************************************************/
204 /*#if defined(SYSV) && !defined(hpux)*/
205 #if defined(SYSV) || defined(SVR4) || defined(linux) || defined(CSRG_BASED)
206 # include <sys/wait.h>
207 # define waitCode(w) WEXITSTATUS(w)
208 # define waitSig(w) WTERMSIG(w)
211 * hpux has a "WCOREDUMP" macro which is undefined in AIX.
212 * For AIX, the macro from hpux's <sys/wait.h> is used.
214 # define waitCore(w) ( ((int)(w)&0200) == 0 ? 0 : 1 )
216 # define waitCore(w) ( WCOREDUMP(w) == 0 ? 0 : 1 )
218 typedef int waitType;
221 # include <sys/wait.h>
224 # include <sys/wait.h>
227 # define waitCode(w) ((w).w_T.w_Retcode)
228 # define waitSig(w) ((w).w_T.w_Termsig)
229 # define waitCore(w) ((w).w_T.w_Coredump)
230 typedef union wait waitType;
233 # define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code))
235 # define waitVal(w) waitCompose(waitSig(w), waitCore(w), waitCode(w))
237 # define waitVal(w) waitCode(w)
242 /***************************************************************************
246 ***************************************************************************/
249 typedef struct my_fd_set { int fds_bits[1]; } my_fd_set;
250 # define FD_ZERO(fdp) bzero ((fdp), sizeof (*(fdp)))
251 # define FD_SET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |= (1 << ((f) % (sizeof (int) * 8))))
252 # define FD_CLR(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8))))
253 # define FD_ISSET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8))))
254 # define FD_TYPE my_fd_set
256 # define FD_TYPE fd_set
262 /***************************************************************************
264 * Defines and structures for display management
266 ***************************************************************************/
268 typedef enum displayStatus { running, notRunning, zombie, phoenix, suspended }
271 typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState;
274 * local - server runs on local host
275 * foreign - server runs on remote host
276 * permanent - session restarted when it exits
277 * transient - session not restarted when it exits
278 * fromFile - started via entry in servers file
279 * fromXDMCP - started with XDMCP
282 typedef struct displayType {
283 unsigned int location:1;
284 unsigned int lifetime:1;
285 unsigned int origin:1;
300 * NONE - no getty running or don't care
301 * LOGIN - getty running
302 * USER - user logged in on getty
304 #define DM_GETTY_NONE 0
305 #define DM_GETTY_LOGIN 1
306 #define DM_GETTY_USER 2
309 struct display *next;
310 /* Xservers file / XDMCP information */
311 char *name; /* DISPLAY name */
312 char *class; /* display class (may be NULL) */
313 DisplayType displayType; /* method to handle with */
314 char **argv; /* program name and arguments */
317 DisplayStatus status; /* current status */
318 int pid; /* process id of child */
319 int serverPid; /* process id of server (-1 if none) */
320 FileState state; /* state during HUP processing */
321 int startTries; /* current start try */
322 int gettyState; /* current getty state */
325 CARD32 sessionID; /* ID of active session */
326 struct sockaddr *peer; /* sockaddr of display peer */
327 int peerlen; /* length of peer name */
328 struct sockaddr *from; /* XDMCP port of display */
330 CARD16 displayNumber;
331 int useChooser; /* Run the chooser for this display */
332 ARRAY8 clientAddr; /* for chooser picking */
333 CARD16 connectionType; /* ... */
336 int bypassLogin; /* bypass login for this display */
337 #endif /* BYPASSLOGIN */
339 /* server management resources */
340 int serverAttempts; /* number of attempts at running X */
341 int openDelay; /* open delay time */
342 int openRepeat; /* open attempts to make */
343 int openTimeout; /* abort open attempt timeout */
344 int startAttempts; /* number of attempts at starting */
345 int pingInterval; /* interval between XSync */
346 int pingTimeout; /* timeout for XSync */
347 int terminateServer;/* restart for each session */
348 int grabServer; /* keep server grabbed for Login */
349 int grabTimeout; /* time to wait for grab */
350 int resetSignal; /* signal to reset server */
351 int termSignal; /* signal to terminate server */
352 int resetForAuth; /* server reads auth file at reset */
354 /* session resources */
355 char *resources; /* resource file */
356 char *xrdb; /* xrdb program */
357 char *cpp; /* cpp program */
358 char *setup; /* Xsetup program */
359 char *startup; /* Xstartup program */
360 char *reset; /* Xreset program */
361 char *session; /* Xsession program */
362 char *userPath; /* path set for session */
363 char *systemPath; /* path set for startup/reset */
364 char *systemShell; /* interpreter for startup/reset */
365 char *failsafeClient;/* a client to start when the session fails */
366 char *chooser; /* chooser program */
368 /* authorization resources */
369 int authorize; /* enable authorization */
370 char **authNames; /* authorization protocol name */
371 unsigned short *authNameLens; /* authorization protocol name len */
372 char *clientAuthFile;/* client specified auth file */
373 char *userAuthDir; /* backup directory for tickets */
375 /* information potentially derived from resources */
376 int authNameNum; /* number of protocol names */
377 Xauth **authorizations; /* authorization data */
378 int authNum; /* number of authorizations */
379 char *authFile; /* file to store authorization in */
380 char *language; /* value for LANG env variable */
381 char *langList; /* list of languages on login screen */
382 char *utmpId; /* id for entry in utmp file */
383 char *gettyLine; /* line to run getty on */
384 char *gettySpeed; /* speed for getty (from gettydefs) */
385 char *environStr; /* environment variable resource */
386 int dtlite; /* boolean for HP DT Lite session */
387 int xdmMode; /* boolean for XDM style session */
388 int sessionType; /* default, XDM, DT, or DTLITE session */
389 char *verifyName; /* default, Kerberos, AFS, B1 */
390 char *pmSearchPath; /* motif pixmap search path */
391 char *bmSearchPath; /* motif bitmap search path */
394 #define PROTO_TIMEOUT (30 * 60) /* 30 minutes should be long enough */
396 struct protoDisplay {
397 struct protoDisplay *next;
398 struct sockaddr *address; /* UDP address */
399 int addrlen; /* UDP address length */
400 unsigned long date; /* creation date */
401 CARD16 displayNumber;
402 CARD16 connectionType;
403 ARRAY8 connectionAddress;
405 Xauth *fileAuthorization;
406 Xauth *xdmcpAuthorization;
407 ARRAY8 authenticationName;
408 ARRAY8 authenticationData;
414 char *name; /* user name */
415 char *password; /* user password */
417 char *b1security; /* user's b1 security */
419 char *string; /* random string */
421 char *name_full; /* full SID */
426 int uid; /* user id */
428 gid_t groups[NGROUPS];/* group list */
429 int ngroups; /* number of elements in groups */
431 int gid; /* group id */
433 char **argv; /* arguments to session */
434 char **userEnviron; /* environment for session */
435 char **systemEnviron;/* environment for startup/reset */
437 long audid; /* audit id */
438 int audflg; /* audit flag */
442 struct mand_ir_t *sec_label_ir;
443 struct mand_ir_t *clearance_ir;
444 /* save these for logout time */
445 struct pr_passwd *prpwd;
452 /* display manager exit status definitions */
454 # define OBEYSESS_DISPLAY 0 /* obey multipleSessions resource */
455 # define REMANAGE_DISPLAY 1 /* force remanage */
456 # define UNMANAGE_DISPLAY 2 /* force deletion */
457 # define RESERVER_DISPLAY 3 /* force server termination */
458 # define OPENFAILED_DISPLAY 4 /* XOpenDisplay failed, retry */
459 # define SUSPEND_DISPLAY 5 /* suspend server while getty is run */
461 # define GREETLESS_FAILED 6
462 #endif /* BYPASSLOGIN */
468 # define CLOSE_ALWAYS 0
469 # define LEAVE_FOR_DISPLAY 1
474 /***************************************************************************
476 * External variable declarations
478 ***************************************************************************/
480 #if !defined(linux) && !defined(CSRG_BASED)
481 extern char *sys_errlist[]; /* system error msgs */
482 extern int sys_nerr; /* system error msgs */
484 extern XrmDatabase XresourceDB;
490 extern char *sysParmsFile;
491 extern char *accessFile;
492 extern char *servers;
493 extern int request_port;
494 extern int debugLevel;
495 extern char *errorLogFile;
496 extern int errorLogSize;
497 extern int daemonMode;
499 extern char *pidFile;
500 extern int lockPidFile;
501 extern char *authDir;
502 extern int autoRescan;
503 extern int removeDomainname;
504 extern char *keyFile;
505 extern char *timeZone;
506 extern int wakeupInterval;
509 extern int langListTimeout;
510 #ifdef DEF_NETWORK_DEV
511 extern char *networkDev;
514 extern char *ignoreLocales;
517 #if !defined (ENABLE_DYNAMIC_LANGLIST)
518 extern char languageList[]; /* util.c */
519 #endif /* ENABLE_DYNAMIC_LANGLIST */
521 extern char **exportList; /* list of export env vars RK 08.17.93 */
526 /****************************************************************************
528 * Public procedure declarations
530 ****************************************************************************/
532 /******************************* access.c **************************/
534 extern int AcceptableDisplayAddress(
535 ARRAY8Ptr clientAddress,
536 #if NeedWidePrototypes
539 CARD16 connectionType,
540 #endif /* NeedWidePrototypes */
543 extern void ForEachChooserHost(
544 ARRAY8Ptr clientAddress,
545 #if NeedWidePrototypes
548 CARD16 connectionType,
549 #endif /* NeedWidePrototypes */
552 extern int ForEachMatchingIndirectHost(
553 ARRAY8Ptr clientAddress,
554 #if NeedWidePrototypes
557 CARD16 connectionType,
558 #endif /* NeedWidePrototypes */
559 int (*function)(CARD16, struct _ARRAY8 *, char *),
561 extern int ScanAccessDatabase( void ) ;
562 extern int UseChooser(
563 ARRAY8Ptr clientAddress,
564 #if NeedWidePrototypes
565 int connectionType) ;
567 CARD16 connectionType) ;
568 #endif /* NeedWidePrototypes */
569 extern ARRAY8Ptr getLocalAddress( void ) ;
572 /******************************* account.c **************************/
579 #if NeedWidePrototypes
583 #endif /* NeedWidePrototypes */
586 extern int UtmpIdOpen(
590 /******************************* apollo.c **************************/
598 /******************************* auth.c **************************/
600 extern int ConvertAddr(
602 int *len, /* return */
603 char **addr); /* return */
605 extern int ConvertFamily(
608 extern int SaveServerAuthorizations(
612 extern void SetAuthorization(
614 extern void SetLocalAuthorization(
616 extern void SetProtoDisplayAuthorization(
617 struct protoDisplay *pdpy,
618 #if NeedWidePrototypes
619 unsigned int authorizationNameLen,
621 unsigned short authorizationNameLen,
622 #endif /* NeedWidePrototypes */
623 char *authorizationName) ;
624 extern void SetUserAuthorization(
626 struct verify_info *verify) ;
627 extern int ValidAuthorization(
628 #if NeedWidePrototypes
629 unsigned int name_length,
631 unsigned short name_length,
632 #endif /* NeedWidePrototypes */
636 /******************************* cryptokey.c **************************/
638 extern void GenerateCryptoKey(
641 extern int InitCryptoKey( void ) ;
644 /******************************* daemon.c **************************/
646 extern void BecomeDaemon( void ) ;
649 /******************************* dm.c **************************/
651 extern int CloseOnFork( void ) ;
652 extern void GettyMessage(
655 extern void RegisterCloseOnFork(
660 extern int StartDisplay(
662 extern void StartDisplays( void ) ;
663 extern void StopDisplay(
665 extern void WaitForChild( void ) ;
669 extern int GettyRunning( struct display *d) ;
672 /******************************* dpylist.c **************************/
674 extern int AnyDisplaysLeft( void ) ;
676 extern struct display * FindDisplayByAddress(
677 struct sockaddr *addr,
679 #if NeedWidePrototypes
682 CARD16 displayNumber) ;
683 #endif /* NeedWidePrototypes */
685 extern struct display * FindDisplayByName(
687 extern struct display * FindDisplayByPid(
689 extern struct display * FindDisplayByServerPid(
691 extern struct display * FindDisplayBySessionID(
694 extern void ForEachDisplay(
696 extern struct display * NewDisplay(
699 extern void RemoveDisplay(
700 struct display *old) ;
703 /******************************* error.c **************************/
707 extern void InitErrorLog( void ) ;
708 extern void CheckErrorFile( void ) ;
709 extern void LogError(
710 unsigned char *fmt, ...) ;
712 unsigned char *fmt, ...) ;
713 extern void LogOutOfMem(
714 unsigned char *fmt, ...) ;
715 extern void LogPanic(
716 unsigned char *fmt, ...) ;
719 extern int SyncErrorFile(
721 extern void TrimErrorFile( void ) ;
724 /******************************* file.c **************************/
726 extern int ParseDisplay( char *source,
727 DisplayType *acceptableTypes,
729 struct passwd *puser );
732 /******************************* mitauth.c **************************/
734 extern Xauth * MitGetAuth(
735 #if NeedWidePrototypes
736 unsigned int namelen,
738 unsigned short namelen,
739 #endif /* NeedWidePrototypes */
742 extern int MitInitAuth(
743 #if NeedWidePrototypes
744 unsigned int name_len,
746 unsigned short name_len,
747 #endif /* NeedWidePrototypes */
751 /******************************* policy.c **************************/
753 extern ARRAY8Ptr Accept(
754 struct sockaddr *from,
756 #if NeedWidePrototypes
759 CARD16 displayNumber) ;
760 #endif /* NeedWidePrototypes */
762 extern int CheckAuthentication(
763 struct protoDisplay *pdpy,
767 extern ARRAY8Ptr ChooseAuthentication(
768 ARRAYofARRAY8Ptr authenticationNames) ;
769 extern int SelectAuthorizationTypeIndex(
770 ARRAY8Ptr authenticationName,
771 ARRAYofARRAY8Ptr authorizationNames) ;
772 extern int SelectConnectionTypeIndex(
773 ARRAY16Ptr connectionTypes,
774 ARRAYofARRAY8Ptr connectionAddresses) ;
778 #if NeedWidePrototypes
781 CARD16 connectionType,
782 #endif /* NeedWidePrototypes */
783 ARRAY8Ptr authenticationName,
786 extern ARRAY8Ptr Accept(
787 struct sockaddr *from,
789 #if NeedWidePrototypes
792 CARD16 displayNumber) ;
793 #endif /* NeedWidePrototypes */
795 /******************************* protodpy.c **************************/
797 extern int DisposeProtoDisplay(
798 struct protoDisplay *pdpy) ;
799 extern void TimeoutProtoDisplays(
801 extern int addressEqual(
806 extern struct protoDisplay * FindProtoDisplay(
807 struct sockaddr *address,
809 #if NeedWidePrototypes
812 CARD16 displayNumber) ;
813 #endif /* NeedWidePrototypes */
815 extern struct protoDisplay * NewProtoDisplay(
816 struct sockaddr *address,
818 #if NeedWidePrototypes
822 CARD16 displayNumber,
823 CARD16 connectionType,
824 #endif /* NeedWidePrototypes */
825 ARRAY8Ptr connectionAddress,
830 /******************************* reset.c **************************/
832 extern void pseudoReset(
836 /******************************* resource.c **************************/
838 extern int GetResource(
843 char *default_value) ;
844 extern void InitResources(
847 extern void ReinitResources( void ) ;
848 extern void LoadDMResources( void ) ;
849 extern void LoadDisplayResources(
851 extern void SetAppName( void ) ;
854 /******************************* server.c **************************/
856 extern int LogOpenError(
858 extern int PingServer(
860 Display *alternateDpy) ;
861 extern void ResetServer(
863 extern int StartServer(
865 extern int StartServerOnce(
867 extern int WaitForServer(
871 /******************************* session.c **************************/
873 extern void ManageSession(
879 struct verify_info *verify,
884 /******************************* socket.c **************************/
886 extern int AnyWellKnownSockets( void ) ;
887 extern int CreateWellKnownSockets( void ) ;
888 extern void DestroyWellKnownSockets( void ) ;
889 extern char * NetworkAddressToHostname(
890 #if NeedWidePrototypes
893 CARD16 connectionType,
894 #endif /* NeedWidePrototypes */
895 ARRAY8Ptr connectionAddress) ;
896 extern char * localHostname( void ) ;
897 extern char * NetworkAddressToName(
898 #if NeedWidePrototypes
901 CARD16 connectionType,
902 #endif /* NeedWidePrototypes */
903 ARRAY8Ptr connectionAddress,
904 #if NeedWidePrototypes
907 CARD16 displayNumber) ;
908 #endif /* NeedWidePrototypes */
909 extern void SendFailed(
912 extern void WaitForSomething( void ) ;
914 extern char * localHostname( void ) ;
918 /******************************* util.c **************************/
920 extern void CleanUpChild( void ) ;
921 extern Cursor GetHourGlass(
923 #if !defined (ENABLE_DYNAMIC_LANGLIST)
924 extern void MakeLangList( void ) ;
926 extern void SetHourGlassCursor(
929 extern char * getEnv(
932 extern char ** parseArgs(
935 extern char ** parseEnv(
938 extern void printEnv(
940 extern char ** setEnv(
944 extern unsigned char * ReadCatalog(
948 extern char ** setLang(
953 /******************************* verify.c **************************/
955 extern void getGroups(
957 struct verify_info *verify,
959 extern int groupMember(
962 extern char ** setDt(
966 extern char ** systemEnv(
970 extern char ** userEnv(
978 struct greet_info *greet,
979 struct verify_info *verify) ;
982 extern char * login_defaults(struct passwd *p,
991 /******************************* version.c **************************/
992 /******************************* xdmauth.c **************************/
994 extern void XdmInitAuth(
995 #if NeedWidePrototypes
996 unsigned int name_len,
998 unsigned short name_len,
999 #endif /* NeedWidePrototypes */
1002 extern Xauth * XdmGetAuth(
1003 #if NeedWidePrototypes
1004 unsigned int namelen,
1006 unsigned short namelen,
1007 #endif /* NeedWidePrototypes */
1010 extern void XdmGetXdmcpAuth(
1011 struct protoDisplay *pdpy,
1012 #if NeedWidePrototypes
1013 unsigned int authorizationNameLen,
1015 unsigned short authorizationNameLen,
1016 #endif /* NeedWidePrototypes */
1017 char *authorizationName) ;
1019 extern int XdmGetKey(
1020 struct protoDisplay *pdpy,
1021 ARRAY8Ptr displayID) ;
1023 extern int XdmCheckAuthentication(
1024 struct protoDisplay *pdpy,
1025 ARRAY8Ptr displayID,
1026 ARRAY8Ptr authenticationName,
1027 ARRAY8Ptr authenticationData) ;
1030 #endif /* HASXDMAUTH */