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