->back to toppage

課題内容-level4-

PATH変数をリストで定義し、コマンド探索を実装せよ。stat を使用する 必要がある。


プログラムの説明

まず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で識別するため、実行ファイルとフォルダが区別でき ずフォルダも検知してしまう。


<-previous problem    go to top    next problem->