Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
docbook 원본 putpwent

1장. putpwent

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제
1.6. 참고문헌

유저 패스워드 정보를 파일에 쓴다.


1.1. 사용법

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

int putpwent(const struct passwd *p, FILE *stream);
		


1.2. 설명

putpwent()함수는 stream에 연결된 파일에 패스워드 구조체 정보p를 이용해서 패스워드내용을 추가한다.

passwd구조체는 <pwd.h>에 다음과 같이 정의되어 있다.

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


1.3. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4. 에러

EINVAL

잘못된 값이 인자로 사용되었다.


1.5. 예제

#include <pwd.h>
#include <unistd.h>
#include <stdio.h>

#define USER_DEFAULT_DIR "/home/%s"
#define USER_DEFAULT_SHELL "/bin/sh"
void help()
{
    fprintf(stderr, "Usage: useradd2 [username] -d usr_dir -s usr_shell\n");
}

int main(int argc, char **argv)
{
    int opt;
    struct passwd lpass; 
    char user_dir[80];
    char user_name[32];
    FILE *pwfp;

    memset((void *)&lpass, 0x00, sizeof(lpass));
    while((opt = getopt(argc, argv, "s:d:h")) != -1)
    {
        switch(opt)
        {
            case 's':
                lpass.pw_shell = optarg; 
                break;
            case 'd':    
                lpass.pw_dir = optarg; 
                break;
            case 'h':
                help();
                exit(0);
                break;
            case '?': 
                help();
                break;
        }
    }

    if (optind > argc)    
    {
        snprintf(user_name, 32, "%s", argv[optind]);
        lpass.pw_name = user_name;
    }
    else
    {
        help();
        exit(1);
    }

    if(!lpass.pw_dir)
    {
        sprintf(user_dir, USER_DEFAULT_DIR, user_name);
        lpass.pw_dir = user_dir;
    }
    if(!lpass.pw_shell)
    {
        lpass.pw_shell = USER_DEFAULT_SHELL;
    }     
    printf("User id    : %s\n", lpass.pw_name);
    printf("User shell : %s\n", lpass.pw_shell);
    printf("User dir   : %s\n", lpass.pw_dir);

    pwfp = fopen("/etc/passwd", "a");
    putpwent(&lpass, pwfp);
    fclose(pwfp);
}
		
fopen()을 통하여 파일을 열때 "w"로 열지 않도록 주의해야 한다. 그럴 경우 기존 파일의 내용을 모두 잃어버리게 된다.

그리고 위의 프로그램은 작동방식만을 설명하는 수준의 프로그램이다. 제대로 작동하도록 만들려면 getpwent(3)등의 함수를 이용해서 패스워드 목록을 가져오고 중복된 이름이 있는지 확인하고, uid와 gid를 결정하는 등의 루틴이 포함되어야 한다. putpwent()함수는 uid와 gid를 결정해 주지 않기 때문이다.