GETPWENT(3)

명칭
getpwent, getpwnam, getpwuid, setpassent, setpwent, endpwent - 패스워드 데이타베이스를 조작

프로그램 라이브러리
libc

서식
<sys/types.h> <pwd.h> struct passwd * getpwent(void) struct passwd * getpwnam(const char *login) struct passwd * getpwuid(uid_t uid) int setpassent(int stayopen) void setpwent(void) void endpwent(void)

해설
이러한 함수는, passwd(5) 에 기술된 패스워드 데이타베이스 파일을 조작합니다. 데이타베이스의 각 엔트리는, 인클루드 파일 <pwd.h> 에 있는 구조체 passwd 그리고 정의됩니다. 다음과 같습니다.

    struct passwd {
    	char	*pw_name;	/* 유저명 */
    	char	*pw_passwd;	/* 암호화된 패스워드 */
    	uid_t	pw_uid;		/* 유저 uid */
    	gid_t	pw_gid;		/* 유저 gid */
    	time_t	pw_change;	/* 패스워드의 변경 시각 */
    	char	*pw_class;	/* 유저 액세스 클래스 */
    	char	*pw_gecos;	/* 하네웰 로그인 정보 */
    	char	*pw_dir;	/* 홈 디렉토리 */
    	char	*pw_shell;	/* 디폴트의 쉘 */
    	time_t	pw_expire;	/* 어카운트 유효기간 */
    	int	pw_fields;	/* 내부 필드: 충전 필드 */
    };

함수 getpwnam() (은)는 주어진 로그인명을, getpwuid() (은)는 주어진 유저 ID 를 각각 패스워드 데이타베이스로 검색해, 항상 최초로 조우했다 엔트리를 돌려줍니다.

getpwent() 함수는 패스워드 데이타베이스를 차례차례 읽어들입니다. 유저의 완전한 리스트를 처리하고 싶은 프로그램 방향입니다.

setpassent() 함수는 2 개의 목적을 완수하는 것입니다. 우선 getpwent() 함수가 데이타베이스의 최초에 「되감는다 (rewind)」 같게 합니다. 한층 더 stayopen 하지만 0 (이)가 아니면, 파일 기술자를 오픈한 채로 합니다. 이것에 의해, 이러한 routine에 대한 그 후의 액세스 모든 것이 지극히 고속화됩니다 (다만 getpwent() 의 경우, 디폴트로 파일 기술자를 클로우즈 하지 않기 때문에 후자의 기능은 불필요합니다).

장시간 실행되고 있는 프로그램으로 파일 기술자를 오픈했다 로 해 두는 것은 위험합니다. 왜냐하면, 프로그램이 실행되어 있는 동안에 데이타베이스가 갱신되면(자), 오픈한 채로 하고 있다 데이타베이스는 낡은 쓸모 있게 되어 버리기 때문입니다.

setpwent() 함수는, 인수를 0 으로 했다 setpassent() (와)과 같습니다.

endpwent() 함수는, 오픈하고 있는 파일을 모두 클로우즈 합니다.

이러한 routine는, 패스워드 파일을 「숨긴다 (shadow)」목적으로 쓰여졌습니다. 예를 들어, 암호화 패스워드에 액세스 할 수 있다 프로그램을 한정할 수 있도록(듯이)입니다. 이러한 routine를 호출하는 프로세스의 유효 유저 ID 가 0 이라면 암호화 패스워드를 돌려주어, 그 외의 경우는 반환값인 구조체의 패스워드 필드는 string ‘*’ (을)를 가리키게 됩니다.

YP/NIS 의 상호작용
yp(4) 패스워드 데이타베이스가 사용 가능한 경우, 로컬의 데이타베이스에 요구된 패스워드 엔트리가 발견되지 않으면 getpwnam() 및 getpwuid() 함수는 각각, “passwd.byname” 및 “passwd.byuid” YP MAP를 사용합니다. passwd(5) 그리고 기술되고 있도록(듯이) MAP 전체가 사용 가능한 경우는, getpwent() 함수는 YP MAP “passwd.byname” (을)를 대충 읽습니다.

반환값
함수 getpwent(), getpwnam() 및 getpwuid() (은)는, 모두 성공하면(자), passwd 구조체에의 유효한 포인터를 돌려줍니다. 파일의 종단에 도달하는지, 혹은 에러가 발생했을 경우는 누르포인타를 돌려줍니다. setpassent() 함수는, 실패했을 경우는 0 을, 성공했을 경우는 1 을 돌려줍니다. endpwent() 및 setpwent() 함수의 반환값은 없습니다.

관련 파일
/etc/pwd.db
    안전하지 않는 패스워드 데이타베이스 파일
/etc/spwd.db
    안전한 패스워드 데이타베이스 파일
/etc/master.passwd
    현재의 패스워드 파일
/etc/passwd
    Version 7 형식의 패스워드 파일

관련 항목
getlogin(2), getgrent(3), yp(4), passwd(5), pwd_mkdb(8), vipw(8)

역사
getpwent(), getpwnam(), getpwuid(), setpwent() 및 endpwent() 함수는, AT&T UNIX 그리고 처음 등장했습니다. setpassent() 함수는 4.3BSD Reno 그리고 등장했습니다.

호환성
역사적인 이유로 존재하고 있던, 대체 패스워드 데이타베이스의 표준을 허락한 함수 setpwfile(3) (은)는 비추천이 되어 있어, 이제 사용할 수 없습니다.

버그
함수 getpwent(), getpwnam() 및 getpwuid() (은)는, 호출 결과를 내부의 정적 오브젝트에 남겨, 그 오브젝트를 가리키는 포인터를 돌려줍니다. 그 후, 같은 함수를 호출하면(자), 같은 오브젝트를 변경해 갈 것입니다.