chiark / gitweb /
use suid helper for sched_setscheduler
authorian <ian>
Sat, 17 May 2008 16:40:45 +0000 (16:40 +0000)
committerian <ian>
Sat, 17 May 2008 16:40:45 +0000 (16:40 +0000)
hostside/common.h
hostside/persist.c
hostside/realtime.h
hostside/rtprio.c
hostside/utils.c

index 3d7a532a80081a3021e86900c9c8a46c1d249659..6983e1f512a63935b56dcc3a7b8472586e3cdb14 100644 (file)
@@ -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);
 
index b1cf71c707d7083717b6717af3d62e00c18c549a..5cbf5677983e76ac39912b37f731bff8b92602d2 100644 (file)
@@ -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);
index 35a66ce6f4f5fd741af0c3c1cd3df79d110091be..d405a751dc2609929547b1519533f588b14c7788 100644 (file)
 #include <ctype.h>
 #include <math.h>
 
-#include <sys/types.h>
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
-#include <sys/wait.h>
 
 #include <unistd.h>
 #include <fcntl.h>
index 8e25688a20b2d8172e70faaf9576d9888881f057..3b99bcfb0a88f28be47367615c34bfe916f4c326 100644 (file)
@@ -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 ----------*/
index e6b35d3a877c51c84be93654019d62a55aaca468..a1f9d346e4c06f4fe547ddb141176cf37c545268 100644 (file)
@@ -9,6 +9,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <sys/types.h>
+#include <sys/wait.h>
+
 #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);
+  }
+}