/*
 * This file was generated automatically by xsubpp version 1.9508 from the
 * contents of PAM.xs. Do not edit this file, edit PAM.xs instead.
 *
 *	ANY CHANGES MADE HERE WILL BE LOST!
 *
 */

#line 1 "PAM.xs"
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif

#include <PAM_config.h>

#if defined( HAVE_SECURITY_PAM_APPL_H )
# include <security/pam_appl.h>
#else
# if defined( HAVE_PAM_PAM_APPL_H )
#   include <pam/pam_appl.h>
# endif
#endif

/* 
   Description of the macros used by this file.

   | If your PAM library has the pam_get/putenv functions (PAM versions 
   | after 0.54) the following macro should be defined.
   |
   #define HAVE_PAM_GETENV

   | The following macro activates a workaround for a bug in the solaris 2.6
   | PAM library by setting a pointer to the perl conversation function
   | before every call to a pam function
   |
   #define STATIC_CONV_FUNC
*/


/* this is now determined from configure script */


#if defined( sun ) || defined( __hpux )

  #define CONST_VOID	void
  #define CONST_STRUCT	struct

#else

  #define CONST_STRUCT	const struct
  #define CONST_VOID	const void

#endif

struct perl_pam_data {
  SV* conv_func;
  SV* delay_func;
};

typedef struct pam_conv sPamConv;
typedef struct pam_response sPamResponse;
typedef struct perl_pam_data sPerlPamData;

/* 
 * Gets conv_struct->appdata_ptr and casts it as a sPerlPamData
 */
static sPerlPamData* 
get_perl_pam_data(pamh)
pam_handle_t *pamh;
{
    int res;
    sPamConv *cs;
    res = pam_get_item(pamh, PAM_CONV, (CONST_VOID **)&cs);
    if (res != PAM_SUCCESS || cs == NULL || cs->appdata_ptr == NULL)
        croak("Error in getting pam data!");
    else
        return (sPerlPamData*)cs->appdata_ptr;
}


#ifdef STATIC_CONV_FUNC

    static sPerlPamData *static_perl_pam_data = NULL;

    #define SET_CONV_FUNC(pamh) static_perl_pam_data = get_perl_pam_data(pamh)

#else

    #define SET_CONV_FUNC(pamh)

#endif

static int
not_here(s)
char *s;
{
    croak("%s not implemented on this architecture", s);
    return -1;
}


static int
my_conv_func(num_msg, msg, resp, appdata_ptr)
        int num_msg;
        CONST_STRUCT pam_message **msg;
        sPamResponse **resp;
        void *appdata_ptr;
{
        int i,res_cnt,res;
	STRLEN len;
        sPamResponse *reply = NULL;
        SV *strSV;
        char *str;
        dSP;
	
        ENTER;
        SAVETMPS;

        PUSHMARK(sp);
        for (i = 0; i < num_msg; i++) {
	#ifdef sun
            XPUSHs(sv_2mortal(newSViv((*msg)[i].msg_style)));
            XPUSHs(sv_2mortal(newSVpv((*msg)[i].msg, 0)));
	#else
            XPUSHs(sv_2mortal(newSViv((msg[i])->msg_style)));
            XPUSHs(sv_2mortal(newSVpv((msg[i])->msg, 0)));
	#endif
        }
        PUTBACK;

#ifdef STATIC_CONV_FUNC
	appdata_ptr = static_perl_pam_data;
#endif
	if ( !SvTRUE(((sPerlPamData*)appdata_ptr)->conv_func) )
	    croak("Calling empty conversation function!");
        res_cnt = 
	  perl_call_sv(((sPerlPamData*)appdata_ptr)->conv_func, G_ARRAY);

        SPAGAIN;
	
        if (res_cnt == 1) { // only return code
	  res = POPi;
	  reply = NULL;
        } 
	else if (res_cnt == 2*num_msg + 1) {
	    res = POPi;
	    res_cnt--;
	    if (res_cnt > 0) {
		res_cnt /= 2;
        	reply = malloc( res_cnt * sizeof(sPamResponse));
        	for (i = res_cnt - 1; i >= 0; i--) {
        	    strSV = POPs;
        	    str = SvPV(strSV, len);
        	    reply[i].resp_retcode = POPi;
		    reply[i].resp = malloc(len+1);
		    memcpy(reply[i].resp, str, len);
		    reply[i].resp[len] = 0;
/*
		printf("Code %d and str %s\n",  reply[i].resp_retcode, 
						reply[i].resp);
*/
           	}
	    }
        } 
        else {
	  croak("The output list of the PAM conversation function"
		" must have twice the size of the input list plus one!");
	  res = PAM_CONV_ERR;
	}

        PUTBACK;

        FREETMPS;
        LEAVE;

	*resp = reply;
	return res;
}


