X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=f7901cb7529ca39a3873bf6bd561acd801040194;hb=df41554d990fd9e69495253b4dc1979c6cd8621f;hp=366c227a3bc9c48c42d1236c4e2fe5006e3cc685;hpb=0028653cdff8e3a7f3577509ce89f8bb15efa01e;p=elogind.git diff --git a/udevd.c b/udevd.c index 366c227a3..f7901cb75 100644 --- a/udevd.c +++ b/udevd.c @@ -51,12 +51,17 @@ LIST_HEAD(running_list); static void exec_queue_manager(void); static void msg_queue_manager(void); +#ifdef LOG unsigned char logname[42]; - -int log_ok(void) +void log_message (int level, const char *format, ...) { - return 1; + va_list args; + + va_start(args, format); + vsyslog(level, format, args); + va_end(args); } +#endif static void msg_dump_queue(void) { @@ -252,16 +257,19 @@ static void handle_msg(int sock) cmsg = CMSG_FIRSTHDR(&smsg); cred = (struct ucred *) CMSG_DATA(cmsg); + if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) { + dbg("no sender credentials received, message ignored"); + goto skip; + } + if (cred->uid != 0) { dbg("sender uid=%i, message ignored", cred->uid); - free(msg); - return; + goto skip; } if (strncmp(msg->magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) { dbg("message magic '%s' doesn't match, ignore it", msg->magic); - free(msg); - return; + goto skip; } /* if no seqnum is given, we move straight to exec queue */ @@ -271,6 +279,11 @@ static void handle_msg(int sock) } else { msg_queue_insert(msg); } + return; + +skip: + free(msg); + return; } static void sig_handler(int signum) @@ -315,6 +328,12 @@ int main(int argc, char *argv[]) struct sigaction act; init_logging("udevd"); + dbg("version %s", UDEV_VERSION); + + if (getuid() != 0) { + dbg("need to be root, exit"); + exit(1); + } /* set signal handler */ act.sa_handler = sig_handler; @@ -336,14 +355,14 @@ int main(int argc, char *argv[]) ssock = socket(AF_LOCAL, SOCK_DGRAM, 0); if (ssock == -1) { - dbg("error getting socket"); + dbg("error getting socket, exit"); exit(1); } /* the bind takes care of ensuring only one copy running */ retval = bind(ssock, (struct sockaddr *) &saddr, addrlen); if (retval < 0) { - dbg("bind failed\n"); + dbg("bind failed, exit"); goto exit; }