SAF_EXIT 헤더 파일과 API
본 장은 user-exit 기능을 제공하기 위한 헤더 파일 및 API 대해 기술한다.
1. 개요
고객사 고유의 사용자 아이디 규칙이나 비밀번호 규칙이 존재할 경우 고객사에서 제작한 모듈에 대한 엔진 수정 없이 플러그인(plugged-in) 형식의 SAF_EXIT 모듈에서 제공하는 인터페이스에 맞춰 고객사 고유의 API를 작성하면, TACF 내부에서는 해당 API를 호출하게 되므로 TACF 내부 모듈의 수정 없이도 고객사 고유의 업무를 적용할 수 있다.
다음 함수는 고객사 고유의 함수명을 TACF에서 사용하는 함수명으로 치환하는 기능을 수행한다.
/* -------------------------- compatible API switch ------------------------- */ #define SAF_EXIT_IMPL_NAME_LEN 31 typedef struct { /* identification */ char saf_exit_impl_name[SAF_EXIT_IMPL_NAME_LEN + 1]; int saf_exit_version; /* group management */ int (*saf_exit_add_group_entry)(char *aceeusri, char *groupname, char *owner, char *supgroup); int (*saf_exit_alter_group_entry)(char *aceeusri, char *groupname, char *owner, char *supgroup); int (*saf_exit_delete_group_entry)(char *aceeusri, char *groupname); /* user management */ int (*saf_exit_add_user_entry)(char *aceeusri, char *userid, char *owner, char *dfltgrp); int (*saf_exit_alter_user_entry)(char *aceeusri, char *userid, char *owner, char *dfltgrp); int (*saf_exit_delete_user_entry)(char *aceeusri, char *userid); /* connect & remove */ int (*saf_exit_connect_entry)(char *aceeusri, char *userid, char *groupname, char *owner); int (*saf_exit_remove_entry)(char *aceeusri, char *userid, char *groupname, char *owner); /* password check */ int (*saf_exit_password_entry)(char *userid, char *password, int count, char *history[]); /* dataset management */ int (*saf_exit_add_dsd_entry)(char *aceeusri, char *profname, char *owner, char *notify); int (*saf_exit_alter_dsd_entry)(char *aceeusri, char *profname, char *owner, char *notify); int (*saf_exit_delete_dsd_entry)(char *aceeusri, char *profname); /* resource management */ int (*saf_exit_define_resource_entry)(char *aceeusri, char *classname, char *profname, char *owner, char *notify); int (*saf_exit_alter_resource_entry)(char *aceeusri, char *classname, char *profname, char *owner, char *notify); int (*saf_exit_delete_resource_entry)(char *aceeusri, char *classname, char *profname); /* permission management */ int (*saf_exit_permit_access_entry)(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset); int (*saf_exit_permit_delete_entry)(char *aceeusri, char *classname, char *profname, char *id, char *reset); } saf_exit_switch_t;
다음은 헤더 파일의 API에 관한 설명이다. 각 함수에 대한 자세한 설명은 해당 절의 설명을 참고한다.
-
GROUP 관련 API
함수 설명 새로운 그룹을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
TACF에 등록된 그룹을 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
TACF에 등록된 그룹을 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
-
USER 관련 API
함수 설명 새로운 사용자을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
TACF에 등록된 사용자를 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
TACF에 등록된 사용자를 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
-
CONNECT & REMOVE 관련 API
함수 설명 사용자의 연결 그룹 설정을 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
사용자의 연결 그룹 해제를 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
-
PASSWORD 관련 API
함수 설명 사용자의 비밀번호를 등록하거나 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
-
DATASET 관련 API
함수 설명 개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 등록하는 함수이다.
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 변경하는 함수이다.
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 삭제하는 함수이다.
-
RESOURCE 관련 API
함수 설명 리소스 프로파일을 정의하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
리소스 프로파일을 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
리소스 프로파일을 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
-
PERMISSION 관련 API
함수 설명 특정 사용자나 그룹에게 특정 리소스에 대한 권한을 부여하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
특정 사용자나 그룹에게 특정 리소스에 대한 권한을 해제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.
2. GROUP 관련 API
새로운 그룹을 TACF에 등록/변경/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다. TACF에 새로운 그룹의 프로파일을 등록/변경/삭제할 때 고객사 고유의 규칙을 검토한다.
2.1. saf_exit_add_group
새로운 그룹을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 함수로 고객사 고유의 규칙을 검토 후 사용한다.
saf_exit_add_group()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_add_group(aceeusri, groupname, owner, supgroup) (*(saf_exit_sw.saf_exit_add_group_entry))(aceeusri, groupname, owner, supgroup)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
groupname
추가할 그룹의 그룹명을 의미한다.
owner
추가할 그룹 소유자의 USERID나 그룹명을 의미한다.
supgroup
추가할 그룹의 상위 그룹을 의미한다.
2.2. saf_exit_alter_group
TACF에 등록된 그룹을 변경하기 위한 고객사 고유의 rule을 추가하는 함수로 고객사 고유의 규칙을 검토 후 사용한다.
saf_exit_alter_group()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_alter_group(aceeusri, groupname, owner, supgroup) (*(saf_exit_sw.saf_exit_alter_group_entry))(aceeusri, groupname, owner, supgroup)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
groupname
수정할 그룹의 그룹명을 의미한다.
owner
수정할 그룹 소유자의 USERID나 그룹명을 의미한다.
supgroup
수정할 그룹의 상위 그룹을 의미한다.
2.3. saf_exit_delete_group
TACF에 등록된 그룹을 삭제하기 위한 고객사 고유의 rule을 추가하는 함수로 고객사 고유의 규칙을 검토 후 사용한다.
saf_exit_delete_group()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_delete_group(aceeusri, groupname) (*(saf_exit_sw.saf_exit_delete_group_entry))(aceeusri, groupname)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
groupname
수정할 그룹의 그룹명을 의미한다.
3. USER 관련 API
새로운 사용자을 TACF에 등록/변경/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다.
3.1. saf_exit_add_user
새로운 사용자을 TACF에 등록하기 위한 고객사 고유의 rule을 추가할 때 사용하는 함수이다.
saf_exit_add_user()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_add_user(aceeusri, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_add_user_entry))(aceeusri, userid, owner, dfltgrp)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
userid
추가할 사용자의 USERID를 의미한다.
owner
추가할 사용자 프로파일 소유자의 USERID나 그룹명을 의미한다.
dfltgrp
추가할 그룹의 기본 그룹을 의미한다.
3.2. saf_exit_alter_user
TACF에 등록된 사용자를 변경하기 위한 고객사 고유의 rule을 추가할 때 사용하는 함수이다. TACF에 존재하는 사용의 프로파일을 수정할 때 고객사 고유의 규칙을 검토한다.
saf_exit_alter_user()의 호출 시점은 다음 그림과 같다:
-
프로토타입
saf_exit_alter_user(aceeusri, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_alter_user_entry))(aceeusri, userid, owner, dfltgrp)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
userid
수정할 사용자의 USERID를 의미한다.
owner
수정할 유저 프로파일 소유자의 USERID나 그룹명을 의미한다.
dfltgrp
수정할 사용자의 기본 그룹을 의미한다.
3.3. saf_exit_delete_user
TACF에 등록된 사용자를 삭제하기 위한 고객사 고유의 rule을 추가할 때 사용하는 함수이다.
saf_exit_delete_user()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_add_user(acee, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_add_user_entry))(aceeusri, userid, owner, dfltgrp)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
userid
삭제할 사용자의 USERID을 의미한다.
4. CONNECT & REMOVE 관련 API
사용자의 연결 그룹 설정/해제를 위한 고객사 고유의 rule을 추가하는 데 사용한다.
4.1. saf_exit_connect
사용자의 연결 그룹 설정을 위한 고객사의 고유의 rule을 추가하는 데 사용하는 함수이다. 사용자의 연결 그룹을 설정할 때 고객사 고유의 규칙을 검토한다.
saf_exit_connect()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_connect(aceeusri, userid, groupname, owner) (*(saf_exit_sw.saf_exit_connect_entry))(aceeusri, userid, groupname, owner)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
userid
특정 그룹에 연결할 사용자의 USERID를 의미한다.
groupname
특정 사용자와 연결될 그룹명을 의미한다.
owner
특정 사용자와 연결될 그룹 프로파일 소유자의 USERID나 그룹명을 의미한다.
4.2. saf_exit_remove
사용자의 연결 그룹 해제을 위한 고객사의 고유의 rule을 추가하는 데 사용하는 함수이다. 특정 그룹에 연결된 사용자를 해당 그룹에서 연결 해제할 때 고객사 고유의 규칙을 검토한다.
saf_exit_remove()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_remove(aceeusri, userid, groupname, owner) (*(saf_exit_sw.saf_exit_remove_entry))(aceeusri, userid, groupname, owner)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
userid
특정 그룹과 연결을 해제할 사용자의 USERID를 의미한다.
groupname
특정 사용자와 연결을 해제할 그룹명을 의미한다.
owner
특정 사용자와 연결 해제할 그룹 프로파일 소유자의 USERID나 그룹명을 의미한다.
5. PASSWORD 관련 API
사용자의 비밀번호를 등록하거나 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용한다.
5.1. saf_exit_password
사용자의 비밀번호를 등록하거나 변경하는 경우 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에서 사용자의 비밀번호를 설정할 때 고객사 고유의 규칙을 검토한다.
함수의 호출 시점은 다음 그림과 같다. tacfmgr 등의 PASSWORD라는 명령을 통해 호출되기도 하지만 ALTUSER 명령을 사용하는 경우에도 비밀번호 조건을 확인하며, 사용자 인증이 필요한 단계를 거칠 때에도 비밀번호를 확인한다.
saf_exit_password()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_password(userid, password, count, history) (*(saf_exit_sw.saf_exit_password_entry))(userid, password, count, history)
-
파라미터
파라미터 설명 userid
로그인한 사용자의 USERID를 의미한다.
password
변경할 새로운 비밀번호를 의미한다.
count
비밀번호가 변경된 횟수를 의미한다.
history
변경 전에 사용하던 비밀번호의 히스토리를 의미한다.
6. DATASET 관련 API
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 등록/변경/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다.
6.1. saf_exit_add_dsd
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 새로운 데이터셋 프로파일을 추가할 때 고객사 고유의 규칙을 검토한다.
saf_exit_add_dsd()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_add_dsd(aceeusri, profname, owner, notify) (*(saf_exit_sw.saf_exit_add_dsd_entry))(aceeusri, profname, owner, notify)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
profname
등록할 데이터셋의 프로파일명을 의미한다.
owner
등록할 데이터셋 프로파일 소유자의 USERID나 그룹명을 의미한다.
notify
해당 데이터셋에 대한 접근 거부를 통보하는 USERID를 의미한다.
6.2. saf_exit_alter_dsd
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 존재하는 데이터셋 프로파일을 수정할 때 고객사 고유의 규칙을 검토한다.
saf_exit_alter_dsd()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_alter_dsd(aceeusri, profname, owner, notify) (*(saf_exit_sw.saf_exit_alter_dsd_entry))(aceeusri, profname, owner, notify)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
profname
수정할 데이터셋의 프로파일명을 의미한다.
owner
수정할 데이터셋의 프로파일 소유자의 USERID나 그룹명을 의미한다.
notify
해당 데이터셋에 대한 접근 거부를 통보하는 USERID를 의미한다.
6.3. saf_exit_delete_dsd
개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 존재하는 데이터셋 프로파일을 삭제할 때 고객사 고유의 규칙을 검토한다.
saf_exit_delete_dsd()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_delete_dsd(aceeusri, profname) (*(saf_exit_sw.saf_exit_delete_dsd_entry))(aceeusri, profname)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
groupname
삭제할 데이터셋의 프로파일명을 의미한다.
7. RESOURCE 관련 API
리소스 프로파일을 정의/ 변경/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다.
7.1. saf_exit_define_resource
리소스 프로파일을 정의하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 새로운 리소스 프로파일을 등록할 때 고객사 고유의 규칙을 검토한다.
saf_exit_define_resource()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_define_resource(aceeusri, classname, profname, owner, notify) (*(saf_exit_sw.saf_exit_define_resource_entry))(aceeusri, classname, profname, owner, notify)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
classname
추가할 리소스 프로파일의 클래스명을 의미한다.
owner
등록할 리소스 프로파일 소유자의 USERID나 그룹명을 의미한다.
notify
해당 리소스에 대한 접근 거부를 통보하는 USERID를 의미한다.
7.2. saf_exit_alter_resource
리소스 프로파일을 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 존재하는 리소스 프로파일을 수정할 때 고객사 고유의 규칙을 검토한다.
saf_exit_alter_resource()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_alter_resource(aceeusri, classname, profname, owner, notify) (*(saf_exit_sw.saf_exit_alter_resource_entry))(aceeusri, classname, profname, owner, notify)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
classname
수정할 리소스 프로파일의 클래스명을 의미한다.
owner
수정할 리소스 프로파일 소유자의 USERID나 그룹명을 의미한다.
notify
해당 리소스에 대한 접근 거부를 통보하는 USERID를 의미한다.
7.3. saf_exit_delete_resource
리소스 프로파일을 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. TACF에 존재하는 리소스 프로파일을 삭제할 때 고객사 고유의 규칙을 검토한다.
saf_exit_delete_resource()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_delete_resource(aceeusri, classname, profname) (*(saf_exit_sw.saf_exit_delete_resource_entry))(aceeusri, classname, profname)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
classname
삭제할 리소스 프로파일의 클래스명을 의미한다.
profname
삭제할 리소스 프로파일명을 의미한다.
8. PERMISSION 관련 API
특정 사용자나 그룹에게 특정 리소스에 대한 권한을 부여/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다.
8.1. saf_exit_permit_access
특정 사용자나 그룹에게 특정 리소스에 대한 권한을 부여하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. 특정 사용자 혹은 그룹에게 특정 리소스에 대한 권한을 부여할 때 고객사 고유의 규칙을 검토한다.
saf_exit_permit_access()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_permit_access(aceeusri, classname, profname, access, id, reset) (*(saf_exit_sw.saf_exit_permit_access_entry))(aceeusri, classname, profname, access, id, reset)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
classname
권한을 부여할 리소스의 클래스명을 의미한다.
profname
권한을 부여할 리소스의 프로파일명을 의미한다.
access
부여할 접근 권한의 레벨을 의미한다.
id
접근 권한을 가지게 될 사용자의 USERID를 의미한다.
reset
해당 프로파일의 접근 리스트에 대한 삭제 레벨을 의미한다.
8.2. saf_exit_permit_delete
특정 사용자나 그룹에게 특정 리소스에 대한 권한을 해제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다. 특정 사용자나 그룹에게서 특정 리소스에 대한 권한을 삭제할 때 고객사 고유의 규칙을 검토한다.
saf_exit_permit_delete()의 호출 시점은 다음 그림과 같다.
-
프로토타입
saf_exit_permit_delete(aceeusri, classname, profname, id, reset) (*(saf_exit_sw.saf_exit_permit_delete_entry))(aceeusri, classname, profname, id, reset)
-
파라미터
파라미터 설명 aceeusri
로그인한 사용자의 USERID를 의미한다.
classname
권한을 삭제할 리소스의 클래스명을 의미한다.
profname
권한을 삭제할 리소스의 프로파일명을 의미한다.
id
권한을 상실할 사용자의 USERID를 의미한다.
reset
해당 프로파일의 접근 리스트에 대한 삭제 레벨을 의미한다.
9. Sample Code
다음은 saf_exit.c의 한 예제이다. 본 예제에서는 편의상 password에 대해서만 사용자 규칙이 작성되어 있으며 나머지 항목들에 대해서는 별도의 규칙이 없이 통과시킨다.
<saf_exit.c>
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "saf_exit.h" /* group management */ /* customer를 고객사의 이름으로 치환해서 사용할 수 있다. */ int customer_saf_exit_add_group(char *aceeusri, char *groupname, char *owner, char *supgroup); int customer_saf_exit_alter_group(char *aceeusri, char *groupname, char *owner, char *supgroup); int customer_saf_exit_delete_group(char *aceeusri, char *groupname); ... (중략) /* user management, connect & remove는 생략한다. */ ... /* password check */ int customer_saf_exit_password(char *userid, char *password, int count, char *history[]); ... (중략) /* dataset management, resource management 역시 생략한다. */ ... /* permission management */ int customer_saf_exit_permit_access(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset); int customer_saf_exit_permit_delete(char *aceeusri, char *classname, char *profname, char *id, char *reset); /* compatible API switch */ saf_exit_switch_t saf_exit_sw = { /* identification */ "CUSTOMER SAF EXIT", 1, /* group management */ customer_saf_exit_add_group, customer_saf_exit_alter_group, customer_saf_exit_delete_group, /* user management */ customer_saf_exit_add_user, customer_saf_exit_alter_user, customer_saf_exit_delete_user, /* connect & remove */ customer_saf_exit_connect, customer_saf_exit_remove, /* password check */ customer_saf_exit_password, /* dataset management */ customer_saf_exit_add_dsd, customer_saf_exit_alter_dsd, customer_saf_exit_delete_dsd, /* resource management */ customer_saf_exit_define_resource, customer_saf_exit_alter_resource, customer_saf_exit_delete_resource, /* permission management */ customer_saf_exit_permit_access, customer_saf_exit_permit_delete, }; /******************************************************************************/ /* group management */ /******************************************************************************/ int customer_saf_exit_add_group(char *aceeusri, char *groupname, char *owner, char *supgroup) { return 0; } int customer_saf_exit_alter_group(char *aceeusri, char *groupname, char *owner, char *supgroup) { return 0; } int customer_saf_exit_delete_group(char *aceeusri, char *groupname) { return 0; } ... (중략) ... /******************************************************************************/ /* password check */ /******************************************************************************/ int customer_saf_exit_password(char *userid, char *password, int count, char *history[]) { int i; /* check if password length is greater than 4 */ /* 패스워드의 길이는 4 이상이어야 한다. */ /* 사용자의 규칙에 위배되는 경우 -1을 리턴한다. */ if( strlen(password) <= 4 ) return -1; /* check if password is not same as userid */ /* 패스워드는 유저 아이디와 동일한 것을 사용할 수 없다. */ if( ! strcmp(password, userid) ) return -1; /* check if password is not used before */ /* 패스워드가 예전에 사용되었던 것인지 확인한다. */ for( i = 0; i < count; i++ ) { if( ! strcmp(password, history[i]) ) return -1; } /* return success code */ /* 모든 사용자 규칙을 만족하는 경우에는 0을 리턴한다. */ return 0; } ... (중략) ... /******************************************************************************/ /* permission management */ /******************************************************************************/ int customer_saf_exit_permit_access(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset) { return 0; } int customer_saf_exit_permit_delete(char *aceeusri, char *classname, char *profname, char *id, char *reset) { return 0; }
saf_exit.c 파일을 shared object 형태로 컴파일한 후 $OPENFRAME_HOME/lib/libsafexit.sl(또는 장비에 따라 $OPENFRAME_HOME/lib/libsafexit.so)로 링크를 걸어주어야 한다. 링크 방법은 다음과 같다. ln -s libsafexit_openframe.sl libsafexit.sl |