diff --git a/mx_util.c b/mx_util.c index abd53a4..24088b2 100644 --- a/mx_util.c +++ b/mx_util.c @@ -9,6 +9,8 @@ #include #include +#include + //#include //#include #include @@ -556,11 +558,13 @@ int mx_strtoi64(char *str, int64_t *to) void *mx_malloc_forever(size_t size) { void *ret; + do { - ret=malloc(size); + ret = malloc(size); assert(ret || (!ret && errno == ENOMEM)); - } while (!ret); - return ret ; + } while (!ret); + + return ret ; } char *mx_strdup_forever(char *str) @@ -1171,7 +1175,7 @@ char **mx_strvec_from_str(char *str) return strvec; } -int mx_str_to_cpuset(cpu_set_t* cpuset_ptr,char *str) +int mx_str_to_cpuset(cpu_set_t* cpuset_ptr, char *str) { char c; int cpu_low; @@ -1182,51 +1186,57 @@ int mx_str_to_cpuset(cpu_set_t* cpuset_ptr,char *str) CPU_ZERO(cpuset_ptr); while (1) { - c=*str; - if (c=='\0') { + c = *str; + + if (c == '\0') break; - } else if (c>='0' && c<='9') { - cpu_low=strtol(str,&next,10); - str=next; - } else { + + if (!isdigit(c)) return -(errno=EINVAL); - } - if (cpu_low<0 || cpu_low>=CPU_SETSIZE) { + cpu_low = strtol(str, &next, 10); + str = next; + + if (cpu_low < 0 || cpu_low >= CPU_SETSIZE) + return -(errno=ERANGE); + + c = *str; + + CPU_SET(cpu_low, cpuset_ptr); + + if (c == '\0') { + break; + } else if (c == ',') { + str++; + continue; + } else if (c != '-') { return -(errno=EINVAL); } - c=*str; - if (c=='\0') { - CPU_SET(cpu_low,cpuset_ptr); + str++; + c = *str; + + if (!isdigit(c)) + return -(errno=EINVAL); + + cpu_high = strtol(str, &next, 10); + str = next; + + if (cpu_high < 0 || cpu_high >= CPU_SETSIZE || cpu_high < cpu_low) + return -(errno=ERANGE); + + for (i = cpu_low+1; i <= cpu_high; i++) + CPU_SET(i, cpuset_ptr); + + c = *str; + + if (c == '\0') { break; - } else if (c==',') { - CPU_SET(cpu_low,cpuset_ptr); - str++; - } else if (c=='-') { - c=*++str; - if (c>='0' && c<='9') { - cpu_high=strtol(str,&next,10); - str=next; - if (cpu_high<0 || cpu_high>=CPU_SETSIZE || cpu_high=CPU_SETSIZE) break; + if (cpu>=CPU_SETSIZE) + break; + if (CPU_ISSET(cpu,cpuset_ptr)) { - cpu_low=cpu++; + cpu_low=cpu; while (1) { - if (cpu>=CPU_SETSIZE || !CPU_ISSET(cpu,cpuset_ptr)) break; cpu++; + if (cpu>=CPU_SETSIZE || !CPU_ISSET(cpu,cpuset_ptr)) + break; } cpu_high=cpu-1; if (cpu_low==cpu_high) {