뭐요

xv6에서 로그인 구현 본문

Operating System/xv6

xv6에서 로그인 구현

욕심만 많은 사람 2023. 2. 28. 12:37

xv6에서 로그인 구현

로그인 구현

xv6에서 init.c를 수정하여 아이디, 비밀번호를 입력할 수 있도록 로그인 구현하기

 

우리의 목표

  • 부팅 시 Username : root, Password : 1234를 입력하여 로그인 구현
  • list.txt 파일을 읽어 입력 받은 값이 해당 파일에 존재하는 지 확인하여 로그인 가능 여부 체크
  • list.txt 파일은 Username, Password 형식으로 구성
  • 로그인 가능하면 ssu_login에서 shell 프로그램을 fork-exec으로 호출

 

1) list.txt를 추가

$ cat list.txt
root 1234
user 3456

 

2) init.c에서 바로 shell 프로그램 실행시키는 것이 아닌 ssu_login 실행시키도록 변경

// init.c
for(;;){
  printf(1, "init: starting login\\n");
  pid = fork();
  if(pid < 0){
    printf(1, "init: fork failed\\n");
    exit();
  }
  if(pid == 0){
    exec("ssu_login", argv); // 추가
        //exec("sh", argv);
    printf(1, "init: exec login failed\\n");
    exit();
  }
  while((wpid=wait()) >= 0 && wpid != pid)
    printf(1, "zombie!\\n");
}

 

3) ssu_login.c 코드 작성

#include "types.h"
#include "stat.h"
#include "user.h"
#include "fcntl.h"

/*
Function Declaration
*/
void get_user_list();
void parse_list();
int check_idpw();

/*
Variable Declaration
*/
char userID[16][32];
char pwdID[16][32];
int stop = 0;
int count = 0; 

void get_user_list(){
    int fd;

    // list.txt open
    fd = open("list.txt", O_RDONLY);
    if(fd < 0){
        printf(1, "open failed");
        exit();
    }

    // list.txt에 있는 [Username] [Password] 가져오기
    for(int i = 0; i < 10; i++){
        // 종료 조건
        if(stop){
            break;
        }
        count++;

        // save
        parse_list(fd, userID[i]);
        parse_list(fd, pwdID[i]);
    }
}

void parse_list(int fd, char *ID){
    for(int i = 0; ; i++){
        if(read(fd, &ID[i], 1) <= 0){
            stop = 1;
            break;
        }
        if(ID[i] == ' ' || ID[i] == '\\n'){
            ID[i] = '\\0';
            break;
        }
    }
}

int check_idpw(){
    char id[32] = {0, };
    char pw[32] = {0, };

    printf(1, "Username: ");
    parse_list(0, id);
    printf(1, "Password: ");
    parse_list(0, pw);

    for(int i = 0 ; i < count; i++){
        if(!strcmp(id, userID[i])){
            if(!strcmp(pw, pwdID[i])){
                return 1;
            }
            return 0;
        }
    }
    return 0;
}

int main(int argc, char *argv[]){
    int pid, wpid;
    get_user_list();

    while(1){
        if(check_idpw()){
            for(;;){
                printf(1, "init: starting sh\\n");
                pid = fork();
                if(pid < 0){
                    printf(1, "init: fork failid\\n");
                    exit();
                }
                if(pid == 0){
                    exec("sh", argv);
                    printf(1, "init: exec sh failed\\n");
                    exit();
                }
                while((wpid = wait()) >= 0 && wpid != pid){
                    printf(1, "zombie!\\n");
                }

            }
        }
    }
}

 

4) 실행 결과

실패한 경우

image

성공한 경우

image