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
  25#include "qemu/osdep.h"
  26#include "qemu/host-utils.h"
  27#include <math.h>
  28
  29#include "qemu-common.h"
  30#include "qemu/sockets.h"
  31#include "qemu/iov.h"
  32#include "net/net.h"
  33#include "qemu/ctype.h"
  34#include "qemu/cutils.h"
  35#include "qemu/error-report.h"
  36
  37void strpadcpy(char *buf, int buf_size, const char *str, char pad)
  38{
  39    int len = qemu_strnlen(str, buf_size);
  40    memcpy(buf, str, len);
  41    memset(buf + len, pad, buf_size - len);
  42}
  43
  44void pstrcpy(char *buf, int buf_size, const char *str)
  45{
  46    int c;
  47    char *q = buf;
  48
  49    if (buf_size <= 0)
  50        return;
  51
  52    for(;;) {
  53        c = *str++;
  54        if (c == 0 || q >= buf + buf_size - 1)
  55            break;
  56        *q++ = c;
  57    }
  58    *q = '\0';
  59}
  60
  61/* strcat and truncate. */
  62char *pstrcat(char *buf, int buf_size, const char *s)
  63{
  64    int len;
  65    len = strlen(buf);
  66    if (len < buf_size)
  67        pstrcpy(buf + len, buf_size - len, s);
  68    return buf;
  69}
  70
  71int strstart(const char *str, const char *val, const char **ptr)
  72{
  73    const char *p, *q;
  74    p = str;
  75    q = val;
  76    while (*q != '\0') {
  77        if (*p != *q)
  78            return 0;
  79        p++;
  80        q++;
  81    }
  82    if (ptr)
  83        *ptr = p;
  84    return 1;
  85}
  86
  87int stristart(const char *str, const char *val, const char **ptr)
  88{
  89    const char *p, *q;
  90    p = str;
  91    q = val;
  92    while (*q != '\0') {
  93        if (qemu_toupper(*p) != qemu_toupper(*q))
  94            return 0;
  95        p++;
  96        q++;
  97    }
  98    if (ptr)
  99        *ptr = p;
 100    return 1;
 101}
 102
 103/* XXX: use host strnlen if available ? */
 104int qemu_strnlen(const char *s, int max_len)
 105{
 106    int i;
 107
 108    for(i = 0; i < max_len; i++) {
 109        if (s[i] == '\0') {
 110            break;
 111        }
 112    }
 113    return i;
 114}
 115
 116char *qemu_strsep(char **input, const char *delim)
 117{
 118    char *result = *input;
 119    if (result != NULL) {
 120        char *p;
 121
 122        for (p = result; *p != '\0'; p++) {
 123            if (strchr(delim, *p)) {
 124                break;
 125            }
 126        }
 127        if (*p == '\0') {
 128            *input = NULL;
 129        } else {
 130            *p = '\0';
 131            *input = p + 1;
 132        }
 133    }
 134    return result;
 135}
 136
 137time_t mktimegm(struct tm *tm)
 138{
 139    time_t t;
 140    int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
 141    if (m < 3) {
 142        m += 12;
 143        y--;
 144    }
 145    t = 86400ULL * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + 
 146                 y / 400 - 719469);
 147    t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
 148    return t;
 149}
 150
 151/*
 152 * Make sure data goes on disk, but if possible do not bother to
 153 * write out the inode just for timestamp updates.
 154 *
 155 * Unfortunately even in 2009 many operating systems do not support
 156 * fdatasync and have to fall back to fsync.
 157 */
 158int qemu_fdatasync(int fd)
 159{
 160#ifdef CONFIG_FDATASYNC
 161    return fdatasync(fd);
 162#else
 163    return fsync(fd);
 164#endif
 165}
 166
 167#ifndef _WIN32
 168/* Sets a specific flag */
 169int fcntl_setfl(int fd, int flag)
 170{
 171    int flags;
 172
 173    flags = fcntl(fd, F_GETFL);
 174    if (flags == -1)
 175        return -errno;
 176
 177    if (fcntl(fd, F_SETFL, flags | flag) == -1)
 178        return -errno;
 179
 180    return 0;
 181}
 182#endif
 183
 184static int64_t suffix_mul(char suffix, int64_t unit)
 185{
 186    switch (qemu_toupper(suffix)) {
 187    case 'B':
 188        return 1;
 189    case 'K':
 190        return unit;
 191    case 'M':
 192        return unit * unit;
 193    case 'G':
 194        return unit * unit * unit;
 195    case 'T':
 196        return unit * unit * unit * unit;
 197    case 'P':
 198        return unit * unit * unit * unit * unit;
 199    case 'E':
 200        return unit * unit * unit * unit * unit * unit;
 201    }
 202    return -1;
 203}
 204
 205/*
 206 * Convert string to bytes, allowing either B/b for bytes, K/k for KB,
 207 * M/m for MB, G/g for GB or T/t for TB. End pointer will be returned
 208 * in *end, if not NULL. Return -ERANGE on overflow, and -EINVAL on
 209 * other error.
 210 */
 211static int do_strtosz(const char *nptr, const char **end,
 212                      const char default_suffix, int64_t unit,
 213                      uint64_t *result)
 214{
 215    int retval;
 216    const char *endptr;
 217    unsigned char c;
 218    int mul_required = 0;
 219    double val, mul, integral, fraction;
 220
 221    retval = qemu_strtod_finite(nptr, &endptr, &val);
 222    if (retval) {
 223        goto out;
 224    }
 225    fraction = modf(val, &integral);
 226    if (fraction != 0) {
 227        mul_required = 1;
 228    }
 229    c = *endptr;
 230    mul = suffix_mul(c, unit);
 231    if (mul >= 0) {
 232        endptr++;
 233    } else {
 234        mul = suffix_mul(default_suffix, unit);
 235        assert(mul >= 0);
 236    }
 237    if (mul == 1 && mul_required) {
 238        retval = -EINVAL;
 239        goto out;
 240    }
 241    /*
 242     * Values near UINT64_MAX overflow to 2**64 when converting to double
 243     * precision.  Compare against the maximum representable double precision
 244     * value below 2**64, computed as "the next value after 2**64 (0x1p64) in
 245     * the direction of 0".
 246     */
 247    if ((val * mul > nextafter(0x1p64, 0)) || val < 0) {
 248        retval = -ERANGE;
 249        goto out;
 250    }
 251    *result = val * mul;
 252    retval = 0;
 253
 254out:
 255    if (end) {
 256        *end = endptr;
 257    } else if (*endptr) {
 258        retval = -EINVAL;
 259    }
 260
 261    return retval;
 262}
 263
 264int qemu_strtosz(const char *nptr, const char **end, uint64_t *result)
 265{
 266    return do_strtosz(nptr, end, 'B', 1024, result);
 267}
 268
 269int qemu_strtosz_MiB(const char *nptr, const char **end, uint64_t *result)
 270{
 271    return do_strtosz(nptr, end, 'M', 1024, result);
 272}
 273
 274int qemu_strtosz_metric(const char *nptr, const char **end, uint64_t *result)
 275{
 276    return do_strtosz(nptr, end, 'B', 1000, result);
 277}
 278
 279/**
 280 * Helper function for error checking after strtol() and the like
 281 */
 282static int check_strtox_error(const char *nptr, char *ep,
 283                              const char **endptr, int libc_errno)
 284{
 285    assert(ep >= nptr);
 286    if (endptr) {
 287        *endptr = ep;
 288    }
 289
 290    /* Turn "no conversion" into an error */
 291    if (libc_errno == 0 && ep == nptr) {
 292        return -EINVAL;
 293    }
 294
 295    /* Fail when we're expected to consume the string, but didn't */
 296    if (!endptr && *ep) {
 297        return -EINVAL;
 298    }
 299
 300    return -libc_errno;
 301}
 302
 303/**
 304 * Convert string @nptr to an integer, and store it in @result.
 305 *
 306 * This is a wrapper around strtol() that is harder to misuse.
 307 * Semantics of @nptr, @endptr, @base match strtol() with differences
 308 * noted below.
 309 *
 310 * @nptr may be null, and no conversion is performed then.
 311 *
 312 * If no conversion is performed, store @nptr in *@endptr and return
 313 * -EINVAL.
 314 *
 315 * If @endptr is null, and the string isn't fully converted, return
 316 * -EINVAL.  This is the case when the pointer that would be stored in
 317 * a non-null @endptr points to a character other than '\0'.
 318 *
 319 * If the conversion overflows @result, store INT_MAX in @result,
 320 * and return -ERANGE.
 321 *
 322 * If the conversion underflows @result, store INT_MIN in @result,
 323 * and return -ERANGE.
 324 *
 325 * Else store the converted value in @result, and return zero.
 326 */
 327int qemu_strtoi(const char *nptr, const char **endptr, int base,
 328                int *result)
 329{
 330    char *ep;
 331    long long lresult;
 332
 333    assert((unsigned) base <= 36 && base != 1);
 334    if (!nptr) {
 335        if (endptr) {
 336            *endptr = nptr;
 337        }
 338        return -EINVAL;
 339    }
 340
 341    errno = 0;
 342    lresult = strtoll(nptr, &ep, base);
 343    if (lresult < INT_MIN) {
 344        *result = INT_MIN;
 345        errno = ERANGE;
 346    } else if (lresult > INT_MAX) {
 347        *result = INT_MAX;
 348        errno = ERANGE;
 349    } else {
 350        *result = lresult;
 351    }
 352    return check_strtox_error(nptr, ep, endptr, errno);
 353}
 354
 355/**
 356 * Convert string @nptr to an unsigned integer, and store it in @result.
 357 *
 358 * This is a wrapper around strtoul() that is harder to misuse.
 359 * Semantics of @nptr, @endptr, @base match strtoul() with differences
 360 * noted below.
 361 *
 362 * @nptr may be null, and no conversion is performed then.
 363 *
 364 * If no conversion is performed, store @nptr in *@endptr and return
 365 * -EINVAL.
 366 *
 367 * If @endptr is null, and the string isn't fully converted, return
 368 * -EINVAL.  This is the case when the pointer that would be stored in
 369 * a non-null @endptr points to a character other than '\0'.
 370 *
 371 * If the conversion overflows @result, store UINT_MAX in @result,
 372 * and return -ERANGE.
 373 *
 374 * Else store the converted value in @result, and return zero.
 375 *
 376 * Note that a number with a leading minus sign gets converted without
 377 * the minus sign, checked for overflow (see above), then negated (in
 378 * @result's type).  This is exactly how strtoul() works.
 379 */
 380int qemu_strtoui(const char *nptr, const char **endptr, int base,
 381                 unsigned int *result)
 382{
 383    char *ep;
 384    long long lresult;
 385
 386    assert((unsigned) base <= 36 && base != 1);
 387    if (!nptr) {
 388        if (endptr) {
 389            *endptr = nptr;
 390        }
 391        return -EINVAL;
 392    }
 393
 394    errno = 0;
 395    lresult = strtoull(nptr, &ep, base);
 396
 397    /* Windows returns 1 for negative out-of-range values.  */
 398    if (errno == ERANGE) {
 399        *result = -1;
 400    } else {
 401        if (lresult > UINT_MAX) {
 402            *result = UINT_MAX;
 403            errno = ERANGE;
 404        } else if (lresult < INT_MIN) {
 405            *result = UINT_MAX;
 406            errno = ERANGE;
 407        } else {
 408            *result = lresult;
 409        }
 410    }
 411    return check_strtox_error(nptr, ep, endptr, errno);
 412}
 413
 414/**
 415 * Convert string @nptr to a long integer, and store it in @result.
 416 *
 417 * This is a wrapper around strtol() that is harder to misuse.
 418 * Semantics of @nptr, @endptr, @base match strtol() with differences
 419 * noted below.
 420 *
 421 * @nptr may be null, and no conversion is performed then.
 422 *
 423 * If no conversion is performed, store @nptr in *@endptr and return
 424 * -EINVAL.
 425 *
 426 * If @endptr is null, and the string isn't fully converted, return
 427 * -EINVAL.  This is the case when the pointer that would be stored in
 428 * a non-null @endptr points to a character other than '\0'.
 429 *
 430 * If the conversion overflows @result, store LONG_MAX in @result,
 431 * and return -ERANGE.
 432 *
 433 * If the conversion underflows @result, store LONG_MIN in @result,
 434 * and return -ERANGE.
 435 *
 436 * Else store the converted value in @result, and return zero.
 437 */
 438int qemu_strtol(const char *nptr, const char **endptr, int base,
 439                long *result)
 440{
 441    char *ep;
 442
 443    assert((unsigned) base <= 36 && base != 1);
 444    if (!nptr) {
 445        if (endptr) {
 446            *endptr = nptr;
 447        }
 448        return -EINVAL;
 449    }
 450
 451    errno = 0;
 452    *result = strtol(nptr, &ep, base);
 453    return check_strtox_error(nptr, ep, endptr, errno);
 454}
 455
 456/**
 457 * Convert string @nptr to an unsigned long, and store it in @result.
 458 *
 459 * This is a wrapper around strtoul() that is harder to misuse.
 460 * Semantics of @nptr, @endptr, @base match strtoul() with differences
 461 * noted below.
 462 *
 463 * @nptr may be null, and no conversion is performed then.
 464 *
 465 * If no conversion is performed, store @nptr in *@endptr and return
 466 * -EINVAL.
 467 *
 468 * If @endptr is null, and the string isn't fully converted, return
 469 * -EINVAL.  This is the case when the pointer that would be stored in
 470 * a non-null @endptr points to a character other than '\0'.
 471 *
 472 * If the conversion overflows @result, store ULONG_MAX in @result,
 473 * and return -ERANGE.
 474 *
 475 * Else store the converted value in @result, and return zero.
 476 *
 477 * Note that a number with a leading minus sign gets converted without
 478 * the minus sign, checked for overflow (see above), then negated (in
 479 * @result's type).  This is exactly how strtoul() works.
 480 */
 481int qemu_strtoul(const char *nptr, const char **endptr, int base,
 482                 unsigned long *result)
 483{
 484    char *ep;
 485
 486    assert((unsigned) base <= 36 && base != 1);
 487    if (!nptr) {
 488        if (endptr) {
 489            *endptr = nptr;
 490        }
 491        return -EINVAL;
 492    }
 493
 494    errno = 0;
 495    *result = strtoul(nptr, &ep, base);
 496    /* Windows returns 1 for negative out-of-range values.  */
 497    if (errno == ERANGE) {
 498        *result = -1;
 499    }
 500    return check_strtox_error(nptr, ep, endptr, errno);
 501}
 502
 503/**
 504 * Convert string @nptr to an int64_t.
 505 *
 506 * Works like qemu_strtol(), except it stores INT64_MAX on overflow,
 507 * and INT_MIN on underflow.
 508 */
 509int qemu_strtoi64(const char *nptr, const char **endptr, int base,
 510                 int64_t *result)
 511{
 512    char *ep;
 513
 514    assert((unsigned) base <= 36 && base != 1);
 515    if (!nptr) {
 516        if (endptr) {
 517            *endptr = nptr;
 518        }
 519        return -EINVAL;
 520    }
 521
 522    errno = 0;
 523    /* FIXME This assumes int64_t is long long */
 524    *result = strtoll(nptr, &ep, base);
 525    return check_strtox_error(nptr, ep, endptr, errno);
 526}
 527
 528/**
 529 * Convert string @nptr to an uint64_t.
 530 *
 531 * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow.
 532 */
 533int qemu_strtou64(const char *nptr, const char **endptr, int base,
 534                  uint64_t *result)
 535{
 536    char *ep;
 537
 538    assert((unsigned) base <= 36 && base != 1);
 539    if (!nptr) {
 540        if (endptr) {
 541            *endptr = nptr;
 542        }
 543        return -EINVAL;
 544    }
 545
 546    errno = 0;
 547    /* FIXME This assumes uint64_t is unsigned long long */
 548    *result = strtoull(nptr, &ep, base);
 549    /* Windows returns 1 for negative out-of-range values.  */
 550    if (errno == ERANGE) {
 551        *result = -1;
 552    }
 553    return check_strtox_error(nptr, ep, endptr, errno);
 554}
 555
 556/**
 557 * Convert string @nptr to a double.
 558  *
 559 * This is a wrapper around strtod() that is harder to misuse.
 560 * Semantics of @nptr and @endptr match strtod() with differences
 561 * noted below.
 562 *
 563 * @nptr may be null, and no conversion is performed then.
 564 *
 565 * If no conversion is performed, store @nptr in *@endptr and return
 566 * -EINVAL.
 567 *
 568 * If @endptr is null, and the string isn't fully converted, return
 569 * -EINVAL. This is the case when the pointer that would be stored in
 570 * a non-null @endptr points to a character other than '\0'.
 571 *
 572 * If the conversion overflows, store +/-HUGE_VAL in @result, depending
 573 * on the sign, and return -ERANGE.
 574 *
 575 * If the conversion underflows, store +/-0.0 in @result, depending on the
 576 * sign, and return -ERANGE.
 577 *
 578 * Else store the converted value in @result, and return zero.
 579 */
 580int qemu_strtod(const char *nptr, const char **endptr, double *result)
 581{
 582    char *ep;
 583
 584    if (!nptr) {
 585        if (endptr) {
 586            *endptr = nptr;
 587        }
 588        return -EINVAL;
 589    }
 590
 591    errno = 0;
 592    *result = strtod(nptr, &ep);
 593    return check_strtox_error(nptr, ep, endptr, errno);
 594}
 595
 596/**
 597 * Convert string @nptr to a finite double.
 598 *
 599 * Works like qemu_strtod(), except that "NaN" and "inf" are rejected
 600 * with -EINVAL and no conversion is performed.
 601 */
 602int qemu_strtod_finite(const char *nptr, const char **endptr, double *result)
 603{
 604    double tmp;
 605    int ret;
 606
 607    ret = qemu_strtod(nptr, endptr, &tmp);
 608    if (!ret && !isfinite(tmp)) {
 609        if (endptr) {
 610            *endptr = nptr;
 611        }
 612        ret = -EINVAL;
 613    }
 614
 615    if (ret != -EINVAL) {
 616        *result = tmp;
 617    }
 618    return ret;
 619}
 620
 621/**
 622 * Searches for the first occurrence of 'c' in 's', and returns a pointer
 623 * to the trailing null byte if none was found.
 624 */
 625#ifndef HAVE_STRCHRNUL
 626const char *qemu_strchrnul(const char *s, int c)
 627{
 628    const char *e = strchr(s, c);
 629    if (!e) {
 630        e = s + strlen(s);
 631    }
 632    return e;
 633}
 634#endif
 635
 636/**
 637 * parse_uint:
 638 *
 639 * @s: String to parse
 640 * @value: Destination for parsed integer value
 641 * @endptr: Destination for pointer to first character not consumed
 642 * @base: integer base, between 2 and 36 inclusive, or 0
 643 *
 644 * Parse unsigned integer
 645 *
 646 * Parsed syntax is like strtoull()'s: arbitrary whitespace, a single optional
 647 * '+' or '-', an optional "0x" if @base is 0 or 16, one or more digits.
 648 *
 649 * If @s is null, or @base is invalid, or @s doesn't start with an
 650 * integer in the syntax above, set *@value to 0, *@endptr to @s, and
 651 * return -EINVAL.
 652 *
 653 * Set *@endptr to point right beyond the parsed integer (even if the integer
 654 * overflows or is negative, all digits will be parsed and *@endptr will
 655 * point right beyond them).
 656 *
 657 * If the integer is negative, set *@value to 0, and return -ERANGE.
 658 *
 659 * If the integer overflows unsigned long long, set *@value to
 660 * ULLONG_MAX, and return -ERANGE.
 661 *
 662 * Else, set *@value to the parsed integer, and return 0.
 663 */
 664int parse_uint(const char *s, unsigned long long *value, char **endptr,
 665               int base)
 666{
 667    int r = 0;
 668    char *endp = (char *)s;
 669    unsigned long long val = 0;
 670
 671    assert((unsigned) base <= 36 && base != 1);
 672    if (!s) {
 673        r = -EINVAL;
 674        goto out;
 675    }
 676
 677    errno = 0;
 678    val = strtoull(s, &endp, base);
 679    if (errno) {
 680        r = -errno;
 681        goto out;
 682    }
 683
 684    if (endp == s) {
 685        r = -EINVAL;
 686        goto out;
 687    }
 688
 689    /* make sure we reject negative numbers: */
 690    while (qemu_isspace(*s)) {
 691        s++;
 692    }
 693    if (*s == '-') {
 694        val = 0;
 695        r = -ERANGE;
 696        goto out;
 697    }
 698
 699out:
 700    *value = val;
 701    *endptr = endp;
 702    return r;
 703}
 704
 705/**
 706 * parse_uint_full:
 707 *
 708 * @s: String to parse
 709 * @value: Destination for parsed integer value
 710 * @base: integer base, between 2 and 36 inclusive, or 0
 711 *
 712 * Parse unsigned integer from entire string
 713 *
 714 * Have the same behavior of parse_uint(), but with an additional check
 715 * for additional data after the parsed number. If extra characters are present
 716 * after the parsed number, the function will return -EINVAL, and *@v will
 717 * be set to 0.
 718 */
 719int parse_uint_full(const char *s, unsigned long long *value, int base)
 720{
 721    char *endp;
 722    int r;
 723
 724    r = parse_uint(s, value, &endp, base);
 725    if (r < 0) {
 726        return r;
 727    }
 728    if (*endp) {
 729        *value = 0;
 730        return -EINVAL;
 731    }
 732
 733    return 0;
 734}
 735
 736int qemu_parse_fd(const char *param)
 737{
 738    long fd;
 739    char *endptr;
 740
 741    errno = 0;
 742    fd = strtol(param, &endptr, 10);
 743    if (param == endptr /* no conversion performed */                    ||
 744        errno != 0      /* not representable as long; possibly others */ ||
 745        *endptr != '\0' /* final string not empty */                     ||
 746        fd < 0          /* invalid as file descriptor */                 ||
 747        fd > INT_MAX    /* not representable as int */) {
 748        return -1;
 749    }
 750    return fd;
 751}
 752
 753/*
 754 * Implementation of  ULEB128 (http://en.wikipedia.org/wiki/LEB128)
 755 * Input is limited to 14-bit numbers
 756 */
 757int uleb128_encode_small(uint8_t *out, uint32_t n)
 758{
 759    g_assert(n <= 0x3fff);
 760    if (n < 0x80) {
 761        *out = n;
 762        return 1;
 763    } else {
 764        *out++ = (n & 0x7f) | 0x80;
 765        *out = n >> 7;
 766        return 2;
 767    }
 768}
 769
 770int uleb128_decode_small(const uint8_t *in, uint32_t *n)
 771{
 772    if (!(*in & 0x80)) {
 773        *n = *in;
 774        return 1;
 775    } else {
 776        *n = *in++ & 0x7f;
 777        /* we exceed 14 bit number */
 778        if (*in & 0x80) {
 779            return -1;
 780        }
 781        *n |= *in << 7;
 782        return 2;
 783    }
 784}
 785
 786/*
 787 * helper to parse debug environment variables
 788 */
 789int parse_debug_env(const char *name, int max, int initial)
 790{
 791    char *debug_env = getenv(name);
 792    char *inv = NULL;
 793    long debug;
 794
 795    if (!debug_env) {
 796        return initial;
 797    }
 798    errno = 0;
 799    debug = strtol(debug_env, &inv, 10);
 800    if (inv == debug_env) {
 801        return initial;
 802    }
 803    if (debug < 0 || debug > max || errno != 0) {
 804        warn_report("%s not in [0, %d]", name, max);
 805        return initial;
 806    }
 807    return debug;
 808}
 809
 810/*
 811 * Helper to print ethernet mac address
 812 */
 813const char *qemu_ether_ntoa(const MACAddr *mac)
 814{
 815    static char ret[18];
 816
 817    snprintf(ret, sizeof(ret), "%02x:%02x:%02x:%02x:%02x:%02x",
 818             mac->a[0], mac->a[1], mac->a[2], mac->a[3], mac->a[4], mac->a[5]);
 819
 820    return ret;
 821}
 822
 823/*
 824 * Return human readable string for size @val.
 825 * @val can be anything that uint64_t allows (no more than "16 EiB").
 826 * Use IEC binary units like KiB, MiB, and so forth.
 827 * Caller is responsible for passing it to g_free().
 828 */
 829char *size_to_str(uint64_t val)
 830{
 831    static const char *suffixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" };
 832    uint64_t div;
 833    int i;
 834
 835    /*
 836     * The exponent (returned in i) minus one gives us
 837     * floor(log2(val * 1024 / 1000).  The correction makes us
 838     * switch to the higher power when the integer part is >= 1000.
 839     * (see e41b509d68afb1f for more info)
 840     */
 841    frexp(val / (1000.0 / 1024.0), &i);
 842    i = (i - 1) / 10;
 843    div = 1ULL << (i * 10);
 844
 845    return g_strdup_printf("%0.3g %sB", (double)val / div, suffixes[i]);
 846}
 847
 848int qemu_pstrcmp0(const char **str1, const char **str2)
 849{
 850    return g_strcmp0(*str1, *str2);
 851}
 852