1 #include <stdio.h>
2 #include <dirent.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <unistd.h>
6 #include <sys/stat.h>
7 #include <aos/cli.h>
8 #include <stdbool.h>
9 #include <fcntl.h>
10 #include <path_helper.h>
11 
12 #ifndef STDOUT_FILENO
13 #define STDOUT_FILENO 1
14 #endif
15 
cat_main(int argc,char ** argv)16 static int cat_main(int argc, char **argv)
17 {
18     int index;
19     char abspath[256];
20 
21     for (index = 1; index < argc; index++) {
22         char *file = argv[index];
23         struct stat s;
24         int ret, fd, fsize, total = 0;
25         char buf[128];
26 
27         memset(abspath, 0 , sizeof(abspath));
28         file = get_realpath(file, abspath, sizeof(abspath));
29         if (!file) {
30             aos_cli_printf("Failed to get real path!\r\n");
31             return -1;
32         }
33 
34         ret = stat(file, &s);
35         if (ret) {
36             aos_cli_printf("stat %s failed - %s\n", file, strerror(errno));
37             continue;
38         }
39 
40         fd = open(file, O_RDONLY);
41         if (fd < 0) {
42             aos_cli_printf("open %s failed - %s\n", file, strerror(errno));
43             continue;
44         }
45 
46         fsize = s.st_size;
47 
48         while ((ret = read(fd, buf, 128))) {
49             int wlen;
50 
51             if (ret < 0) {
52                 aos_cli_printf("read %s failed - %s\n", file, strerror(errno));
53                 goto close;
54             }
55 
56             wlen = write(STDOUT_FILENO, buf, ret);
57             if (wlen != ret) {
58                 aos_cli_printf("write %s failed - %s\n", file, strerror(errno));
59                 goto close;
60             }
61 
62             total += ret;
63             if (total >= fsize) {
64                 break;
65             }
66         }
67         write(STDOUT_FILENO, "\r\n", 2);
68 close:
69         close(fd);
70     }
71     return 0;
72 }
73 ALIOS_CLI_CMD_REGISTER(cat_main, cat, read file);
74