From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751752AbcKILuK (ORCPT ); Wed, 9 Nov 2016 06:50:10 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39086 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750792AbcKILuI (ORCPT ); Wed, 9 Nov 2016 06:50:08 -0500 Subject: Re: [PATCH/RFC v2] tools/leds: Add led_notify_mon program for monitoring brightness changes To: Jacek Anaszewski , linux-leds@vger.kernel.org References: <1478604994-29854-1-git-send-email-j.anaszewski@samsung.com> Cc: linux-kernel@vger.kernel.org From: Hans de Goede Message-ID: <60631830-50a3-7215-15f5-d47cd73d2fc0@redhat.com> Date: Wed, 9 Nov 2016 12:50:05 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <1478604994-29854-1-git-send-email-j.anaszewski@samsung.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 09 Nov 2016 11:50:07 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 08-11-16 12:36, Jacek Anaszewski wrote: > LED subsystem supports POLLPRI on "brightness" sysfs file of LED > class devices. This tool demonstrates how to use the feature. > > Signed-off-by: Jacek Anaszewski > Cc: Hans de Goede Thank you. Patch looks good to me: Reviewed-by: Hans de Goede Regards, Hans > --- > Changes since v1: > - added lseek which fixes non-blocking poll() behaviour > > tools/leds/Makefile | 4 +-- > tools/leds/led_notify_mon.c | 83 +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 85 insertions(+), 2 deletions(-) > create mode 100644 tools/leds/led_notify_mon.c > > diff --git a/tools/leds/Makefile b/tools/leds/Makefile > index c03a79e..0fa948a 100644 > --- a/tools/leds/Makefile > +++ b/tools/leds/Makefile > @@ -3,11 +3,11 @@ > CC = $(CROSS_COMPILE)gcc > CFLAGS = -Wall -Wextra -g -I../../include/uapi > > -all: uledmon > +all: uledmon led_notify_mon > %: %.c > $(CC) $(CFLAGS) -o $@ $^ > > clean: > - $(RM) uledmon > + $(RM) uledmon led_notify_mon > > .PHONY: all clean > diff --git a/tools/leds/led_notify_mon.c b/tools/leds/led_notify_mon.c > new file mode 100644 > index 0000000..8b6e6f9 > --- /dev/null > +++ b/tools/leds/led_notify_mon.c > @@ -0,0 +1,83 @@ > +/* > + * led_notify_mon.c > + * > + * This program monitors LED brightness change notifications, > + * either having its origin in the hardware or in the software. > + * A timestamp and brightness value is printed each time the brightness changes. > + * > + * Usage: led_notify_mon > + * > + * is the name of the LED class device to be monitored. Pressing > + * CTRL+C will exit. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +int main(int argc, char const *argv[]) > +{ > + int fd, ret; > + char brightness_file_path[LEDS_MAX_NAME_SIZE + 11]; > + struct pollfd pollfd; > + struct timespec ts; > + char buf[11]; > + > + if (argc != 2) { > + fprintf(stderr, "Requires argument\n"); > + return 1; > + } > + > + snprintf(brightness_file_path, LEDS_MAX_NAME_SIZE, > + "/sys/class/leds/%s/brightness", argv[1]); > + > + fd = open(brightness_file_path, O_RDONLY); > + if (fd == -1) { > + printf("Failed to open %s file\n", brightness_file_path); > + return 1; > + } > + > + ret = read(fd, buf, sizeof(buf)); > + if (ret < 0) { > + printf("Failed to read %s file\n", brightness_file_path); > + goto err_read; > + } > + > + pollfd.fd = fd; > + pollfd.events = POLLPRI; > + > + while (1) { > + ret = poll(&pollfd, 1, -1); > + if (ret == -1) { > + printf("Failed to poll %s file (%d)\n", > + brightness_file_path, ret); > + ret = 1; > + break; > + } > + > + clock_gettime(CLOCK_MONOTONIC, &ts); > + > + ret = read(fd, buf, sizeof(buf)); > + if (ret < 0) > + break; > + > + ret = lseek(pollfd.fd, 0, SEEK_SET); > + if (ret < 0) { > + printf("lseek failed (%d)\n", ret); > + break; > + } > + > + printf("[%ld.%09ld] %d\n", ts.tv_sec, ts.tv_nsec, atoi(buf)); > + } > + > +err_read: > + close(fd); > + > + return ret; > +} >