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"
121 #define DEF_NLS_DIR CDE_INSTALLATION_TOP "/lib/nls/msg"
125 #define DEF_X11_NLS_SHARE_DIR "/usr/openwin/share/locale"
126 #define DEF_X11_NLS_LIB_DIR "/usr/openwin/lib/locale"
129 /**************************************************************************
133 **************************************************************************/
135 /* Default dummy device name (/etc/utmp "tty line" for foreign displays ) */
136 #define DEF_NETWORK_DEV "/dev/dtremote"
139 * Pseudo-tty file creation routine
141 * For remote connections, the value for 'line' in /etc/utmp must also
142 * exist as a device in the /dev directory for commands such as 'finger'
143 * to operate properly.
145 * For most platforms, /dev/dtremote will simply be a symbolic link
146 * to the /dev/null device.
148 * For AIX, /dev/dtremote will be a character special file whose major
149 * and minor numbers are the same as /dev/null. This is the case since
150 * the AIX init command will chown and chmod the 'line' device if dtlogin
151 * dies while owned by init. If /dev/dtremote were a symlink to /dev/null,
152 * /dev/null whould be chown/chmod such that regular users could no longer
156 #define MK_NETWORK_DEV_PERMS (S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
157 #define MK_NETWORK_DEV(DEV) (mknod(DEV, MK_NETWORK_DEV_PERMS, makedev(2, 2)))
159 #define MK_NETWORK_DEV(DEV) (symlink("/dev/null",DEV))
162 /* Utmp rec prefix */
163 #define UTMPREC_PREFIX "dt"
165 #ifdef SIGNALRETURNSINT
172 #ifndef UID_NO_CHANGE
173 # define UID_NO_CHANGE ((uid_t) -1) /* for chown(2) and setresuid(2) */
176 #ifndef GID_NO_CHANGE
177 # define GID_NO_CHANGE ((gid_t) -1) /* for chown(2) and setresgid(2) */
186 #define bzero(x,y) memset((void *)(x),0,(y))/* use ANSI C version */
188 #define bzero(x,y) memset((x),0,(y)) /* use ANSI C version */
192 #define IsVerifyName(n) ((d->verifyName && (strcmp(d->verifyName,(n)) == 0 )) \
196 /***************************************************************************
200 ***************************************************************************/
202 /*#if defined(SYSV) && !defined(hpux)*/
203 #if defined(SYSV) || defined(SVR4) || defined(linux) || defined(CSRG_BASED)
204 # include <sys/wait.h>
205 # define waitCode(w) WEXITSTATUS(w)
206 # define waitSig(w) WTERMSIG(w)
209 * hpux has a "WCOREDUMP" macro which is undefined in AIX.
210 * For AIX, the macro from hpux's <sys/wait.h> is used.
212 # define waitCore(w) ( ((int)(w)&0200) == 0 ? 0 : 1 )
214 # define waitCore(w) ( WCOREDUMP(w) == 0 ? 0 : 1 )
216 typedef int waitType;
219 # include <sys/wait.h>
222 # include <sys/wait.h>
225 # define waitCode(w) ((w).w_T.w_Retcode)
226 # define waitSig(w) ((w).w_T.w_Termsig)
227 # define waitCore(w) ((w).w_T.w_Coredump)
228 typedef union wait waitType;
231 # define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code))
233 # define waitVal(w) waitCompose(waitSig(w), waitCore(w), waitCode(w))
235 # define waitVal(w) waitCode(w)
240 /***************************************************************************
244 ***************************************************************************/
247 typedef struct my_fd_set { int fds_bits[1]; } my_fd_set;
248 # define FD_ZERO(fdp) bzero ((fdp), sizeof (*(fdp)))
249 # define FD_SET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |= (1 << ((f) % (sizeof (int) * 8))))
250 # define FD_CLR(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8))))
251 # define FD_ISSET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8))))
252 # define FD_TYPE my_fd_set
254 # define FD_TYPE fd_set
260 /***************************************************************************
262 * Defines and structures for display management
264 ***************************************************************************/
266 typedef enum displayStatus { running, notRunning, zombie, phoenix, suspended }
269 typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState;
272 * local - server runs on local host
273 * foreign - server runs on remote host
274 * permanent - session restarted when it exits
275 * transient - session not restarted when it exits
276 * fromFile - started via entry in servers file
277 * fromXDMCP - started with XDMCP
280 typedef struct displayType {
281 unsigned int location:1;
282 unsigned int lifetime:1;
283 unsigned int origin:1;
298 * NONE - no getty running or don't care
299 * LOGIN - getty running
300 * USER - user logged in on getty
302 #define DM_GETTY_NONE 0
303 #define DM_GETTY_LOGIN 1
304 #define DM_GETTY_USER 2
307 struct display *next;
308 /* Xservers file / XDMCP information */
309 char *name; /* DISPLAY name */
310 char *class; /* display class (may be NULL) */
311 DisplayType displayType; /* method to handle with */
312 char **argv; /* program name and arguments */
315 DisplayStatus status; /* current status */
316 int pid; /* process id of child */
317 int serverPid; /* process id of server (-1 if none) */
318 FileState state; /* state during HUP processing */
319 int startTries; /* current start try */
320 int gettyState; /* current getty state */
323 CARD32 sessionID; /* ID of active session */
324 struct sockaddr *peer; /* sockaddr of display peer */
325 int peerlen; /* length of peer name */
326 struct sockaddr *from; /* XDMCP port of display */
328 CARD16 displayNumber;
329 int useChooser; /* Run the chooser for this display */
330 ARRAY8 clientAddr; /* for chooser picking */
331 CARD16 connectionType; /* ... */
334 int bypassLogin; /* bypass login for this display */
335 #endif /* BYPASSLOGIN */
337 /* server management resources */
338 int serverAttempts; /* number of attempts at running X */
339 int openDelay; /* open delay time */
340 int openRepeat; /* open attempts to make */
341 int openTimeout; /* abort open attempt timeout */
342 int startAttempts; /* number of attempts at starting */
343 int pingInterval; /* interval between XSync */
344 int pingTimeout; /* timeout for XSync */
345 int terminateServer;/* restart for each session */
346 int grabServer; /* keep server grabbed for Login */
347 int grabTimeout; /* time to wait for grab */
348 int resetSignal; /* signal to reset server */
349 int termSignal; /* signal to terminate server */
350 int resetForAuth; /* server reads auth file at reset */
352 /* session resources */
353 char *resources; /* resource file */
354 char *xrdb; /* xrdb program */
355 char *cpp; /* cpp program */
356 char *setup; /* Xsetup program */
357 char *startup; /* Xstartup program */
358 char *reset; /* Xreset program */
359 char *session; /* Xsession program */
360 char *userPath; /* path set for session */
361 char *systemPath; /* path set for startup/reset */
362 char *systemShell; /* interpreter for startup/reset */
363 char *failsafeClient;/* a client to start when the session fails */
364 char *chooser; /* chooser program */
366 /* authorization resources */
367 int authorize; /* enable authorization */
368 char **authNames; /* authorization protocol name */
369 unsigned short *authNameLens; /* authorization protocol name len */
370 char *clientAuthFile;/* client specified auth file */
371 char *userAuthDir; /* backup directory for tickets */
373 /* information potentially derived from resources */
374 int authNameNum; /* number of protocol names */
375 Xauth **authorizations; /* authorization data */
376 int authNum; /* number of authorizations */
377 char *authFile; /* file to store authorization in */
378 char *language; /* value for LANG env variable */
379 char *langList; /* list of languages on login screen */
380 char *utmpId; /* id for entry in utmp file */
381 char *gettyLine; /* line to run getty on */
382 char *gettySpeed; /* speed for getty (from gettydefs) */
383 char *environStr; /* environment variable resource */
384 int dtlite; /* boolean for HP DT Lite session */
385 int xdmMode; /* boolean for XDM style session */
386 int sessionType; /* default, XDM, DT, or DTLITE session */
387 char *verifyName; /* default, Kerberos, AFS, B1 */
388 char *pmSearchPath; /* motif pixmap search path */
389 char *bmSearchPath; /* motif bitmap search path */
392 #define PROTO_TIMEOUT (30 * 60) /* 30 minutes should be long enough */
394 struct protoDisplay {
395 struct protoDisplay *next;
396 struct sockaddr *address; /* UDP address */
397 int addrlen; /* UDP address length */
398 unsigned long date; /* creation date */
399 CARD16 displayNumber;
400 CARD16 connectionType;
401 ARRAY8 connectionAddress;
403 Xauth *fileAuthorization;
404 Xauth *xdmcpAuthorization;
405 ARRAY8 authenticationName;
406 ARRAY8 authenticationData;
412 char *name; /* user name */
413 char *password; /* user password */
415 char *b1security; /* user's b1 security */
417 char *string; /* random string */
419 char *name_full; /* full SID */
424 int uid; /* user id */
426 gid_t groups[NGROUPS];/* group list */
427 int ngroups; /* number of elements in groups */
429 int gid; /* group id */
431 char **argv; /* arguments to session */
432 char **userEnviron; /* environment for session */
433 char **systemEnviron;/* environment for startup/reset */
435 long audid; /* audit id */
436 int audflg; /* audit flag */
440 struct mand_ir_t *sec_label_ir;
441 struct mand_ir_t *clearance_ir;
442 /* save these for logout time */
443 struct pr_passwd *prpwd;
450 /* display manager exit status definitions */
452 # define OBEYSESS_DISPLAY 0 /* obey multipleSessions resource */
453 # define REMANAGE_DISPLAY 1 /* force remanage */
454 # define UNMANAGE_DISPLAY 2 /* force deletion */
455 # define RESERVER_DISPLAY 3 /* force server termination */
456 # define OPENFAILED_DISPLAY 4 /* XOpenDisplay failed, retry */
457 # define SUSPEND_DISPLAY 5 /* suspend server while getty is run */
459 # define GREETLESS_FAILED 6
460 #endif /* BYPASSLOGIN */
466 # define CLOSE_ALWAYS 0
467 # define LEAVE_FOR_DISPLAY 1
472 /***************************************************************************
474 * External variable declarations
476 ***************************************************************************/
478 #if !defined(linux) && !defined(CSRG_BASED)
479 extern char *sys_errlist[]; /* system error msgs */
480 extern int sys_nerr; /* system error msgs */
482 extern XrmDatabase XresourceDB;
488 extern char *sysParmsFile;
489 extern char *accessFile;
490 extern char *servers;
491 extern int request_port;
492 extern int debugLevel;
493 extern char *errorLogFile;
494 extern int errorLogSize;
495 extern int daemonMode;
497 extern char *pidFile;
498 extern int lockPidFile;
499 extern char *authDir;
500 extern int autoRescan;
501 extern int removeDomainname;
502 extern char *keyFile;
503 extern char *timeZone;
504 extern int wakeupInterval;
507 extern int langListTimeout;
508 #ifdef DEF_NETWORK_DEV
509 extern char *networkDev;
512 extern char *ignoreLocales;
515 #if !defined (ENABLE_DYNAMIC_LANGLIST)
516 extern char languageList[]; /* util.c */
517 #endif /* ENABLE_DYNAMIC_LANGLIST */
519 extern char **exportList; /* list of export env vars RK 08.17.93 */
524 /****************************************************************************
526 * Public procedure declarations
528 ****************************************************************************/
530 /******************************* access.c **************************/
532 extern int AcceptableDisplayAddress(
533 ARRAY8Ptr clientAddress,
534 #if NeedWidePrototypes
537 CARD16 connectionType,
538 #endif /* NeedWidePrototypes */
541 extern void ForEachChooserHost(
542 ARRAY8Ptr clientAddress,
543 #if NeedWidePrototypes
546 CARD16 connectionType,
547 #endif /* NeedWidePrototypes */
550 extern int ForEachMatchingIndirectHost(
551 ARRAY8Ptr clientAddress,
552 #if NeedWidePrototypes
555 CARD16 connectionType,
556 #endif /* NeedWidePrototypes */
557 int (*function)(CARD16, struct _ARRAY8 *, char *),
559 extern int ScanAccessDatabase( void ) ;
560 extern int UseChooser(
561 ARRAY8Ptr clientAddress,
562 #if NeedWidePrototypes
563 int connectionType) ;
565 CARD16 connectionType) ;
566 #endif /* NeedWidePrototypes */
567 extern ARRAY8Ptr getLocalAddress( void ) ;
570 /******************************* account.c **************************/
577 #if NeedWidePrototypes
581 #endif /* NeedWidePrototypes */
584 extern int UtmpIdOpen(
588 /******************************* apollo.c **************************/
596 /******************************* auth.c **************************/
598 extern int ConvertAddr(
600 int *len, /* return */
601 char **addr); /* return */
603 extern int ConvertFamily(
606 extern int SaveServerAuthorizations(
610 extern void SetAuthorization(
612 extern void SetLocalAuthorization(
614 extern void SetProtoDisplayAuthorization(
615 struct protoDisplay *pdpy,
616 #if NeedWidePrototypes
617 unsigned int authorizationNameLen,
619 unsigned short authorizationNameLen,
620 #endif /* NeedWidePrototypes */
621 char *authorizationName) ;
622 extern void SetUserAuthorization(
624 struct verify_info *verify) ;
625 extern int ValidAuthorization(
626 #if NeedWidePrototypes
627 unsigned int name_length,
629 unsigned short name_length,
630 #endif /* NeedWidePrototypes */
634 /******************************* cryptokey.c **************************/
636 extern void GenerateCryptoKey(
639 extern int InitCryptoKey( void ) ;
642 /******************************* daemon.c **************************/
644 extern void BecomeDaemon( void ) ;
647 /******************************* dm.c **************************/
649 extern int CloseOnFork( void ) ;
650 extern void GettyMessage(
653 extern void RegisterCloseOnFork(
658 extern int StartDisplay(
660 extern void StartDisplays( void ) ;
661 extern void StopDisplay(
663 extern void WaitForChild( void ) ;
667 extern int GettyRunning( struct display *d) ;
670 /******************************* dpylist.c **************************/
672 extern int AnyDisplaysLeft( void ) ;
674 extern struct display * FindDisplayByAddress(
675 struct sockaddr *addr,
677 #if NeedWidePrototypes
680 CARD16 displayNumber) ;
681 #endif /* NeedWidePrototypes */
683 extern struct display * FindDisplayByName(
685 extern struct display * FindDisplayByPid(
687 extern struct display * FindDisplayByServerPid(
689 extern struct display * FindDisplayBySessionID(
692 extern void ForEachDisplay(
694 extern struct display * NewDisplay(
697 extern void RemoveDisplay(
698 struct display *old) ;
701 /******************************* error.c **************************/
705 extern void InitErrorLog( void ) ;
706 extern void CheckErrorFile( void ) ;
707 extern void LogError(
708 unsigned char *fmt, ...) ;
710 unsigned char *fmt, ...) ;
711 extern void LogOutOfMem(
712 unsigned char *fmt, ...) ;
713 extern void LogPanic(
714 unsigned char *fmt, ...) ;
717 extern int SyncErrorFile(
719 extern void TrimErrorFile( void ) ;
722 /******************************* file.c **************************/
724 extern int ParseDisplay( char *source,
725 DisplayType *acceptableTypes,
727 struct passwd *puser );
730 /******************************* mitauth.c **************************/
732 extern Xauth * MitGetAuth(
733 #if NeedWidePrototypes
734 unsigned int namelen,
736 unsigned short namelen,
737 #endif /* NeedWidePrototypes */
740 extern int MitInitAuth(
741 #if NeedWidePrototypes
742 unsigned int name_len,
744 unsigned short name_len,
745 #endif /* NeedWidePrototypes */
749 /******************************* policy.c **************************/
751 extern ARRAY8Ptr Accept(
752 struct sockaddr *from,
754 #if NeedWidePrototypes
757 CARD16 displayNumber) ;
758 #endif /* NeedWidePrototypes */
760 extern int CheckAuthentication(
761 struct protoDisplay *pdpy,
765 extern ARRAY8Ptr ChooseAuthentication(
766 ARRAYofARRAY8Ptr authenticationNames) ;
767 extern int SelectAuthorizationTypeIndex(
768 ARRAY8Ptr authenticationName,
769 ARRAYofARRAY8Ptr authorizationNames) ;
770 extern int SelectConnectionTypeIndex(
771 ARRAY16Ptr connectionTypes,
772 ARRAYofARRAY8Ptr connectionAddresses) ;
776 #if NeedWidePrototypes
779 CARD16 connectionType,
780 #endif /* NeedWidePrototypes */
781 ARRAY8Ptr authenticationName,
784 extern ARRAY8Ptr Accept(
785 struct sockaddr *from,
787 #if NeedWidePrototypes
790 CARD16 displayNumber) ;
791 #endif /* NeedWidePrototypes */
793 /******************************* protodpy.c **************************/
795 extern int DisposeProtoDisplay(
796 struct protoDisplay *pdpy) ;
797 extern void TimeoutProtoDisplays(
799 extern int addressEqual(
804 extern struct protoDisplay * FindProtoDisplay(
805 struct sockaddr *address,
807 #if NeedWidePrototypes
810 CARD16 displayNumber) ;
811 #endif /* NeedWidePrototypes */
813 extern struct protoDisplay * NewProtoDisplay(
814 struct sockaddr *address,
816 #if NeedWidePrototypes
820 CARD16 displayNumber,
821 CARD16 connectionType,
822 #endif /* NeedWidePrototypes */
823 ARRAY8Ptr connectionAddress,
828 /******************************* reset.c **************************/
830 extern void pseudoReset(
834 /******************************* resource.c **************************/
836 extern int GetResource(
841 char *default_value) ;
842 extern void InitResources(
845 extern void ReinitResources( void ) ;
846 extern void LoadDMResources( void ) ;
847 extern void LoadDisplayResources(
849 extern void SetAppName( void ) ;
852 /******************************* server.c **************************/
854 extern int LogOpenError(
856 extern int PingServer(
858 Display *alternateDpy) ;
859 extern void ResetServer(
861 extern int StartServer(
863 extern int StartServerOnce(
865 extern int WaitForServer(
869 /******************************* session.c **************************/
871 extern void ManageSession(
877 struct verify_info *verify,
882 /******************************* socket.c **************************/
884 extern int AnyWellKnownSockets( void ) ;
885 extern int CreateWellKnownSockets( void ) ;
886 extern void DestroyWellKnownSockets( void ) ;
887 extern char * NetworkAddressToHostname(
888 #if NeedWidePrototypes
891 CARD16 connectionType,
892 #endif /* NeedWidePrototypes */
893 ARRAY8Ptr connectionAddress) ;
894 extern char * localHostname( void ) ;
895 extern char * NetworkAddressToName(
896 #if NeedWidePrototypes
899 CARD16 connectionType,
900 #endif /* NeedWidePrototypes */
901 ARRAY8Ptr connectionAddress,
902 #if NeedWidePrototypes
905 CARD16 displayNumber) ;
906 #endif /* NeedWidePrototypes */
907 extern void SendFailed(
910 extern void WaitForSomething( void ) ;
912 extern char * localHostname( void ) ;
916 /******************************* util.c **************************/
918 extern void CleanUpChild( void ) ;
919 extern Cursor GetHourGlass(
921 #if !defined (ENABLE_DYNAMIC_LANGLIST)
922 extern void MakeLangList( void ) ;
924 extern void SetHourGlassCursor(
927 extern char * getEnv(
930 extern char ** parseArgs(
933 extern char ** parseEnv(
936 extern void printEnv(
938 extern char ** setEnv(
942 extern unsigned char * ReadCatalog(
946 extern char ** setLang(
951 /******************************* verify.c **************************/
953 extern void getGroups(
955 struct verify_info *verify,
957 extern int groupMember(
960 extern char ** setDt(
964 extern char ** systemEnv(
968 extern char ** userEnv(
976 struct greet_info *greet,
977 struct verify_info *verify) ;
980 extern char * login_defaults(struct passwd *p,
989 /******************************* version.c **************************/
990 /******************************* xdmauth.c **************************/
992 extern void XdmInitAuth(
993 #if NeedWidePrototypes
994 unsigned int name_len,
996 unsigned short name_len,
997 #endif /* NeedWidePrototypes */
1000 extern Xauth * XdmGetAuth(
1001 #if NeedWidePrototypes
1002 unsigned int namelen,
1004 unsigned short namelen,
1005 #endif /* NeedWidePrototypes */
1008 extern void XdmGetXdmcpAuth(
1009 struct protoDisplay *pdpy,
1010 #if NeedWidePrototypes
1011 unsigned int authorizationNameLen,
1013 unsigned short authorizationNameLen,
1014 #endif /* NeedWidePrototypes */
1015 char *authorizationName) ;
1017 extern int XdmGetKey(
1018 struct protoDisplay *pdpy,
1019 ARRAY8Ptr displayID) ;
1021 extern int XdmCheckAuthentication(
1022 struct protoDisplay *pdpy,
1023 ARRAY8Ptr displayID,
1024 ARRAY8Ptr authenticationName,
1025 ARRAY8Ptr authenticationData) ;
1028 #endif /* HASXDMAUTH */