X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=331b7e4b84aa9d0229f709268dcbe58248e88701;hb=95a6f4c8acafe7031087667aa556a50a6a091c93;hp=22fb4d33db86d8e387d3d0ff2000f6f1d2de1d0b;hpb=53921bfa44129a19661a4aaa4c1647282921fc18;p=elogind.git diff --git a/udevd.c b/udevd.c index 22fb4d33d..331b7e4b8 100644 --- a/udevd.c +++ b/udevd.c @@ -19,6 +19,7 @@ * */ +#include #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include #include "list.h" #include "udev.h" @@ -42,6 +42,7 @@ #include "logging.h" +unsigned char logname[42]; static pthread_mutex_t msg_lock; static pthread_mutex_t msg_active_lock; static pthread_cond_t msg_active; @@ -71,7 +72,6 @@ static void msg_dump(struct hotplug_msg *msg) msg->seqnum, msg->action, msg->devpath, msg->subsystem); } -/* allocates a new message */ static struct hotplug_msg *msg_create(void) { struct hotplug_msg *new_msg; @@ -81,10 +81,15 @@ static struct hotplug_msg *msg_create(void) dbg("error malloc"); return NULL; } - memset(new_msg, 0x00, sizeof(struct hotplug_msg)); return new_msg; } +static void msg_delete(struct hotplug_msg *msg) +{ + if (msg != NULL) + free(msg); +} + /* orders the message in the queue by sequence number */ static void msg_queue_insert(struct hotplug_msg *msg) { @@ -143,7 +148,7 @@ exit: list_del_init(&msg->list); pthread_mutex_unlock(&running_lock); - free(msg); + msg_delete(msg); /* signal queue activity to exec manager */ pthread_mutex_lock(&exec_active_lock); @@ -289,6 +294,7 @@ static void *client_threads(void * parm) if (strncmp(msg->magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) { dbg("message magic '%s' doesn't match, ignore it", msg->magic); + msg_delete(msg); goto exit; } @@ -307,7 +313,7 @@ static void sig_handler(int signum) case SIGINT: case SIGTERM: unlink(UDEVD_LOCK); - unlink(UDEVD_SOCKET); + unlink(UDEVD_SOCK); exit(20 + signum); break; default: @@ -320,7 +326,6 @@ static int one_and_only(void) char string[50]; int lock_file; - /* see if we can open */ lock_file = open(UDEVD_LOCK, O_RDWR | O_CREAT, 0x640); if (lock_file < 0) return -1; @@ -350,6 +355,8 @@ int main(int argc, char *argv[]) pthread_t mgr_exec_tid; int retval; + init_logging("udevd"); + /* only let one version of the daemon run at any one time */ if (one_and_only() != 0) exit(0); @@ -359,9 +366,9 @@ int main(int argc, char *argv[]) memset(&saddr, 0x00, sizeof(saddr)); saddr.sun_family = AF_LOCAL; - strcpy(saddr.sun_path, UDEVD_SOCKET); + strcpy(saddr.sun_path, UDEVD_SOCK); - unlink(UDEVD_SOCKET); + unlink(UDEVD_SOCK); ssock = socket(AF_LOCAL, SOCK_STREAM, 0); if (ssock == -1) { dbg("error getting socket"); @@ -389,6 +396,7 @@ int main(int argc, char *argv[]) /* set default attributes for created threads */ pthread_attr_init(&thr_attr); pthread_attr_setdetachstate(&thr_attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&thr_attr, 16 * 1024); /* init queue management */ pthread_create(&mgr_msg_tid, &thr_attr, msg_queue_manager, NULL); @@ -399,14 +407,13 @@ int main(int argc, char *argv[]) while (1) { csock = accept(ssock, &caddr, &clen); if (csock < 0) { - if (errno == EINTR) - continue; dbg("client accept failed\n"); + continue; } pthread_create(&cli_tid, &thr_attr, client_threads, (void *) csock); } exit: close(ssock); - unlink(UDEVD_SOCKET); + unlink(UDEVD_SOCK); exit(1); }