| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * uledmon.c | 
 |  * | 
 |  * This program creates a new userspace LED class device and monitors it. A | 
 |  * timestamp and brightness value is printed each time the brightness changes. | 
 |  * | 
 |  * Usage: uledmon <device-name> | 
 |  * | 
 |  * <device-name> is the name of the LED class device to be created. Pressing | 
 |  * CTRL+C will exit. | 
 |  */ | 
 |  | 
 | #include <fcntl.h> | 
 | #include <stdio.h> | 
 | #include <string.h> | 
 | #include <time.h> | 
 | #include <unistd.h> | 
 |  | 
 | #include <linux/uleds.h> | 
 |  | 
 | int main(int argc, char const *argv[]) | 
 | { | 
 | 	struct uleds_user_dev uleds_dev; | 
 | 	int fd, ret; | 
 | 	int brightness; | 
 | 	struct timespec ts; | 
 |  | 
 | 	if (argc != 2) { | 
 | 		fprintf(stderr, "Requires <device-name> argument\n"); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	strncpy(uleds_dev.name, argv[1], LED_MAX_NAME_SIZE); | 
 | 	uleds_dev.max_brightness = 100; | 
 |  | 
 | 	fd = open("/dev/uleds", O_RDWR); | 
 | 	if (fd == -1) { | 
 | 		perror("Failed to open /dev/uleds"); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	ret = write(fd, &uleds_dev, sizeof(uleds_dev)); | 
 | 	if (ret == -1) { | 
 | 		perror("Failed to write to /dev/uleds"); | 
 | 		close(fd); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	while (1) { | 
 | 		ret = read(fd, &brightness, sizeof(brightness)); | 
 | 		if (ret == -1) { | 
 | 			perror("Failed to read from /dev/uleds"); | 
 | 			close(fd); | 
 | 			return 1; | 
 | 		} | 
 | 		clock_gettime(CLOCK_MONOTONIC, &ts); | 
 | 		printf("[%ld.%09ld] %u\n", ts.tv_sec, ts.tv_nsec, brightness); | 
 | 	} | 
 |  | 
 | 	close(fd); | 
 |  | 
 | 	return 0; | 
 | } |