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

    함수 설명

    saf_exit_add_group

    새로운 그룹을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_alter_group

    TACF에 등록된 그룹을 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_delete_group

    TACF에 등록된 그룹을 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

  • USER 관련 API

    함수 설명

    saf_exit_add_user

    새로운 사용자을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_alter_user

    TACF에 등록된 사용자를 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_delete_user

    TACF에 등록된 사용자를 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

  • CONNECT & REMOVE 관련 API

    함수 설명

    saf_exit_connect

    사용자의 연결 그룹 설정을 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_remove

    사용자의 연결 그룹 해제를 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

  • PASSWORD 관련 API

    함수 설명

    saf_exit_password

    사용자의 비밀번호를 등록하거나 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

  • DATASET 관련 API

    함수 설명

    saf_exit_add_dsd

    개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 등록하는 함수이다.

    saf_exit_alter_dsd

    개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 변경하는 함수이다.

    saf_exit_delete_dsd

    개별 데이터셋 프로파일이나 일반 데이터셋 프로파일을 TACF에 삭제하는 함수이다.

  • RESOURCE 관련 API

    함수 설명

    saf_exit_define_resource

    리소스 프로파일을 정의하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_alter_resource

    리소스 프로파일을 변경하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_delete_resource

    리소스 프로파일을 삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

  • PERMISSION 관련 API

    함수 설명

    saf_exit_permit_access

    특정 사용자나 그룹에게 특정 리소스에 대한 권한을 부여하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

    saf_exit_permit_delete

    특정 사용자나 그룹에게 특정 리소스에 대한 권한을 해제하기 위한 고객사 고유의 rule을 추가하는 데 사용하는 함수이다.

2. GROUP 관련 API

새로운 그룹을 TACF에 등록/변경/삭제하기 위한 고객사 고유의 rule을 추가하는 데 사용한다. TACF에 새로운 그룹의 프로파일을 등록/변경/삭제할 때 고객사 고유의 규칙을 검토한다.

2.1. saf_exit_add_group

새로운 그룹을 TACF에 등록하기 위한 고객사 고유의 rule을 추가하는 함수로 고객사 고유의 규칙을 검토 후 사용한다.

saf_exit_add_group()의 호출 시점은 다음 그림과 같다.

figure ag
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure alg
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure dg
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure au
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다:

figure alu
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure du
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure co
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure re
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure 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()의 호출 시점은 다음 그림과 같다.

figure ad
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure ald
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure 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()의 호출 시점은 다음 그림과 같다.

figure rd
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure ra
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure rde
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure pa
  • 프로토타입

    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()의 호출 시점은 다음 그림과 같다.

figure pd
  • 프로토타입

    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