diff --git a/src/cat.c b/src/cat.c new file mode 100644 index 0000000..f4d3f13 --- /dev/null +++ b/src/cat.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include + +int cat(const int fd) { + char buf[4024]; + ssize_t len; + + while ((len = read(fd, buf, sizeof(buf))) > 0) + if (write(STDOUT_FILENO, buf, len) != len) + return 1; + + return 0; +} + +int main(const int argc, const char **argv) { + if (argc == 1) + return cat(STDIN_FILENO); + + else { + for (int i = 1; i < argc; i++) { + int fd = open(argv[i], O_RDONLY); + if (fd < 0) { + fprintf(stderr, "cat: %s %s\n", argv[i], strerror(errno)); + return 1; + } + + if (cat(fd)) + return 1; + + if (close(fd)) { + fprintf(stderr, "cat: %s %s\n", argv[i], strerror(errno)); + return 1; + } + } + } + + return 0; +} diff --git a/src/echo.c b/src/echo.c new file mode 100644 index 0000000..e4fe93a --- /dev/null +++ b/src/echo.c @@ -0,0 +1,14 @@ +#include + +int main(const int argc, const char **argv) { + if (argc > 1) { + for (int i = 1; i < argc; i++) { + fputs(argv[i], stdout); + if (i < argc - 1) + putchar(' '); + } + } + + putchar('\n'); + return 0; +} diff --git a/src/getloadavg.c b/src/getloadavg.c new file mode 100644 index 0000000..ba7015d --- /dev/null +++ b/src/getloadavg.c @@ -0,0 +1,15 @@ +#include +#include + +int main(void) { + double avg[3] = {0, 0, 0}; + +#ifndef __ANDROID__ + if (getloadavg(avg, sizeof(avg) / sizeof(avg[0])) < 0) { + fprintf(stderr, "getloadavg: getloadavg() failed\n"); + return 1; + } +#endif + + printf("%.2f %.2f %.2f\n", avg[0], avg[1], avg[2]); +} diff --git a/src/ls.c b/src/ls.c new file mode 100644 index 0000000..4b78cb9 --- /dev/null +++ b/src/ls.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include + +int list(const char *path, int flag, int label) { + struct stat statbuf; + if (stat(path, &statbuf)) { + fprintf(stderr, "unable to stat %s: %s\n", path, strerror(errno)); + return 1; + } + + /* If its file */ + if (!S_ISDIR(statbuf.st_mode)) { + puts(path); + return 0; + } + + /* Make label */ + if (label) + printf("\n%s: \n", path); + + /* Open and print dir */ + struct dirent *ep; + DIR *dp = opendir(path); + if (dp == NULL) { + fprintf(stderr, "%s: %s\n", path, strerror(errno)); + return 1; + } + + while ((ep = readdir(dp)) != NULL) { + if (ep->d_name[0] == '.' && !flag) + continue; + + puts(ep->d_name); + } + + closedir(dp); + return 0; +} + + + +int main(const int argc, const char **argv) { + int flag = 0; + + int i; + for (i = 1; i < argc; i++) { + if (argv[i][0] != '-') + break; + + else if (!strcmp(argv[i], "-a")) + flag = 1; + + else if (!strcmp(argv[i], "-h")) { + printf("ls [-a] [Path]\n"); + return 0; + } + } + + if (i == argc) + return list(".", flag, 0); + + if (i == argc - 1) + return list(argv[i], flag, 0); + + else + for (int i = 1; i < argc; i++) + if (list(argv[i], flag, 1)) + return 1; + return 0; +} diff --git a/src/pwd.c b/src/pwd.c new file mode 100644 index 0000000..9b2068b --- /dev/null +++ b/src/pwd.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include + +int main(void) { + char cwd[PATH_MAX]; + + if (getcwd(cwd, sizeof(cwd))) + puts(cwd); + + else { + fprintf(stderr, "pwd: %s\n", strerror(errno)); + return 1; + } + + return 0; +}