/*
 * We must also handle setting a delay function with a prototype:
 *
 *     void (*delay_fn)(int retval, unsigned usec_delay, void *appdata_ptr);
 *
 * by a call to pam_set_item(pamh, PAM_FAIL_DELAY, fail_delay);
 *
 * Works only on Linux-PAM >= 0.68
 */
static void
my_delay_func(status, delay, appdata_ptr)
int status;
unsigned int delay;
void *appdata_ptr;
{
    dSP ;

    if (appdata_ptr == NULL)
        croak("Empty perl pam data");
    if (!SvTRUE(((sPerlPamData*)appdata_ptr)->delay_func))
        croak("Calling empty delay function!");
    
    /* printf("st: %d, dl: %d\n",status,delay); */

    PUSHMARK(sp) ;
    XPUSHs(sv_2mortal(newSViv(status)));
    XPUSHs(sv_2mortal(newSViv(delay)));
    PUTBACK ;

    perl_call_sv(((sPerlPamData*)appdata_ptr)->delay_func, 
		 G_VOID | G_DISCARD);
}

static double
constant(name, arg)
char *name;
int arg;
{
    errno = 0;

    if (strncmp(name, "PAM_", 4) == 0) {
      name = &name[4];
      /* error codes */
      if (strcmp(name, "SUCCESS") == 0)
	  return PAM_SUCCESS;
      else if (strcmp(name, "OPEN_ERR") == 0)
	  return PAM_OPEN_ERR;
      else if (strcmp(name, "SYMBOL_ERR") == 0)
	  return PAM_SYMBOL_ERR;
      else if (strcmp(name, "SERVICE_ERR") == 0)
	  return PAM_SERVICE_ERR;
      else if (strcmp(name, "SYSTEM_ERR") == 0)
	  return PAM_SYSTEM_ERR;
      else if (strcmp(name, "BUF_ERR") == 0)
	  return PAM_BUF_ERR;
      else if (strcmp(name, "PERM_DENIED") == 0)
	  return PAM_PERM_DENIED;
      else if (strcmp(name, "AUTH_ERR") == 0)
	  return PAM_AUTH_ERR;
      else if (strcmp(name, "CRED_INSUFFICIENT") == 0)
	  return PAM_CRED_INSUFFICIENT;
      else if (strcmp(name, "AUTHINFO_UNAVAIL") == 0)
	  return PAM_AUTHINFO_UNAVAIL;
      else if (strcmp(name, "USER_UNKNOWN") == 0)
	  return PAM_USER_UNKNOWN;
      else if (strcmp(name, "MAXTRIES") == 0)
	  return PAM_MAXTRIES;
      else if (strcmp(name, "NEW_AUTHTOK_REQD") == 0 ||
	       strcmp(name, "AUTHTOKEN_REQD") == 0)
      #if defined(HAVE_PAM_NEW_AUTHTOK_REQD)
	  return PAM_NEW_AUTHTOK_REQD;
      #elif defined(HAVE_PAM_AUTHTOKEN_REQD)
          return PAM_AUTHTOKEN_REQD;       /* Old Linux-PAM */
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "ACCT_EXPIRED") == 0)
	  return PAM_ACCT_EXPIRED;
      else if (strcmp(name, "SESSION_ERR") == 0)
	  return PAM_SESSION_ERR;
      else if (strcmp(name, "CRED_UNAVAIL") == 0)
	  return PAM_CRED_UNAVAIL;
      else if (strcmp(name, "CRED_EXPIRED") == 0)
	  return PAM_CRED_EXPIRED;
      else if (strcmp(name, "CRED_ERR") == 0)
	  return PAM_CRED_ERR;
      else if (strcmp(name, "NO_MODULE_DATA") == 0)
	  return PAM_NO_MODULE_DATA;
      else if (strcmp(name, "CONV_ERR") == 0)
	  return PAM_CONV_ERR;
      else if (strcmp(name, "AUTHTOK_ERR") == 0)
	  return PAM_AUTHTOK_ERR;
      else if (strcmp(name, "AUTHTOK_RECOVER_ERR") == 0 ||
	       strcmp(name, "AUTHTOK_RECOVERY_ERR") == 0)
      #if defined(HAVE_PAM_AUTHTOK_RECOVER_ERR)    /* Linux-PAM   */
	  return PAM_AUTHTOK_RECOVER_ERR;
      #elif defined(HAVE_PAM_AUTHTOK_RECOVERY_ERR) /* Solaris PAM */
	  return PAM_AUTHTOK_RECOVERY_ERR;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "AUTHTOK_LOCK_BUSY") == 0)
	  return PAM_AUTHTOK_LOCK_BUSY;
      else if (strcmp(name, "AUTHTOK_DISABLE_AGING") == 0)
	  return PAM_AUTHTOK_DISABLE_AGING;
      else if (strcmp(name, "TRY_AGAIN") == 0)
	  return PAM_TRY_AGAIN;
      else if (strcmp(name, "IGNORE") == 0)
	  return PAM_IGNORE;
      else if (strcmp(name, "ABORT") == 0)
	  return PAM_ABORT;
      else if (strcmp(name, "AUTHTOK_EXPIRED") == 0)
      #if defined(HAVE_PAM_AUTHTOK_EXPIRED)
	  return PAM_AUTHTOK_EXPIRED;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "MODULE_UNKNOWN") == 0)
      #if defined(HAVE_PAM_MODULE_UNKNOWN)  /* Linux-PAM only */
	  return PAM_MODULE_UNKNOWN;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "BAD_ITEM") == 0)
      #if defined(HAVE_PAM_BAD_ITEM)
	  return PAM_BAD_ITEM;
      #else
	  goto not_there;
      #endif

      /* New Linux-PAM return codes */
      else if (strcmp(name, "CONV_AGAIN") == 0)
      #if defined(HAVE_PAM_CONV_AGAIN)
	  return PAM_CONV_AGAIN;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "INCOMPLETE") == 0)
      #if defined(HAVE_PAM_INCOMPLETE)
	  return PAM_INCOMPLETE;
      #else
	  goto not_there;
      #endif

      /* set/get_item constants */
      else if (strcmp(name, "SERVICE") == 0)
	  return PAM_SERVICE;
      else if (strcmp(name, "USER") == 0)
	  return PAM_USER;
      else if (strcmp(name, "TTY") == 0)
	  return PAM_TTY;
      else if (strcmp(name, "RHOST") == 0)
	  return PAM_RHOST;
      else if (strcmp(name, "CONV") == 0)
	  return PAM_CONV;
      /* module flags */
      /*
      else if (strcmp(name, "AUTHTOK") == 0)
	  return PAM_CONV;
      else if (strcmp(name, "OLDAUTHTOK") == 0)
	  return PAM_CONV;
      */
      else if (strcmp(name, "RUSER") == 0)
	  return PAM_RUSER;
      else if (strcmp(name, "USER_PROMPT") == 0)
	  return PAM_USER_PROMPT;
      else if (strcmp(name, "FAIL_DELAY") == 0)
      #if defined(HAVE_PAM_FAIL_DELAY)
	  return PAM_FAIL_DELAY;
      #else
	  goto not_there;
      #endif

      /* global flag */
      else if (strcmp(name, "SILENT") == 0)
	  return PAM_SILENT;
      /* pam_authenticate falgs */
      else if (strcmp(name, "DISALLOW_NULL_AUTHTOK") == 0)
	  return PAM_DISALLOW_NULL_AUTHTOK;
      /* pam_set_cred flags */
      else if (strcmp(name, "ESTABLISH_CRED") == 0 ||
	       strcmp(name, "CRED_ESTABLISH") == 0)
      #if defined(HAVE_PAM_ESTABLISH_CRED)
	  return PAM_ESTABLISH_CRED;
      #elif defined(HAVE_PAM_CRED_ESTABLISH)   /* Old Linux-PAM */
	  return PAM_CRED_ESTABLISH;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "DELETE_CRED") == 0 ||
	       strcmp(name, "CRED_DELETE") == 0)
      #if defined(HAVE_PAM_DELETE_CRED)
	  return PAM_DELETE_CRED;
      #elif defined(HAVE_PAM_CRED_DELETE)       /* Old Linux-PAM */
	  return PAM_CRED_DELETE;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "REINITIALIZE_CRED") == 0 ||
	       strcmp(name, "CRED_REINITIALIZE") == 0)
      #if defined(HAVE_PAM_REINITIALIZE_CRED)
	  return PAM_REINITIALIZE_CRED;
      #elif defined(HAVE_PAM_CRED_REINITIALIZE)
	  return PAM_CRED_REINITIALIZE;    /* Old Linux-PAM */
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "REFRESH_CRED") == 0 ||
	       strcmp(name, "CRED_REFRESH") == 0)
      #if defined(HAVE_PAM_REFRESH_CRED)
	  return PAM_REFRESH_CRED;
      #elif defined(HAVE_PAM_CRED_REFRESH)
	  return PAM_CRED_REFRESH;         /* Old Linux-PAM */
      #else
	  goto not_there;
      #endif
      /* pam_chauthtok flags */
      else if (strcmp(name, "CHANGE_EXPIRED_AUTHTOK") == 0)
	  return PAM_CHANGE_EXPIRED_AUTHTOK;

      /* message style constants */
      else if (strcmp(name, "PROMPT_ECHO_OFF") == 0)
	  return PAM_PROMPT_ECHO_OFF;
      else if (strcmp(name, "PROMPT_ECHO_ON") == 0)
	  return PAM_PROMPT_ECHO_ON;
      else if (strcmp(name, "ERROR_MSG") == 0)
	  return PAM_ERROR_MSG;
      else if (strcmp(name, "TEXT_INFO") == 0)
	  return PAM_TEXT_INFO;
      else if (strcmp(name, "RADIO_TYPE") == 0)
      #if defined(HAVE_PAM_RADIO_TYPE)
	  return PAM_RADIO_TYPE;
      #else
	  goto not_there;
      #endif
      else if (strcmp(name, "BINARY_PROMPT") == 0)
      #if defined(HAVE_PAM_BINARY_PROMPT)
	  return PAM_BINARY_PROMPT;
      #else
	  goto not_there;
      #endif

      /* I'm not sure if these are really needed... */
      /*
      else if (strcmp(name, "MAX_MSG_SIZE") == 0)
	  return PAM_MAX_MSG_SIZE;
      else if (strcmp(name, "MAX_RESP_SIZE") == 0)
	  return PAM_MAX_RESP_SIZE;
      */
    } 
    else if (strncmp(name, "HAVE_PAM_", 9) == 0) {
      name = &name[9];

      if (strcmp(name, "FAIL_DELAY") == 0)
      #if defined(HAVE_PAM_FAIL_DELAY)
	  return 1;
      #else
	  return 0;
      #endif
      else if (strcmp(name, "ENV_FUNCTIONS") == 0)
      #if defined(HAVE_PAM_GETENV)
	  return 1;
      #else
	  return 0;
      #endif
      /*
      else if (strcmp(name, "HAVE_PAM_SYSTEM_LOG") == 0)
      #if defined(HAVE_PAM_SYSTEM_LOG)
	  return 1;
      #else
	  return 0;
      #endif
      */
    }

    errno = EINVAL;
    return 0;

