diff options
author | Harout Hedeshian <harouth@codeaurora.org> | 2014-03-04 10:12:39 -0700 |
---|---|---|
committer | Harout Hedeshian <harouth@codeaurora.org> | 2014-06-17 13:12:34 -0600 |
commit | 53def5e867e9b5b20101d1e77068be1b29507a2a (patch) | |
tree | 8475ddf96907b7ceeacf9b03620c2fc9107ae7c0 | |
parent | e4da15738080fdb1300adb6577b5dfaa9284c942 (diff) | |
download | android_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.mk | 2 | ||||
-rw-r--r-- | sockev/src/Android.mk | 14 | ||||
-rw-r--r-- | sockev/src/sockev_cli.c | 94 |
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; +} + |