X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fudev%2Fudev-ctrl.c;h=61d3c5b5575a616a60e3ed82be921038cf1a433e;hb=62a30b2c490512fe22a4e5faacb1d55763ead1e0;hp=7b5ef6b2a8e6fbfcd71659722cc8aeeeb6ac6a4b;hpb=0a6f50c0afdfc434b492493bd9efab20cbee8623;p=elogind.git diff --git a/src/udev/udev-ctrl.c b/src/udev/udev-ctrl.c index 7b5ef6b2a..61d3c5b55 100644 --- a/src/udev/udev-ctrl.c +++ b/src/udev/udev-ctrl.c @@ -10,16 +10,15 @@ */ #include -#include #include #include #include #include -#include #include #include #include +#include "socket-util.h" #include "udev.h" /* wire protocol magic must match */ @@ -57,7 +56,7 @@ struct udev_ctrl { int refcount; struct udev *udev; int sock; - struct sockaddr_un saddr; + union sockaddr_union saddr; socklen_t addrlen; bool bound; bool cleanup_socket; @@ -96,9 +95,9 @@ struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) { if (r < 0) log_warning_errno(errno, "could not set SO_PASSCRED: %m"); - uctrl->saddr.sun_family = AF_LOCAL; - 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); + uctrl->saddr.un.sun_family = AF_LOCAL; + strscpy(uctrl->saddr.un.sun_path, sizeof(uctrl->saddr.un.sun_path), "/run/udev/control"); + uctrl->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(uctrl->saddr.un.sun_path); return uctrl; } @@ -110,10 +109,10 @@ int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl) { int err; if (!uctrl->bound) { - err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen); + err = bind(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen); if (err < 0 && errno == EADDRINUSE) { - unlink(uctrl->saddr.sun_path); - err = bind(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen); + unlink(uctrl->saddr.un.sun_path); + err = bind(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen); } if (err < 0) { @@ -162,7 +161,7 @@ int udev_ctrl_cleanup(struct udev_ctrl *uctrl) { if (uctrl == NULL) return 0; if (uctrl->cleanup_socket) - unlink(uctrl->saddr.sun_path); + unlink(uctrl->saddr.un.sun_path); return 0; } @@ -251,7 +250,7 @@ static int ctrl_send(struct udev_ctrl *uctrl, enum udev_ctrl_msg_type type, int ctrl_msg_wire.intval = intval; if (!uctrl->connected) { - if (connect(uctrl->sock, (struct sockaddr *)&uctrl->saddr, uctrl->addrlen) < 0) { + if (connect(uctrl->sock, &uctrl->saddr.sa, uctrl->addrlen) < 0) { err = -errno; goto out; } @@ -377,6 +376,9 @@ struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn) { log_error_errno(errno, "unable to receive ctrl message: %m"); goto err; } + + cmsg_close_all(&smsg); + cmsg = CMSG_FIRSTHDR(&smsg); cred = (struct ucred *) CMSG_DATA(cmsg);