C言語でcdコマンドを書きたい

■要求定義
– ユーザ名の入力に合わせてカレントディレクトリを移動する

■検討事項
ディレクトリ一覧を取得し、ユーザ入力と一致したら移動か
+ chdirでディレクトリを変更

#include <stdio.h>
#include <string.h> // 文字列操作
#include <unistd.h> // standard symbolic constants and types

int main(){

	char pathname[512];
	memset(pathname, '\0', 512); // memsetはバイトメモリブロックのセット

	char path[64] = "./hoge";
	chdir(path);
	getcwd(pathname, 512); // getcwdはカレントディレクトリ
	printf("%s\n",pathname);
		
	return 0;
}

$ pwd
/home/vagrant/dev
$ ./dev
/home/vagrant/dev/hoge

cだと、chdir(path)でディレクトリを変更できる

C言語でlsコマンドを書きたい

■要求定義
– まずはファイル名一覧表示
– オプションは後から考える

■検討した事
標準関数でファイル名一覧の取得関数はないらしい

#include <stdio.h>
#include <dirent.h> // format of directory entries

int main(){
	DIR *dir;
	struct dirent *dp; // 構造体
	char path[64] = "./";

	dir=opendir(path); // opendirはディレクトリオープン、 dirent.hが必要

	for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){ // readdirはディレクトリ読み込み
		printf("%s\n",dp->d_name);
	}
		
	return 0;
}

$ ./dev
.
dev
hello.c
..

forループでdp=readdir(dir);dp!=NULL;dp=readdir(dir)の書き方がよくわからんな。

C言語でログイン処理を書きたい

さて、C言語の基礎を写経したので、ここから少しずつC言語を使って緩くOSを学んでいきたい
まずmac, windowsにもあるログイン処理から

■要求定義
– ユーザ名に一致したパスワードを入力し、一致していたらログイン
– 不一致の場合は、パスワードを再入力してくださいと表示

#include <stdio.h>
#define User "hpscript"
#define Password "asdf"

int main(){
	char s[5];
	
	while(1){
		printf("%sさん、パスワードを入力してください。\n", User);
			gets(s);
		if(strcmp(s, Password)==0){
			printf("ログイン成功しました。\n");
			break;
		} else {
			printf("%sさん、パスワードを入力してください。\n", s);
		}
	}
	
	return 0;
}

$ ./dev
hpscriptさん、パスワードを入力してください。
aaaa
aaaaさん、パスワードを入力してください。
hpscriptさん、パスワードを入力してください。
asdf
ログイン成功しました。

文字列の比較は、strcmpを使用する
if(s == Password){} としても、trueにならない。
while(1)で無限ループにして、一致した場合はbreakでループから抜ける。

なるほど、型の宣言するところとか、色々頭使うなー