반응형

getpwnam_r(3)

#include <sys/types.h>
#include <pwd.h>

int getpwnam_r(const char *name, struct passwd *pwd,
       char *buf, size_t buflen, struct passwd **result);

getpwnam_r(3)함수는 LINUX / UNIX의 계정인 name(문자열)으로 그 계정에 대한 상세 정보를 얻는 함수입니다. LINUX/UNIX 계정의 상세 정보는 /etc/passwd 파일에 저장이 됩니다. UNIX의 초기에는 이 passwd 파일에 비밀번호까지 관리를 해서 아마도 passwd 파일이라고 이름을 지은 것 같습니다. passwd 파일은 아무나 읽을 수 있는 파일이라 보안상 문제가 있어서, 현재는 비밀번호는 /etc/shadow 파일에 root 계정만 접근 가능하도록 변경되었습니다. 구조체 struct passwd는 /etc/passwd 파일의 항목으로 구성되어 있습니다. /etc/passwd 파일을 열어보면 다음과 같은 구성으로 되어 있습니다.

user1:x:3001:3000:User Comment:/home/user1:/bin/bash

user1 : OS 계정 (사용자ID)
x : 비밀번호. 비밀번호가 x이면 비밀번호는 /etc/shadow 파일에 암호화되어 저장되어 있다는 의미
3001 : user1에 대한 uid (숫자) - LINUX 내에서 실제 사용은 이 숫자인 uid를 사용함
3000 : user1이 소속된 그룹ID (gid)
User Comment : 사용자에 대한 설명
/home/user1 : user1의 home directory
/bin/bash : user1이 사용할 shell 종류

 

getpwnam_r(3)함수는 getpwnam(3)함수와 달리 multi-thread환경에서도 안정적으로 실행가능한 multi-thread safe함수입니다. 

 

getpwnam_r(3)함수의 두번 째 파라미터에 저장되는 struct passwd 파일의  구조는 아래와 같습니다.

struct passwd {
    char   *pw_name;       /* username */
    char   *pw_passwd;     /* user password */
    uid_t   pw_uid;        /* user ID */
    gid_t   pw_gid;        /* group ID */
    char   *pw_gecos;      /* user information */
    char   *pw_dir;        /* home directory */
    char   *pw_shell;      /* shell program */
};

 

파리미터

name
    : 상세정보를 얻으려는 LINUX / UNIX 계정명입니다.
pwd
    - 사용자의 상세 정보가 저장되는 buffer 
buf
    - 정상적으로 처리된 경우에는 name이 입력됩니다.
    - 오류가 발생한 경우에는 오류 문구가 출력됩니다.
    - buf의 크기를 적게 할당하게 되면 ERANGE값이 환경변수에 설정되므로 크게 잡습니다.
buf_len
    - buf에 할당된 크기입니다. 
    - buf의 크기를 적게 할당하게 되면 ERANGE값이 환경변수에 설정되므로 크게 잡습니다.
result
    - 정상적으로 처리가 된 경우에는 두번 째 파라미터인 pwd가 설정됩니다.
    - 오류가 발생한 경우에는 NULL이 설정됩니다.

 

RETURN

0
    - 성공적하였으며, result는 pwd를 가리킵니다.
    - 만약 name이 없는 정보이면 result는 NULL이 설정됩니다.

0 이외
    - 오류가 발생하였으면 errno 번호가 return되고 result는 NULL이 됩니다. 

 


활용 예제

 

sample. 파라미터로 계정명을 입력받아 그 계정의 정보를 출력하는 예제

#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[])
{
	struct passwd pwd;
	struct passwd *result;
	char   buf[1024];
	size_t bufsize;
	int    ret;

	if (argc != 2) {
		fprintf(stderr, "Usage: %s username\n", argv[0]);
		return 1;
	}

	ret = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
	if (result == NULL) {
		if (ret == 0)
			printf("%s\n", buf);
		else {
			printf("getpwnam_r() error: %s\n", strerror(ret));
		}
		return 1;
	}

	printf("Name: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);

	return 0;
}

 


see also : getpwnam(3) getpwuid(3) getpwuid_r(3)  사용자 및 그룹 관련 Library

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,