Home | History | Annotate | Line # | Download | only in include
      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