11f5bd054SAlexey Dobriyan /* 21f5bd054SAlexey Dobriyan * Copyright _ 2018 Alexey Dobriyan <adobriyan@gmail.com> 31f5bd054SAlexey Dobriyan * 41f5bd054SAlexey Dobriyan * Permission to use, copy, modify, and distribute this software for any 51f5bd054SAlexey Dobriyan * purpose with or without fee is hereby granted, provided that the above 61f5bd054SAlexey Dobriyan * copyright notice and this permission notice appear in all copies. 71f5bd054SAlexey Dobriyan * 81f5bd054SAlexey Dobriyan * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 91f5bd054SAlexey Dobriyan * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 101f5bd054SAlexey Dobriyan * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 111f5bd054SAlexey Dobriyan * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 121f5bd054SAlexey Dobriyan * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 131f5bd054SAlexey Dobriyan * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 141f5bd054SAlexey Dobriyan * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 151f5bd054SAlexey Dobriyan */ 161f5bd054SAlexey Dobriyan #undef NDEBUG 171f5bd054SAlexey Dobriyan #include <assert.h> 181f5bd054SAlexey Dobriyan #include <errno.h> 191f5bd054SAlexey Dobriyan #include <string.h> 201f5bd054SAlexey Dobriyan #include <stdlib.h> 211f5bd054SAlexey Dobriyan #include <unistd.h> 221f5bd054SAlexey Dobriyan 231f5bd054SAlexey Dobriyan static unsigned long long xstrtoull(const char *p, char **end) 241f5bd054SAlexey Dobriyan { 251f5bd054SAlexey Dobriyan if (*p == '0') { 261f5bd054SAlexey Dobriyan *end = (char *)p + 1; 271f5bd054SAlexey Dobriyan return 0; 281f5bd054SAlexey Dobriyan } else if ('1' <= *p && *p <= '9') { 291f5bd054SAlexey Dobriyan unsigned long long val; 301f5bd054SAlexey Dobriyan 311f5bd054SAlexey Dobriyan errno = 0; 321f5bd054SAlexey Dobriyan val = strtoull(p, end, 10); 331f5bd054SAlexey Dobriyan assert(errno == 0); 341f5bd054SAlexey Dobriyan return val; 351f5bd054SAlexey Dobriyan } else 361f5bd054SAlexey Dobriyan assert(0); 371f5bd054SAlexey Dobriyan } 381f5bd054SAlexey Dobriyan 391f5bd054SAlexey Dobriyan static void proc_uptime(int fd, uint64_t *uptime, uint64_t *idle) 401f5bd054SAlexey Dobriyan { 411f5bd054SAlexey Dobriyan uint64_t val1, val2; 421f5bd054SAlexey Dobriyan char buf[64], *p; 431f5bd054SAlexey Dobriyan ssize_t rv; 441f5bd054SAlexey Dobriyan 451f5bd054SAlexey Dobriyan /* save "p < end" checks */ 461f5bd054SAlexey Dobriyan memset(buf, 0, sizeof(buf)); 471f5bd054SAlexey Dobriyan rv = pread(fd, buf, sizeof(buf), 0); 481f5bd054SAlexey Dobriyan assert(0 <= rv && rv <= sizeof(buf)); 491f5bd054SAlexey Dobriyan buf[sizeof(buf) - 1] = '\0'; 501f5bd054SAlexey Dobriyan 511f5bd054SAlexey Dobriyan p = buf; 521f5bd054SAlexey Dobriyan 531f5bd054SAlexey Dobriyan val1 = xstrtoull(p, &p); 541f5bd054SAlexey Dobriyan assert(p[0] == '.'); 551f5bd054SAlexey Dobriyan assert('0' <= p[1] && p[1] <= '9'); 561f5bd054SAlexey Dobriyan assert('0' <= p[2] && p[2] <= '9'); 571f5bd054SAlexey Dobriyan assert(p[3] == ' '); 581f5bd054SAlexey Dobriyan 591f5bd054SAlexey Dobriyan val2 = (p[1] - '0') * 10 + p[2] - '0'; 601f5bd054SAlexey Dobriyan *uptime = val1 * 100 + val2; 611f5bd054SAlexey Dobriyan 621f5bd054SAlexey Dobriyan p += 4; 631f5bd054SAlexey Dobriyan 641f5bd054SAlexey Dobriyan val1 = xstrtoull(p, &p); 651f5bd054SAlexey Dobriyan assert(p[0] == '.'); 661f5bd054SAlexey Dobriyan assert('0' <= p[1] && p[1] <= '9'); 671f5bd054SAlexey Dobriyan assert('0' <= p[2] && p[2] <= '9'); 681f5bd054SAlexey Dobriyan assert(p[3] == '\n'); 691f5bd054SAlexey Dobriyan 701f5bd054SAlexey Dobriyan val2 = (p[1] - '0') * 10 + p[2] - '0'; 711f5bd054SAlexey Dobriyan *idle = val1 * 100 + val2; 721f5bd054SAlexey Dobriyan 731f5bd054SAlexey Dobriyan assert(p + 4 == buf + rv); 741f5bd054SAlexey Dobriyan } 75