#ifndef _DM_H_
#define _DM_H_ 1
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xmd.h>
#include <X11/Xauth.h>
#include <X11/Intrinsic.h>
#if defined(X_POSIX_C_SOURCE)
#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
#include <setjmp.h>
#include <limits.h>
#undef _POSIX_C_SOURCE
#else
#include <setjmp.h>
#include <limits.h>
#endif
#include <time.h>
#define Time_t time_t
#define XDMCP
#ifdef XDMCP
#include <X11/Xdmcp.h>
#endif
#ifdef pegasus
#undef dirty
#endif
#ifndef X_NOT_POSIX
#ifdef _POSIX_SOURCE
#include <sys/wait.h>
#else
#define _POSIX_SOURCE
#ifdef __SCO__
#include <sys/procset.h>
#include <sys/siginfo.h>
#endif
#include <sys/wait.h>
#undef _POSIX_SOURCE
#endif
# define waitCode(w) (WIFEXITED(w) ? WEXITSTATUS(w) : 0)
# define waitSig(w) (WIFSIGNALED(w) ? WTERMSIG(w) : 0)
# define waitCore(w) 0
typedef int waitType;
#else
#ifdef SYSV
# define waitCode(w) (((w) >> 8) & 0x7f)
# define waitSig(w) ((w) & 0xff)
# define waitCore(w) (((w) >> 15) & 0x01)
typedef int waitType;
#else
# include <sys/wait.h>
# define waitCode(w) ((w).w_T.w_Retcode)
# define waitSig(w) ((w).w_T.w_Termsig)
# define waitCore(w) ((w).w_T.w_Coredump)
typedef union wait waitType;
#endif
#endif
#ifdef USE_PAM
#include <security/pam_appl.h>
#endif
#ifdef CSRG_BASED
#include <sys/param.h>
#ifdef HAS_SETUSERCONTEXT
#include <login_cap.h>
#include <pwd.h>
#ifdef USE_BSDAUTH
#include <bsd_auth.h>
#endif
#endif
#endif
# define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code))
# define waitVal(w) waitCompose(waitSig(w), waitCore(w), waitCode(w))
typedef enum displayStatus { running, notRunning, zombie, phoenix } DisplayStatus;
#ifndef FD_ZERO
typedef struct my_fd_set { int fds_bits[1]; } my_fd_set;
# define FD_ZERO(fdp) bzero ((fdp), sizeof (*(fdp)))
# define FD_SET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |= (1 << ((f) % (sizeof (int) * 8))))
# define FD_CLR(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8))))
# define FD_ISSET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8))))
# define FD_TYPE my_fd_set
#else
# define FD_TYPE fd_set
#endif
typedef struct displayType {
unsigned int location:1;
unsigned int lifetime:1;
unsigned int origin:1;
} DisplayType;
# define Local 1
# define Foreign 0
# define Permanent 1
# define Transient 0
# define FromFile 1
# define FromXDMCP 0
extern DisplayType parseDisplayType (char *string, int *usedDefault);
typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState;
struct display {
struct display *next;
char *name;
char *class;
DisplayType displayType;
char **argv;
DisplayStatus status;
pid_t pid;
pid_t serverPid;
FileState state;
int startTries;
Time_t lastCrash;
#ifdef XDMCP
CARD32 sessionID;
XdmcpNetaddr peer;
int peerlen;
XdmcpNetaddr from;
int fromlen;
CARD16 displayNumber;
int useChooser;
ARRAY8 clientAddr;
CARD16 connectionType;
int xdmcpFd;
#endif
int serverAttempts;
int openDelay;
int openRepeat;
int openTimeout;
int startAttempts;
int pingInterval;
int pingTimeout;
int terminateServer;
int grabServer;
int grabTimeout;
int resetSignal;
int termSignal;
int resetForAuth;
char *keymaps;
char *greeterLib;
char *resources;
char *xrdb;
char *setup;
char *startup;
char *reset;
char *session;
char *userPath;
char *systemPath;
char *systemShell;
char *failsafeClient;
char *chooser;
int authorize;
char **authNames;
unsigned short *authNameLens;
char *clientAuthFile;
char *userAuthDir;
int authComplain;
int authNameNum;
Xauth **authorizations;
int authNum;
char *authFile;
int version;
char *willing;
};
#ifdef XDMCP
#define PROTO_TIMEOUT (30 * 60)
#define XDM_BROKEN_INTERVAL (120)
struct protoDisplay {
struct protoDisplay *next;
XdmcpNetaddr address;
int addrlen;
unsigned long date;
CARD16 displayNumber;
CARD16 connectionType;
ARRAY8 connectionAddress;
CARD32 sessionID;
Xauth *fileAuthorization;
Xauth *xdmcpAuthorization;
ARRAY8 authenticationName;
ARRAY8 authenticationData;
XdmAuthKeyRec key;
};
#endif
struct greet_info {
char *name;
char *password;
char *string;
char *passwd;
int version;
Boolean allow_null_passwd;
Boolean allow_root_login;
};
typedef void (*ChooserFunc)(CARD16 connectionType, ARRAY8Ptr addr, char *closure);
typedef void (*ListenFunc)(ARRAY8Ptr addr, void **closure);
struct verify_info {
int uid;
int gid;
char **argv;
char **userEnviron;
char **systemEnviron;
int version;
};
# define OBEYSESS_DISPLAY 0
# define REMANAGE_DISPLAY 1
# define UNMANAGE_DISPLAY 2
# define RESERVER_DISPLAY 3
# define OPENFAILED_DISPLAY 4
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
extern char *config;
extern char *servers;
extern int request_port;
extern int debugLevel;
extern char *errorLogFile;
extern int daemonMode;
extern char *pidFile;
extern int lockPidFile;
extern char *authDir;
extern int autoRescan;
extern int removeDomainname;
extern char *keyFile;
extern char *accessFile;
extern char **exportList;
#if !defined(ARC4_RANDOM)
extern char *randomFile;
extern char *prngdSocket;
extern int prngdPort;
#endif
extern char *greeterLib;
extern char *willing;
extern int choiceTimeout;
extern struct display *FindDisplayByName (char *name),
*FindDisplayBySessionID (CARD32 sessionID),
*FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber),
*FindDisplayByPid (pid_t pid),
*FindDisplayByServerPid (pid_t serverPid),
*NewDisplay (char *name, char *class);
extern struct protoDisplay *FindProtoDisplay (
XdmcpNetaddr address,
int addrlen,
CARD16 displayNumber);
extern struct protoDisplay *NewProtoDisplay (
XdmcpNetaddr address,
int addrlen,
CARD16 displayNumber,
CARD16 connectionType,
ARRAY8Ptr connectionAddress,
CARD32 sessionID);
extern void DrawFail (Widget ctx);
extern ARRAY8Ptr getLocalAddress (void);
extern int AcceptableDisplayAddress (ARRAY8Ptr clientAddress, CARD16 connectionType, xdmOpCode type);
extern int ForEachMatchingIndirectHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
extern int ScanAccessDatabase (void);
extern int UseChooser (ARRAY8Ptr clientAddress, CARD16 connectionType);
extern void ForEachChooserHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure);
extern void ForEachListenAddr(ListenFunc listenfunction,
ListenFunc mcastfcuntion, void **closure);
extern ARRAY8Ptr IndirectChoice (ARRAY8Ptr clientAddress, CARD16 connectionType);
extern int IsIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
extern int RememberIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType);
extern void ForgetIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType);
extern void ProcessChooserSocket (int fd);
extern void RunChooser (struct display *d);
extern void BecomeDaemon (void);
extern void BecomeOrphan (void);
extern void CloseOnFork (void);
extern void RegisterCloseOnFork (int fd);
extern void StartDisplay (struct display *d);
#ifndef HAS_SETPROCTITLE
extern void SetTitle (char *name, ...);
#endif
extern int AnyDisplaysLeft (void);
extern void ForEachDisplay (void (*f)(struct display *));
extern void RemoveDisplay (struct display *old);
extern void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable);
extern char *NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp);
extern char *NetaddrPort(XdmcpNetaddr netaddrp, int *lenp);
extern int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr);
extern int NetaddrFamily (XdmcpNetaddr netaddrp);
extern int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2);
#if 0
extern ARRAY8Ptr Accept ();
#endif
extern ARRAY8Ptr ChooseAuthentication (ARRAYofARRAY8Ptr authenticationNames);
extern int CheckAuthentication (struct protoDisplay *pdpy, ARRAY8Ptr displayID, ARRAY8Ptr name, ARRAY8Ptr data);
extern int SelectAuthorizationTypeIndex (ARRAY8Ptr authenticationName, ARRAYofARRAY8Ptr authorizationNames);
extern int SelectConnectionTypeIndex (ARRAY16Ptr connectionTypes, ARRAYofARRAY8Ptr connectionAddresses);
extern int Willing (ARRAY8Ptr addr, CARD16 connectionType, ARRAY8Ptr authenticationName, ARRAY8Ptr status, xdmOpCode type);
extern void DisposeProtoDisplay(struct protoDisplay *pdpy);
extern void pseudoReset (Display *dpy);
extern void InitResources (int argc, char **argv);
extern void LoadDMResources (void);
extern void LoadServerResources (struct display *d);
extern void LoadSessionResources (struct display *d);
extern void ReinitResources (void);
#ifdef USE_PAM
extern pam_handle_t **thepamhp(void);
extern pam_handle_t *thepamh(void);
#endif
extern char **defaultEnv (void);
extern char **systemEnv (struct display *d, char *user, char *home);
extern int PingServer(struct display *d, Display *alternateDpy);
extern int source (char **environ, char *file);
extern void ClearCloseOnFork (int fd);
extern void DeleteXloginResources (struct display *d, Display *dpy);
extern void LoadXloginResources (struct display *d);
extern void ManageSession (struct display *d);
extern void SecureDisplay (struct display *d, Display *dpy);
extern void SessionExit (struct display *d, int status, int removeAuth);
extern void SessionPingFailed (struct display *d);
extern void SetupDisplay (struct display *d);
extern void UnsecureDisplay (struct display *d, Display *dpy);
extern void execute(char **argv, char **environ);
extern char *_SysErrorMsg (int n);
extern int StartServer (struct display *d);
extern int WaitForServer (struct display *d);
extern void ResetServer (struct display *d);
extern int GetChooserAddr (char *addr, int *lenp);
extern void CreateWellKnownSockets (void);
extern void UpdateListenSockets (void);
extern void CloseListenSockets (void);
extern void ProcessListenSockets (fd_set *readmask);
extern char *localHostname (void);
extern char **parseArgs (char **argv, char *string);
extern char **setEnv (char **e, char *name, char *value);
extern char **putEnv(const char *string, char **env);
extern char *getEnv (char **e, char *name);
extern void CleanUpChild (void);
extern void freeArgs (char **argv);
extern void freeEnv (char **env);
extern void printEnv (char **e);
extern int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify);
extern char *NetworkAddressToHostname (CARD16 connectionType, ARRAY8Ptr connectionAddress);
extern int AnyWellKnownSockets (void);
extern void DestroyWellKnownSockets (void);
extern void SendFailed (struct display *d, char *reason);
extern void StopDisplay (struct display *d);
extern void WaitForChild (void);
extern void WaitForSomething (void);
extern void init_session_id(void);
extern void registerHostname(char *name, int namelen);
extern void ProcessRequestSocket(int fd);
# define CLOSE_ALWAYS 0
# define LEAVE_FOR_DISPLAY 1
#include <stdlib.h>
#define SIGVAL RETSIGTYPE
#if defined(X_NOT_POSIX) || defined(__UNIXOS2__) || defined(__NetBSD__) && defined(__sparc__)
#if defined(SYSV) || defined(__UNIXOS2__)
#define SIGNALS_RESET_WHEN_CAUGHT
#define UNRELIABLE_SIGNALS
#endif
#define Setjmp(e) setjmp(e)
#define Longjmp(e,v) longjmp(e,v)
#define Jmp_buf jmp_buf
#else
#define Setjmp(e) sigsetjmp(e,1)
#define Longjmp(e,v) siglongjmp(e,v)
#define Jmp_buf sigjmp_buf
#endif
typedef SIGVAL (*SIGFUNC)(int);
SIGVAL (*Signal(int, SIGFUNC Handler))(int);
#endif