- /* get state of ipc queue */
- retval = msgctl(msgid, IPC_STAT, &msg_queue);
- if (retval == -1) {
- dbg("error getting info on ipc queue");
- goto exit;
+ memset(&saddr, 0x00, sizeof(saddr));
+ saddr.sun_family = AF_LOCAL;
+ strcpy(saddr.sun_path, UDEVD_SOCKET);
+
+ /* try to connect, if it fails start daemon */
+ retval = connect(sock, &saddr, sizeof(saddr));
+ if (retval != -1) {
+ goto send;
+ } else {
+ dbg("connect failed, try starting daemon...");
+ retval = start_daemon();
+ if (retval == 0) {
+ dbg("daemon started");
+ } else {
+ dbg("error starting daemon");
+ goto exit;
+ }
+ }
+
+ /* try to connect while daemon to starts */
+ tspec.tv_sec = 0;
+ tspec.tv_nsec = 100000000; /* 100 millisec */
+ loop = UDEVSEND_CONNECT_RETRY;
+ while (loop--) {
+ retval = connect(sock, &saddr, sizeof(saddr));
+ if (retval != -1)
+ goto send;
+ else
+ dbg("retry to connect %d",
+ UDEVSEND_CONNECT_RETRY - loop);
+ nanosleep(&tspec, NULL);