misc.c
上传用户:hxtd_72
上传日期:2007-06-06
资源大小:64k
文件大小:3k
源码类别:

驱动编程

开发平台:

C/C++

  1. /*
  2.     misc.c.
  3.     Miscellaneous routines for ksymoops.
  4.     Copyright 1999 Keith Owens <kaos@ocs.com.au>.
  5.     Released under the GNU Public Licence, Version 2.
  6.  */
  7. #include "ksymoops.h"
  8. #include <errno.h>
  9. #include <limits.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <unistd.h>
  13. void malloc_error(const char *msg)
  14. {
  15.     static char const procname[] = "malloc_error";
  16.     FATAL("for %s", msg);
  17. }
  18. /* Format an address with the correct number of leading zeroes */
  19. const char *format_address(addr_t address, const OPTIONS *options)
  20. {
  21.     /* Well oversized */
  22.     static char text[200];
  23.     snprintf(text, sizeof(text), "%0*llx",
  24. options && options->address_bits ? options->address_bits/4
  25. : address > 0xffffffff ? 16 : 8,
  26. address);
  27.     return(text);
  28. }
  29. /* Find the full pathname of a program.  Code heavily based on
  30.  * glibc-2.0.5/posix/execvp.c.
  31.  */
  32. char *find_fullpath(const char *program)
  33. {
  34.     char *fullpath = NULL;
  35.     char *path, *p;
  36.     size_t len;
  37.     static const char procname[] = "find_fullpath";
  38.     /* Don't search when it contains a slash.  */
  39.     if (strchr(program, '/')) {
  40. if (!(fullpath = strdup(program)))
  41.     malloc_error(procname);
  42. DEBUG(2, "%s", fullpath);
  43. return(fullpath);
  44.     }
  45.     path = getenv ("PATH");
  46.     if (!path) {
  47. /* There is no `PATH' in the environment.  The default search
  48.    path is the current directory followed by the path `confstr'
  49.    returns for `_CS_PATH'.
  50.  */
  51. len = confstr(_CS_PATH, (char *) NULL, 0);
  52. if (!(path = malloc(1 + len)))
  53.     malloc_error(procname);
  54. path[0] = ':';
  55. confstr(_CS_PATH, path+1, len);
  56.     }
  57.     len = strlen(program) + 1;
  58.     if (!(fullpath = malloc(strlen(path) + len)))
  59. malloc_error(procname);
  60.     p = path;
  61.     do {
  62. path = p;
  63. p = strchr(path, ':');
  64. if (p == NULL)
  65.     p = strchr(path, '');
  66. /* Two adjacent colons, or a colon at the beginning or the end
  67.  * of `PATH' means to search the current directory.
  68.  */
  69. if (p == path)
  70.     memcpy(fullpath, program, len);
  71. else {
  72.     /* Construct the pathname to try.  */
  73.     memcpy(fullpath, path, p - path);
  74.     fullpath[p - path] = '/';
  75.     memcpy(&fullpath[(p - path) + 1], program, len);
  76. }
  77. /* If we have execute access, assume this is the program. */
  78. if (access(fullpath, X_OK) == 0) {
  79.     DEBUG(2, "%s", fullpath);
  80.     return(fullpath);
  81. }
  82.     } while (*p++ != '');
  83.     FATAL("could not find executable %s", program);
  84. }
  85. /* Convert a hex string to a number.  Addresses can be 64 bit, not all libraries
  86.  * have strtoull so roll my own.  I assume that hex is a valid hex string, the
  87.  * regular expression parsing takes care of that.
  88.  */
  89. U64 hexstring(const char *hex)
  90. {
  91.     addr_t address = 0;
  92.     char chunk[9];
  93.     int len;
  94.     /* Unlike the IMHO broken strtoul[l], clear errno here instead of forcing
  95.      * the user to do it.
  96.      */
  97.     errno = 0;
  98.     while (*hex == '0')
  99. ++hex;
  100.     len = strlen(hex);
  101.     if (len > 2*sizeof(addr_t)) {
  102. errno = ERANGE;
  103. return(ULONG_MAX);
  104.     }
  105.     while (len > 0) {
  106. strncpy(chunk, hex, len > 8 ? 8 : len+1);
  107. chunk[8] = '';
  108. address = (address << strlen(chunk)*4) + strtoul(chunk, NULL, 16);
  109. len -= 8;
  110. hex += 8;
  111.     }
  112.     return(address);
  113. }