X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=7786ae6b8debba13d8c0d3ee76a44fe6aafa82e0;hb=4278ab015d76876f61821b293df07e0c3746bfd5;hp=7f32a2aa7926b5f58ea0a6b0b7fb27cf0baa9c50;hpb=225cb03bd851adc6d269b13bdf2b1bfded2b96b9;p=elogind.git diff --git a/udevd.c b/udevd.c index 7f32a2aa7..7786ae6b8 100644 --- a/udevd.c +++ b/udevd.c @@ -168,7 +168,9 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st delete_path(filename_failed); create_path(filename); + selinux_setfscreatecon(filename, NULL, S_IFLNK); symlink(msg->devpath, filename); + selinux_resetfscreatecon(); break; case EVENT_FINISHED: if (msg->devpath_old != NULL) { @@ -479,12 +481,20 @@ static int devpath_busy(struct udevd_uevent_msg *msg, int limit) return 3; } + /* check for our major:minor number */ + if (msg->devt && loop_msg->devt == msg->devt && + strcmp(msg->subsystem, loop_msg->subsystem) == 0) { + dbg("%llu, device event still pending %llu (%d:%d)", msg->seqnum, + loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt)); + return 4; + } + /* check physical device event (special case of parent) */ if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0) if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) { dbg("%llu, physical device event still pending %llu (%s)", msg->seqnum, loop_msg->seqnum, loop_msg->devpath); - return 4; + return 5; } } @@ -507,12 +517,20 @@ static int devpath_busy(struct udevd_uevent_msg *msg, int limit) return 3; } + /* check for our major:minor number */ + if (msg->devt && loop_msg->devt == msg->devt && + strcmp(msg->subsystem, loop_msg->subsystem) == 0) { + dbg("%llu, device event still running %llu (%d:%d)", msg->seqnum, + loop_msg->seqnum, major(loop_msg->devt), minor(loop_msg->devt)); + return 4; + } + /* check physical device event (special case of parent) */ if (msg->physdevpath && msg->action && strcmp(msg->action, "add") == 0) if (compare_devpath(loop_msg->devpath, msg->physdevpath) != 0) { dbg("%llu, physical device event still running %llu (%s)", msg->seqnum, loop_msg->seqnum, loop_msg->devpath); - return 4; + return 5; } } return 0; @@ -846,7 +864,7 @@ static int init_udevd_socket(void) saddr.sun_family = AF_LOCAL; /* use abstract namespace for socket path */ strcpy(&saddr.sun_path[1], UDEVD_CTRL_SOCK_PATH); - addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; + addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]); udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0); if (udevd_sock == -1) { @@ -1100,6 +1118,14 @@ int main(int argc, char *argv[], char *envp[]) close(fd); } + fd = open("/dev/kmsg", O_WRONLY); + if (fd > 0) { + const char *str = "<6>udevd version " UDEV_VERSION " started\n"; + + write(fd, str, strlen(str)); + close(fd); + } + /* set signal handlers */ memset(&act, 0x00, sizeof(struct sigaction)); act.sa_handler = (void (*)(int)) sig_handler;