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 #ifdef __FreeBSD__ 30 #include <sys/sysctl.h> 31 #include <sys/user.h> 32 #endif 33 34 #ifdef __NetBSD__ 35 #include <sys/sysctl.h> 36 #endif 37 38 #ifdef __HAIKU__ 39 #include <kernel/image.h> 40 #endif 41 42 #ifdef __APPLE__ 43 #include <mach-o/dyld.h> 44 #endif 45 46 #ifdef G_OS_WIN32 47 #include <pathcch.h> 48 #include <wchar.h> 49 #endif 50 51 #include "qemu/ctype.h" 52 #include "qemu/cutils.h" 53 #include "qemu/error-report.h" 54 55 void strpadcpy(char *buf, int buf_size, const char *str, char pad) 56 { 57 int len = qemu_strnlen(str, buf_size); 58 memcpy(buf, str, len); 59 memset(buf + len, pad, buf_size - len); 60 } 61 62 void pstrcpy(char *buf, int buf_size, const char *str) 63 { 64 int c; 65 char *q = buf; 66 67 if (buf_size <= 0) 68 return; 69 70 for(;;) { 71 c = *str++; 72 if (c == 0 || q >= buf + buf_size - 1) 73 break; 74 *q++ = c; 75 } 76 *q = '\0'; 77 } 78 79 /* strcat and truncate. */ 80 char *pstrcat(char *buf, int buf_size, const char *s) 81 { 82 int len; 83 len = strlen(buf); 84 if (len < buf_size) 85 pstrcpy(buf + len, buf_size - len, s); 86 return buf; 87 } 88 89 int strstart(const char *str, const char *val, const char **ptr) 90 { 91 const char *p, *q; 92 p = str; 93 q = val; 94 while (*q != '\0') { 95 if (*p != *q) 96 return 0; 97 p++; 98 q++; 99 } 100 if (ptr) 101 *ptr = p; 102 return 1; 103 } 104 105 int stristart(const char *str, const char *val, const char **ptr) 106 { 107 const char *p, *q; 108 p = str; 109 q = val; 110 while (*q != '\0') { 111 if (qemu_toupper(*p) != qemu_toupper(*q)) 112 return 0; 113 p++; 114 q++; 115 } 116 if (ptr) 117 *ptr = p; 118 return 1; 119 } 120 121 /* XXX: use host strnlen if available ? */ 122 int qemu_strnlen(const char *s, int max_len) 123 { 124 int i; 125 126 for(i = 0; i < max_len; i++) { 127 if (s[i] == '\0') { 128 break; 129 } 130 } 131 return i; 132 } 133 134 char *qemu_strsep(char **input, const char *delim) 135 { 136 char *result = *input; 137 if (result != NULL) { 138 char *p; 139 140 for (p = result; *p != '\0'; p++) { 141 if (strchr(delim, *p)) { 142 break; 143 } 144 } 145 if (*p == '\0') { 146 *input = NULL; 147 } else { 148 *p = '\0'; 149 *input = p + 1; 150 } 151 } 152 return result; 153 } 154 155 time_t mktimegm(struct tm *tm) 156 { 157 time_t t; 158 int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday; 159 if (m < 3) { 160 m += 12; 161 y--; 162 } 163 t = 86400ULL * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + 164 y / 400 - 719469); 165 t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec; 166 return t; 167 } 168 169 static int64_t suffix_mul(char suffix, int64_t unit) 170 { 171 switch (qemu_toupper(suffix)) { 172 case 'B': 173 return 1; 174 case 'K': 175 return unit; 176 case 'M': 177 return unit * unit; 178 case 'G': 179 return unit * unit * unit; 180 case 'T': 181 return unit * unit * unit * unit; 182 case 'P': 183 return unit * unit * unit * unit * unit; 184 case 'E': 185 return unit * unit * unit * unit * unit * unit; 186 } 187 return -1; 188 } 189 190 /* 191 * Convert size string to bytes. 192 * 193 * The size parsing supports the following syntaxes 194 * - 12345 - decimal, scale determined by @default_suffix and @unit 195 * - 12345{bBkKmMgGtTpPeE} - decimal, scale determined by suffix and @unit 196 * - 12345.678{kKmMgGtTpPeE} - decimal, scale determined by suffix, and 197 * fractional portion is truncated to byte 198 * - 0x7fEE - hexadecimal, unit determined by @default_suffix 199 * 200 * The following are intentionally not supported 201 * - hex with scaling suffix, such as 0x20M 202 * - octal, such as 08 203 * - fractional hex, such as 0x1.8 204 * - floating point exponents, such as 1e3 205 * 206 * The end pointer will be returned in *end, if not NULL. If there is 207 * no fraction, the input can be decimal or hexadecimal; if there is a 208 * fraction, then the input must be decimal and there must be a suffix 209 * (possibly by @default_suffix) larger than Byte, and the fractional 210 * portion may suffer from precision loss or rounding. The input must 211 * be positive. 212 * 213 * Return -ERANGE on overflow (with *@end advanced), and -EINVAL on 214 * other error (with *@end left unchanged). 215 */ 216 static int do_strtosz(const char *nptr, const char **end, 217 const char default_suffix, int64_t unit, 218 uint64_t *result) 219 { 220 int retval; 221 const char *endptr, *f; 222 unsigned char c; 223 uint64_t val, valf = 0; 224 int64_t mul; 225 226 /* Parse integral portion as decimal. */ 227 retval = qemu_strtou64(nptr, &endptr, 10, &val); 228 if (retval) { 229 goto out; 230 } 231 if (memchr(nptr, '-', endptr - nptr) != NULL) { 232 endptr = nptr; 233 retval = -EINVAL; 234 goto out; 235 } 236 if (val == 0 && (*endptr == 'x' || *endptr == 'X')) { 237 /* Input looks like hex; reparse, and insist on no fraction or suffix. */ 238 retval = qemu_strtou64(nptr, &endptr, 16, &val); 239 if (retval) { 240 goto out; 241 } 242 if (*endptr == '.' || suffix_mul(*endptr, unit) > 0) { 243 endptr = nptr; 244 retval = -EINVAL; 245 goto out; 246 } 247 } else if (*endptr == '.') { 248 /* 249 * Input looks like a fraction. Make sure even 1.k works 250 * without fractional digits. If we see an exponent, treat 251 * the entire input as invalid instead. 252 */ 253 double fraction; 254 255 f = endptr; 256 retval = qemu_strtod_finite(f, &endptr, &fraction); 257 if (retval) { 258 endptr++; 259 } else if (memchr(f, 'e', endptr - f) || memchr(f, 'E', endptr - f)) { 260 endptr = nptr; 261 retval = -EINVAL; 262 goto out; 263 } else { 264 /* Extract into a 64-bit fixed-point fraction. */ 265 valf = (uint64_t)(fraction * 0x1p64); 266 } 267 } 268 c = *endptr; 269 mul = suffix_mul(c, unit); 270 if (mul > 0) { 271 endptr++; 272 } else { 273 mul = suffix_mul(default_suffix, unit); 274 assert(mul > 0); 275 } 276 if (mul == 1) { 277 /* When a fraction is present, a scale is required. */ 278 if (valf != 0) { 279 endptr = nptr; 280 retval = -EINVAL; 281 goto out; 282 } 283 } else { 284 uint64_t valh, tmp; 285 286 /* Compute exact result: 64.64 x 64.0 -> 128.64 fixed point */ 287 mulu64(&val, &valh, val, mul); 288 mulu64(&valf, &tmp, valf, mul); 289 val += tmp; 290 valh += val < tmp; 291 292 /* Round 0.5 upward. */ 293 tmp = valf >> 63; 294 val += tmp; 295 valh += val < tmp; 296 297 /* Report overflow. */ 298 if (valh != 0) { 299 retval = -ERANGE; 300 goto out; 301 } 302 } 303 304 retval = 0; 305 306 out: 307 if (end) { 308 *end = endptr; 309 } else if (*endptr) { 310 retval = -EINVAL; 311 } 312 if (retval == 0) { 313 *result = val; 314 } 315 316 return retval; 317 } 318 319 int qemu_strtosz(const char *nptr, const char **end, uint64_t *result) 320 { 321 return do_strtosz(nptr, end, 'B', 1024, result); 322 } 323 324 int qemu_strtosz_MiB(const char *nptr, const char **end, uint64_t *result) 325 { 326 return do_strtosz(nptr, end, 'M', 1024, result); 327 } 328 329 int qemu_strtosz_metric(const char *nptr, const char **end, uint64_t *result) 330 { 331 return do_strtosz(nptr, end, 'B', 1000, result); 332 } 333 334 /** 335 * Helper function for error checking after strtol() and the like 336 */ 337 static int check_strtox_error(const char *nptr, char *ep, 338 const char **endptr, bool check_zero, 339 int libc_errno) 340 { 341 assert(ep >= nptr); 342 343 /* Windows has a bug in that it fails to parse 0 from "0x" in base 16 */ 344 if (check_zero && ep == nptr && libc_errno == 0) { 345 char *tmp; 346 347 errno = 0; 348 if (strtol(nptr, &tmp, 10) == 0 && errno == 0 && 349 (*tmp == 'x' || *tmp == 'X')) { 350 ep = tmp; 351 } 352 } 353 354 if (endptr) { 355 *endptr = ep; 356 } 357 358 /* Turn "no conversion" into an error */ 359 if (libc_errno == 0 && ep == nptr) { 360 return -EINVAL; 361 } 362 363 /* Fail when we're expected to consume the string, but didn't */ 364 if (!endptr && *ep) { 365 return -EINVAL; 366 } 367 368 return -libc_errno; 369 } 370 371 /** 372 * Convert string @nptr to an integer, and store it in @result. 373 * 374 * This is a wrapper around strtol() that is harder to misuse. 375 * Semantics of @nptr, @endptr, @base match strtol() with differences 376 * noted below. 377 * 378 * @nptr may be null, and no conversion is performed then. 379 * 380 * If no conversion is performed, store @nptr in *@endptr and return 381 * -EINVAL. 382 * 383 * If @endptr is null, and the string isn't fully converted, return 384 * -EINVAL. This is the case when the pointer that would be stored in 385 * a non-null @endptr points to a character other than '\0'. 386 * 387 * If the conversion overflows @result, store INT_MAX in @result, 388 * and return -ERANGE. 389 * 390 * If the conversion underflows @result, store INT_MIN in @result, 391 * and return -ERANGE. 392 * 393 * Else store the converted value in @result, and return zero. 394 */ 395 int qemu_strtoi(const char *nptr, const char **endptr, int base, 396 int *result) 397 { 398 char *ep; 399 long long lresult; 400 401 assert((unsigned) base <= 36 && base != 1); 402 if (!nptr) { 403 if (endptr) { 404 *endptr = nptr; 405 } 406 return -EINVAL; 407 } 408 409 errno = 0; 410 lresult = strtoll(nptr, &ep, base); 411 if (lresult < INT_MIN) { 412 *result = INT_MIN; 413 errno = ERANGE; 414 } else if (lresult > INT_MAX) { 415 *result = INT_MAX; 416 errno = ERANGE; 417 } else { 418 *result = lresult; 419 } 420 return check_strtox_error(nptr, ep, endptr, lresult == 0, errno); 421 } 422 423 /** 424 * Convert string @nptr to an unsigned integer, and store it in @result. 425 * 426 * This is a wrapper around strtoul() that is harder to misuse. 427 * Semantics of @nptr, @endptr, @base match strtoul() with differences 428 * noted below. 429 * 430 * @nptr may be null, and no conversion is performed then. 431 * 432 * If no conversion is performed, store @nptr in *@endptr and return 433 * -EINVAL. 434 * 435 * If @endptr is null, and the string isn't fully converted, return 436 * -EINVAL. This is the case when the pointer that would be stored in 437 * a non-null @endptr points to a character other than '\0'. 438 * 439 * If the conversion overflows @result, store UINT_MAX in @result, 440 * and return -ERANGE. 441 * 442 * Else store the converted value in @result, and return zero. 443 * 444 * Note that a number with a leading minus sign gets converted without 445 * the minus sign, checked for overflow (see above), then negated (in 446 * @result's type). This is exactly how strtoul() works. 447 */ 448 int qemu_strtoui(const char *nptr, const char **endptr, int base, 449 unsigned int *result) 450 { 451 char *ep; 452 long long lresult; 453 454 assert((unsigned) base <= 36 && base != 1); 455 if (!nptr) { 456 if (endptr) { 457 *endptr = nptr; 458 } 459 return -EINVAL; 460 } 461 462 errno = 0; 463 lresult = strtoull(nptr, &ep, base); 464 465 /* Windows returns 1 for negative out-of-range values. */ 466 if (errno == ERANGE) { 467 *result = -1; 468 } else { 469 if (lresult > UINT_MAX) { 470 *result = UINT_MAX; 471 errno = ERANGE; 472 } else if (lresult < INT_MIN) { 473 *result = UINT_MAX; 474 errno = ERANGE; 475 } else { 476 *result = lresult; 477 } 478 } 479 return check_strtox_error(nptr, ep, endptr, lresult == 0, errno); 480 } 481 482 /** 483 * Convert string @nptr to a long integer, and store it in @result. 484 * 485 * This is a wrapper around strtol() that is harder to misuse. 486 * Semantics of @nptr, @endptr, @base match strtol() with differences 487 * noted below. 488 * 489 * @nptr may be null, and no conversion is performed then. 490 * 491 * If no conversion is performed, store @nptr in *@endptr and return 492 * -EINVAL. 493 * 494 * If @endptr is null, and the string isn't fully converted, return 495 * -EINVAL. This is the case when the pointer that would be stored in 496 * a non-null @endptr points to a character other than '\0'. 497 * 498 * If the conversion overflows @result, store LONG_MAX in @result, 499 * and return -ERANGE. 500 * 501 * If the conversion underflows @result, store LONG_MIN in @result, 502 * and return -ERANGE. 503 * 504 * Else store the converted value in @result, and return zero. 505 */ 506 int qemu_strtol(const char *nptr, const char **endptr, int base, 507 long *result) 508 { 509 char *ep; 510 511 assert((unsigned) base <= 36 && base != 1); 512 if (!nptr) { 513 if (endptr) { 514 *endptr = nptr; 515 } 516 return -EINVAL; 517 } 518 519 errno = 0; 520 *result = strtol(nptr, &ep, base); 521 return check_strtox_error(nptr, ep, endptr, *result == 0, errno); 522 } 523 524 /** 525 * Convert string @nptr to an unsigned long, and store it in @result. 526 * 527 * This is a wrapper around strtoul() that is harder to misuse. 528 * Semantics of @nptr, @endptr, @base match strtoul() with differences 529 * noted below. 530 * 531 * @nptr may be null, and no conversion is performed then. 532 * 533 * If no conversion is performed, store @nptr in *@endptr and return 534 * -EINVAL. 535 * 536 * If @endptr is null, and the string isn't fully converted, return 537 * -EINVAL. This is the case when the pointer that would be stored in 538 * a non-null @endptr points to a character other than '\0'. 539 * 540 * If the conversion overflows @result, store ULONG_MAX in @result, 541 * and return -ERANGE. 542 * 543 * Else store the converted value in @result, and return zero. 544 * 545 * Note that a number with a leading minus sign gets converted without 546 * the minus sign, checked for overflow (see above), then negated (in 547 * @result's type). This is exactly how strtoul() works. 548 */ 549 int qemu_strtoul(const char *nptr, const char **endptr, int base, 550 unsigned long *result) 551 { 552 char *ep; 553 554 assert((unsigned) base <= 36 && base != 1); 555 if (!nptr) { 556 if (endptr) { 557 *endptr = nptr; 558 } 559 return -EINVAL; 560 } 561 562 errno = 0; 563 *result = strtoul(nptr, &ep, base); 564 /* Windows returns 1 for negative out-of-range values. */ 565 if (errno == ERANGE) { 566 *result = -1; 567 } 568 return check_strtox_error(nptr, ep, endptr, *result == 0, errno); 569 } 570 571 /** 572 * Convert string @nptr to an int64_t. 573 * 574 * Works like qemu_strtol(), except it stores INT64_MAX on overflow, 575 * and INT64_MIN on underflow. 576 */ 577 int qemu_strtoi64(const char *nptr, const char **endptr, int base, 578 int64_t *result) 579 { 580 char *ep; 581 582 assert((unsigned) base <= 36 && base != 1); 583 if (!nptr) { 584 if (endptr) { 585 *endptr = nptr; 586 } 587 return -EINVAL; 588 } 589 590 /* This assumes int64_t is long long TODO relax */ 591 QEMU_BUILD_BUG_ON(sizeof(int64_t) != sizeof(long long)); 592 errno = 0; 593 *result = strtoll(nptr, &ep, base); 594 return check_strtox_error(nptr, ep, endptr, *result == 0, errno); 595 } 596 597 /** 598 * Convert string @nptr to an uint64_t. 599 * 600 * Works like qemu_strtoul(), except it stores UINT64_MAX on overflow. 601 */ 602 int qemu_strtou64(const char *nptr, const char **endptr, int base, 603 uint64_t *result) 604 { 605 char *ep; 606 607 assert((unsigned) base <= 36 && base != 1); 608 if (!nptr) { 609 if (endptr) { 610 *endptr = nptr; 611 } 612 return -EINVAL; 613 } 614 615 /* This assumes uint64_t is unsigned long long TODO relax */ 616 QEMU_BUILD_BUG_ON(sizeof(uint64_t) != sizeof(unsigned long long)); 617 errno = 0; 618 *result = strtoull(nptr, &ep, base); 619 /* Windows returns 1 for negative out-of-range values. */ 620 if (errno == ERANGE) { 621 *result = -1; 622 } 623 return check_strtox_error(nptr, ep, endptr, *result == 0, errno); 624 } 625 626 /** 627 * Convert string @nptr to a double. 628 * 629 * This is a wrapper around strtod() that is harder to misuse. 630 * Semantics of @nptr and @endptr match strtod() with differences 631 * noted below. 632 * 633 * @nptr may be null, and no conversion is performed then. 634 * 635 * If no conversion is performed, store @nptr in *@endptr and return 636 * -EINVAL. 637 * 638 * If @endptr is null, and the string isn't fully converted, return 639 * -EINVAL. This is the case when the pointer that would be stored in 640 * a non-null @endptr points to a character other than '\0'. 641 * 642 * If the conversion overflows, store +/-HUGE_VAL in @result, depending 643 * on the sign, and return -ERANGE. 644 * 645 * If the conversion underflows, store +/-0.0 in @result, depending on the 646 * sign, and return -ERANGE. 647 * 648 * Else store the converted value in @result, and return zero. 649 */ 650 int qemu_strtod(const char *nptr, const char **endptr, double *result) 651 { 652 char *ep; 653 654 if (!nptr) { 655 if (endptr) { 656 *endptr = nptr; 657 } 658 return -EINVAL; 659 } 660 661 errno = 0; 662 *result = strtod(nptr, &ep); 663 return check_strtox_error(nptr, ep, endptr, false, errno); 664 } 665 666 /** 667 * Convert string @nptr to a finite double. 668 * 669 * Works like qemu_strtod(), except that "NaN" and "inf" are rejected 670 * with -EINVAL and no conversion is performed. 671 */ 672 int qemu_strtod_finite(const char *nptr, const char **endptr, double *result) 673 { 674 double tmp; 675 int ret; 676 677 ret = qemu_strtod(nptr, endptr, &tmp); 678 if (!ret && !isfinite(tmp)) { 679 if (endptr) { 680 *endptr = nptr; 681 } 682 ret = -EINVAL; 683 } 684 685 if (ret != -EINVAL) { 686 *result = tmp; 687 } 688 return ret; 689 } 690 691 /** 692 * Searches for the first occurrence of 'c' in 's', and returns a pointer 693 * to the trailing null byte if none was found. 694 */ 695 #ifndef HAVE_STRCHRNUL 696 const char *qemu_strchrnul(const char *s, int c) 697 { 698 const char *e = strchr(s, c); 699 if (!e) { 700 e = s + strlen(s); 701 } 702 return e; 703 } 704 #endif 705 706 /** 707 * parse_uint: 708 * 709 * @s: String to parse 710 * @value: Destination for parsed integer value 711 * @endptr: Destination for pointer to first character not consumed 712 * @base: integer base, between 2 and 36 inclusive, or 0 713 * 714 * Parse unsigned integer 715 * 716 * Parsed syntax is like strtoull()'s: arbitrary whitespace, a single optional 717 * '+' or '-', an optional "0x" if @base is 0 or 16, one or more digits. 718 * 719 * If @s is null, or @base is invalid, or @s doesn't start with an 720 * integer in the syntax above, set *@value to 0, *@endptr to @s, and 721 * return -EINVAL. 722 * 723 * Set *@endptr to point right beyond the parsed integer (even if the integer 724 * overflows or is negative, all digits will be parsed and *@endptr will 725 * point right beyond them). 726 * 727 * If the integer is negative, set *@value to 0, and return -ERANGE. 728 * 729 * If the integer overflows unsigned long long, set *@value to 730 * ULLONG_MAX, and return -ERANGE. 731 * 732 * Else, set *@value to the parsed integer, and return 0. 733 */ 734 int parse_uint(const char *s, unsigned long long *value, char **endptr, 735 int base) 736 { 737 int r = 0; 738 char *endp = (char *)s; 739 unsigned long long val = 0; 740 741 assert((unsigned) base <= 36 && base != 1); 742 if (!s) { 743 r = -EINVAL; 744 goto out; 745 } 746 747 errno = 0; 748 val = strtoull(s, &endp, base); 749 if (errno) { 750 r = -errno; 751 goto out; 752 } 753 754 if (endp == s) { 755 r = -EINVAL; 756 goto out; 757 } 758 759 /* make sure we reject negative numbers: */ 760 while (qemu_isspace(*s)) { 761 s++; 762 } 763 if (*s == '-') { 764 val = 0; 765 r = -ERANGE; 766 goto out; 767 } 768 769 out: 770 *value = val; 771 *endptr = endp; 772 return r; 773 } 774 775 /** 776 * parse_uint_full: 777 * 778 * @s: String to parse 779 * @value: Destination for parsed integer value 780 * @base: integer base, between 2 and 36 inclusive, or 0 781 * 782 * Parse unsigned integer from entire string 783 * 784 * Have the same behavior of parse_uint(), but with an additional check 785 * for additional data after the parsed number. If extra characters are present 786 * after the parsed number, the function will return -EINVAL, and *@v will 787 * be set to 0. 788 */ 789 int parse_uint_full(const char *s, unsigned long long *value, int base) 790 { 791 char *endp; 792 int r; 793 794 r = parse_uint(s, value, &endp, base); 795 if (r < 0) { 796 return r; 797 } 798 if (*endp) { 799 *value = 0; 800 return -EINVAL; 801 } 802 803 return 0; 804 } 805 806 int qemu_parse_fd(const char *param) 807 { 808 long fd; 809 char *endptr; 810 811 errno = 0; 812 fd = strtol(param, &endptr, 10); 813 if (param == endptr /* no conversion performed */ || 814 errno != 0 /* not representable as long; possibly others */ || 815 *endptr != '\0' /* final string not empty */ || 816 fd < 0 /* invalid as file descriptor */ || 817 fd > INT_MAX /* not representable as int */) { 818 return -1; 819 } 820 return fd; 821 } 822 823 /* 824 * Implementation of ULEB128 (http://en.wikipedia.org/wiki/LEB128) 825 * Input is limited to 14-bit numbers 826 */ 827 int uleb128_encode_small(uint8_t *out, uint32_t n) 828 { 829 g_assert(n <= 0x3fff); 830 if (n < 0x80) { 831 *out = n; 832 return 1; 833 } else { 834 *out++ = (n & 0x7f) | 0x80; 835 *out = n >> 7; 836 return 2; 837 } 838 } 839 840 int uleb128_decode_small(const uint8_t *in, uint32_t *n) 841 { 842 if (!(*in & 0x80)) { 843 *n = *in; 844 return 1; 845 } else { 846 *n = *in++ & 0x7f; 847 /* we exceed 14 bit number */ 848 if (*in & 0x80) { 849 return -1; 850 } 851 *n |= *in << 7; 852 return 2; 853 } 854 } 855 856 /* 857 * helper to parse debug environment variables 858 */ 859 int parse_debug_env(const char *name, int max, int initial) 860 { 861 char *debug_env = getenv(name); 862 char *inv = NULL; 863 long debug; 864 865 if (!debug_env) { 866 return initial; 867 } 868 errno = 0; 869 debug = strtol(debug_env, &inv, 10); 870 if (inv == debug_env) { 871 return initial; 872 } 873 if (debug < 0 || debug > max || errno != 0) { 874 warn_report("%s not in [0, %d]", name, max); 875 return initial; 876 } 877 return debug; 878 } 879 880 const char *si_prefix(unsigned int exp10) 881 { 882 static const char *prefixes[] = { 883 "a", "f", "p", "n", "u", "m", "", "K", "M", "G", "T", "P", "E" 884 }; 885 886 exp10 += 18; 887 assert(exp10 % 3 == 0 && exp10 / 3 < ARRAY_SIZE(prefixes)); 888 return prefixes[exp10 / 3]; 889 } 890 891 const char *iec_binary_prefix(unsigned int exp2) 892 { 893 static const char *prefixes[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei" }; 894 895 assert(exp2 % 10 == 0 && exp2 / 10 < ARRAY_SIZE(prefixes)); 896 return prefixes[exp2 / 10]; 897 } 898 899 /* 900 * Return human readable string for size @val. 901 * @val can be anything that uint64_t allows (no more than "16 EiB"). 902 * Use IEC binary units like KiB, MiB, and so forth. 903 * Caller is responsible for passing it to g_free(). 904 */ 905 char *size_to_str(uint64_t val) 906 { 907 uint64_t div; 908 int i; 909 910 /* 911 * The exponent (returned in i) minus one gives us 912 * floor(log2(val * 1024 / 1000). The correction makes us 913 * switch to the higher power when the integer part is >= 1000. 914 * (see e41b509d68afb1f for more info) 915 */ 916 frexp(val / (1000.0 / 1024.0), &i); 917 i = (i - 1) / 10 * 10; 918 div = 1ULL << i; 919 920 return g_strdup_printf("%0.3g %sB", (double)val / div, iec_binary_prefix(i)); 921 } 922 923 char *freq_to_str(uint64_t freq_hz) 924 { 925 double freq = freq_hz; 926 size_t exp10 = 0; 927 928 while (freq >= 1000.0) { 929 freq /= 1000.0; 930 exp10 += 3; 931 } 932 933 return g_strdup_printf("%0.3g %sHz", freq, si_prefix(exp10)); 934 } 935 936 int qemu_pstrcmp0(const char **str1, const char **str2) 937 { 938 return g_strcmp0(*str1, *str2); 939 } 940 941 static inline bool starts_with_prefix(const char *dir) 942 { 943 size_t prefix_len = strlen(CONFIG_PREFIX); 944 return !memcmp(dir, CONFIG_PREFIX, prefix_len) && 945 (!dir[prefix_len] || G_IS_DIR_SEPARATOR(dir[prefix_len])); 946 } 947 948 /* Return the next path component in dir, and store its length in *p_len. */ 949 static inline const char *next_component(const char *dir, int *p_len) 950 { 951 int len; 952 while ((*dir && G_IS_DIR_SEPARATOR(*dir)) || 953 (*dir == '.' && (G_IS_DIR_SEPARATOR(dir[1]) || dir[1] == '\0'))) { 954 dir++; 955 } 956 len = 0; 957 while (dir[len] && !G_IS_DIR_SEPARATOR(dir[len])) { 958 len++; 959 } 960 *p_len = len; 961 return dir; 962 } 963 964 static const char *exec_dir; 965 966 void qemu_init_exec_dir(const char *argv0) 967 { 968 #ifdef G_OS_WIN32 969 char *p; 970 char buf[MAX_PATH]; 971 DWORD len; 972 973 if (exec_dir) { 974 return; 975 } 976 977 len = GetModuleFileName(NULL, buf, sizeof(buf) - 1); 978 if (len == 0) { 979 return; 980 } 981 982 buf[len] = 0; 983 p = buf + len - 1; 984 while (p != buf && *p != '\\') { 985 p--; 986 } 987 *p = 0; 988 if (access(buf, R_OK) == 0) { 989 exec_dir = g_strdup(buf); 990 } else { 991 exec_dir = CONFIG_BINDIR; 992 } 993 #else 994 char *p = NULL; 995 char buf[PATH_MAX]; 996 997 if (exec_dir) { 998 return; 999 } 1000 1001 #if defined(__linux__) 1002 { 1003 int len; 1004 len = readlink("/proc/self/exe", buf, sizeof(buf) - 1); 1005 if (len > 0) { 1006 buf[len] = 0; 1007 p = buf; 1008 } 1009 } 1010 #elif defined(__FreeBSD__) \ 1011 || (defined(__NetBSD__) && defined(KERN_PROC_PATHNAME)) 1012 { 1013 #if defined(__FreeBSD__) 1014 static int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; 1015 #else 1016 static int mib[4] = {CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME}; 1017 #endif 1018 size_t len = sizeof(buf) - 1; 1019 1020 *buf = '\0'; 1021 if (!sysctl(mib, ARRAY_SIZE(mib), buf, &len, NULL, 0) && 1022 *buf) { 1023 buf[sizeof(buf) - 1] = '\0'; 1024 p = buf; 1025 } 1026 } 1027 #elif defined(__APPLE__) 1028 { 1029 char fpath[PATH_MAX]; 1030 uint32_t len = sizeof(fpath); 1031 if (_NSGetExecutablePath(fpath, &len) == 0) { 1032 p = realpath(fpath, buf); 1033 if (!p) { 1034 return; 1035 } 1036 } 1037 } 1038 #elif defined(__HAIKU__) 1039 { 1040 image_info ii; 1041 int32_t c = 0; 1042 1043 *buf = '\0'; 1044 while (get_next_image_info(0, &c, &ii) == B_OK) { 1045 if (ii.type == B_APP_IMAGE) { 1046 strncpy(buf, ii.name, sizeof(buf)); 1047 buf[sizeof(buf) - 1] = 0; 1048 p = buf; 1049 break; 1050 } 1051 } 1052 } 1053 #endif 1054 /* If we don't have any way of figuring out the actual executable 1055 location then try argv[0]. */ 1056 if (!p && argv0) { 1057 p = realpath(argv0, buf); 1058 } 1059 if (p) { 1060 exec_dir = g_path_get_dirname(p); 1061 } else { 1062 exec_dir = CONFIG_BINDIR; 1063 } 1064 #endif 1065 } 1066 1067 const char *qemu_get_exec_dir(void) 1068 { 1069 return exec_dir; 1070 } 1071 1072 char *get_relocated_path(const char *dir) 1073 { 1074 size_t prefix_len = strlen(CONFIG_PREFIX); 1075 const char *bindir = CONFIG_BINDIR; 1076 const char *exec_dir = qemu_get_exec_dir(); 1077 GString *result; 1078 int len_dir, len_bindir; 1079 1080 /* Fail if qemu_init_exec_dir was not called. */ 1081 assert(exec_dir[0]); 1082 1083 result = g_string_new(exec_dir); 1084 g_string_append(result, "/qemu-bundle"); 1085 if (access(result->str, R_OK) == 0) { 1086 #ifdef G_OS_WIN32 1087 size_t size = mbsrtowcs(NULL, &dir, 0, &(mbstate_t){0}) + 1; 1088 PWSTR wdir = g_new(WCHAR, size); 1089 mbsrtowcs(wdir, &dir, size, &(mbstate_t){0}); 1090 1091 PCWSTR wdir_skipped_root; 1092 PathCchSkipRoot(wdir, &wdir_skipped_root); 1093 1094 size = wcsrtombs(NULL, &wdir_skipped_root, 0, &(mbstate_t){0}); 1095 char *cursor = result->str + result->len; 1096 g_string_set_size(result, result->len + size); 1097 wcsrtombs(cursor, &wdir_skipped_root, size + 1, &(mbstate_t){0}); 1098 g_free(wdir); 1099 #else 1100 g_string_append(result, dir); 1101 #endif 1102 } else if (!starts_with_prefix(dir) || !starts_with_prefix(bindir)) { 1103 g_string_assign(result, dir); 1104 } else { 1105 g_string_assign(result, exec_dir); 1106 1107 /* Advance over common components. */ 1108 len_dir = len_bindir = prefix_len; 1109 do { 1110 dir += len_dir; 1111 bindir += len_bindir; 1112 dir = next_component(dir, &len_dir); 1113 bindir = next_component(bindir, &len_bindir); 1114 } while (len_dir && len_dir == len_bindir && !memcmp(dir, bindir, len_dir)); 1115 1116 /* Ascend from bindir to the common prefix with dir. */ 1117 while (len_bindir) { 1118 bindir += len_bindir; 1119 g_string_append(result, "/.."); 1120 bindir = next_component(bindir, &len_bindir); 1121 } 1122 1123 if (*dir) { 1124 assert(G_IS_DIR_SEPARATOR(dir[-1])); 1125 g_string_append(result, dir - 1); 1126 } 1127 } 1128 1129 return g_string_free(result, false); 1130 } 1131