#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/socket.h>
#define MAX_PAYLOAD 1024

struct sockaddr_nl src_addr, dst_addr;
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int sock_fd;

int main(int argc,char **argv)
{
	sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
	memset(&dst_addr, 0, sizeof(dst_addr));
	dst_addr.nl_family = AF_NETLINK;
	printf("%s :",argv[1]);
	if(argc>0)
	dst_addr.nl_pid = atoi(argv[1]); // 0 means kernel
	else
	dst_addr.nl_pid = 0;
	dst_addr.nl_groups = 0; // no multicast
	printf("SOCK FD :%d \n",sock_fd);
	nlh = (struct nlhmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
	/* Fill the netlink message header */
	nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
	nlh->nlmsg_pid = getpid();
	nlh->nlmsg_flags = 0;
	strcpy(NLMSG_DATA(nlh), "User Spaces: Message from User to Kernel!");
	iov.iov_base = (void *)nlh;
	iov.iov_len = nlh->nlmsg_len;
	msg.msg_name = (void *)&dst_addr;
	msg.msg_namelen = sizeof(dst_addr);
	msg.msg_iov = &iov;
	msg.msg_iovlen = 1;
	printf("My id is : %d\n",getpid());
	sendmsg(sock_fd, &msg, 0);
	memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
	recvmsg(sock_fd, &msg, 0);
	system("myScript.sh");
	printf("Received message payload: %s\n", NLMSG_DATA(nlh));
	close(sock_fd);
	return (1);
}

/*
Save as netwriter.c,
Compile using
gcc netwriter.c -o netwriter
For execution, give Process ID as arguement. '0' for kernel.*/
