반응형

getpwuid_r(3)

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

int getpwuid_r(uid_t uid, struct passwd *pwd,
        char *buf, size_t buflen, struct passwd **result);

getpwuid_r(3)함수는 LINUX / UNIX 계정의 uid로 그 계정에 대한 상세 정보를 얻는 함수입니다. 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 종류

 

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

 

getpwuid_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 */
};

 

파리미터

uid 
    - LINUX 계정의 uid. UID는 사용자를 관리하는 unique한 번호이며 계정 생성시에 할당되는 번호입니다.
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) 프로세스의 owner에 대한 정보를 출력하는 예제

#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];
    int    ret;

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

    printf("USER ID: %s\nHome Dir: %s\n", pwd.pw_name, pwd.pw_dir);

    return 0;
}

 


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

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,