読者です 読者をやめる 読者になる 読者になる

Let's write β

趣味で書いたこととか、RustとLispが好き

シェルをつくりたい。

C/C++

シェルの作り方の基礎は大昔にやりましたが、でも今コードに落せるかといわれると
ちょっと微妙です。そこで、ゆっくり復習しようとおもってます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <dirent.h>
#include <unistd.h>

char* getPath();
char* searchFile(char *, char*);
char* searchBin(char *);

main()
{
        char *pathStr, *path;
        char *binpath;
        pathStr = getPath();
        int i;
        binpath = searchBin("ls");
        if(binpath != NULL) {
                printf("ls bin -> %s\n", binpath);
        }
        return 0;
}

char* getPath()
{
        return getenv("PATH");
}

//もし発見できたら、そのファイルのパスを返す
char* searchFile(char *dirpath, char *filename)
{
        DIR *dp = opendir(dirpath);
        struct dirent *dirst;
        char *binpath = NULL;
        char *fpath = NULL;
        if(dp == NULL) {
                fprintf(stderr, "Error: failed to open directory: %s\n",
                                dirpath);
                return false;
        }

        while((dirst = readdir(dp)) != NULL) {
                if (strcmp(filename, dirst->d_name) == 0) {
                        fpath = (char *)malloc(sizeof(char) *
                                        (strlen(dirpath) + strlen(filename)));
                        sprintf(fpath, "%s/%s", dirpath, dirst->d_name);
                }
        }
        return fpath;
}

char* searchBin(char *binname)
{
        char* binpath = NULL;
        char *pathStr, *path;
        for(pathStr = getPath(), path = strtok(pathStr, ":");
                        path != NULL;
                        path = strtok(NULL, ":"))
        {
                if((binpath = searchFile(path, binname)) != NULL) 
                        break;
        }
        return binpath;
}

僕が働いているAzit.incでは一緒に働けるエンジニアを募集しています!
採用情報 — 株式会社アジット|Azit Inc.