diff options
-rw-r--r-- | src/util.c | 64 |
1 files changed, 34 insertions, 30 deletions
@@ -16,6 +16,7 @@ #include <errno.h> #include <fcntl.h> #include <stdlib.h> +#include <string.h> #include <stdio.h> #include <unistd.h> @@ -36,64 +37,67 @@ static dbus_handle_s g_dh[2]; pthread_mutex_unlock(&(handle)->mutex);\ } while (0); -static int sysfs_read_buf(char *path, char *buf, int len) +static int sysfs_read_buf(char *file, char *buf, int len) { - int r, fd; + int fd, r; - if ((!path) || (!buf) || (len < 0)) + if (!file || !buf || len < 0) return -EINVAL; - fd = open(path, O_RDONLY); + fd = open(file, O_RDONLY); if (fd == -1) - return -ENOENT; + return -errno; r = read(fd, buf, len); - close(fd); - - if ((r < 0) || (r > len)) - return -EIO; + if ((r >= 0) && (r < len)) + buf[r] = '\0'; + else { + buf[0] = '\0'; + r = -EIO; + } - /* Replace '\n' with space (ascii code is 32) */ - buf[strcspn(buf, "\n")] = (char)32; - buf[r] = '\0'; + close(fd); - return 0; + return r; } -static int sysfs_write_buf(char *path, char *buf) +int sysfs_write_buf(char *file, char *buf) { - int w, fd; + int fd, r; - if ((!path) || (!buf)) + if (!file || !buf) return -EINVAL; - fd = open(path, O_WRONLY); + fd = open(file, O_WRONLY); if (fd == -1) - return -ENOENT; + return -errno; - w = write(fd, buf, strlen(buf)); - close(fd); + r = write(fd, buf, strlen(buf)); + if (r < 0) + r = -EIO; - if (w < 0) - return -EIO; + close(fd); return 0; } int sysfs_read_int(char *path, int *val) { - char buf[MAX_BUF_SIZE + 1]; + char buf[MAX_BUF_SIZE]; int r; if ((!path) || (!val)) return -EINVAL; - r = sysfs_read_buf(path, buf, MAX_BUF_SIZE); - if (r < 0) - return r; + r = sysfs_read_buf(path, buf, sizeof(buf)); + if (r > 0) { + *val = atoi(buf); + } else { + *val = -1; + r = -EIO; + } - *val = atoi(buf); - return 0; + return r; } int sysfs_read_str(char *path, char *str, int len) @@ -112,13 +116,13 @@ int sysfs_read_str(char *path, char *str, int len) int sysfs_write_int(char *path, int val) { - char buf[MAX_BUF_SIZE + 1]; + char buf[MAX_BUF_SIZE]; int w; if (!path) return -EINVAL; - snprintf(buf, MAX_BUF_SIZE, "%d", val); + snprintf(buf, sizeof(buf), "%d", val); w = sysfs_write_buf(path, buf); if (w < 0) return w; |