1 /* 2 3 Copyright 1994, 1998 The Open Group 4 5 Permission to use, copy, modify, distribute, and sell this software and its 6 documentation for any purpose is hereby granted without fee, provided that 7 the above copyright notice appear in all copies and that both that 8 copyright notice and this permission notice appear in supporting 9 documentation. 10 11 The above copyright notice and this permission notice shall be included 12 in all copies or substantial portions of the Software. 13 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 OTHER DEALINGS IN THE SOFTWARE. 21 22 Except as contained in this notice, the name of The Open Group shall 23 not be used in advertising or otherwise to promote the sale, use or 24 other dealings in this Software without prior written authorization 25 from The Open Group. 26 27 */ 28 29 /* 30 * greet.h - interface to xdm's dynamically-loadable modular greeter 31 */ 32 #include <pwd.h> 33 #include <X11/Xlib.h> 34 35 /* 36 * Do this rather than break a build over a const-mismatch 37 */ 38 #if defined(__linux__) || defined(CSRG_BASED) || (defined(sun) && defined(SVR4)) 39 # define CRYPT_ARGS const char *s1, const char *s2 40 # define GETSPNAM_ARGS const char *name 41 # define GETPWNAM_ARGS const char *name 42 #else 43 # define CRYPT_ARGS /*unknown*/ 44 # define GETSPNAM_ARGS /*unknown*/ 45 # define GETPWNAM_ARGS /*unknown*/ 46 #endif 47 48 #if defined(__FreeBSD__) || defined(__bsdi__) 49 # define SETGRENT_TYPE int 50 #else 51 # define SETGRENT_TYPE void 52 #endif 53 54 struct dlfuncs { 55 int (*_PingServer)(struct display *d, Display *alternateDpy); 56 void (*_SessionPingFailed)(struct display *d); 57 void (*_Debug)(const char * fmt, ...); 58 void (*_RegisterCloseOnFork)(int fd); 59 void (*_SecureDisplay)(struct display *d, Display *dpy); 60 void (*_UnsecureDisplay)(struct display *d, Display *dpy); 61 void (*_ClearCloseOnFork)(int fd); 62 void (*_SetupDisplay)(struct display *d); 63 void (*_LogError)(const char * fmt, ...); 64 void (*_SessionExit)(struct display *d, int status, int removeAuth); 65 void (*_DeleteXloginResources)(struct display *d, Display *dpy); 66 int (*_source)(char **environ, char *file); 67 char **(*_defaultEnv)(void); 68 char **(*_setEnv)(char **e, const char *name, const char *value); 69 char **(*_putEnv)(const char *string, char **env); 70 char **(*_parseArgs)(char **argv, const char *string); 71 void (*_printEnv)(char **e); 72 char **(*_systemEnv)(struct display *d, char *user, char *home); 73 void (*_LogOutOfMem)(const char * fmt, ...); 74 SETGRENT_TYPE (*_setgrent)(void); /* no longer used */ 75 struct group *(*_getgrent)(void); /* no longer used */ 76 void (*_endgrent)(void); /* no longer used */ 77 #ifdef HAVE_GETSPNAM 78 struct spwd *(*_getspnam)(GETSPNAM_ARGS); 79 void (*_endspent)(void); 80 #endif 81 struct passwd *(*_getpwnam)(GETPWNAM_ARGS); 82 #if defined(linux) || defined(__GLIBC__) 83 void (*_endpwent)(void); 84 #endif 85 char *(*_crypt)(CRYPT_ARGS); 86 #ifdef USE_PAM 87 pam_handle_t **(*_thepamhp)(void); 88 #endif 89 }; 90 91 /* 92 * Return values for GreetUser(); 93 * Values must be explicitly defined because the greet library 94 * may come from a different vendor. 95 * Negative values indicate an error. 96 */ 97 typedef enum { 98 Greet_Session_Over = 0, /* session managed and over */ 99 Greet_Success = 1, /* greet succeeded, session not managed */ 100 Greet_Failure = -1 /* greet failed */ 101 } greet_user_rtn; 102 103 /* 104 * GreetUser can either handle the user's session or allow xdm to do it. 105 * The return or exit status of GreetUser indicates to xdm whether it 106 * should start a session. 107 * 108 * GreetUser is passed the xdm struct display pointer, a pointer to a 109 * Display, and pointers to greet and verify structs. If it expects xdm 110 * to run the session, it fills in the Display pointer and the fields 111 * of the greet and verify structs. 112 * 113 * The verify struct includes the uid, gid, arguments to run the session, 114 * environment for the session, and environment for startup/reset. 115 * 116 * The greet struct includes the user's name and password but these are 117 * really only needed if xdm is compiled with a user-based authorization 118 * option such as SECURE_RPC or K5AUTH. 119 */ 120 121 extern greet_user_rtn GreetUser(struct display *, Display **, 122 struct verify_info *, struct greet_info *, struct dlfuncs *); 123 124 typedef greet_user_rtn (*GreetUserProc)(struct display *, Display **, 125 struct verify_info *, struct greet_info *, struct dlfuncs *dlfcns); 126 127 #ifdef GREET_LIB 128 /* 129 * The greeter uses some symbols from the main xdm executable. Since some 130 * dynamic linkers are broken, we need to fix things up so that the symbols 131 * are referenced indirectly through function pointers. The definitions 132 * here, are used to hold the pointers to the functions in the main xdm 133 * executable. The pointers are filled in when the GreetUser function is 134 * called, with the pointer values passed as a parameter. 135 */ 136 137 extern int (*__xdm_PingServer)(struct display *d, Display *alternateDpy); 138 extern void (*__xdm_SessionPingFailed)(struct display *d); 139 extern void (*__xdm_Debug)(const char * fmt, ...); 140 extern void (*__xdm_RegisterCloseOnFork)(int fd); 141 extern void (*__xdm_SecureDisplay)(struct display *d, Display *dpy); 142 extern void (*__xdm_UnsecureDisplay)(struct display *d, Display *dpy); 143 extern void (*__xdm_ClearCloseOnFork)(int fd); 144 extern void (*__xdm_SetupDisplay)(struct display *d); 145 extern void (*__xdm_LogError)(const char * fmt, ...); 146 extern void (*__xdm_SessionExit)(struct display *d, int status, int removeAuth); 147 extern void (*__xdm_DeleteXloginResources)(struct display *d, Display *dpy); 148 extern int (*__xdm_source)(char **environ, char *file); 149 extern char **(*__xdm_defaultEnv)(void); 150 extern char **(*__xdm_setEnv)(char **e, const char *name, const char *value); 151 extern char **(*__xdm_putEnv)(const char *string, char **env); 152 extern char **(*__xdm_parseArgs)(char **argv, const char *string); 153 extern void (*__xdm_printEnv)(char **e); 154 extern char **(*__xdm_systemEnv)(struct display *d, char *user, char *home); 155 extern void (*__xdm_LogOutOfMem)(const char * fmt, ...); 156 extern void (*__xdm_setgrent)(void); 157 extern struct group *(*__xdm_getgrent)(void); 158 extern void (*__xdm_endgrent)(void); 159 # ifdef HAVE_GETSPNAM 160 extern struct spwd *(*__xdm_getspnam)(GETSPNAM_ARGS); 161 extern void (*__xdm_endspent)(void); 162 # endif 163 extern struct passwd *(*__xdm_getpwnam)(GETPWNAM_ARGS); 164 # if defined(linux) || defined(__GLIBC__) 165 extern void (*__xdm_endpwent)(void); 166 # endif 167 extern char *(*__xdm_crypt)(CRYPT_ARGS); 168 # ifdef USE_PAM 169 extern pam_handle_t **(*__xdm_thepamhp)(void); 170 # endif 171 172 /* 173 * Force the shared library to call through the function pointer 174 * initialized during the initial call into the library. 175 */ 176 177 # define PingServer (*__xdm_PingServer) 178 # define SessionPingFailed (*__xdm_SessionPingFailed) 179 # define Debug (*__xdm_Debug) 180 # define RegisterCloseOnFork (*__xdm_RegisterCloseOnFork) 181 # define SecureDisplay (*__xdm_SecureDisplay) 182 # define UnsecureDisplay (*__xdm_UnsecureDisplay) 183 # define ClearCloseOnFork (*__xdm_ClearCloseOnFork) 184 # define SetupDisplay (*__xdm_SetupDisplay) 185 # define LogError (*__xdm_LogError) 186 # define SessionExit (*__xdm_SessionExit) 187 # define DeleteXloginResources (*__xdm_DeleteXloginResources) 188 # define source (*__xdm_source) 189 # define defaultEnv (*__xdm_defaultEnv) 190 # define setEnv (*__xdm_setEnv) 191 # define putEnv (*__xdm_putEnv) 192 # define parseArgs (*__xdm_parseArgs) 193 # define printEnv (*__xdm_printEnv) 194 # define systemEnv (*__xdm_systemEnv) 195 # define LogOutOfMem (*__xdm_LogOutOfMem) 196 # define setgrent (*__xdm_setgrent) 197 # define getgrent (*__xdm_getgrent) 198 # define endgrent (*__xdm_endgrent) 199 # ifdef HAVE_GETSPNAM 200 # define getspnam (*__xdm_getspnam) 201 # define endspent (*__xdm_endspent) 202 # endif 203 # define getpwnam (*__xdm_getpwnam) 204 # if defined(linux) || defined(__GLIBC__) 205 # define endpwent (*__xdm_endpwent) 206 # endif 207 # define crypt (*__xdm_crypt) 208 # ifdef USE_PAM 209 # define thepamhp (*__xdm_thepamhp) 210 # endif 211 212 #endif /* GREET_LIB */ 213