15 Ocak 2017 Pazar

AF_NETLINK Soketi

Giriş
Şu satırı dahil ederiz.
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
socket metodu
Şöyle yaparız.
#define NETLINK_KOBJECT_UEVENT 15

int socket_fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
bind metodu
Şöyle yaparız.
struct sockaddr_nl address;

memset(&address, 0, sizeof(address));
address.nl_family = AF_NETLINK;
address.nl_pid = atoi(argv[1]);
address.nl_groups = 0;

bind(socket_fd, (struct sockaddr *) &address, sizeof(address));
send metodu
Şöyle yaparız.
struct msghdr msg;
...
sendmsg(socket_fd, &msg, 0);
msghdr yapısını doldurmak için şöyle yaparız.
struct msghdr msg;
struct iovec iovector;


msg.msg_name = (void*)&address;
msg.msg_namelen = sizeof(address);
msg.msg_iov = &iovector;
msg.msg_iovlen = 1;


char message[LONG_STRING];
char *mp;

mp = message;
mp += sprintf(mp, "%s@%s", event, sysfspath) +1;
mp += sprintf(mp, "ACTION=%s", event) +1;
mp += sprintf(mp, "DEVPATH=%s", sysfspath) +1;
mp += sprintf(mp, "MAJOR=%s", major) +1;
mp += sprintf(mp, "MINOR=%s", minor) +1;
mp += sprintf(mp, "SUBSYSTEM=%s", subsystem) +1;
mp += sprintf(mp, "LD_PRELOAD=/tmp/libno_ex.so.1.0") +1;

iovector.iov_base = (void*)message;
iovector.iov_len = (int)(mp-message);

Hiç yorum yok:

Yorum Gönder