File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pciutils / common.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:18:42 2012 UTC (12 years, 3 months ago) by misho
Branches: pciutils, MAIN
CVS tags: v3_1_9, HEAD
pciutils

    1: /*
    2:  *	The PCI Utilities -- Common Functions
    3:  *
    4:  *	Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
    5:  *
    6:  *	Can be freely distributed and used under the terms of the GNU GPL.
    7:  */
    8: 
    9: #include <stdio.h>
   10: #include <string.h>
   11: #include <stdlib.h>
   12: #include <stdarg.h>
   13: #include <unistd.h>
   14: 
   15: #include "pciutils.h"
   16: 
   17: void NONRET
   18: die(char *msg, ...)
   19: {
   20:   va_list args;
   21: 
   22:   va_start(args, msg);
   23:   fprintf(stderr, "%s: ", program_name);
   24:   vfprintf(stderr, msg, args);
   25:   fputc('\n', stderr);
   26:   exit(1);
   27: }
   28: 
   29: void *
   30: xmalloc(unsigned int howmuch)
   31: {
   32:   void *p = malloc(howmuch);
   33:   if (!p)
   34:     die("Unable to allocate %d bytes of memory", howmuch);
   35:   return p;
   36: }
   37: 
   38: void *
   39: xrealloc(void *ptr, unsigned int howmuch)
   40: {
   41:   void *p = realloc(ptr, howmuch);
   42:   if (!p)
   43:     die("Unable to allocate %d bytes of memory", howmuch);
   44:   return p;
   45: }
   46: 
   47: char *
   48: xstrdup(char *str)
   49: {
   50:   int len = strlen(str) + 1;
   51:   char *copy = xmalloc(len);
   52:   memcpy(copy, str, len);
   53:   return copy;
   54: }
   55: 
   56: static void
   57: set_pci_method(struct pci_access *pacc, char *arg)
   58: {
   59:   char *name;
   60:   int i;
   61: 
   62:   if (!strcmp(arg, "help"))
   63:     {
   64:       printf("Known PCI access methods:\n\n");
   65:       for (i=0; name = pci_get_method_name(i); i++)
   66: 	if (name[0])
   67: 	  printf("%s\n", name);
   68:       exit(0);
   69:     }
   70:   else
   71:     {
   72:       i = pci_lookup_method(arg);
   73:       if (i < 0)
   74: 	die("No such PCI access method: %s (see `-A help' for a list)", arg);
   75:       pacc->method = i;
   76:     }
   77: }
   78: 
   79: static void
   80: set_pci_option(struct pci_access *pacc, char *arg)
   81: {
   82:   if (!strcmp(arg, "help"))
   83:     {
   84:       struct pci_param *p;
   85:       printf("Known PCI access parameters:\n\n");
   86:       for (p=NULL; p=pci_walk_params(pacc, p);)
   87: 	printf("%-20s %s (%s)\n", p->param, p->help, p->value);
   88:       exit(0);
   89:     }
   90:   else
   91:     {
   92:       char *sep = strchr(arg, '=');
   93:       if (!sep)
   94: 	die("Invalid PCI access parameter syntax: %s", arg);
   95:       *sep++ = 0;
   96:       if (pci_set_param(pacc, arg, sep) < 0)
   97: 	die("Unrecognized PCI access parameter: %s (see `-O help' for a list)", arg);
   98:     }
   99: }
  100: 
  101: int
  102: parse_generic_option(int i, struct pci_access *pacc, char *optarg)
  103: {
  104:   switch (i)
  105:     {
  106: #ifdef PCI_HAVE_PM_INTEL_CONF
  107:     case 'H':
  108:       if (!strcmp(optarg, "1"))
  109: 	pacc->method = PCI_ACCESS_I386_TYPE1;
  110:       else if (!strcmp(optarg, "2"))
  111: 	pacc->method = PCI_ACCESS_I386_TYPE2;
  112:       else
  113: 	die("Unknown hardware configuration type %s", optarg);
  114:       break;
  115: #endif
  116: #ifdef PCI_HAVE_PM_DUMP
  117:     case 'F':
  118:       pci_set_param(pacc, "dump.name", optarg);
  119:       pacc->method = PCI_ACCESS_DUMP;
  120:       break;
  121: #endif
  122:     case 'A':
  123:       set_pci_method(pacc, optarg);
  124:       break;
  125:     case 'G':
  126:       pacc->debugging++;
  127:       break;
  128:     case 'O':
  129:       set_pci_option(pacc, optarg);
  130:       break;
  131:     default:
  132:       return 0;
  133:     }
  134:   return 1;
  135: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>