X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fhardware-intel-libsensors.git;a=blobdiff_plain;f=utils.c;h=4dd316fdca08f75abf165ebd108acea7a1d06254;hp=278da194a9cb2c2e705bba5130bdd1f3251a281b;hb=7c33fc169569c9097418478b99f6be69497cb58d;hpb=8c426f37d87c2049951809e67e51f424690a3c91 diff --git a/utils.c b/utils.c index 278da19..4dd316f 100644 --- a/utils.c +++ b/utils.c @@ -20,247 +20,174 @@ * possible sysfs attributes. As an optimization we may want to cache which * ones are valid and immediately return in error for inexistent entries. */ - -int sysfs_write_int(const char path[PATH_MAX], int value) +int sysfs_read(const char path[PATH_MAX], void *buf, int buf_len) { - int ret; - int fd; - int len; - char buf[20]; - - len = sprintf(buf, "%d", value); + int fd, len; - if (!path[0] || len <= 0) { - ALOGE("Unexpected condition in sysfs_write_int\n"); + if (!path[0] || !buf || buf_len < 1) return -1; - } - fd = open(path, O_WRONLY); + fd = open(path, O_RDONLY); if (fd == -1) { ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); return -1; } - ret = write(fd, buf, len); - - if (ret != len) { - ALOGW("Cannot write %s (%d bytes) to %s (%s)\n", buf, len, path, - strerror(errno)); - } + len = read(fd, buf, buf_len); close(fd); - return ret; + if (len == -1) + ALOGW("Cannot read from %s (%s)\n", path, strerror(errno)); + else + ALOGV("Read %d bytes from %s\n", len, path); + + return len; } -int sysfs_read_int(const char path[PATH_MAX], int *value) +int sysfs_write(const char path[PATH_MAX], const void *buf, const int buf_len) { - int fd; - int len; - char buf[20] = {0}; + int fd, len; - if (!path[0] || !value) { + if (!path[0] || !buf || buf_len < 1) return -1; - } - fd = open(path, O_RDONLY); + fd = open(path, O_WRONLY); if (fd == -1) { ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); return -1; } - len = read(fd, buf, sizeof(buf)); + len = write(fd, buf, buf_len); close(fd); - if (len <= 0) { - ALOGW("Cannot read integer from %s (%s)\n", path, - strerror(errno)); - return -1; - } + if (len == -1) + ALOGW("Cannot write to %s (%s)\n", path, strerror(errno)); + else if (len != buf_len) + ALOGW("Cannot write %d bytes to %s (%d)\n", buf_len, path, len); + else + ALOGV("Wrote %d bytes to %s\n", buf_len, path); - *value = atoi(buf); + return len; +} - ALOGV("Read %d from %s\n", *value, path); - return 0; +static void str2int(const char* buf, void *v) +{ + *(int*)v = atoi(buf); } -int sysfs_write_str(const char path[PATH_MAX], const char *str) +static void str2float(const char* buf, void *v) { - int ret; - int fd; - int len; - - if (!path[0] || !str || !str[0]) { - return -1; - } + *(float*)v = strtof(buf, NULL); +} - fd = open(path, O_WRONLY); - if (fd == -1) { - ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); - return -1; - } +static void str2uint64(const char* buf, void *v) +{ + *(uint64_t*)v = atoll(buf); +} - len = strlen(str); - ret = write(fd, str, len); +int sysfs_read_num(const char path[PATH_MAX], void *v, + void (*str2num)(const char* buf, void *v)) +{ + char buf[20]; + int len = sysfs_read_str(path, buf, sizeof(buf)); - if (ret != len) { - ALOGW("Cannot write %s (%d bytes) to %s (%s)\n", str, len, path, + if (len <= 0) { + ALOGW("Cannot read number from %s (%s)\n", path, strerror(errno)); + return -1; } - else - ALOGV("Wrote %s to %s\n", str, path); - close(fd); - - return ret; + str2num(buf, v); + return 0; } -int sysfs_read_str(const char path[PATH_MAX], char *buf, int buf_len) +int sysfs_read_int(const char path[PATH_MAX], int *value) { - int fd; - int len; + return sysfs_read_num(path, value, str2int); +} - if (!path[0] || !buf || buf_len < 1) - return -1; - fd = open(path, O_RDONLY); +int sysfs_read_float(const char path[PATH_MAX], float *value) +{ + return sysfs_read_num(path, value, str2float); +} - if (fd == -1) { - ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); - return -1; - } - len = read(fd, buf, buf_len); +int sysfs_read_uint64(const char path[PATH_MAX], uint64_t *value) +{ + return sysfs_read_num(path, value, str2uint64); +} - close(fd); - if (len == -1) { - ALOGW("Cannot read string from %s (%s)\n", path, - strerror(errno)); +int sysfs_write_int(const char path[PATH_MAX], int value) +{ + char buf[20]; + int len = snprintf(buf, sizeof(buf), "%d", value); + + if (len <= 0) { + ALOGE("Unexpected condition in sysfs_write_int\n"); return -1; } - buf[len == 0 ? 0 : len-1] = '\0'; - - ALOGV("Read %s from %s\n", buf, path); - - return len; + return sysfs_write(path, buf, len); } - int sysfs_write_float(const char path[PATH_MAX], float value) { - int ret; - int fd; - int len; char buf[20]; + int len = snprintf(buf, sizeof(buf), "%g", value); - len = snprintf(buf, sizeof(buf), "%g", value); - - if (!path[0] || len <= 0) { + if (len <= 0) { ALOGE("Unexpected condition in sysfs_write_float\n"); return -1; } - fd = open(path, O_WRONLY); - - if (fd == -1) { - ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); - return -1; - } - - ret = write(fd, buf, len); - - if (ret != len) { - ALOGW("Cannot write %s (%d bytes) to %s (%s)\n", buf, len, path, - strerror(errno)); - } - - close(fd); - - return ret; + return sysfs_write(path, buf, len); } -int sysfs_read_float(const char path[PATH_MAX], float *value) +int sysfs_write_str(const char path[PATH_MAX], const char *str) { - int fd; - int len; - char buf[20] = {0}; - - if (!path[0] || !value) { - return -1; - } - - fd = open(path, O_RDONLY); - - if (fd == -1) { - ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); - return -1; - } - - len = read(fd, buf, sizeof(buf)); - - close(fd); - - if (len <= 0) { - ALOGW("Cannot read float from %s (%s)\n", path, - strerror(errno)); + if (!str || !str[0]) return -1; - } - - *value = (float) strtod(buf, NULL); - ALOGV("Read %g from %s\n", *value, path); - - return 0; + return sysfs_write(path, str, strlen(str)); } -int sysfs_read_uint64(const char path[PATH_MAX], uint64_t *value) + +int sysfs_read_str(const char path[PATH_MAX], char *buf, int buf_len) { - int fd; int len; - char buf[20] = {0}; - if (!path[0] || !value) { + if (!buf || buf_len < 1) return -1; - } - - fd = open(path, O_RDONLY); - - if (fd == -1) { - ALOGV("Cannot open %s (%s)\n", path, strerror(errno)); - return -1; - } - len = read(fd, buf, sizeof(buf)); + len = sysfs_read(path, buf, buf_len); - close(fd); - - if (len <= 0) { - ALOGW("Cannot read uint64 from %s (%s)\n", path, + if (len == -1) { + ALOGW("Cannot read string from %s (%s)\n", path, strerror(errno)); return -1; } - *value = atoll(buf); + buf[len == 0 ? 0 : len - 1] = '\0'; - ALOGV("Read %llu from %s\n", *value, path); + ALOGV("Read %s from %s\n", buf, path); - return 0; + return len; } - int64_t get_timestamp_realtime (void) { struct timespec ts = {0};