From: ian Date: Sat, 17 May 2008 16:40:45 +0000 (+0000) Subject: use suid helper for sched_setscheduler X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=2287ecb08395ab4eefb15f4126a34caf2123fc88;p=trains.git use suid helper for sched_setscheduler --- diff --git a/hostside/common.h b/hostside/common.h index 3d7a532..6983e1f 100644 --- a/hostside/common.h +++ b/hostside/common.h @@ -124,6 +124,7 @@ char *mstrdup(const char *s); void real_mgettimeofday(struct timeval *tv); void mrename(const char *old, const char *new); +void mwaitpid(pid_t child, const char *what); void badusage(const char *why); diff --git a/hostside/persist.c b/hostside/persist.c index b1cf71c..5cbf567 100644 --- a/hostside/persist.c +++ b/hostside/persist.c @@ -99,8 +99,8 @@ static int fe(const char *fn) { /*---------- finding and interpreting of old persistent data ----------*/ static int persist_convert(const char *data, const char *conv) { - int data_fd, newrecord_fd, status; - pid_t child, rpid; + int data_fd, newrecord_fd; + pid_t child; if (!fe(conv)) return 0; @@ -123,18 +123,8 @@ static int persist_convert(const char *data, const char *conv) { execl(conv, conv, PERSIST_CONVERT_OPTION, (char*)0); diee("persist child: failed to exec `%s'", conv); } - - rpid= waitpid(child,&status,0); if (rpid!=child) diee("waitpid"); - if (WIFEXITED(status)) { - int st= WEXITSTATUS(status); - if (st) die("persist conversion exited with nonzero status %d",st); - } else if (WIFSIGNALED(status)) { - die("persist conversion died due to %s%s", - strsignal(WTERMSIG(status)), - WCOREDUMP(status) ? " (core dumped)" : ""); - } else { - die("persist conversion failed with unexpected wait status 0x%x",status); - } + + mwaitpid(child, "persist conversion"); if (close(newrecord_fd)) diee("persist data close new record"); close(data_fd); diff --git a/hostside/realtime.h b/hostside/realtime.h index 35a66ce..d405a75 100644 --- a/hostside/realtime.h +++ b/hostside/realtime.h @@ -19,11 +19,9 @@ #include #include -#include #include #include #include -#include #include #include diff --git a/hostside/rtprio.c b/hostside/rtprio.c index 8e25688..3b99bcf 100644 --- a/hostside/rtprio.c +++ b/hostside/rtprio.c @@ -115,12 +115,17 @@ fail: /*---------- CPU: set hard scheduling priority ----------*/ static void rtf_acquire_CPU(void) { - struct sched_param sp; - int r; - - sp.sched_priority= 10; - r= sched_setscheduler(0, SCHED_FIFO, &sp); - if (r) diee("sched_setscheduler"); + pid_t child; + + child= fork(); + if (child<0) diee("fork for auth-sched-setscheduler"); + + if (!child) { + execlp("auth-sched-setscheduler", + "auth-sched-setscheduler","fifo",10,(char*)0); + diee("exec auth-sched-setscheduler"); + } + mwaitpid(child, "auth-sched-setscheduler"); } /*---------- core ----------*/ diff --git a/hostside/utils.c b/hostside/utils.c index e6b35d3..a1f9d34 100644 --- a/hostside/utils.c +++ b/hostside/utils.c @@ -9,6 +9,9 @@ #include #include +#include +#include + #include "common.h" static void vdie_vprintf(const char *fmt, va_list al) { @@ -75,3 +78,19 @@ void mrename(const char *old, const char *new) { if (rename(old,new)) diee("failed to rename `%s' to `%s'", old,new); } + +void mwaitpid(pid_t child, const char *what) { + pid_t rpid; + int status; + + rpid= waitpid(child,&status,0); if (rpid!=child) diee("waitpid"); + if (WIFEXITED(status)) { + int st= WEXITSTATUS(status); + if (st) die("%s exited with nonzero status %d",what,st); + } else if (WIFSIGNALED(status)) { + die("%s died due to %s%s", what, strsignal(WTERMSIG(status)), + WCOREDUMP(status) ? " (core dumped)" : ""); + } else { + die("%s failed with unexpected wait status 0x%x", what, status); + } +}