Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 셀레니움
- 값 객체
- Java
- 개발자 디자인
- excalidraw
- 위키 탭
- 정렬 기준
- nurigo
- REST
- DNS동작원리
- 위키 꾸미기
- 문자 인증
- ssh
- aws ec2
- 숭실대
- 스터디 관리
- NAVER D2
- 현장실습
- 프로그래머스
- 현장실습 IT
- 인턴
- 잘하고싶다..
- 스프링
- 사이드 프로젝트
- 스프링 회원가입 인증
- Executors
- Spring
- 스트림
- OpenAI
- 자바
Archives
- Today
- Total
뭐요
xv6에서 로그인 구현 본문
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) 실행 결과
실패한 경우
성공한 경우
'Operating System > xv6' 카테고리의 다른 글
예제로 알아보는 xv6에서 시스템 호출 구현하기 (2) (0) | 2023.02.28 |
---|---|
예제로 알아보는 xv6에서 시스템 호출 구현하기 (1) (0) | 2023.02.28 |
xv6에서 hcat 쉘 프로그램 작성 (0) | 2023.02.28 |
xv6에서 helloworld 쉘 프로그램 작성 (0) | 2023.02.28 |
[xv6] writing 1 byte into a region of size 0 에러 (2) | 2022.09.11 |