lights: Cleanup read/write API

 * Use O_WRONLY for write
 * Return errno for write
 * Log all failures
 * Fix read_int():
   We would always treat strtol(...) = 0 as an error,
   although the real value can very well be 0.
   Check the end pointer to fix this.

Change-Id: Id2bc9acc103a7a6400dd06f3904af37cbb0b5174
diff --git a/liblights/lights_helper.c b/liblights/lights_helper.c
index 5fb4af1..565101b 100644
--- a/liblights/lights_helper.c
+++ b/liblights/lights_helper.c
@@ -28,38 +28,44 @@
  * Reads an Integer from a file.
  *
  * @param path The absolute path string.
- * @return The Integer with decimal base, -1 on error.
+ * @return The Integer with decimal base, -1 or errno on error.
  */
 int read_int(char const *path)
 {
     int fd, len;
     int num_bytes = 10;
     char buf[11];
-    int retval;
+    int ret;
 
     fd = open(path, O_RDONLY);
     if (fd < 0) {
-        ALOGE("%s: failed to open %s", __func__, path);
-        goto fail;
+        ret = errno;
+        ALOGE("%s: failed to open %s (%s)", __func__, path, strerror(errno));
+        goto exit;
     }
 
     len = read(fd, buf, num_bytes - 1);
     if (len < 0) {
-        ALOGE("%s: failed to read from %s", __func__, path);
-        goto fail;
+        ret = errno;
+        ALOGE("%s: failed to read from %s (%s)", __func__, path, strerror(errno));
+        goto exit;
     }
 
     buf[len] = '\0';
-    close(fd);
 
-    // no endptr, decimal base
-    retval = strtol(buf, NULL, 10);
-    return retval == 0 ? -1 : retval;
+    // decimal base
+    char *endptr = NULL;
+    ret = strtol(buf, &endptr, 10);
+    if (ret == 0 && endptr == NULL) {
+        ret = -1;
+        ALOGE("%s: failed to extract number from string %s", __func__, buf);
+        goto exit;
+    }
 
-fail:
+exit:
     if (fd >= 0)
         close(fd);
-    return -1;
+    return ret;
 }
 
 /*
@@ -67,38 +73,40 @@
  *
  * @param path The absolute path string.
  * @param value The Integer value to be written.
- * @return 0 on success, -1 or errno on error.
+ * @return 0 on success, errno on error.
  */
 int write_int(char const *path, const int value)
 {
-    int fd;
-    static int already_warned;
+    int fd, len;
+    int ret = 0;
 
-    already_warned = 0;
-
-    ALOGV("write_int: path %s, value %d", path, value);
-    fd = open(path, O_RDWR);
-
-    if (fd >= 0) {
-        char buffer[20];
-        int bytes = sprintf(buffer, "%d", value);
-        int amt = write(fd, buffer, bytes);
-        close(fd);
-        return amt == -1 ? -errno : 0;
-    } else {
-        if (already_warned == 0) {
-            ALOGE("write_int failed to open %s", path);
-            already_warned = 1;
-        }
-        return -errno;
+    fd = open(path, O_WRONLY);
+    if (fd < 0) {
+        ret = errno;
+        ALOGE("%s: failed to open %s (%s)", __func__, path, strerror(errno));
+        goto exit;
     }
+
+    char buffer[20];
+    int bytes = sprintf(buffer, "%d", value);
+    len = write(fd, buffer, bytes);
+    if (len < 0) {
+        ret = errno;
+        ALOGE("%s: failed to write to %s (%s)", __func__, path, strerror(errno));
+        goto exit;
+    }
+
+exit:
+    if (fd >= 0)
+        close(fd);
+    return ret;
 }
 
 /*
  * Set the current button brightness via sysfs.
  *
  * @param brightness The brightness value.
- * @return 0 on success, -1 or errno on error.
+ * @return 0 on success, errno on error.
  */
 inline int set_cur_button_brightness(const int brightness)
 {
@@ -129,7 +137,7 @@
  * Set the current panel brightness via sysfs.
  *
  * @param brightness The (scaled) brightness value.
- * @return 0 on success, -1 or errno on error.
+ * @return 0 on success, errno on error.
  */
 inline int set_cur_panel_brightness(const int brightness)
 {
@@ -140,7 +148,7 @@
  * Set the maximum panel brightness via sysfs.
  *
  * @param brightness The brightness value.
- * @return 0 on success, -1 or errno on error.
+ * @return 0 on success, errno on error.
  */
 inline int set_max_panel_brightness(const int brightness)
 {