summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarout Hedeshian <harouth@codeaurora.org>2014-03-04 10:12:39 -0700
committerHarout Hedeshian <harouth@codeaurora.org>2014-06-17 13:12:34 -0600
commit53def5e867e9b5b20101d1e77068be1b29507a2a (patch)
tree8475ddf96907b7ceeacf9b03620c2fc9107ae7c0
parente4da15738080fdb1300adb6577b5dfaa9284c942 (diff)
downloadandroid_vendor_qcom_opensource_dataservices-53def5e867e9b5b20101d1e77068be1b29507a2a.tar.gz
android_vendor_qcom_opensource_dataservices-53def5e867e9b5b20101d1e77068be1b29507a2a.tar.bz2
android_vendor_qcom_opensource_dataservices-53def5e867e9b5b20101d1e77068be1b29507a2a.zip
sockev: Initial version
Simple command line utility which listens to SOCKEV netlink multicast messages from the kernel CRs-Fixed: 626021 Change-Id: Ia9096e8e8ff4d86ea8babd1bfc1c99fda8d6cfb1
-rw-r--r--sockev/Android.mk2
-rw-r--r--sockev/src/Android.mk14
-rw-r--r--sockev/src/sockev_cli.c94
3 files changed, 110 insertions, 0 deletions
diff --git a/sockev/Android.mk b/sockev/Android.mk
new file mode 100644
index 0000000..8338432
--- /dev/null
+++ b/sockev/Android.mk
@@ -0,0 +1,2 @@
+include $(call all-subdir-makefiles)
+
diff --git a/sockev/src/Android.mk b/sockev/src/Android.mk
new file mode 100644
index 0000000..fd98fc4
--- /dev/null
+++ b/sockev/src/Android.mk
@@ -0,0 +1,14 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := sockev_cli.c
+LOCAL_CFLAGS := -Wall -Werror
+
+LOCAL_C_INCLUDES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
+LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+
+LOCAL_MODULE := sockev
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_EXECUTABLE)
diff --git a/sockev/src/sockev_cli.c b/sockev/src/sockev_cli.c
new file mode 100644
index 0000000..c007767
--- /dev/null
+++ b/sockev/src/sockev_cli.c
@@ -0,0 +1,94 @@
+/******************************************************************************
+ S O C K E V _ C L I . C
+Copyright (c) 2013, The Linux Foundation. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+******************************************************************************/
+
+/******************************************************************************
+ @file sockev_cli.c
+ @brief command line test utility to receive sockev netlink messages.
+******************************************************************************/
+
+#include <sys/socket.h>
+#include <linux/netlink.h>
+#include <linux/sockev.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#define SOCKEVCLI_ERROR -1
+
+int main(void)
+{
+ int skfd, addrlen, rc;
+ struct sockaddr_nl my_addr, src_addr;
+ struct nlmsghdr *nlh = NULL;
+ struct sknlsockevmsg *msg;
+
+ nlh = (struct nlmsghdr *)
+ malloc(NLMSG_SPACE(sizeof(struct sknlsockevmsg) + 16));
+ if (!nlh) {
+ fprintf(stderr, "malloc() failed\n");
+ return SOCKEVCLI_ERROR;
+ }
+
+ skfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCKEV);
+ if (skfd < 0) {
+ fprintf(stderr, "nl_open_sock: socket failed\n");
+ return SOCKEVCLI_ERROR;
+ }
+
+ memset(&my_addr, 0, sizeof(struct sockaddr_nl));
+
+ my_addr.nl_family = AF_NETLINK;
+ my_addr.nl_pid = getpid();
+ my_addr.nl_groups = SKNLGRP_SOCKEV;
+
+ rc = bind(skfd, (struct sockaddr *)&my_addr,
+ sizeof(struct sockaddr_nl));
+ if (rc < 0) {
+ fprintf(stderr, "nl_open_sock: bind failed\n");
+ close(skfd);
+ return SOCKEVCLI_ERROR;
+ }
+
+ while (1) {
+ recvfrom(skfd, nlh, sizeof(struct sknlsockevmsg) + 16, 0,
+ (const struct sockaddr *)&src_addr, &addrlen);
+ msg = NLMSG_DATA(nlh);
+ printf("----------------------------\n");
+ printf("pid:\t%d\n", msg->pid);
+ printf("event:\t%s\n", msg->event);
+ printf("skfamily:\t0x%04X\n", msg->skfamily);
+ printf("skstate:\t%03d\n", msg->skstate);
+ printf("skprotocol:\t%03d\n", msg->skprotocol);
+ printf("sktype:\t0x%04X\n", msg->sktype);
+ printf("skflags:\t0x%016llX\n", msg->skflags);
+ }
+
+ return 0;
+}
+