not_there:
    errno = ENOSYS;
    return 0;
}


#line 472 "PAM.c"

XS(XS_Authen__PAM_constant); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_constant)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::constant(name, arg)");
    {
	char *	name = (char *)SvPV_nolen(ST(0));
	int	arg = (int)SvIV(ST(1));
	double	RETVAL;
	dXSTARG;

	RETVAL = constant(name, arg);
	XSprePUSH; PUSHn((double)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM__pam_start); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM__pam_start)
{
    dXSARGS;
    if (items != 4)
	Perl_croak(aTHX_ "Usage: Authen::PAM::_pam_start(service_name, user_sv, func, pamh)");
    {
	const char *	service_name = (const char *)SvPV_nolen(ST(0));
	SV *	user_sv = ST(1);
	SV *	func = ST(2);
	pam_handle_t *	pamh;
#line 480 "PAM.xs"
	  sPamConv conv_st;
	  const char *user;
#line 507 "PAM.c"
	int	RETVAL;
	dXSTARG;
#line 483 "PAM.xs"
	  user = SvOK(user_sv) ? SvPV_nolen(user_sv) : NULL;

	  conv_st.conv = my_conv_func;
	  conv_st.appdata_ptr = malloc(sizeof(sPerlPamData));
	  ((sPerlPamData*)conv_st.appdata_ptr)->conv_func = newSVsv(func);
	  ((sPerlPamData*)conv_st.appdata_ptr)->delay_func = newSViv(0);

	  RETVAL = pam_start(service_name, user, &conv_st, &pamh);
#line 519 "PAM.c"
	sv_setref_pv(ST(3), Nullch, (void*)pamh);
	SvSETMAGIC(ST(3));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_end); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_end)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_end(pamh, pam_status=PAM_SUCCESS)");
    {
	pam_handle_t *	pamh;
	int	pam_status;
#line 500 "PAM.xs"
	  sPerlPamData *data;
	  int res;
#line 540 "PAM.c"
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    pam_status = PAM_SUCCESS;
	else {
	    pam_status = (int)SvIV(ST(1));
	}
#line 503 "PAM.xs"
	  data = get_perl_pam_data(pamh);
          SvREFCNT_dec(data->conv_func); 
          SvREFCNT_dec(data->delay_func); 
	  free(data);

          RETVAL = pam_end(pamh, pam_status);
#line 563 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_set_item); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_set_item)
{
    dXSARGS;
    if (items != 3)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_set_item(pamh, item_type, item)");
    {
	pam_handle_t *	pamh;
	int	item_type = (int)SvIV(ST(1));
	SV *	item = ST(2);
#line 518 "PAM.xs"
	  sPerlPamData *data;
	  int res;
#line 583 "PAM.c"
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 521 "PAM.xs"
	  if (item_type == PAM_CONV) {
	      data = get_perl_pam_data(pamh);
	      sv_setsv(data->conv_func, item);
	      RETVAL = PAM_SUCCESS;
	  }
#if defined(HAVE_PAM_FAIL_DELAY)
          else if (item_type == PAM_FAIL_DELAY) {
	      data = get_perl_pam_data(pamh);
	      sv_setsv(data->delay_func, item);
	      if (SvTRUE(item))
	          RETVAL = pam_set_item( pamh, item_type, my_delay_func);
	      else
	          RETVAL = pam_set_item( pamh, item_type, NULL);
	  }
#endif
	  else
#if (PERL_API_REVISION == 5 && PERL_API_VERSION >= 5)
	      RETVAL = pam_set_item( pamh, item_type, SvPV_nolen(item));
#else
	      RETVAL = pam_set_item( pamh, item_type, SvPV(item,na));
#endif
#line 615 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_get_item); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_get_item)
{
    dXSARGS;
    if (items != 3)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_get_item(pamh, item_type, item)");
    {
	pam_handle_t *	pamh;
	int	item_type = (int)SvIV(ST(1));
	SV *	item = ST(2);
#line 551 "PAM.xs"
	  char *c;
	  sPerlPamData *data;
	  int res;
#line 636 "PAM.c"
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 555 "PAM.xs"
	  if (item_type == PAM_CONV) {
	      data = get_perl_pam_data(pamh);
	      sv_setsv(item, data->conv_func);
	      RETVAL = PAM_SUCCESS;
	  }
#if defined(HAVE_PAM_FAIL_DELAY)
          else if (item_type == PAM_FAIL_DELAY) {
	      data = get_perl_pam_data(pamh);
	      sv_setsv(item, data->delay_func);
	      RETVAL = PAM_SUCCESS;
 	  }
#endif
	  else {
	      RETVAL = pam_get_item( pamh, item_type, (CONST_VOID **)&c);
	      sv_setpv(item, c);
	  }
#line 663 "PAM.c"
	ST(2) = item;
	SvSETMAGIC(ST(2));
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_strerror); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_strerror)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_strerror(pamh, errnum)");
    {
	pam_handle_t *	pamh;
	int	errnum = (int)SvIV(ST(1));
	const char *	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 580 "PAM.xs"
#if defined(PAM_STRERROR_NEEDS_PAMH)
	  RETVAL = pam_strerror(pamh, errnum);
#else
	  RETVAL = pam_strerror(errnum);
#endif
#line 696 "PAM.c"
	sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
    }
    XSRETURN(1);
}

#if defined(HAVE_PAM_GETENV)
#define XSubPPtmpAAAA 1


XS(XS_Authen__PAM_pam_putenv); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_putenv)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_putenv(pamh, name_value)");
    {
	pam_handle_t *	pamh;
	const char *	name_value = (const char *)SvPV_nolen(ST(1));
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 594 "PAM.xs"
	  RETVAL = pam_putenv(pamh, name_value);
#line 726 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_getenv); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_getenv)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_getenv(pamh, name)");
    {
	pam_handle_t *	pamh;
	const char *	name = (const char *)SvPV_nolen(ST(1));
	const char *	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 603 "PAM.xs"
	  RETVAL = pam_getenv(pamh, name);
#line 753 "PAM.c"
	sv_setpv(TARG, RETVAL); XSprePUSH; PUSHTARG;
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM__pam_getenvlist); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM__pam_getenvlist)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: Authen::PAM::_pam_getenvlist(pamh)");
    SP -= items;
    {
	pam_handle_t *	pamh;
#line 611 "PAM.xs"
	  char **res;
	  int i;
	  int c;
#line 773 "PAM.c"

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 615 "PAM.xs"
	  res = pam_getenvlist(pamh);
	  c = 0;
	  while (res[c] != 0)
	      c++;
	  EXTEND(sp, c);
	  for (i = 0; i < c; i++)
	      PUSHs(sv_2mortal(newSVpv(res[i],0)));
#line 789 "PAM.c"
	PUTBACK;
	return;
    }
}

