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