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 QEMU_STRTOSZ_DEFSUFFIX_B:
 185        return 1;
 186    case QEMU_STRTOSZ_DEFSUFFIX_KB:
 187        return unit;
 188    case QEMU_STRTOSZ_DEFSUFFIX_MB:
 189        return unit * unit;
 190    case QEMU_STRTOSZ_DEFSUFFIX_GB:
 191        return unit * unit * unit;
 192    case QEMU_STRTOSZ_DEFSUFFIX_TB:
 193        return unit * unit * unit * unit;
 194    case QEMU_STRTOSZ_DEFSUFFIX_PB:
 195        return unit * unit * unit * unit * unit;
 196    case QEMU_STRTOSZ_DEFSUFFIX_EB:
 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 */
 208int64_t qemu_strtosz_suffix_unit(const char *nptr, char **end,
 209                            const char default_suffix, int64_t unit)
 210{
 211    int64_t retval = -EINVAL;
 212    char *endptr;
 213    unsigned char c;
 214    int mul_required = 0;
 215    double val, mul, integral, fraction;
 216
 217    errno = 0;
 218    val = strtod(nptr, &endptr);
 219    if (isnan(val) || endptr == nptr || errno != 0) {
 220        goto fail;
 221    }
 222    fraction = modf(val, &integral);
 223    if (fraction != 0) {
 224        mul_required = 1;
 225    }
 226    c = *endptr;
 227    mul = suffix_mul(c, unit);
 228    if (mul >= 0) {
 229        endptr++;
 230    } else {
 231        mul = suffix_mul(default_suffix, unit);
 232        assert(mul >= 0);
 233    }
 234    if (mul == 1 && mul_required) {
 235        goto fail;
 236    }
 237    if ((val * mul >= INT64_MAX) || val < 0) {
 238        retval = -ERANGE;
 239        goto fail;
 240    }
 241    retval = val * mul;
 242
 243fail:
 244    if (end) {
 245        *end = endptr;
 246    }
 247
 248    return retval;
 249}
 250
 251int64_t qemu_strtosz_suffix(const char *nptr, char **end,
 252                            const char default_suffix)
 253{
 254    return qemu_strtosz_suffix_unit(nptr, end, default_suffix, 1024);
 255}
 256
 257int64_t qemu_strtosz(const char *nptr, char **end)
 258{
 259    return qemu_strtosz_suffix(nptr, end, QEMU_STRTOSZ_DEFSUFFIX_MB);
 260}
 261
 262/**
 263 * Helper function for qemu_strto*l() functions.
 264 */
 265static int check_strtox_error(const char *p, char *endptr, const char **next,
 266                              int err)
 267{
 268    /* If no conversion was performed, prefer BSD behavior over glibc
 269     * behavior.
 270     */
 271    if (err == 0 && endptr == p) {
 272        err = EINVAL;
 273    }
 274    if (!next && *endptr) {
 275        return -EINVAL;
 276    }
 277    if (next) {
 278        *next = endptr;
 279    }
 280    return -err;
 281}
 282
 283/**
 284 * QEMU wrappers for strtol(), strtoll(), strtoul(), strotull() C functions.
 285 *
 286 * Convert ASCII string @nptr to a long integer value
 287 * from the given @base. Parameters @nptr, @endptr, @base
 288 * follows same semantics as strtol() C function.
 289 *
 290 * Unlike from strtol() function, if @endptr is not NULL, this
 291 * function will return -EINVAL whenever it cannot fully convert
 292 * the string in @nptr with given @base to a long. This function returns
 293 * the result of the conversion only through the @result parameter.
 294 *
 295 * If NULL is passed in @endptr, then the whole string in @ntpr
 296 * is a number otherwise it returns -EINVAL.
 297 *
 298 * RETURN VALUE
 299 * Unlike from strtol() function, this wrapper returns either
 300 * -EINVAL or the errno set by strtol() function (e.g -ERANGE).
 301 * If the conversion overflows, -ERANGE is returned, and @result
 302 * is set to the max value of the desired type
 303 * (e.g. LONG_MAX, LLONG_MAX, ULONG_MAX, ULLONG_MAX). If the case
 304 * of underflow, -ERANGE is returned, and @result is set to the min
 305 * value of the desired type. For strtol(), strtoll(), @result is set to
 306 * LONG_MIN, LLONG_MIN, respectively, and for strtoul(), strtoull() it
 307 * is set to 0.
 308 */
 309int qemu_strtol(const char *nptr, const char **endptr, int base,
 310                long *result)
 311{
 312    char *p;
 313    int err = 0;
 314    if (!nptr) {
 315        if (endptr) {
 316            *endptr = nptr;
 317        }
 318        err = -EINVAL;
 319    } else {
 320        errno = 0;
 321        *result = strtol(nptr, &p, base);
 322        err = check_strtox_error(nptr, p, endptr, errno);
 323    }
 324    return err;
 325}
 326
 327/**
 328 * Converts ASCII string to an unsigned long integer.
 329 *
 330 * If string contains a negative number, value will be converted to
 331 * the unsigned representation of the signed value, unless the original
 332 * (nonnegated) value would overflow, in this case, it will set @result
 333 * to ULONG_MAX, and return ERANGE.
 334 *
 335 * The same behavior holds, for qemu_strtoull() but sets @result to
 336 * ULLONG_MAX instead of ULONG_MAX.
 337 *
 338 * See qemu_strtol() documentation for more info.
 339 */
 340int qemu_strtoul(const char *nptr, const char **endptr, int base,
 341                 unsigned long *result)
 342{
 343    char *p;
 344    int err = 0;
 345    if (!nptr) {
 346        if (endptr) {
 347            *endptr = nptr;
 348        }
 349        err = -EINVAL;
 350    } else {
 351        errno = 0;
 352        *result = strtoul(nptr, &p, base);
 353        /* Windows returns 1 for negative out-of-range values.  */
 354        if (errno == ERANGE) {
 355            *result = -1;
 356        }
 357        err = check_strtox_error(nptr, p, endptr, errno);
 358    }
 359    return err;
 360}
 361
 362/**
 363 * Converts ASCII string to a long long integer.
 364 *
 365 * See qemu_strtol() documentation for more info.
 366 */
 367int qemu_strtoll(const char *nptr, const char **endptr, int base,
 368                 int64_t *result)
 369{
 370    char *p;
 371    int err = 0;
 372    if (!nptr) {
 373        if (endptr) {
 374            *endptr = nptr;
 375        }
 376        err = -EINVAL;
 377    } else {
 378        errno = 0;
 379        *result = strtoll(nptr, &p, base);
 380        err = check_strtox_error(nptr, p, endptr, errno);
 381    }
 382    return err;
 383}
 384
 385/**
 386 * Converts ASCII string to an unsigned long long integer.
 387 *
 388 * See qemu_strtol() documentation for more info.
 389 */
 390int qemu_strtoull(const char *nptr, const char **endptr, int base,
 391                  uint64_t *result)
 392{
 393    char *p;
 394    int err = 0;
 395    if (!nptr) {
 396        if (endptr) {
 397            *endptr = nptr;
 398        }
 399        err = -EINVAL;
 400    } else {
 401        errno = 0;
 402        *result = strtoull(nptr, &p, base);
 403        /* Windows returns 1 for negative out-of-range values.  */
 404        if (errno == ERANGE) {
 405            *result = -1;
 406        }
 407        err = check_strtox_error(nptr, p, endptr, errno);
 408    }
 409    return err;
 410}
 411
 412/**
 413 * parse_uint:
 414 *
 415 * @s: String to parse
 416 * @value: Destination for parsed integer value
 417 * @endptr: Destination for pointer to first character not consumed
 418 * @base: integer base, between 2 and 36 inclusive, or 0
 419 *
 420 * Parse unsigned integer
 421 *
 422 * Parsed syntax is like strtoull()'s: arbitrary whitespace, a single optional
 423 * '+' or '-', an optional "0x" if @base is 0 or 16, one or more digits.
 424 *
 425 * If @s is null, or @base is invalid, or @s doesn't start with an
 426 * integer in the syntax above, set *@value to 0, *@endptr to @s, and
 427 * return -EINVAL.
 428 *
 429 * Set *@endptr to point right beyond the parsed integer (even if the integer
 430 * overflows or is negative, all digits will be parsed and *@endptr will
 431 * point right beyond them).
 432 *
 433 * If the integer is negative, set *@value to 0, and return -ERANGE.
 434 *
 435 * If the integer overflows unsigned long long, set *@value to
 436 * ULLONG_MAX, and return -ERANGE.
 437 *
 438 * Else, set *@value to the parsed integer, and return 0.
 439 */
 440int parse_uint(const char *s, unsigned long long *value, char **endptr,
 441               int base)
 442{
 443    int r = 0;
 444    char *endp = (char *)s;
 445    unsigned long long val = 0;
 446
 447    if (!s) {
 448        r = -EINVAL;
 449        goto out;
 450    }
 451
 452    errno = 0;
 453    val = strtoull(s, &endp, base);
 454    if (errno) {
 455        r = -errno;
 456        goto out;
 457    }
 458
 459    if (endp == s) {
 460        r = -EINVAL;
 461        goto out;
 462    }
 463
 464    /* make sure we reject negative numbers: */
 465    while (isspace((unsigned char)*s)) {
 466        s++;
 467    }
 468    if (*s == '-') {
 469        val = 0;
 470        r = -ERANGE;
 471        goto out;
 472    }
 473
 474out:
 475    *value = val;
 476    *endptr = endp;
 477    return r;
 478}
 479
 480/**
 481 * parse_uint_full:
 482 *
 483 * @s: String to parse
 484 * @value: Destination for parsed integer value
 485 * @base: integer base, between 2 and 36 inclusive, or 0
 486 *
 487 * Parse unsigned integer from entire string
 488 *
 489 * Have the same behavior of parse_uint(), but with an additional check
 490 * for additional data after the parsed number. If extra characters are present
 491 * after the parsed number, the function will return -EINVAL, and *@v will
 492 * be set to 0.
 493 */
 494int parse_uint_full(const char *s, unsigned long long *value, int base)
 495{
 496    char *endp;
 497    int r;
 498
 499    r = parse_uint(s, value, &endp, base);
 500    if (r < 0) {
 501        return r;
 502    }
 503    if (*endp) {
 504        *value = 0;
 505        return -EINVAL;
 506    }
 507
 508    return 0;
 509}
 510
 511int qemu_parse_fd(const char *param)
 512{
 513    long fd;
 514    char *endptr;
 515
 516    errno = 0;
 517    fd = strtol(param, &endptr, 10);
 518    if (param == endptr /* no conversion performed */                    ||
 519        errno != 0      /* not representable as long; possibly others */ ||
 520        *endptr != '\0' /* final string not empty */                     ||
 521        fd < 0          /* invalid as file descriptor */                 ||
 522        fd > INT_MAX    /* not representable as int */) {
 523        return -1;
 524    }
 525    return fd;
 526}
 527
 528/*
 529 * Implementation of  ULEB128 (http://en.wikipedia.org/wiki/LEB128)
 530 * Input is limited to 14-bit numbers
 531 */
 532int uleb128_encode_small(uint8_t *out, uint32_t n)
 533{
 534    g_assert(n <= 0x3fff);
 535    if (n < 0x80) {
 536        *out++ = n;
 537        return 1;
 538    } else {
 539        *out++ = (n & 0x7f) | 0x80;
 540        *out++ = n >> 7;
 541        return 2;
 542    }
 543}
 544
 545int uleb128_decode_small(const uint8_t *in, uint32_t *n)
 546{
 547    if (!(*in & 0x80)) {
 548        *n = *in++;
 549        return 1;
 550    } else {
 551        *n = *in++ & 0x7f;
 552        /* we exceed 14 bit number */
 553        if (*in & 0x80) {
 554            return -1;
 555        }
 556        *n |= *in++ << 7;
 557        return 2;
 558    }
 559}
 560
 561/*
 562 * helper to parse debug environment variables
 563 */
 564int parse_debug_env(const char *name, int max, int initial)
 565{
 566    char *debug_env = getenv(name);
 567    char *inv = NULL;
 568    long debug;
 569
 570    if (!debug_env) {
 571        return initial;
 572    }
 573    errno = 0;
 574    debug = strtol(debug_env, &inv, 10);
 575    if (inv == debug_env) {
 576        return initial;
 577    }
 578    if (debug < 0 || debug > max || errno != 0) {
 579        fprintf(stderr, "warning: %s not in [0, %d]", name, max);
 580        return initial;
 581    }
 582    return debug;
 583}
 584
 585/*
 586 * Helper to print ethernet mac address
 587 */
 588const char *qemu_ether_ntoa(const MACAddr *mac)
 589{
 590    static char ret[18];
 591
 592    snprintf(ret, sizeof(ret), "%02x:%02x:%02x:%02x:%02x:%02x",
 593             mac->a[0], mac->a[1], mac->a[2], mac->a[3], mac->a[4], mac->a[5]);
 594
 595    return ret;
 596}
 597