#else
#define XSubPPtmpAAAB 1


XS(XS_Authen__PAM_pam_putenv); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_putenv)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_putenv(pamh, name_value)");
    {
	pam_handle_t *	pamh;
	const char *	name_value = (const char *)SvPV_nolen(ST(1));
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 630 "PAM.xs"
	  not_here("pam_putenv");
#line 819 "PAM.c"
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_getenv); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_getenv)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_getenv(pamh, name)");
    {
	pam_handle_t *	pamh;
	const char *	name = (const char *)SvPV_nolen(ST(1));
	const char *	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 637 "PAM.xs"
	  not_here("pam_getenv");
#line 845 "PAM.c"
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM__pam_getenvlist); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM__pam_getenvlist)
{
    dXSARGS;
    if (items != 1)
	Perl_croak(aTHX_ "Usage: Authen::PAM::_pam_getenvlist(pamh)");
    {
	pam_handle_t *	pamh;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 644 "PAM.xs"
	  not_here("pam_getenvlist");
#line 868 "PAM.c"
    }
    XSRETURN_EMPTY;
}

#endif
#if defined(HAVE_PAM_FAIL_DELAY)
#define XSubPPtmpAAAC 1


XS(XS_Authen__PAM_pam_fail_delay); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_fail_delay)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_fail_delay(pamh, musec_delay)");
    {
	pam_handle_t *	pamh;
	unsigned int	musec_delay = (unsigned int)SvUV(ST(1));
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 656 "PAM.xs"
	  RETVAL = pam_fail_delay(pamh, musec_delay);
#line 898 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

#else
#define XSubPPtmpAAAD 1


XS(XS_Authen__PAM_pam_fail_delay); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_fail_delay)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_fail_delay(pamh, musec_delay)");
    {
	pam_handle_t *	pamh;
	unsigned int	musec_delay = (unsigned int)SvUV(ST(1));

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 667 "PAM.xs"
	  not_here("pam_fail_delay");
#line 926 "PAM.c"
    }
    XSRETURN_EMPTY;
}

