X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=plug%2Fhotplug.c;h=0905e4e95430ad8979e45c7dfc2adc2f7575220c;hp=0c97e4dce4efecbc6a6b9d34cfd22b34fb308436;hb=6900a6be63c63707c304cfe79c7469725fd07c11;hpb=370b68a9c3514ecb2fb6b814ba58e4e41f4f26c0 diff --git a/plug/hotplug.c b/plug/hotplug.c index 0c97e4d..0905e4e 100644 --- a/plug/hotplug.c +++ b/plug/hotplug.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ #include #include #include +#include #include "../procd.h" @@ -120,16 +122,18 @@ static void mkdir_p(char *dir) static void handle_makedev(struct blob_attr *msg, struct blob_attr *data) { unsigned int oldumask = umask(0); - static struct blobmsg_policy mkdev_policy[2] = { + static struct blobmsg_policy mkdev_policy[3] = { + { .type = BLOBMSG_TYPE_STRING }, { .type = BLOBMSG_TYPE_STRING }, { .type = BLOBMSG_TYPE_STRING }, }; - struct blob_attr *tb[2]; + struct blob_attr *tb[3]; char *minor = hotplug_msg_find_var(msg, "MINOR"); char *major = hotplug_msg_find_var(msg, "MAJOR"); char *subsystem = hotplug_msg_find_var(msg, "SUBSYSTEM"); + int ret = 0; - blobmsg_parse_array(mkdev_policy, 2, tb, blobmsg_data(data), blobmsg_data_len(data)); + blobmsg_parse_array(mkdev_policy, 3, tb, blobmsg_data(data), blobmsg_data_len(data)); if (tb[0] && tb[1] && minor && major && subsystem) { mode_t m = S_IFCHR; char *d = strdup(blobmsg_get_string(tb[0])); @@ -143,6 +147,17 @@ static void handle_makedev(struct blob_attr *msg, struct blob_attr *data) mknod(blobmsg_get_string(tb[0]), m | strtoul(blobmsg_data(tb[1]), NULL, 8), makedev(atoi(major), atoi(minor))); + if (tb[2]) { + struct group *g = getgrnam(blobmsg_get_string(tb[2])); + + if (g) + ret = chown(blobmsg_get_string(tb[0]), 0, g->gr_gid); + + if (!g || ret < 0) + ERROR("cannot set group %s for %s\n", + blobmsg_get_string(tb[2]), + blobmsg_get_string(tb[0])); + } } umask(oldumask); } @@ -377,12 +392,12 @@ static void queue_add(struct cmd_handler *h, struct blob_attr *msg, struct blob_ &_data, blob_pad_len(data), NULL); - c->msg = _msg; - c->data = _data; - if (!c) return; + c->msg = _msg; + c->data = _data; + memcpy(c->msg, msg, blob_pad_len(msg)); memcpy(c->data, data, blob_pad_len(data)); c->handler = h->handler; @@ -399,6 +414,7 @@ static void handle_button_timeout(struct uloop_timeout *t) b = container_of(t, struct button_timeout, timeout); blob_buf_init(&button_buf, 0); + blobmsg_add_string(&button_buf, "BUTTON", b->name); blobmsg_add_string(&button_buf, "ACTION", "timeout"); snprintf(seen, sizeof(seen), "%d", b->seen); blobmsg_add_string(&button_buf, "SEEN", seen); @@ -415,11 +431,12 @@ static void handle_button_complete(struct blob_attr *msg, struct blob_attr *data if (!timeout) return; - b = malloc(sizeof(*b)); - if (!b || !name) + if (!name) return; - memset(b, 0, sizeof(*b)); + b = calloc(1, sizeof(*b)); + if (!b) + return; b->data = malloc(blob_pad_len(data)); b->name = strdup(name); @@ -473,15 +490,13 @@ static void rule_handle_command(struct json_script_ctx *ctx, const char *name, int rem, i; if (debug > 3) { - DEBUG(4, "Command: %s", name); + DEBUG(4, "Command: %s\n", name); blobmsg_for_each_attr(cur, data, rem) - DEBUG(4, " %s", (char *) blobmsg_data(cur)); - DEBUG(4, "\n"); + DEBUG(4, " %s\n", (char *) blobmsg_data(cur)); - DEBUG(4, "Message:"); + DEBUG(4, "Message:\n"); blobmsg_for_each_attr(cur, vars, rem) - DEBUG(4, " %s=%s", blobmsg_name(cur), (char *) blobmsg_data(cur)); - DEBUG(4, "\n"); + DEBUG(4, " %s=%s\n", blobmsg_name(cur), (char *) blobmsg_data(cur)); } for (i = 0; i < ARRAY_SIZE(handlers); i++) @@ -567,11 +582,10 @@ void hotplug_last_event(uloop_timeout_handler handler) void hotplug(char *rules) { - struct sockaddr_nl nls; + struct sockaddr_nl nls = {}; int nlbufsize = 512 * 1024; rule_file = strdup(rules); - memset(&nls,0,sizeof(struct sockaddr_nl)); nls.nl_family = AF_NETLINK; nls.nl_pid = getpid(); nls.nl_groups = -1;