2.2.  libpam에서 제공하는 기타 함수들

2.2.1. PAM 오류 코드 서술 문자열

#include <security/pam_appl.h>
const char *pam_strerror(pamh,  
 errnum); 
pam_handle_t *pamh;
int errnum;
 

2.2.1.1. 설명

pam_strerror 함수는 인자 errnum로 준 오류 코드를 설명하는 문자열에 대한 포인터를 반환한다. 가능한 경우 현재 로캘의 LC_MESSAGES 부분을 사용해 적절한 언어를 선택한다. 응용에서 그 문자열을 변경해선 안 된다. 어떤 라이브러리 함수에서도 그 문자열을 변경하지 않을 것이다.

2.2.1.2. 반환 값

이 함수는 항상 문자열 포인터를 반환한다.

2.2.2. 실패 시 지연 요청하기

#include <security/pam_appl.h>
int pam_fail_delay(pamh,  
 usec); 
pam_handle_t *pamh;
unsigned int usec;
 

2.2.2.1. 설명

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 항목이 그 함수를 가리키게 설정해야 한다.

2.2.2.2. 반환 값

PAM_SUCCESS

지연 시간이 성공적으로 조정되었음.

PAM_SYSTEM_ERR

PAM 핸들로 NULL 포인터를 줬음.