PAM

 view release on metacpan or  search on metacpan

PAM.xs  view on Meta::CPAN

#endif
                item = SvPV_nolen(item_sv);
                rv = pam_set_item(pam_handle, item_type, item);
            break;

            case PAM_CONV :
#ifdef __LINUX_PAM__
            case PAM_FAIL_DELAY :   // Linux specific
            case PAM_XAUTHDATA :    // Linux specific
            case PAM_AUTHTOK_TYPE : // Linux specific
#endif
            default :
            break;
        }

SV*
get_data(pam_handle, name)
    pam_handle_t *pam_handle
    const char *name
    PREINIT:
        const void *data;
        int rv;
    CODE:
        rv = pam_get_data(pam_handle, name, &data);
        if (rv == PAM_SUCCESS)
            RETVAL = newSVpv((char*)data, 0);
        else
            RETVAL = &PL_sv_undef;
    OUTPUT:
        RETVAL

void
set_data(pam_handle, name, data_sv)
    pam_handle_t *pam_handle
    const char *name
    SV *data_sv
    PREINIT:
        const void *data;
        void *datacpy;
        int rv;
        STRLEN len = 0;
    CODE:
        if (SvOK(data_sv)) {
            data = SvPV(data_sv, len);
            datacpy = malloc(len);
            if (datacpy == NULL)
                croak("Unable to allocate memory\n");
            memcpy(datacpy, data, len);
            rv = pam_set_data(pam_handle, name, datacpy, &cleanup_data);
        } else {
            // undef should set null
            rv = pam_set_data(pam_handle, name, NULL, NULL);
        }

void
getenvlist(pam_handle)
    pam_handle_t *pam_handle
    PREINIT:
        char **env;
        char **env_orig;
    PPCODE:
        env = pam_getenvlist(pam_handle);
        env_orig = env;
        while (env != NULL) {
            XPUSHs(sv_2mortal(newSVpv(*env, 0)));
            env++;
        }
        free(env_orig);

SV*
getenv(pam_handle, name)
    pam_handle_t *pam_handle
    const char *name
    PREINIT:
        const char *value;
    CODE:
        value = pam_getenv(pam_handle, name);
        RETVAL = newSVpv(value, 0);
    OUTPUT:
        RETVAL

void
putenv(pam_handle, name_value_sv)
    pam_handle_t *pam_handle
    SV *name_value_sv
    const void *name_value = NO_INIT
    int rv           = NO_INIT
    CODE:
        name_value = SvPV_nolen(name_value_sv);
        rv = pam_putenv(pam_handle, name_value);

SV*
strerror(pam_handle, errnum)
    pam_handle_t *pam_handle
    int           errnum
    PREINIT:
        const char *errstr;
    CODE:
        errstr = pam_strerror(pam_handle, errnum);
        RETVAL = newSVpv(errstr, 0);
    OUTPUT:
        RETVAL

MODULE = PAM    PACKAGE = PAM::Conversation

int
run(SV *self, ...)
    PREINIT:
        struct pam_conv *pamc;
        struct pam_message **msg = NULL;
        struct pam_response *resp = NULL;
        int rv, i;
        SV **pamh_ref;
    INIT:
        pamc = xs_object_magic_get_struct_rv(aTHX_ self);
    CODE:
        pamh_ref = hv_fetchs((HV*)SvRV(self), "handle", 0);
        SvREFCNT_inc(*pamh_ref);
        items--; // self takes up one

        if (pamh_ref != NULL) {



( run in 0.517 second using v1.01-cache-2.11-cpan-5511b514fd6 )