まずPATH変数はpath.cの内のhash関数(make_path())でpath変数の内にリストに
としてハッシュテーブルにパスが定義されている。以下はその定義である。探索
する場所を定義している。また$PATHに探索するコマンドの文字列をinsertする。
さらに$PATHの文字列path[]に挿入する。
void make_path(){
int i,j,path_num;
char path[][VALUE_LEN] = {
"/bin",
"/sbin" ,
"/usr/bin",
"/usr/bin/X11",
"/usr/local/bin",
"."
};
printf("--- set path ---\n");
insert("$PATH", "path_head", 0);
path_num = sizeof(path) / VALUE_LEN; // パスの長さを取得
for(i=0; i<path_num; i++){ // path[i][0]!='\0'はおかしい
ので修正
insert("$PATH", path[i], -1);
}
次にPATH関数と入力された文字列をつなげてそのファイルは所有者,グループ,他
人いずれかで実行可能なのかをstatで調べて、executableで実行している。
strcat(path, *c); // $PATH の中のパスとコマンドを結合
if(PATH_DEB)printf("fullpath : %s ..... ", path);
//* コマンドが存在するかどうか調べて、あれば返す
if(stat(path,&buf) == -1){ //コマンドが存在しない(stat)
if(PATH_DEB) printf("Command not found.\n");
}else{ //コマンドが存在する
if(PATH_DEB) printf("Command was found!!\n");
for(m=0000100;m>1;m>>=3){ //コマンドの実行権限をチェック
switch(buf.st_mode & m){ //buf.st_mode:ファイルのモード
case S_IXUSR: //所有者の実行許可
case S_IXGRP: //グループの実行許可
case S_IXOTH: //他人の実行許可
printf("executable path : %s\n", path);
return 1;
default:
printf("not executable path : %s\n", path);
break;
}
}
}
[j04033@pw033 ~/level4]% my_shell_path
--- set path ---
$PATH=path_head->/bin->/sbin->/usr/bin->/usr/bin/X11->/usr/local/bin->.
[Level4] % ssh
fullpath : /bin/ssh ..... Command not found.
fullpath : /sbin/ssh ..... Command not found.
fullpath : /usr/bin/ssh ..... Command was found!!
executable path : /usr/bin/ssh
usage: ssh [-1246AaCfghkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
[-D port] [-e escape_char] [-F configfile] [-i identity_file]
[-L port:host:hostport] [-l login_name] [-m mac_spec] [-o option]
[-p port] [-R port:host:hostport] [-S ctl] [user@]hostname [command]
[Level4] % j04033
fullpath : /bin/j04033 ..... Command not found.
fullpath : /sbin/j04033 ..... Command not found.
fullpath : /usr/bin/j04033 ..... Command not found.
fullpath : /usr/bin/X11/j04033 ..... Command not found.
fullpath : /usr/local/bin/j04033 ..... Command not found.
fullpath : ./j04033 ..... Command not found.
指定したディレクトリ内のファイルの探索を行い、そのファイルの実行を行うよ
うにしている。ただしstatで識別するため、実行ファイルとフォルダが区別でき
ずフォルダも検知してしまう。