qemu/util/cutils.c
<<
>>
Prefs
   1/*
   2 * Simple C functions to supplement the C library
   3 *
   4 * Copyright (c) 2006 Fabrice Bellard
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24#include "qemu/osdep.h"
  25#include "qemu-common.h"
  26#include "qemu/host-utils.h"
  27#include <math.h>
  28
  29#include "qemu/sockets.h"
  30#include "qemu/iov.h"
  31#include "net/net.h"
  32#include "qemu/cutils.h"
  33
  34void strpadcpy(char *buf, int buf_size, const char *str, char pad)
  35{
  36    int len = qemu_strnlen(str, buf_size);
  37    memcpy(buf, str, len);
  38    memset(buf + len, pad, buf_size - len);
  39}
  40
  41void pstrcpy(char *buf, int buf_size, const char *str)
  42{
  43    int c;
  44    char *q = buf;
  45
  46    if (buf_size <= 0)
  47        return;
  48
  49    for(;;) {
  50        c = *str++;
  51        if (c == 0 || q >= buf + buf_size - 1)
  52            break;
  53        *q++ = c;
  54    }
  55    *q = '\0';
  56}
  57
  58/* strcat and truncate. */
  59char *pstrcat(char *buf, int buf_size, const char *s)
  60{
  61    int len;
  62    len = strlen(buf);
  63    if (len < buf_size)
  64        pstrcpy(buf + len, buf_size - len, s);
  65    return buf;
  66}
  67
  68int strstart(const char *str, const char *val, const char **ptr)
  69{
  70    const char *p, *q;
  71    p = str;
  72    q = val;
  73    while (*q != '\0') {
  74        if (*p != *q)
  75            return 0;
  76        p++;
  77        q++;
  78    }
  79    if (ptr)
  80        *ptr = p;
  81    return 1;
  82}
  83
  84int stristart(const char *str, const char *val, const char **ptr)
  85{
  86    const char *p, *q;
  87    p = str;
  88    q = val;
  89    while (*q != '\0') {
  90        if (qemu_toupper(*p) != qemu_toupper(*q))
  91            return 0;
  92        p++;
  93        q++;
  94    }
  95    if (ptr)
  96        *ptr = p;
  97    return 1;
  98}
  99
 100/* XXX: use host strnlen if available ? */
 101int qemu_strnlen(const char *s, int max_len)
 102{
 103    int i;
 104
 105    for(i = 0; i < max_len; i++) {
 106        if (s[i] == '\0') {
 107            break;
 108        }
 109    }
 110    return i;
 111}
 112
 113char *qemu_strsep(char **input, const char *delim)
 114{
 115    char *result = *input;
 116    if (result != NULL) {
 117        char *p;
 118
 119        for (p = result; *p != '\0'; p++) {
 120            if (strchr(delim, *p)) {
 121                break;
 122            }
 123        }
 124        if (*p == '\0') {
 125            *input = NULL;
 126        } else {
 127            *p = '\0';
 128            *input = p + 1;
 129        }
 130    }
 131    return result;
 132}
 133
 134time_t mktimegm(struct tm *tm)
 135{
 136    time_t t;
 137    int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
 138    if (m < 3) {
 139        m += 12;
 140        y--;
 141    }
 142    t = 86400ULL * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + 
 143                 y / 400 - 719469);
 144    t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
 145    return t;
 146}
 147
 148/*
 149 * Make sure data goes on disk, but if possible do not bother to
 150 * write out the inode just for timestamp updates.
 151 *
 152 * Unfortunately even in 2009 many operating systems do not support
 153 * fdatasync and have to fall back to fsync.
 154 */
 155int qemu_fdatasync(int fd)
 156{
 157#ifdef CONFIG_FDATASYNC
 158    return fdatasync(fd);
 159#else
 160    return fsync(fd);
 161#endif
 162}
 163
 164#ifndef _WIN32
 165/* Sets a specific flag */
 166int fcntl_setfl(int fd, int flag)
 167{
 168    int flags;
 169
 170    flags = fcntl(fd, F_GETFL);
 171    if (flags == -1)
 172        return -errno;
 173
 174    if (fcntl(fd, F_SETFL, flags | flag) == -1)
 175        return -errno;
 176
 177    return 0;
 178}
 179#endif
 180
 181static int64_t suffix_mul(char suffix, int64_t unit)
 182{
 183    switch (qemu_toupper(suffix)) {
 184    case 'B':
 185        return 1;
 186    case 'K':
 187        return unit;
 188    case 'M':
 189        return unit * unit;
 190    case 'G':
 191        return unit * unit * unit;
 192    case 'T':
 193        return unit * unit * unit * unit;
 194    case 'P':
 195        return unit * unit * unit * unit * unit;
 196    case 'E':
 197        return unit * unit * unit * unit * unit * unit;
 198    }
 199    return -1;
 200}
 201
 202/*
 203 * Convert string to bytes, allowing either B/b for bytes, K/k for KB,
 204 * M/m for MB, G/g for GB or T/t for TB. End pointer will be returned
 205 * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on
 206 * other error.
 207 */
 208static int do_strtosz(const char *nptr, char **end,
 209                      const char default_suffix, int64_t unit,
 210                      uint64_t *result)
 211{
 212    int retval;
 213    char *endptr;
 214    unsigned char c;
 215    int mul_required = 0;
 216    double val, mul, integral, fraction;
 217
 218    errno = 0;
 219    val = strtod(nptr, &endptr);
 220    if (isnan(val) || endptr == nptr || errno != 0) {
 221        retval = -EINVAL;
 222        goto out;
 223    }
 224    fraction = modf(val, &integral);
 225    if (fraction != 0) {
 226        mul_required = 1;
 227    }
 228    c = *endptr;
 229    mul = suffix_mul(c, unit);
 230    if (mul >= 0) {
 231        endptr++;
 232    } else {
 233        mul = suffix_mul(default_suffix, unit);
 234        assert(mul >= 0);
 235    }
 236    if (mul == 1 && mul_required) {
 237        retval = -EINVAL;
 238        goto out;
 239    }
 240    /*
 241     * Values >= 0xfffffffffffffc00 overflow uint64_t after their trip
 242     * through double (53 bits of precision).
 243     */
 244    if ((val * mul >= 0xfffffffffffffc00) || val < 0) {
 245        retval = -ERANGE;
 246        goto out;
 247    }
 248    *result = val * mul;
 249    retval = 0;
 250
 251out:
 252    if (end) {
 253        *end = endptr;
 254    } else if (*endptr) {
 255        retval = -EINVAL;
 256    }
 257
 258    return retval;
 259}
 260
 261int qemu_strtosz(const char *nptr, char **end, uint64_t *result)
 262{
 263    return do_strtosz(nptr, end, 'B', 1024, result);
 264}
 265
 266int qemu_strtosz_MiB(const char *nptr, char **end, uint64_t *result)
 267{
 268    return do_strtosz(nptr, end, 'M', 1024, result);
 269}
 270
 271int qemu_strtosz_metric(const char *nptr, char **end, uint64_t *result)
 272{
 273    return do_strtosz(nptr, end, 'B', 1000, result);
 274}
 275
 276/**
 277 * Helper function for error checking after strtol() and the like
 278 */
 279static int check_strtox_error(const char *nptr, char *ep,
 280                              const char **endptr, int libc_errno)
 281{
 282    if (endptr) {
 283        *endptr = ep;
 284    }
 285
 286    /* Turn "no conversion" into an error */
 287    if (libc_errno == 0 && ep == nptr) {
 288        return -EINVAL;
 289    }
 290
 291    /* Fail when we're expected to consume the string, but didn't */
 292    if (!endptr && *ep) {
 293        return -EINVAL;
 294    }
 295
 296    return -libc_errno;
 297}
 298
 299/**
 300 * Convert string @nptr to a long integer, and store it in @result.
 301 *
 302 * This is a wrapper around strtol() that is harder to misuse.
 303 * Semantics of @nptr, @endptr, @base match strtol() with differences
 304 * noted below.
 305 *
 306 * @nptr may be null, and no conversion is performed then.
 307 *
 308 * If no conversion is performed, store @nptr in *@endptr and return
 309 * -EINVAL.
 310 *
 311 * If @endptr is null, and the string isn't fully converted, return
 312 * -EINVAL.  This is the case when the pointer that would be stored in
 313 * a non-null @endptr points to a character other than '\0'.
 314 *
 315 * If the conversion overflows @result, store LONG_MAX in @result,
 316 * and return -ERANGE.
 317 *
 318 * If the conversion underflows @result, store LONG_MIN in @result,
 319 * and return -ERANGE.
 320 *
 321 * Else store the converted value in @result, and return zero.
 322 */
 323int qemu_strtol(const char *nptr, const char **endptr, int base,
 324                long *result)
 325{
 326    char *ep;
 327
 328    if (!nptr) {
 329        if (endptr) {
 330            *endptr = nptr;
 331        }
 332        return -EINVAL;
 333    }
 334
 335    errno = 0;
 336    *result = strtol(nptr, &ep, base);
 337    return check_strtox_error(nptr, ep, endptr, errno);
 338}
 339
 340/**
 341 * Convert string @nptr to an unsigned long, and store it in @result.
 342 *
 343 * This is a wrapper around strtoul() that is harder to misuse.
 344 * Semantics of @nptr, @endptr, @base match strtoul() with differences
 345 * noted below.
 346 *
 347 * @nptr may be null, and no conversion is performed then.
 348 *
 349 * If no conversion is performed, store @nptr in *@endptr and return
 350 * -EINVAL.
 351 *
 352 * If @endptr is null, and the string isn't fully converted, return
 353 * -EINVAL.  This is the case when the pointer that would be stored in
 354 * a non-null @endptr points to a character other than '\0'.
 355 *
 356 * If the conversion overflows @result, store ULONG_MAX in @result,
 357 * and return -ERANGE.
 358 *
 359 * Else store the converted value in @result, and return zero.
 360 *
 361 * Note that a number with a leading minus sign gets converted without
 362 * the minus sign, checked for overflow (see above), then negated (in
 363 * @result's type).  This is exactly how strtoul() works.
 364 */
 365int qemu_strtoul(const char *nptr, const char **endptr, int base,
 366                 unsigned long *result)
 367{
 368    char *ep;
 369
 370    if (!nptr) {
 371        if (endptr) {
 372            *endptr = nptr;
 373        }
 374        return -EINVAL;
 375    }
 376
 377    errno = 0;
 378    *result = strtoul(nptr, &ep, base);
 379    /* Windows returns 1 for negative out-of-range values.  */
 380    if (errno == ERANGE) {
 381        *result = -1;
 382    }
 383    return check_strtox_error(nptr, ep, endptr, errno);
 384}
 385
 386/**
 387 * Convert string @nptr to an int64_t.
 388 *
 389 * Works like qemu_strtol(), except it stores INT64_MAX on overflow,
 390 * and INT_MIN on underflow.
 391 */
 392int qemu_strtoi64(const char *nptr, const char **endptr, int base,
 393                 int64_t *result)
 394{
 395    char *ep;
 396
 397    if (!nptr) {
 398        if (endptr) {
 399            *endptr = nptr;
 400        }
 401        return -EINVAL;
 402    }
 403
 404    errno = 0;
 405    /* FIXME This assumes int64_t is long long */
 406    *result = strtoll(nptr, &ep, base);
 407    return check_strtox_error(nptr, ep, endptr, errno);
 408}
 409
 410/**
 411 * Convert string @nptr to an uint64_t.
 412 *
 413 * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow.
 414 */
 415int qemu_strtou64(const char *nptr, const char **endptr, int base,
 416                  uint64_t *result)
 417{
 418    char *ep;
 419
 420    if (!nptr) {
 421        if (endptr) {
 422            *endptr = nptr;
 423        }
 424        return -EINVAL;
 425    }
 426
 427    errno = 0;
 428    /* FIXME This assumes uint64_t is unsigned long long */
 429    *result = strtoull(nptr, &ep, base);
 430    /* Windows returns 1 for negative out-of-range values.  */
 431    if (errno == ERANGE) {
 432        *result = -1;
 433    }
 434    return check_strtox_error(nptr, ep, endptr, errno);
 435}
 436
 437/**
 438 * parse_uint:
 439 *
 440 * @s: String to parse
 441 * @value: Destination for parsed integer value
 442 * @endptr: Destination for pointer to first character not consumed
 443 * @base: integer base, between 2 and 36 inclusive, or 0
 444 *
 445 * Parse unsigned integer
 446 *
 447 * Parsed syntax is like strtoull()'s: arbitrary whitespace, a single optional
 448 * '+' or '-', an optional "0x" if @base is 0 or 16, one or more digits.
 449 *
 450 * If @s is null, or @base is invalid, or @s doesn't start with an
 451 * integer in the syntax above, set *@value to 0, *@endptr to @s, and
 452 * return -EINVAL.
 453 *
 454 * Set *@endptr to point right beyond the parsed integer (even if the integer
 455 * overflows or is negative, all digits will be parsed and *@endptr will
 456 * point right beyond them).
 457 *
 458 * If the integer is negative, set *@value to 0, and return -ERANGE.
 459 *
 460 * If the integer overflows unsigned long long, set *@value to
 461 * ULLONG_MAX, and return -ERANGE.
 462 *
 463 * Else, set *@value to the parsed integer, and return 0.
 464 */
 465int parse_uint(const char *s, unsigned long long *value, char **endptr,
 466               int base)
 467{
 468    int r = 0;
 469    char *endp = (char *)s;
 470    unsigned long long val = 0;
 471
 472    if (!s) {
 473        r = -EINVAL;
 474        goto out;
 475    }
 476
 477    errno = 0;
 478    val = strtoull(s, &endp, base);
 479    if (errno) {
 480        r = -errno;
 481        goto out;
 482    }
 483
 484    if (endp == s) {
 485        r = -EINVAL;
 486        goto out;
 487    }
 488
 489    /* make sure we reject negative numbers: */
 490    while (isspace((unsigned char)*s)) {
 491        s++;
 492    }
 493    if (*s == '-') {
 494        val = 0;
 495        r = -ERANGE;
 496        goto out;
 497    }
 498
 499out:
 500    *value = val;
 501    *endptr = endp;
 502    return r;
 503}
 504
 505/**
 506 * parse_uint_full:
 507 *
 508 * @s: String to parse
 509 * @value: Destination for parsed integer value
 510 * @base: integer base, between 2 and 36 inclusive, or 0
 511 *
 512 * Parse unsigned integer from entire string
 513 *
 514 * Have the same behavior of parse_uint(), but with an additional check
 515 * for additional data after the parsed number. If extra characters are present
 516 * after the parsed number, the function will return -EINVAL, and *@v will
 517 * be set to 0.
 518 */
 519int parse_uint_full(const char *s, unsigned long long *value, int base)
 520{
 521    char *endp;
 522    int r;
 523
 524    r = parse_uint(s, value, &endp, base);
 525    if (r < 0) {
 526        return r;
 527    }
 528    if (*endp) {
 529        *value = 0;
 530        return -EINVAL;
 531    }
 532
 533    return 0;
 534}
 535
 536int qemu_parse_fd(const char *param)
 537{
 538    long fd;
 539    char *endptr;
 540
 541    errno = 0;
 542    fd = strtol(param, &endptr, 10);
 543    if (param == endptr /* no conversion performed */                    ||
 544        errno != 0      /* not representable as long; possibly others */ ||
 545        *endptr != '\0' /* final string not empty */                     ||
 546        fd < 0          /* invalid as file descriptor */                 ||
 547        fd > INT_MAX    /* not representable as int */) {
 548        return -1;
 549    }
 550    return fd;
 551}
 552
 553/*
 554 * Implementation of  ULEB128 (http://en.wikipedia.org/wiki/LEB128)
 555 * Input is limited to 14-bit numbers
 556 */
 557int uleb128_encode_small(uint8_t *out, uint32_t n)
 558{
 559    g_assert(n <= 0x3fff);
 560    if (n < 0x80) {
 561        *out++ = n;
 562        return 1;
 563    } else {
 564        *out++ = (n & 0x7f) | 0x80;
 565        *out++ = n >> 7;
 566        return 2;
 567    }
 568}
 569
 570int uleb128_decode_small(const uint8_t *in, uint32_t *n)
 571{
 572    if (!(*in & 0x80)) {
 573        *n = *in++;
 574        return 1;
 575    } else {
 576        *n = *in++ & 0x7f;
 577        /* we exceed 14 bit number */
 578        if (*in & 0x80) {
 579            return -1;
 580        }
 581        *n |= *in++ << 7;
 582        return 2;
 583    }
 584}
 585
 586/*
 587 * helper to parse debug environment variables
 588 */
 589int parse_debug_env(const char *name, int max, int initial)
 590{
 591    char *debug_env = getenv(name);
 592    char *inv = NULL;
 593    long debug;
 594
 595    if (!debug_env) {
 596        return initial;
 597    }
 598    errno = 0;
 599    debug = strtol(debug_env, &inv, 10);
 600    if (inv == debug_env) {
 601        return initial;
 602    }
 603    if (debug < 0 || debug > max || errno != 0) {
 604        fprintf(stderr, "warning: %s not in [0, %d]", name, max);
 605        return initial;
 606    }
 607    return debug;
 608}
 609
 610/*
 611 * Helper to print ethernet mac address
 612 */
 613const char *qemu_ether_ntoa(const MACAddr *mac)
 614{
 615    static char ret[18];
 616
 617    snprintf(ret, sizeof(ret), "%02x:%02x:%02x:%02x:%02x:%02x",
 618             mac->a[0], mac->a[1], mac->a[2], mac->a[3], mac->a[4], mac->a[5]);
 619
 620    return ret;
 621}
 622
 623/*
 624 * Return human readable string for size @val.
 625 * @val can be anything that uint64_t allows (no more than "16 EiB").
 626 * Use IEC binary units like KiB, MiB, and so forth.
 627 * Caller is responsible for passing it to g_free().
 628 */
 629char *size_to_str(uint64_t val)
 630{
 631    static const char *suffixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" };
 632    unsigned long div;
 633    int i;
 634
 635    /*
 636     * The exponent (returned in i) minus one gives us
 637     * floor(log2(val * 1024 / 1000).  The correction makes us
 638     * switch to the higher power when the integer part is >= 1000.
 639     * (see e41b509d68afb1f for more info)
 640     */
 641    frexp(val / (1000.0 / 1024.0), &i);
 642    i = (i - 1) / 10;
 643    div = 1ULL << (i * 10);
 644
 645    return g_strdup_printf("%0.3g %sB", (double)val / div, suffixes[i]);
 646}
 647