diff options
Diffstat (limited to 'hw/shared.h')
-rw-r--r-- | hw/shared.h | 112 |
1 files changed, 108 insertions, 4 deletions
diff --git a/hw/shared.h b/hw/shared.h index da51ca4..a0687e2 100644 --- a/hw/shared.h +++ b/hw/shared.h @@ -20,6 +20,13 @@ #ifndef __HW_DEFAULT_SHARED_H__ #define __HW_DEFAULT_SHARED_H__ +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + #define FEATURE_HARDWARE_DLOG #ifdef FEATURE_HARDWARE_DLOG #define LOG_TAG "HARDWARE" @@ -35,9 +42,106 @@ #define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0])) -int sys_get_int(char *fname, int *val); -int sys_get_str(char *fname, char *str, int len); -int sys_set_int(char *fname, int val); -int sys_set_str(char *fname, char *val); +#define SHARED_H_BUF_MAX 255 + +static inline int sys_read_buf(char *file, char *buf, int len) +{ + int fd, r; + + if (!file || !buf || len < 0) + return -EINVAL; + + fd = open(file, O_RDONLY); + if (fd == -1) + return -ENOENT; + + r = read(fd, buf, len); + close(fd); + if ((r >= 0) && (r < len)) + buf[r] = '\0'; + else + return -EIO; + + return 0; +} + +static inline int sys_write_buf(char *file, char *buf) +{ + int fd, r; + + if (!file || !buf) + return -EINVAL; + + fd = open(file, O_WRONLY); + if (fd == -1) + return -EPERM; + + r = write(fd, buf, strlen(buf)); + close(fd); + if (r < 0) + return -EIO; + + return 0; +} + +static inline int sys_get_int(char *fname, int *val) +{ + char buf[SHARED_H_BUF_MAX]; + int r; + + if (!fname || !val) + return -EINVAL; + + r = sys_read_buf(fname, buf, sizeof(buf)); + if (r < 0) + return r; + + *val = atoi(buf); + return 0; +} + +static inline int sys_get_str(char *fname, char *str, int len) +{ + int r; + + if (!fname || !str || len < 0) + return -EINVAL; + + r = sys_read_buf(fname, str, len); + if (r < 0) + return r; + + return 0; +} + +static inline int sys_set_int(char *fname, int val) +{ + char buf[SHARED_H_BUF_MAX]; + int r; + + if (!fname) + return -EINVAL; + + snprintf(buf, sizeof(buf), "%d", val); + r = sys_write_buf(fname, buf); + if (r < 0) + return r; + + return 0; +} + +static inline int sys_set_str(char *fname, char *val) +{ + int r; + + if (!fname || !val) + return -EINVAL; + + r = sys_write_buf(fname, val); + if (r < 0) + return r; + + return 0; +} #endif |