diff options
Diffstat (limited to 'config/os/gnu-linux/systemtest.c')
-rw-r--r-- | config/os/gnu-linux/systemtest.c | 299 |
1 files changed, 156 insertions, 143 deletions
diff --git a/config/os/gnu-linux/systemtest.c b/config/os/gnu-linux/systemtest.c index 3f56982..957abe8 100644 --- a/config/os/gnu-linux/systemtest.c +++ b/config/os/gnu-linux/systemtest.c @@ -14,7 +14,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Set of functions to gather system information for the jack setup wizard. - * + * * TODO: Test for rt prio availability * * @author Florian Faber, faber@faberman.de @@ -43,112 +43,117 @@ #include "systemtest.h" /** - * This function checks for the existence of known frequency scaling mechanisms + * This function checks for the existence of known frequency scaling mechanisms * in this system by testing for the availability of scaling governors/ * * @returns 0 if the system has no frequency scaling capabilities non-0 otherwise. **/ -int system_has_frequencyscaling() { - int fd; +int system_has_frequencyscaling () +{ + int fd; - fd = open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors", O_RDONLY); + fd = open ("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors", O_RDONLY); - if (-1==fd) { - return 0; - } + if (-1 == fd) { + return 0; + } - (void) close(fd); + (void)close (fd); - return 1; + return 1; } -static int read_string(char* filename, char* buf, size_t buflen) { - int fd; - ssize_t r=-1; - - memset (buf, 0, buflen); - - fd = open (filename, O_RDONLY); - if (-1<fd) { - r = read (fd, buf, buflen-1); - (void) close(fd); - - if (-1==r) { - fprintf(stderr, "Error while reading \"%s\": %s\n", filename, strerror(errno)); - exit(EXIT_FAILURE); - } - } - - return (int) r; +static int read_string (char* filename, char* buf, size_t buflen) +{ + int fd; + ssize_t r = -1; + + memset (buf, 0, buflen); + + fd = open (filename, O_RDONLY); + if (-1 < fd) { + r = read (fd, buf, buflen - 1); + (void)close (fd); + + if (-1 == r) { + fprintf (stderr, "Error while reading \"%s\": %s\n", filename, strerror (errno)); + exit (EXIT_FAILURE); + } + } + + return (int)r; } -static int read_int(char* filename, int* value) { - char buf[20]; +static int read_int (char* filename, int* value) +{ + char buf[20]; - if (0<read_string(filename, buf, 20)) { - return (1==sscanf(buf, "%d", value)); - } + if (0 < read_string (filename, buf, 20)) { + return 1 == sscanf (buf, "%d", value); + } - return 0; + return 0; } /** - * This function determines wether any CPU core uses a variable clock speed if frequency + * This function determines wether any CPU core uses a variable clock speed if frequency * scaling is available. If the governor for all cores is either "powersave" or * "performance", the CPU frequency can be assumed to be static. This is also the case * if scaling_min_freq and scaling_max_freq are set to the same value. * * @returns 0 if system doesn't use frequency scaling at the moment, non-0 otherwise **/ -int system_uses_frequencyscaling() { - int cpu=0, done=0, min, max; - char filename[256], buf[256]; - - while (!done) { - (void) snprintf(filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpu); - if (0<read_string(filename, buf, 256)) { - if ((0!=strncmp("performance", buf,11)) && - (0!=strncmp("powersafe", buf,9))) { +int system_uses_frequencyscaling () +{ + int cpu = 0, done = 0, min, max; + char filename[256], buf[256]; + + while (!done) { + (void)snprintf (filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpu); + if (0 < read_string (filename, buf, 256)) { + if ((0 != strncmp ("performance", buf, 11)) && + (0 != strncmp ("powersafe", buf, 9))) { // So it's neither the "performance" nor the "powersafe" governor - (void) snprintf(filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu); - if (read_int(filename, &min)) { - (void) snprintf(filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu); - if (read_int(filename, &max)) { - if (min!=max) { + (void)snprintf (filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu); + if (read_int (filename, &min)) { + (void)snprintf (filename, 256, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu); + if (read_int (filename, &max)) { + if (min != max) { // wrong governor AND different frequency limits -> scaling return 1; } - } + } } - } - } else { - // couldn't open file -> no more cores - done = 1; - } - cpu++; - } - - // couldn't find anything that points to scaling - return 0; + } + } else { + // couldn't open file -> no more cores + done = 1; + } + cpu++; + } + + // couldn't find anything that points to scaling + return 0; } -static gid_t get_group_by_name(const char* name) { - struct group* grp; +static gid_t get_group_by_name (const char* name) +{ + struct group* grp; gid_t res = 0; - while ((0==res) && (NULL != (grp = getgrent()))) { - if (0==strcmp(name, grp->gr_name)) { - res = grp->gr_gid; - } - } + while ((0 == res) && (NULL != (grp = getgrent ()))) { + if (0 == strcmp (name, grp->gr_name)) { + res = grp->gr_gid; + } + } - endgrent(); + endgrent (); - return res; + return res; } /*** @@ -162,7 +167,7 @@ int system_has_rtprio_limits_conf () const char* limits = "/etc/security/limits.conf"; char cmd[100]; - snprintf (cmd, sizeof (cmd), "grep -q 'rtprio *[0-9][0-9]*' %s", limits); + snprintf (cmd, sizeof(cmd), "grep -q 'rtprio *[0-9][0-9]*' %s", limits); if (system (cmd) == 0) { return 1; } @@ -175,8 +180,9 @@ int system_has_rtprio_limits_conf () * * @returns 0 is there is no 'audio' group, the group id otherwise **/ -int system_has_audiogroup() { - return get_group_by_name("audio") || get_group_by_name ("jackuser"); +int system_has_audiogroup () +{ + return get_group_by_name ("audio") || get_group_by_name ("jackuser"); } @@ -185,36 +191,37 @@ int system_has_audiogroup() { * * @returns 0 if the owner of this process is not in the audio group, non-0 otherwise **/ -int system_user_in_audiogroup() { - gid_t* list = (gid_t*) malloc(MAX_GROUPS * sizeof(gid_t)); - int num_groups, i=0, found=0; +int system_user_in_audiogroup () +{ + gid_t* list = (gid_t*)malloc (MAX_GROUPS * sizeof(gid_t)); + int num_groups, i = 0, found = 0; unsigned int gid; - if (NULL==list) { - perror("Cannot allocate group list structure"); - exit(EXIT_FAILURE); - } - - gid = get_group_by_name("audio"); - if (0==gid) { - fprintf(stderr, "No audio group found\n"); - exit(EXIT_FAILURE); - } - - num_groups = getgroups(MAX_GROUPS, list); - - while (i<num_groups) { - if (list[i]==gid) { - found = 1; - i = num_groups; - } - - i++; - } - - free(list); - - return found; + if (NULL == list) { + perror ("Cannot allocate group list structure"); + exit (EXIT_FAILURE); + } + + gid = get_group_by_name ("audio"); + if (0 == gid) { + fprintf (stderr, "No audio group found\n"); + exit (EXIT_FAILURE); + } + + num_groups = getgroups (MAX_GROUPS, list); + + while (i < num_groups) { + if (list[i] == gid) { + found = 1; + i = num_groups; + } + + i++; + } + + free (list); + + return found; } @@ -223,38 +230,40 @@ int system_user_in_audiogroup() { * * @returns 0 if this process can not be switched to rt prio, non-0 otherwise **/ -int system_user_can_rtprio() { - int min_prio; - struct sched_param schparam; - - memset(&schparam, 0, sizeof(struct sched_param)); - - if (-1 == (min_prio = sched_get_priority_min(SCHED_FIFO))) { - perror("sched_get_priority"); - exit(EXIT_FAILURE); - } - schparam.sched_priority = min_prio; - - if (0 == sched_setscheduler(0, SCHED_FIFO, &schparam)) { - // TODO: restore previous state - schparam.sched_priority = 0; - if (0 != sched_setscheduler(0, SCHED_OTHER, &schparam)) { - perror("sched_setscheduler"); - exit(EXIT_FAILURE); - } - return 1; - } - - return 0; +int system_user_can_rtprio () +{ + int min_prio; + struct sched_param schparam; + + memset (&schparam, 0, sizeof(struct sched_param)); + + if (-1 == (min_prio = sched_get_priority_min (SCHED_FIFO))) { + perror ("sched_get_priority"); + exit (EXIT_FAILURE); + } + schparam.sched_priority = min_prio; + + if (0 == sched_setscheduler (0, SCHED_FIFO, &schparam)) { + // TODO: restore previous state + schparam.sched_priority = 0; + if (0 != sched_setscheduler (0, SCHED_OTHER, &schparam)) { + perror ("sched_setscheduler"); + exit (EXIT_FAILURE); + } + return 1; + } + + return 0; } -long long unsigned int system_memlock_amount() { +long long unsigned int system_memlock_amount () +{ struct rlimit limits; - if (-1==getrlimit(RLIMIT_MEMLOCK, &limits)) { - perror("getrlimit on RLIMIT_MEMLOCK"); - exit(EXIT_FAILURE); + if (-1 == getrlimit (RLIMIT_MEMLOCK, &limits)) { + perror ("getrlimit on RLIMIT_MEMLOCK"); + exit (EXIT_FAILURE); } return limits.rlim_max; @@ -266,26 +275,28 @@ long long unsigned int system_memlock_amount() { * * @returns - 0 if the memlock limit is limited, non-0 otherwise **/ -int system_memlock_is_unlimited() { - return ((RLIM_INFINITY==system_memlock_amount())?1:0); +int system_memlock_is_unlimited () +{ + return (RLIM_INFINITY == system_memlock_amount ()) ? 1 : 0; } -long long unsigned int system_available_physical_mem() { +long long unsigned int system_available_physical_mem () +{ char buf[256]; long long unsigned int res = 0; - if (0<read_string("/proc/meminfo", buf, sizeof (buf))) { + if (0 < read_string ("/proc/meminfo", buf, sizeof(buf))) { if (strncmp (buf, "MemTotal:", 9) == 0) { if (sscanf (buf, "%*s %llu", &res) != 1) { perror ("parse error in /proc/meminfo"); - } + } } } else { - perror("read from /proc/meminfo"); + perror ("read from /proc/meminfo"); } - return res*1024; + return res * 1024; } @@ -295,19 +306,21 @@ long long unsigned int system_available_physical_mem() { * * @returns String with the full version of the kernel **/ -char* system_kernel_version() { - return NULL; +char* system_kernel_version () +{ + return NULL; } -char* system_get_username() { - char* res = NULL; - char* name = NULL; +char* system_get_username () +{ + char* res = NULL; + char* name = NULL; - if ((name = getlogin())) { - res = strdup(name); - } + if ((name = getlogin ())) { + res = strdup (name); + } - return res; + return res; } |