xref: /aosp_15_r20/external/ethtool/libmnl/examples/kobject/kobject-event.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /* This example is placed in the public domain. */
2*1b481fc3SMaciej Żenczykowski #include <stdio.h>
3*1b481fc3SMaciej Żenczykowski #include <stdlib.h>
4*1b481fc3SMaciej Żenczykowski #include <unistd.h>
5*1b481fc3SMaciej Żenczykowski #include <time.h>
6*1b481fc3SMaciej Żenczykowski 
7*1b481fc3SMaciej Żenczykowski #include <libmnl/libmnl.h>
8*1b481fc3SMaciej Żenczykowski #include <linux/netlink.h>
9*1b481fc3SMaciej Żenczykowski 
main(int argc,char * argv[])10*1b481fc3SMaciej Żenczykowski int main(int argc, char *argv[])
11*1b481fc3SMaciej Żenczykowski {
12*1b481fc3SMaciej Żenczykowski 	struct mnl_socket *nl;
13*1b481fc3SMaciej Żenczykowski 	char buf[MNL_SOCKET_BUFFER_SIZE];
14*1b481fc3SMaciej Żenczykowski 	int ret;
15*1b481fc3SMaciej Żenczykowski 
16*1b481fc3SMaciej Żenczykowski 	nl = mnl_socket_open(NETLINK_KOBJECT_UEVENT);
17*1b481fc3SMaciej Żenczykowski 	if (nl == NULL) {
18*1b481fc3SMaciej Żenczykowski 		perror("mnl_socket_open");
19*1b481fc3SMaciej Żenczykowski 		exit(EXIT_FAILURE);
20*1b481fc3SMaciej Żenczykowski 	}
21*1b481fc3SMaciej Żenczykowski 
22*1b481fc3SMaciej Żenczykowski 	/* There is one single group in kobject over netlink */
23*1b481fc3SMaciej Żenczykowski 	if (mnl_socket_bind(nl, (1<<0), MNL_SOCKET_AUTOPID) < 0) {
24*1b481fc3SMaciej Żenczykowski 		perror("mnl_socket_bind");
25*1b481fc3SMaciej Żenczykowski 		exit(EXIT_FAILURE);
26*1b481fc3SMaciej Żenczykowski 	}
27*1b481fc3SMaciej Żenczykowski 
28*1b481fc3SMaciej Żenczykowski 	ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
29*1b481fc3SMaciej Żenczykowski 	while (ret > 0) {
30*1b481fc3SMaciej Żenczykowski 		int i;
31*1b481fc3SMaciej Żenczykowski 
32*1b481fc3SMaciej Żenczykowski 		/* kobject uses a string based protocol, with no initial
33*1b481fc3SMaciej Żenczykowski 		 * netlink header.
34*1b481fc3SMaciej Żenczykowski 		 */
35*1b481fc3SMaciej Żenczykowski 		for (i=0; i<ret; i++)
36*1b481fc3SMaciej Żenczykowski 			printf("%c", buf[i]);
37*1b481fc3SMaciej Żenczykowski 
38*1b481fc3SMaciej Żenczykowski 		printf("\n");
39*1b481fc3SMaciej Żenczykowski 		ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
40*1b481fc3SMaciej Żenczykowski 	}
41*1b481fc3SMaciej Żenczykowski 	if (ret == -1) {
42*1b481fc3SMaciej Żenczykowski 		perror("error");
43*1b481fc3SMaciej Żenczykowski 		exit(EXIT_FAILURE);
44*1b481fc3SMaciej Żenczykowski 	}
45*1b481fc3SMaciej Żenczykowski 
46*1b481fc3SMaciej Żenczykowski 	mnl_socket_close(nl);
47*1b481fc3SMaciej Żenczykowski 
48*1b481fc3SMaciej Żenczykowski 	return 0;
49*1b481fc3SMaciej Żenczykowski }
50