]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - lib/cpuset.c
po: update es.po (from translationproject.org)
[thirdparty/util-linux.git] / lib / cpuset.c
index b8a41085b2ea6af59a0ee84bf6d6403db104f5a5..011b6882b82b785a8382ed2146d2cc8a5559b465 100644 (file)
@@ -7,6 +7,9 @@
  *
  * Based on code from taskset.c and Linux kernel.
  *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ *
  * Copyright (C) 2010 Karel Zak <kzak@redhat.com>
  */
 
@@ -26,23 +29,21 @@ static inline int val_to_char(int v)
 {
        if (v >= 0 && v < 10)
                return '0' + v;
-       else if (v >= 10 && v < 16)
+       if (v >= 10 && v < 16)
                return ('a' - 10) + v;
-       else
-               return -1;
+       return -1;
 }
 
 static inline int char_to_val(int c)
 {
        int cl;
 
-       cl = tolower(c);
        if (c >= '0' && c <= '9')
                return c - '0';
-       else if (cl >= 'a' && cl <= 'f')
+       cl = tolower(c);
+       if (cl >= 'a' && cl <= 'f')
                return cl + (10 - 'a');
-       else
-               return -1;
+       return -1;
 }
 
 static const char *nexttoken(const char *q,  int sep)
@@ -59,6 +60,7 @@ static const char *nexttoken(const char *q,  int sep)
  */
 int get_max_number_of_cpus(void)
 {
+#ifdef SYS_sched_getaffinity
        int n, cpus = 2048;
        size_t setsize;
        cpu_set_t *set = cpuset_alloc(cpus, &setsize, NULL);
@@ -83,6 +85,7 @@ int get_max_number_of_cpus(void)
                cpuset_free(set);
                return n * 8;
        }
+#endif
        return -1;
 }
 
