X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudev-ctrl.c;h=9e503001bbaacd08d3774828d2ef413ca47a452d;hb=486cd82c8f7642016895b72bcc09a1bfe885a783;hp=a235912ffb5eeb48822c3c3ae16f760ed755b89e;hpb=f274ece0f76b5709408821e317e87aef76123db6;p=elogind.git diff --git a/src/udev/udev-ctrl.c b/src/udev/udev-ctrl.c index a235912ff..9e503001b 100644 --- a/src/udev/udev-ctrl.c +++ b/src/udev/udev-ctrl.c @@ -73,6 +73,7 @@ struct udev_ctrl_connection { struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) { struct udev_ctrl *uctrl; + const int on = 1; uctrl = calloc(1, sizeof(struct udev_ctrl)); if (uctrl == NULL) @@ -91,9 +92,10 @@ struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) uctrl->bound = true; uctrl->sock = fd; } + setsockopt(uctrl->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); uctrl->saddr.sun_family = AF_LOCAL; - util_strscpy(uctrl->saddr.sun_path, sizeof(uctrl->saddr.sun_path), "/run/udev/control"); + strscpy(uctrl->saddr.sun_path, sizeof(uctrl->saddr.sun_path), "/run/udev/control"); uctrl->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(uctrl->saddr.sun_path); return uctrl; } @@ -138,7 +140,7 @@ struct udev *udev_ctrl_get_udev(struct udev_ctrl *uctrl) return uctrl->udev; } -struct udev_ctrl *udev_ctrl_ref(struct udev_ctrl *uctrl) +static struct udev_ctrl *udev_ctrl_ref(struct udev_ctrl *uctrl) { if (uctrl == NULL) return NULL; @@ -250,7 +252,7 @@ static int ctrl_send(struct udev_ctrl *uctrl, enum udev_ctrl_msg_type type, int ctrl_msg_wire.type = type; if (buf != NULL) - util_strscpy(ctrl_msg_wire.buf, sizeof(ctrl_msg_wire.buf), buf); + strscpy(ctrl_msg_wire.buf, sizeof(ctrl_msg_wire.buf), buf); else ctrl_msg_wire.intval = intval; @@ -338,13 +340,18 @@ struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn) { struct udev_ctrl_msg *uctrl_msg; ssize_t size; - struct msghdr smsg; struct cmsghdr *cmsg; struct iovec iov; - struct ucred *cred; char cred_msg[CMSG_SPACE(sizeof(struct ucred))]; + struct msghdr smsg = { + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_control = cred_msg, + .msg_controllen = sizeof(cred_msg), + }; + struct ucred *cred; - uctrl_msg = calloc(1, sizeof(struct udev_ctrl_msg)); + uctrl_msg = new0(struct udev_ctrl_msg, 1); if (uctrl_msg == NULL) return NULL; uctrl_msg->refcount = 1; @@ -379,11 +386,7 @@ struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn) iov.iov_base = &uctrl_msg->ctrl_msg_wire; iov.iov_len = sizeof(struct udev_ctrl_msg_wire); - memset(&smsg, 0x00, sizeof(struct msghdr)); - smsg.msg_iov = &iov; - smsg.msg_iovlen = 1; - smsg.msg_control = cred_msg; - smsg.msg_controllen = sizeof(cred_msg); + size = recvmsg(conn->sock, &smsg, 0); if (size < 0) { log_error("unable to receive ctrl message: %m\n"); @@ -413,14 +416,6 @@ err: return NULL; } -struct udev_ctrl_msg *udev_ctrl_msg_ref(struct udev_ctrl_msg *ctrl_msg) -{ - if (ctrl_msg == NULL) - return NULL; - ctrl_msg->refcount++; - return ctrl_msg; -} - struct udev_ctrl_msg *udev_ctrl_msg_unref(struct udev_ctrl_msg *ctrl_msg) { if (ctrl_msg == NULL)