-
Notifications
You must be signed in to change notification settings - Fork 0
/
adg-interface-of-app-expected.html
100 lines (98 loc) · 8.37 KB
/
adg-interface-of-app-expected.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>3.2. 응용에게 기대하는 것</title><meta name="generator" content="DocBook XSL Stylesheets V1.79.1"><link rel="home" href="Linux-PAM_ADG.html" title="Linux-PAM 응용 개발자 안내서"><link rel="up" href="adg-interface.html" title="3장. Linux-PAM 공식 인터페이스"><link rel="prev" href="adg-interface-by-app-expected.html" title="3.1. 응용에서 기대할 수 있는 것"><link rel="next" href="adg-interface-programming-notes.html" title="3.3. 프로그래밍 노트"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.2. 응용에게 기대하는 것</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="adg-interface-by-app-expected.html">이전</a> </td><th width="60%" align="center">3장.
<span class="emphasis"><em>Linux-PAM</em></span> 공식 인터페이스
</th><td width="20%" align="right"> <a accesskey="n" href="adg-interface-programming-notes.html">다음</a></td></tr></table><hr></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="adg-interface-of-app-expected"></a>3.2. 응용에게 기대하는 것</h2></div></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="adg-pam_conv"></a>3.2.1. 대화 함수</h3></div></div></div><div class="funcsynopsis"><pre class="funcsynopsisinfo">#include <security/pam_appl.h></pre></div><pre class="programlisting">
struct pam_message {
int msg_style;
const char *msg;
};
struct pam_response {
char *resp;
int resp_retcode;
};
struct pam_conv {
int (*conv)(int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr);
void *appdata_ptr;
};
</pre><div class="section"><div class="titlepage"><div><div><h4 class="title"><a name="adg-pam_conv-description"></a>3.2.1.1. 설명</h4></div></div></div><p>
PAM 라이브러리에선 응용에서 정의한 콜백을 이용해 응용과
적재된 모듈이 직접 소통할 수 있게 한다. 트랜잭션 시작 때
<span class="citerefentry"><span class="refentrytitle">pam_start</span>(3)</span>에
주는 <span class="emphasis"><em>struct pam_conv</em></span>로
콜백을 지정한다.
</p><p>
모듈에서 해당 conv() 함수를 호출할 때 그 구조체의 두 번째 항목을
<span class="emphasis"><em>appdata_ptr</em></span> 인자에 설정한다.
</p><p>
conv() 호출의 나머지 인자들은 모듈과 응용 사이에 주고받는 정보에
대한 것이다. 말하자면 <span class="emphasis"><em>num_msg</em></span>는
포인터의 배열인 <span class="emphasis"><em>msg</em></span>의
길이를 담는다. 성공 반환 시 포인터 <span class="emphasis"><em>resp</em></span>가
pam_response 구조체의 배열을 가리키는데, 그 구조체들은 응용에서
제공한 텍스트를 담는다. 그 구조체의 <span class="emphasis"><em>resp_retcode</em></span>
멤버는 쓰지 않으며 0으로 설정해야 한다. 그 배열과 응답들을
<span class="citerefentry"><span class="refentrytitle">free</span>(3)</span>로
해제하는 건 호출자의 책임이다. <span class="emphasis"><em>*resp</em></span>가
포인터의 배열이 아니라 <span class="emphasis"><em>struct pam_response</em></span>
배열이라는 점에 유의하자.
</p><p>
응답의 개수는 언제나 대화 함수 인자
<span class="emphasis"><em>num_msg</em></span>와 같다.
따라서 대화 함수 호출 후마다 응답 배열이
<span class="citerefentry"><span class="refentrytitle">free</span>(3)</span>
돼야 한다. 응답들의 인덱스는 pam_message 배열 프롬프트의
인덱스와 대응한다.
</p><p>
실패 시 대화 함수는 할당한 자원이 있으면 모두 해제한 후
미리 규정된 PAM 오류 코드들 중 하나를 반환해야 한다.
</p><p>
각 메시지는 네 가지 타입 중 하나이며,
<span class="emphasis"><em>struct pam_message</em></span>의
<span class="emphasis"><em>msg_style</em></span> 멤버에
지정돼 있다.
</p><div class="variablelist"><dl class="variablelist"><dt><span class="term">PAM_PROMPT_ECHO_OFF</span></dt><dd><p>
텍스트 반향 없이 문자열 얻기.
</p></dd><dt><span class="term">PAM_PROMPT_ECHO_ON</span></dt><dd><p>
텍스트 반향하면서 문자열 얻기.
</p></dd><dt><span class="term">PAM_ERROR_MSG</span></dt><dd><p>
오류 메시지 표시하기.
</p></dd><dt><span class="term">PAM_TEXT_INFO</span></dt><dd><p>
어떤 텍스트 표시하기.
</p></dd></dl></div><p>
메시지가 배열로 돼 있으므로 모듈에서 한 번의 호출로 여러 가지를
응용으로 전달하는 게 가능해진다. 응용 입장에서도 관련 항목들이
한번에 오는 게 편할 수 있다. 그 경우 창 형태 응용에서 양식
하나로 여러 메시지/프롬프트를 한꺼번에 표시할 수 있다.
</p><p>
여담으로, Linux-PAM에서 대화 함수 인자 const struct pam_message
**msg를 다루는 방식이 솔라리스의 PAM과 (또 그에 기반한 HP/UX 등과)
차이가 있다는 점을 언급해 둬야겠다. Linux-PAM은 msg 인자를
프로토타입 const struct pam_message *msg[]와 완전히 동등하게
해석한다. (다들 아는 main() 함수의 argv 인자에 흔히 쓰는 프로토타입이
char **argv와 char *argv[]인 것과 같은 식이다.) 요컨데
Linux-PAM에서는 msg 인자를 읽기 전용 'struct pam_message' 포인터
num_msg 개짜리 배열에 대한 포인터로 해석한다. 솔라리스 PAM
구현에서는 이 인자를 pam_message 구조체 num_msg개짜리 배열에
대한 포인터에 대한 포인터로 해석한다. 대부분 모듈 응용 개발자에게는
(아마도) 다행스럽게도 num_msg의 값이 1일 때 두 정의는 완전히
동등하다. 그러다 별 생각 없이 그 수를 2개로 올리면 예상치 않은
호환성 문제가 발생한다.
</p><p>
어느 쪽이 바람직한가는 제쳐 두고, 모듈 작성자가 두 가지 PAM 구현
모두와 소스 수준 호환성을 유지하기 위한 방법으로 두 가지가 있다.
</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>
절대 num_msg를 1보다 크게 해서 대화 함수를 호출하지 않기.
</p></li><li class="listitem"><p>
msg를 이중 참조 구조로 만들어서 두 가지 대화 함수 모두
메시지를 찾아낼 수 있게 하기. 즉 다음처럼 만들기:
</p><pre class="programlisting">
msg[n] = & (( *msg )[n])
</pre></li></ul></div></div><div class="section"><div class="titlepage"><div><div><h4 class="title"><a name="adg-pam_conv-return_values"></a>3.2.1.2. 반환 값</h4></div></div></div><div class="variablelist"><dl class="variablelist"><dt><span class="term">PAM_BUF_ERR</span></dt><dd><p>
메모리 버퍼 오류.
</p></dd><dt><span class="term">PAM_CONV_ERR</span></dt><dd><p>
대화 실패. 응용에선
<span class="emphasis"><em>*resp</em></span>를
설정하지 않아야 한다.
</p></dd><dt><span class="term">PAM_SUCCESS</span></dt><dd><p>
성공.
</p></dd></dl></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="adg-interface-by-app-expected.html">이전</a> </td><td width="20%" align="center"><a accesskey="u" href="adg-interface.html">위</a></td><td width="40%" align="right"> <a accesskey="n" href="adg-interface-programming-notes.html">다음</a></td></tr><tr><td width="40%" align="left" valign="top">3.1. 응용에서 기대할 수 있는 것 </td><td width="20%" align="center"><a accesskey="h" href="Linux-PAM_ADG.html">대문</a></td><td width="40%" align="right" valign="top"> 3.3. 프로그래밍 노트</td></tr></table></div></body></html>