1

単純なシェルとして機能する C プログラムでシステム コールを使用して機能を実装cdしていますが、ディレクトリ名に少し問題があります。些細な文字列関連のような気がしますが、これまでのところ運がありません。

次のような関数があります。

static void parse_args(int argc, char **argv) {

    // Special conditions:
    if (strcmp(argv[1], "return") == 0) {
        exit(0);
    }
    else if (strcmp(argv[1], "cd") == 0) {

        if (strcmp(argv[2], "mydir") == 0) {
            printf("Directory name is 'mydir'!\n");
        } else {
            printf("Directory name is NOT 'mydir'!\n");
        }

        int ret = chdir(argv[2]);
        if (ret == 0) { // success
            printf("Able to change directory.\n");
        } else {
            printf("UNABLE to change directory.\n");
        }
    }

    // Handling piping for shell ....
}

argv[2]これは、新しい目的のディレクトリを含む文字列であることを前もって知っています。

cdという名前の既存のディレクトリに移動したいのですが、等号mydirで呼び出します。ただし、ご覧のとおり、 の内部では、 が実際には「mydir」と正確に等しいことを確認しています。changeDirectoryargv[2]"mydir"changeDirectoryargv[2]

私の単純なシェル呼び出しの結果は次のとおりです。

$> pwd
/foo/bar
$> cd mydir
Directory name is 'mydir'!
UNABLE to change directory.
/usr/bin/cd: line 4: cd: mydir: No such file or directory
$> pwd
/foo/bar/mydir

したがって、コマンドは成功したように見えますが、なぜエラー メッセージが表示されるのかわかりません。 興味深いことに、このパラメーターを何らかの方法でキャスト/サニタイズできますか?を呼び出すと、このエラー メッセージは表示されません。int ret = chdir("mydir");任意のポインタをいただければ幸いです。さんできますか

4

1 に答える 1