diff --git a/usr/shelly/shelly_cmd.c b/usr/shelly/shelly_cmd.c index 0b3435c..f25054d 100644 --- a/usr/shelly/shelly_cmd.c +++ b/usr/shelly/shelly_cmd.c @@ -87,6 +87,63 @@ static errval_t shelly_cmd_cat(char * line) { err = shelly_write_str("(@)<_____>__(_____)____/\n\r"); if (err_is_fail(err)) return err; + + int res = 0; + + FILE *f = fopen(line, "r"); + if (f == NULL) { + return FS_ERR_OPEN; + } + + /* obtain the file size */ + res = fseek(f , 0 , SEEK_END); + if (res) { + return FS_ERR_INVALID_FH; + } + + size_t filesize = ftell(f); + rewind(f); + + char str_buf[filesize + 10]; + snprintf(str_buf, filesize + 10, "File size is %zu\n\r", filesize); + err = shelly_write_str(str_buf); + if (err_is_fail(err)) return err; + + char *file_content = calloc(filesize + 2, sizeof(char)); + if (file_content == NULL) { + return LIB_ERR_MALLOC_FAIL; + } + + size_t read = fread(file_content, 1, filesize, f); + + + snprintf(str_buf, filesize + 10, "%s\n\r", file_content); + err = shelly_write_str(str_buf); + if (err_is_fail(err)) return err; + + if (read != filesize) { + return FS_ERR_READ; + } + + rewind(f); + + size_t nchars = 0; + int c; + do { + c = fgetc(f); + nchars++; + } while (c != EOF); + + if (nchars < filesize) { + return FS_ERR_READ; + } + + free(file_content); + res = fclose(f); + if (res) { + return FS_ERR_CLOSE; + } + return SYS_ERR_OK; }