- 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;
+
+ memset(&msg, 0x00, sizeof(struct hotplug_msg));
+ strcpy(msg.magic, UDEV_MAGIC);
+ msg.seqnum = seq;
+ strfieldcpy(msg.action, action);
+ strfieldcpy(msg.devpath, devpath);
+ strfieldcpy(msg.subsystem, subsystem);
+
+ /* If we can't send, try to start daemon and resend message */
+ loop = UDEVSEND_CONNECT_RETRY;
+ while (loop--) {
+ retval = sendto(sock, &msg, sizeof(struct hotplug_msg), 0,
+ (struct sockaddr *)&saddr, addrlen);
+ if (retval != -1) {
+ retval = 0;
+ goto exit;
+ }
+
+ if (errno != ECONNREFUSED) {
+ dbg("error sending message");
+ goto fallback;
+ }
+
+ if (!started_daemon) {
+ info("starting udevd daemon");
+ retval = start_daemon();
+ if (retval) {
+ info("error starting daemon");
+ goto fallback;
+ }