@@ -147,15 +150,15 @@ int __cpuset_count_s(size_t setsize, const cpu_set_t *set)
 char *cpulist_create(char *str, size_t len,
                        cpu_set_t *set, size_t setsize)
 {
-       int i;
+       size_t i;
        char *ptr = str;
        int entry_made = 0;
        size_t max = cpuset_nbits(setsize);
 
        for (i = 0; i < max; i++) {
                if (CPU_ISSET_S(i, setsize, set)) {
-                       int j, rlen;
-                       int run = 0;
+                       int rlen;
+                       size_t j, run = 0;
                        entry_made = 1;
                        for (j = i + 1; j < max; j++) {
                                if (CPU_ISSET_S(j, setsize, set))
@@ -164,15 +167,15 @@ char *cpulist_create(char *str, size_t len,
                                        break;
                        }
                        if (!run)
-                               rlen = snprintf(ptr, len, "%d,", i);
+                               rlen = snprintf(ptr, len, "%zu,", i);
                        else if (run == 1) {
-                               rlen = snprintf(ptr, len, "%d,%d,", i, i + 1);
+                               rlen = snprintf(ptr, len, "%zu,%zu,", i, i + 1);
                                i++;
                        } else {
-                               rlen = snprintf(ptr, len, "%d-%d,", i, i + run);
+                               rlen = snprintf(ptr, len, "%zu-%zu,", i, i + run);
                                i += run;
                        }
-                       if (rlen < 0 || rlen + 1 > len)
+                       if (rlen < 0 || (size_t) rlen >= len)
                                return NULL;
                        ptr += rlen;
                        len -= rlen;
@@ -197,7 +200,7 @@ char *cpumask_create(char *str, size_t len,
        for (cpu = cpuset_nbits(setsize) - 4; cpu >= 0; cpu -= 4) {
                char val = 0;
 
-               if (len == (ptr - str))
+               if (len == (size_t) (ptr - str))
                        break;
 
                if (CPU_ISSET_S(cpu, setsize, set))
@@ -218,7 +221,7 @@ char *cpumask_create(char *str, size_t len,
 }
 
 /*
- * Parses string with list of CPU ranges.
+ * Parses string with CPUs mask.
  */
 int cpumask_parse(const char *str, cpu_set_t *set, size_t setsize)
 {
@@ -250,7 +253,6 @@ int cpumask_parse(const char *str, cpu_set_t *set, size_t setsize)
                        CPU_SET_S(cpu + 2, setsize, set);
                if (val & 8)
                        CPU_SET_S(cpu + 3, setsize, set);
-               len--;
                ptr--;
                cpu += 4;
        }
@@ -259,13 +261,20 @@ int cpumask_parse(const char *str, cpu_set_t *set, size_t setsize)
 }
 
 /*
- * Parses string with CPUs mask.
+ * Parses string with list of CPU ranges.
+ * Returns 0 on success.
+ * Returns 1 on error.
+ * Returns 2 if fail is set and a cpu number passed in the list doesn't fit
+ * into the cpu_set. If fail is not set cpu numbers that do not fit are
+ * ignored and 0 is returned instead.
  */
-int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize)
+int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize, int fail)
 {
+       size_t max = cpuset_nbits(setsize);
        const char *p, *q;
-       q = str;
+       int r = 0;
 
+       q = str;
        CPU_ZERO_S(setsize, set);
 
        while (p = q, q = nexttoken(q, ','), p) {
@@ -273,8 +282,9 @@ int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize)
                unsigned int b; /* end of range */
                unsigned int s; /* stride */
                const char *c1, *c2;
+               char c;
 
-               if (sscanf(p, "%u", &a) < 1)
+               if ((r = sscanf(p, "%u%c", &a, &c)) < 1)
                        return 1;
                b = a;
                s = 1;
@@ -282,11 +292,13 @@ int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize)
                c1 = nexttoken(p, '-');
                c2 = nexttoken(p, ',');
                if (c1 != NULL && (c2 == NULL || c1 < c2)) {
-                       if (sscanf(c1, "%u", &b) < 1)
+                       if ((r = sscanf(c1, "%u%c", &b, &c)) < 1)
                                return 1;
                        c1 = nexttoken(c1, ':');
-                       if (c1 != NULL && (c2 == NULL || c1 < c2))
-                               if (sscanf(c1, "%u", &s) < 1) {
+                       if (c1 != NULL && (c2 == NULL || c1 < c2)) {
+                               if ((r = sscanf(c1, "%u%c", &s, &c)) < 1)
+                                       return 1;
+                               if (s == 0)
                                        return 1;
                        }
                }
@@ -294,15 +306,19 @@ int cpulist_parse(const char *str, cpu_set_t *set, size_t setsize)
                if (!(a <= b))
                        return 1;
                while (a <= b) {
+                       if (fail && (a >= max))
+                               return 2;
                        CPU_SET_S(a, setsize, set);
                        a += s;
                }
        }
 
+       if (r == 2)
+               return 1;
        return 0;
 }
 
-#ifdef TEST_PROGRAM
+#ifdef TEST_PROGRAM_CPUSET
 
 #include <getopt.h>
 
@@ -313,11 +329,11 @@ int main(int argc, char *argv[])
        char *buf, *mask = NULL, *range = NULL;
        int ncpus = 2048, rc, c;
 
-       struct option longopts[] = {
-           { "ncpus", 1, 0, 'n' },
-           { "mask",  1, 0, 'm' },
-           { "range", 1, 0, 'r' },
-           { NULL,    0, 0, 0 }
+       static const struct option longopts[] = {
+           { "ncpus", 1, NULL, 'n' },
+           { "mask",  1, NULL, 'm' },
+           { "range", 1, NULL, 'r' },
+           { NULL,    0, NULL, 0 }
        };
 
        while ((c = getopt_long(argc, argv, "n:m:r:", longopts, NULL)) != -1) {
@@ -356,7 +372,7 @@ int main(int argc, char *argv[])
        if (mask)
                rc = cpumask_parse(mask, set, setsize);
        else
-               rc = cpulist_parse(range, set, setsize);
+               rc = cpulist_parse(range, set, setsize, 0);
 
        if (rc)
                errx(EXIT_FAILURE, "failed to parse string: %s", mask ? : range);
@@ -366,6 +382,7 @@ int main(int argc, char *argv[])
        printf("[%s]\n", cpulist_create(buf, buflen, set, setsize));
 
        free(buf);
+       free(mask);
        free(range);
        cpuset_free(set);