summaryrefslogtreecommitdiff
path: root/meta-rtmod1/model_answer/files/rt-sysfs-poll.c
diff options
context:
space:
mode:
Diffstat (limited to 'meta-rtmod1/model_answer/files/rt-sysfs-poll.c')
-rw-r--r--meta-rtmod1/model_answer/files/rt-sysfs-poll.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/meta-rtmod1/model_answer/files/rt-sysfs-poll.c b/meta-rtmod1/model_answer/files/rt-sysfs-poll.c
new file mode 100644
index 0000000000..8d0a5314e9
--- /dev/null
+++ b/meta-rtmod1/model_answer/files/rt-sysfs-poll.c
@@ -0,0 +1,52 @@
+/* Copyright (C) 2021 by Linaro */
+/* Permission to use, copy, modify, and/or distribute this software for any */
+/* purpose with or without fee is hereby granted. */
+/* THE SOFTWARE IS PROVIDED AS IS AND THE AUTHOR DISCLAIMS ALL WARRANTIES */
+/* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF */
+/* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR */
+/* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
+/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN */
+/* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF */
+/* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <poll.h>
+
+#define TEST_SYSFS_NOTIFY "/sys/demo-poll/notify"
+
+int main(void)
+{
+ int notify_fd, rv, cnt;
+ char attr_data[100];
+ struct pollfd ufds;
+
+ if ((notify_fd = open(TEST_SYSFS_NOTIFY, O_RDWR)) < 0) {
+ printf("Unable to open %s", TEST_SYSFS_NOTIFY);
+ exit(1);
+ }
+
+ cnt = read(notify_fd, attr_data, 100);
+ lseek(notify_fd, 0, SEEK_SET);
+ ufds.fd = notify_fd;
+ ufds.events = POLLPRI | POLLERR;
+ ufds.revents = 0;
+
+ if ((rv = poll(&ufds, 1, 100000)) < 0) {
+ perror("poll error");
+ } else if (rv == 0) {
+ printf("Timeout occurred!\n");
+ } else if (ufds.revents & (POLLPRI | POLLERR)) {
+ cnt = read(notify_fd, attr_data, 100);
+ printf("sysfs_notify() triggered, revents: %08X,"
+ " attribute data[%d] %s", ufds.revents, cnt, attr_data);
+ }
+
+ close(notify_fd);
+}