반응형
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
반응형
'C언어 header > pwd.h' 카테고리의 다른 글
getpwuid(3) - uid로 상세 user정보 얻기 (0) | 2019.10.11 |
---|---|
getpwnam_r(3) - username으로 상세 user정보 얻기(thread-safe) (0) | 2019.10.11 |
getpwnam(3) - username으로 상세 user정보 얻기 (0) | 2019.10.11 |