/* * Intel(R) Enclosure LED Utilities * Copyright (C) 2009-2019 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * */ #ifndef _UTILS_H_INCLUDED_ #define _UTILS_H_INCLUDED_ #include #include "config_file.h" #include "stdlib.h" #include "stdint.h" #include "list.h" #include "status.h" #include "syslog.h" #include "ibpi.h" /** * Value is intentionally unused. * Macro to prevent compiler from raising unused result warning. */ #define UNUSED(x) do { if (x); } while (0) /** * Maximum number of bytes in temporary buffer. It is used for local variables. */ #define BUFFER_MAX 128 /** * Maximum number of bytes in write buffer. It is used for local variables when * function needs to write a sysfs attribute. */ #define WRITE_BUFFER_SIZE 1024 /** * This structure describes a device identifier. It consists of major and minor * attributes of device. */ struct device_id { int major, minor; }; struct log_level_info { char prefix[10]; int priority; }; /** */ #define PREFIX_DEBUG " DEBUG: " #define PREFIX_WARNING "WARNING: " #define PREFIX_INFO " INFO: " #define PREFIX_ERROR " ERROR: " /** * This array describes a log levels priorities with message prefix . */ extern struct log_level_info log_level_infos[]; /** * This global variable holds the name of binary file an application has been * executed from. */ extern char *progname; /** * @brief Reads integer value from a text file. * * This function assumes that the only text in a file is requested number to * read. In case of an error while reading from file the function will return * a value stored in defval argument. * * @param[in] path location of a file to be read. * @param[in] defval default value to return in case the file * does not exist. * @param[in] name name of a file to be read. * * @return Value read from a file if successful, otherwise a value stored in * defval argument. */ int get_int(const char *path, int defval, const char *name); /** * @brief Reads 64-bit unsigned integer from a text file. * * This function assumes that the only text in a file is requested number to * read. In case of an error while reading from file the function will return * a value stored in defval argument. * * @param[in] path Path where a file is located. * @param[in] defval Default value to be returned in case of error. * @param[in] name Name of a file to be read. * * @return Value read from a file if successful, otherwise a value stored in * defval argument. */ uint64_t get_uint64(const char *path, uint64_t defval, const char *name); /** * @brief Reads a content of a text file. * * This function reads a text file and return pointer to memory where the text * has been stored. The memory allocated by the function must be release as soon * as application does not require the content. Use free() function to give * allocated memory back to the system. * * @param[in] path Path where a file is located. * @param[in] name Name of a file to be read. * * @return Pointer to memory buffer if successful, otherwise NULL pointer. */ char *get_text(const char *path, const char *name); /** * @brief Reads boolean value from a text file. * * This function assumes that the only text in a file is the requested value to * read. The recognized boolean values are in the format 'Y' for True and 'N' * for False. In case of an error while reading from file the function will * return a value stored in defval argument. * * @param[in] path Path where a file is located. * @param[in] defval Default value to be returned in case of error. * @param[in] name Name of a file to be read. * * @return Value read from a file if successful, otherwise a value stored in * defval argument. 1 is returned for True, 0 for False. */ int get_bool(const char *path, int defval, const char *name); /** * @brief Writes a text to file. * * This function writes a text to a file and return the number of bytes written. * If the file does not exist or the value is incorrect the function returns -1 * and errno has additional error information. * * @param[in] path Location of file to write. * @param[in] name Name of file to write. * @param[in] value Text to write to a file. * * @return The number of bytes written or -1 if an error occurred. */ int put_text(const char *path, const char *name, const char *value); /** * @brief Writes an integer value to a text file. * * This function writes an integer value to a text file. If the file does not * exist or the value is out of range the function returns -1 and errno variable * has additional error information. * * @param[in] path Location of file to write. * @param[in] name Name of file to write. * @param[in] value Integer value to write to a file. * * @return The number of bytes written or -1 if an error occurred. */ int put_int(const char *path, const char *name, int value); /** * @brief Scans directory for files. * * This function reads a directory specified in path argument and puts found * file on a list. The function puts a canonical paths on the list, however it * does not resolve any symbolic link. * * This function allocates memory for the list elements. The caller should free * it using list_erase(). * * @param[in] path Path to directory to read. * @param[in] result Pointer to list where the directory contents * will be put. * * @return 0 on success, -1 on error. */ int scan_dir(const char *path, struct list *result); /** * @brief Writes a text to file. * * This function writes content of text buffer to file. If the file does not * exist or a content is invalid the function returns -1 and errno variable has * additional error information. * * @param[in] path Location and name of file to write to. * @param[in] buf Pointer to text buffer to write to a file. * * @return Number of bytes written if successful, otherwise -1 for an error. */ ssize_t buf_write(const char *path, const char *buf); /** * @brief Reads the content of a text file. * * The function reads the content of a text file and stores it to memory buffer * allocated. The function determines a size of the file and allocates required * amount of memory. User is required to free allocated memory as soon as * application does not require the content. Use free() function to give memory * back to the system pool. The function replaces last end-of-line character * with '\0' character. * * @param[in] path Path and name of file to read. * * @return Pointer to memory block if successful, otherwise NULL pointer. */ char *buf_read(const char *path); /** * @brief Gets major and minor of device. * * The function reads from text buffer the major and minor of block device. * * @param[in] buf Pointer to text buffer to interpret. * @param[out] did Placeholder where major and minor will be * stored. * * @return The function does not return a value. */ void get_id(const char *buf, struct device_id *did); /** * @brief Open a local log file. * * The function opens a file to write log messages. If the given file does not * exist the new one will be created. If the file already exist the file will be * opened in append mode and the pointer will be set at the end of a file. * * @param[in] path Location and name of a log file. * * @return The function returns 0 if successful, otherwise -1 and errno variable * has additional error information. */ int log_open(const char *path); /** * @brief Close a local log file. * * The function closes a local log file. If the file has not been opened the * function does nothing. * * @return The function does not return a value. */ void log_close(void); /** * @brief Logs an message with given loglevel. * * The function logs a message at given level of verbosity. * * @param[in] loglevel Level of verbosity for a message. * @param[in] buf Buffer containing format of a message. * @param[in] ... Additional arguments according to format of * a message. * * @return The function does not return a value. */ void _log(enum log_level_enum loglevel, const char *buf, ...); #define log_error(buf, ...) _log(LOG_LEVEL_ERROR, buf, ##__VA_ARGS__) #define log_debug(buf, ...) _log(LOG_LEVEL_DEBUG, buf, ##__VA_ARGS__) #define log_info(buf, ...) _log(LOG_LEVEL_INFO, buf, ##__VA_ARGS__) #define log_warning(buf, ...) _log(LOG_LEVEL_WARNING, buf, ##__VA_ARGS__) /** */ void set_invocation_name(char *invocation_name); /** * @brief Copies a text buffer. * * This function copies source text buffer to destination buffer. The function * always return a null-terminated buffer even if src does not fit in dest. * * @param[out] dest Pointer to destination buffer. * @param[in] src Pointer to source buffer. * @param[in] size Capacity of destination buffer in bytes. * * @return Pointer to destination buffer even if function failed. */ char *str_cpy(char *dest, const char *src, size_t size); /** * @brief Duplicates a text buffer. * * This function duplicates a text buffer. It allocates a new memory block and * copies the content of source buffer to new location. If pointer to source * buffer is NULL the function will return NULL, too. The caller is required to * free allocated memory as soon as content is not needed. * * @param[in] src Source buffer to duplicate the content. * * @return Pointer to allocated memory block if successful, otherwise NULL. */ char *str_dup(const char *src); /** */ char *truncate_path_component_rev(const char *path, int index); /** */ char *get_path_component_rev(const char *path, int index); /** * @brief Extracts the 'hostX' part from path. */ char *get_path_hostN(const char *path); int match_string(const char *string, const char *pattern); /** */ int get_log_fd(void); /** */ void print_opt(const char *long_opt, const char *short_opt, const char *desc); /** */ status_t set_log_path(const char *path); /** * Internal enumeration type. It is used to help parse command line arguments. */ enum opt { OPT_ALL, OPT_CONFIG, OPT_DEBUG, OPT_ERROR, OPT_HELP, OPT_INFO, OPT_INTERVAL, OPT_LOG, OPT_QUIET, OPT_VERSION, OPT_WARNING, OPT_LOG_LEVEL, OPT_LIST_CTRL, OPT_LISTED_ONLY, OPT_FOREGROUND, OPT_NULL_ELEMENT }; extern struct option longopt_all[]; void setup_options(struct option **longopt, char **shortopt, int *options, int options_nr); int get_option_id(const char *optarg); status_t set_verbose_level(int log_level); const char *ibpi2str(enum ibpi_pattern ibpi); #endif /* _UTILS_H_INCLUDED_ */