- strcpy(saddr.sun_path, UDEVD_SOCK);
-
- /* try to connect, if it fails start daemon */
- retval = connect(sock, (struct sockaddr *) &saddr, sizeof(saddr));
- if (retval != -1) {
- goto send;
- } else {
- dbg("connect failed, try starting daemon...");
- retval = start_daemon();
- if (retval == 0) {
+ /* use abstract namespace for socket path */
+ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
+ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
+
+ size = build_hotplugmsg(&msg, action, devpath, subsystem, seq);
+
+ /* prepare message with credentials to authenticate ourself */
+ iov.iov_base = &msg;
+ iov.iov_len = size;
+
+ smsg.msg_name = &saddr;
+ smsg.msg_namelen = addrlen;
+ smsg.msg_iov = &iov;
+ smsg.msg_iovlen = 1;
+ smsg.msg_control = cred_msg;
+ smsg.msg_controllen = CMSG_LEN(sizeof(struct ucred));;
+ smsg.msg_flags = 0;
+
+ cmsg = CMSG_FIRSTHDR(&smsg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_CREDENTIALS;
+ cmsg->cmsg_len = sizeof(cred_msg);
+ cred = (struct ucred *) CMSG_DATA(cmsg);
+ cred->uid = getuid();
+ cred->gid = getgid();
+ cred->pid = getpid();
+ cred->pid = getpid();
+
+ /* If we can't send, try to start daemon and resend message */
+ loop = UDEVSEND_CONNECT_RETRY;
+ while (loop--) {
+ retval = sendmsg(sock, &smsg, 0);
+ if (retval != -1) {
+ retval = 0;
+ goto close_and_exit;
+ }
+
+ if (errno != ECONNREFUSED) {
+ dbg("error sending message");
+ goto close_and_exit;
+ }
+
+ if (!started_daemon) {
+ dbg("connect failed, try starting daemon...");
+ retval = start_daemon();
+ if (retval) {
+ dbg("error starting daemon");
+ goto exit;
+ }
+