- udev_monitor->saddr.sun_family = AF_LOCAL;
- strcpy(udev_monitor->saddr.sun_path, socket_path);
- udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(udev_monitor->saddr.sun_path);
-
- /* translate leading '@' to abstract namespace */
- if (udev_monitor->saddr.sun_path[0] == '@')
- udev_monitor->saddr.sun_path[0] = '\0';
-
+ udev_monitor->sun.sun_family = AF_LOCAL;
+ if (socket_path[0] == '@') {
+ /* translate leading '@' to abstract namespace */
+ util_strlcpy(udev_monitor->sun.sun_path, socket_path, sizeof(udev_monitor->sun.sun_path));
+ udev_monitor->sun.sun_path[0] = '\0';
+ udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path);
+ } else if (stat(socket_path, &statbuf) == 0 && S_ISSOCK(statbuf.st_mode)) {
+ /* existing socket file */
+ util_strlcpy(udev_monitor->sun.sun_path, socket_path, sizeof(udev_monitor->sun.sun_path));
+ udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path);
+ } else {
+ /* no socket file, assume abstract namespace socket */
+ util_strlcpy(&udev_monitor->sun.sun_path[1], socket_path, sizeof(udev_monitor->sun.sun_path)-1);
+ udev_monitor->addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path)+1;
+ }