diff options
author | Luca Stefani <luca020400@lineageos.org> | 2017-08-24 22:24:29 +0200 |
---|---|---|
committer | dd3boh <dade.garberi@gmail.com> | 2017-09-17 14:13:47 +0200 |
commit | 66c36e2cb752b01a8c7fbe45e32ccc1681fb9d4b (patch) | |
tree | abb6d0f255601442e21e1caea3ccb5c6a7b077d4 /dataservices/datatop/src/datatop_fileops.c | |
parent | 7d3687801d2c4b503807698e34a5a3dd881bfce4 (diff) |
msm8996-common: Import marlin dataservices
Change-Id: I9d2e47585ac93bbdf28e275e9ec0c669b9f8be3e
Signed-off-by: Marco Zanin (B--B) <mrczn.bb@gmail.com>
Diffstat (limited to 'dataservices/datatop/src/datatop_fileops.c')
-rw-r--r-- | dataservices/datatop/src/datatop_fileops.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/dataservices/datatop/src/datatop_fileops.c b/dataservices/datatop/src/datatop_fileops.c new file mode 100644 index 0000000..b4c866c --- /dev/null +++ b/dataservices/datatop/src/datatop_fileops.c @@ -0,0 +1,167 @@ +/************************************************************************ +Copyright (c) 2015, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +************************************************************************/ + +/** + * @file datatop_fileops.c + * @brief Declares functions for reading and writing to files. + * + * Declares functions called when reading from files which data is collected. + * Also contains methods to handle files which will be written to. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include "datatop_interface.h" +#include "datatop_linked_list.h" +#include "datatop_opt.h" +#include "datatop_fileops.h" + +/** + * @brief Reads the lines from files which we are collecting data from. + * + * @param file File which is read from + * @param buffer Pointer to buffer where data will be read. The buffer is allocated + * in dt_read_file() and passed back to the caller. Caller should + * free this when done. + * @param len Maximum amount of data which should be read from the file. + * @return Number of bytes of data placed in *buffer. + */ +int dt_read_file(const char *file, char **buffer, int len) +{ + int read; + FILE *fp; + + *buffer = (char *)malloc(len); + if (!(*buffer)) { + fprintf(stderr, "%s(): malloc(%d) failed\n", __func__, len); + return 0; + } + + fp = fopen(file, "r"); + if (!fp) { + fprintf(stderr, "%s(): Failed to open %s: ", __func__, file); + fprintf(stderr, "Error: %s\n", strerror(errno)); + free(*buffer); + *buffer = 0; + return 0; + } + read = fread(*buffer, sizeof(char), len, fp); + fclose(fp); + + return read; +} + +/** + * @brief Deallocates memory no longer being used. + * + * @param buffer Buffer to be deallocated. + */ +void dt_free(char **buffer) +{ + free(*buffer); + *buffer = 0; +} + +/** + * @brief Checks for access to a file for writing. + * + * @param fw File to check access of. + * @return INVALID - File already exists or write access denied. + * @return VALID - File does not exist and can be written to. + */ +int dtop_check_writefile_access(char *fw) +{ + if (!access(fw, F_OK)) { + printf("File specified already exists\n"); + return INVALID; + } + + if (!access(fw, W_OK)) { + printf("Permission to write to specified file denied\n"); + return INVALID; + } + + return VALID; +} + +/** + * @brief Opens file and handles possible errors. + * + * @param fw File path to be opened. + * @param to_file Pointer to the *file that is opened. + * @return VALID - File opened successfully. + * @return INVALID - File could not be opened. + */ +int dtop_open_writing_file(char *fw, FILE **to_file) +{ + *to_file = fopen(fw, "w"); + if (*to_file) { + return VALID; + } else { + fprintf(stderr, "Value of errno: %d\n", errno); + fprintf(stderr, "Error opening file: %s\n", strerror(errno)); + fprintf(stderr, "Please try writing to a non-existent file\n"); + printf("See datatop -h for help\n"); + return INVALID; + } +} + +/** + * @brief Closes a file if not a standard stream. + * + * @param fw File to be closed. + */ +void dtop_close_file(FILE *fw) +{ + if (fw != stdout && fw != stderr && fw != stdin) + fclose(fw); +} + +/** + * @brief Helper function to find number of lines in dual_line file. + * + * @return Number of lines in a dual_line file. + */ +int dtop_get_file_line_amount(char *name) +{ + signed char rc = 0; + int line_count = 0; + FILE *file = fopen(name, "r"); + while (rc != EOF) { + if (rc == '\n') + line_count++; + rc = fgetc(file); + } + + fclose(file); + return line_count; +} |