#endif

XS(XS_Authen__PAM_pam_authenticate); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_authenticate)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_authenticate(pamh, flags=0)");
    {
	pam_handle_t *	pamh;
	int	flags;
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    flags = 0;
	else {
	    flags = (int)SvIV(ST(1));
	}
#line 677 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_authenticate(pamh,flags);
#line 960 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_setcred); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_setcred)
{
    dXSARGS;
    if (items != 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_setcred(pamh, flags)");
    {
	pam_handle_t *	pamh;
	int	flags = (int)SvIV(ST(1));
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");
#line 687 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_setcred(pamh,flags);
#line 988 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_acct_mgmt); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_acct_mgmt)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_acct_mgmt(pamh, flags=0)");
    {
	pam_handle_t *	pamh;
	int	flags;
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    flags = 0;
	else {
	    flags = (int)SvIV(ST(1));
	}
#line 697 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_acct_mgmt(pamh,flags);
#line 1022 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_open_session); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_open_session)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_open_session(pamh, flags=0)");
    {
	pam_handle_t *	pamh;
	int	flags;
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    flags = 0;
	else {
	    flags = (int)SvIV(ST(1));
	}
#line 707 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_open_session(pamh,flags);
#line 1056 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_close_session); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_close_session)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_close_session(pamh, flags=0)");
    {
	pam_handle_t *	pamh;
	int	flags;
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    flags = 0;
	else {
	    flags = (int)SvIV(ST(1));
	}
#line 717 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_close_session(pamh, flags);
#line 1090 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}


XS(XS_Authen__PAM_pam_chauthtok); /* prototype to pass -Wmissing-prototypes */
XS(XS_Authen__PAM_pam_chauthtok)
{
    dXSARGS;
    if (items < 1 || items > 2)
	Perl_croak(aTHX_ "Usage: Authen::PAM::pam_chauthtok(pamh, flags=0)");
    {
	pam_handle_t *	pamh;
	int	flags;
	int	RETVAL;
	dXSTARG;

	if (SvROK(ST(0))) {
	    IV tmp = SvIV((SV*)SvRV(ST(0)));
	    pamh = INT2PTR(pam_handle_t *,tmp);
	}
	else
	    Perl_croak(aTHX_ "pamh is not a reference");

	if (items < 2)
	    flags = 0;
	else {
	    flags = (int)SvIV(ST(1));
	}
#line 727 "PAM.xs"
	  SET_CONV_FUNC(pamh);
	  RETVAL = pam_chauthtok(pamh, flags);
#line 1124 "PAM.c"
	XSprePUSH; PUSHi((IV)RETVAL);
    }
    XSRETURN(1);
}

#ifdef __cplusplus
extern "C"
#endif
XS(boot_Authen__PAM); /* prototype to pass -Wmissing-prototypes */
XS(boot_Authen__PAM)
{
    dXSARGS;
    char* file = __FILE__;

    XS_VERSION_BOOTCHECK ;

        newXSproto("Authen::PAM::constant", XS_Authen__PAM_constant, file, "$$");
        newXSproto("Authen::PAM::_pam_start", XS_Authen__PAM__pam_start, file, "$$$$");
        newXSproto("Authen::PAM::pam_end", XS_Authen__PAM_pam_end, file, "$;$");
        newXSproto("Authen::PAM::pam_set_item", XS_Authen__PAM_pam_set_item, file, "$$$");
        newXSproto("Authen::PAM::pam_get_item", XS_Authen__PAM_pam_get_item, file, "$$$");
        newXSproto("Authen::PAM::pam_strerror", XS_Authen__PAM_pam_strerror, file, "$$");
#if XSubPPtmpAAAA
        newXSproto("Authen::PAM::pam_putenv", XS_Authen__PAM_pam_putenv, file, "$$");
        newXSproto("Authen::PAM::pam_getenv", XS_Authen__PAM_pam_getenv, file, "$$");
        newXSproto("Authen::PAM::_pam_getenvlist", XS_Authen__PAM__pam_getenvlist, file, "$");
#endif
#if XSubPPtmpAAAB
        newXSproto("Authen::PAM::pam_putenv", XS_Authen__PAM_pam_putenv, file, "$$");
        newXSproto("Authen::PAM::pam_getenv", XS_Authen__PAM_pam_getenv, file, "$$");
        newXSproto("Authen::PAM::_pam_getenvlist", XS_Authen__PAM__pam_getenvlist, file, "$");
#endif
#if XSubPPtmpAAAC
        newXSproto("Authen::PAM::pam_fail_delay", XS_Authen__PAM_pam_fail_delay, file, "$$");
#endif
#if XSubPPtmpAAAD
        newXSproto("Authen::PAM::pam_fail_delay", XS_Authen__PAM_pam_fail_delay, file, "$$");
#endif
        newXSproto("Authen::PAM::pam_authenticate", XS_Authen__PAM_pam_authenticate, file, "$;$");
        newXSproto("Authen::PAM::pam_setcred", XS_Authen__PAM_pam_setcred, file, "$$");
        newXSproto("Authen::PAM::pam_acct_mgmt", XS_Authen__PAM_pam_acct_mgmt, file, "$;$");
        newXSproto("Authen::PAM::pam_open_session", XS_Authen__PAM_pam_open_session, file, "$;$");
        newXSproto("Authen::PAM::pam_close_session", XS_Authen__PAM_pam_close_session, file, "$;$");
        newXSproto("Authen::PAM::pam_chauthtok", XS_Authen__PAM_pam_chauthtok, file, "$;$");

    /* Initialisation Section */

#if XSubPPtmpAAAA
#endif
#if XSubPPtmpAAAB
#endif
#if XSubPPtmpAAAC
#endif
#if XSubPPtmpAAAD
#endif
#line 1180 "PAM.c"

    /* End of Initialisation Section */

    XSRETURN_YES;
}

