#include <security/pam_appl.h>
const char *pam_strerror( | pamh, | |
errnum) ; |
pam_handle_t *pamh
;int errnum
;
pam_strerror
함수는 인자
errnum로 준 오류 코드를
설명하는 문자열에 대한 포인터를 반환한다. 가능한 경우 현재 로캘의
LC_MESSAGES 부분을 사용해 적절한 언어를 선택한다. 응용에서
그 문자열을 변경해선 안 된다. 어떤 라이브러리 함수에서도
그 문자열을 변경하지 않을 것이다.
#include <security/pam_appl.h>
int pam_fail_delay( | pamh, | |
usec) ; |
pam_handle_t *pamh
;unsigned int usec
;
pam_fail_delay
함수는 응용이나 모듈에서
usec 마이크로초의 최소 지연
시간을 제안할 수 있는 방법을 제공한다. 이 함수로 요청한 가장 긴
시간이 기록된다. pam_authenticate(3)가
실패하면 응용으로 실패를 반환하는 동작이 그 가장 긴 값 정도의
(50%까지의) 난수 분포 시간만큼 지연된다.
성공 여부와 무관하게 PAM 서비스 모듈에서 응용으로 제어가 반환될 때 지연 시간이 기본값 0으로 재설정된다. 인증 모듈들이 호출된 후이자 서비스 응용으로 제어가 반환되기는 전에 지연이 이뤄진다.
이 함수를 쓸 때 프로그래머는 다음처럼 이용 가능 여부를 확인해야 한다.
#ifdef HAVE_PAM_FAIL_DELAY .... #endif /* HAVE_PAM_FAIL_DELAY */
이벤트 주도 방식으로 작성된 단일 스레드 응용에서는 이렇게 지연을 만드는 게 바람직하지 않을 수도 있다. 응용에서 어떤 다른 방식으로 지연을 처리하고 싶을 수 있다. 예를 들어 단일 이벤트 루프에서 여러 인증 요청을 처리하는 단일 스레드 서버라면 응용의 타이머가 만료될 때까지 해당 연결에 차단 표시만 해 두고 싶을 수 있다. 그런 이유로 지연 함수를 PAM_FAIL_DELAY 항목으로 교체할 수 있다. pam_get_item(3)과 pam_set_item(3)으로 질의하고 설정할 수 있다. 설정하는 값은 다음 원형의 함수 포인터여야 한다.
void (*delay_fn)(int retval, unsigned usec_delay, void *appdata_ptr);
인자 retval은 모듈 스택의 반환 코드이고, usec_delay는 libpam에서 요청하는 마이크로초 단위 지연 시간이다. 그리고 appdata_ptr은 현재 pamh에 응용에서 연계시켜 둔 값이다. 이 마지막 인자는 pam_start(3)를 호출할 때, 또는 명시적으로 pam_set_item(3)를 호출해서 응용에서 설정해 둔 값이다.
참고로 PAM_FAIL_DELAY 항목은 기본적으로 NULL로 설정돼 있다. 이는 인증이 실패하고 지연이 제안됐을 때 위에서 설명한 것처럼 PAM에서 임이 길이로 지연을 수행한다는 뜻이다. 인증 실패 시 PAM 라이브러리에서 지연을 수행하는 걸 응용에서 원치 않는다면 아무것도 실행하지 않는 자체 지연 함수를 정의하고 PAM_FAIL_DELAY 항목이 그 함수를 가리키게 설정해야 한다.