X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=common.c;h=3d69dd0b4a5ab45384fa4f86f76147f3445a3b0e;hb=cac545f64e6f5863b430f5b94442b777aa7f1165;hp=5b938dd5b26570b9731526f74e266a412a2a4519;hpb=a85769a88b81f22aa43895199cbb01a12e0ab0a7;p=pciutils.git diff --git a/common.c b/common.c index 5b938dd..3d69dd0 100644 --- a/common.c +++ b/common.c @@ -1,7 +1,7 @@ /* - * Linux PCI Utilities -- Common Functions + * The PCI Utilities -- Common Functions * - * Copyright (c) 1997--1999 Martin Mares + * Copyright (c) 1997--2016 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -10,66 +10,123 @@ #include #include #include -#include #include "pciutils.h" -void __attribute__((noreturn)) +void NONRET die(char *msg, ...) { va_list args; va_start(args, msg); - fputs("lspci: ", stderr); + fprintf(stderr, "%s: ", program_name); vfprintf(stderr, msg, args); fputc('\n', stderr); exit(1); } void * -xmalloc(unsigned int howmuch) +xmalloc(size_t howmuch) { void *p = malloc(howmuch); if (!p) - die("Unable to allocate %d bytes of memory", howmuch); + die("Unable to allocate %d bytes of memory", (int) howmuch); return p; } +void * +xrealloc(void *ptr, size_t howmuch) +{ + void *p = realloc(ptr, howmuch); + if (!p) + die("Unable to allocate %d bytes of memory", (int) howmuch); + return p; +} + +char * +xstrdup(const char *str) +{ + int len = strlen(str) + 1; + char *copy = xmalloc(len); + memcpy(copy, str, len); + return copy; +} + +static void +set_pci_method(struct pci_access *pacc, char *arg) +{ + char *name; + int i; + + if (!strcmp(arg, "help")) + { + printf("Known PCI access methods:\n\n"); + for (i=0; name = pci_get_method_name(i); i++) + if (name[0]) + printf("%s\n", name); + exit(0); + } + else + { + i = pci_lookup_method(arg); + if (i < 0) + die("No such PCI access method: %s (see `-A help' for a list)", arg); + pacc->method = i; + } +} + +static void +set_pci_option(struct pci_access *pacc, char *arg) +{ + if (!strcmp(arg, "help")) + { + struct pci_param *p; + printf("Known PCI access parameters:\n\n"); + for (p=NULL; p=pci_walk_params(pacc, p);) + printf("%-20s %s (%s)\n", p->param, p->help, p->value); + exit(0); + } + else + { + char *sep = strchr(arg, '='); + if (!sep) + die("Invalid PCI access parameter syntax: %s", arg); + *sep++ = 0; + if (pci_set_param(pacc, arg, sep) < 0) + die("Unrecognized PCI access parameter: %s (see `-O help' for a list)", arg); + } +} + int -parse_generic_option(int i, struct pci_access *pacc, char *optarg) +parse_generic_option(int i, struct pci_access *pacc, char *arg) { switch (i) { -#ifdef HAVE_PM_LINUX_PROC - case 'P': - pacc->method_params[PCI_ACCESS_PROC_BUS_PCI] = optarg; - pacc->method = PCI_ACCESS_PROC_BUS_PCI; - break; -#endif -#ifdef HAVE_PM_INTEL_CONF +#ifdef PCI_HAVE_PM_INTEL_CONF case 'H': - if (!strcmp(optarg, "1")) + if (!strcmp(arg, "1")) pacc->method = PCI_ACCESS_I386_TYPE1; - else if (!strcmp(optarg, "2")) + else if (!strcmp(arg, "2")) pacc->method = PCI_ACCESS_I386_TYPE2; else - die("Unknown hardware configuration type %s", optarg); + die("Unknown hardware configuration type %s", arg); break; #endif -#ifdef HAVE_PM_SYSCALLS - case 'S': - pacc->method = PCI_ACCESS_SYSCALLS; - break; -#endif -#ifdef HAVE_PM_DUMP +#ifdef PCI_HAVE_PM_DUMP case 'F': - pacc->method_params[PCI_ACCESS_DUMP] = optarg; + pci_set_param(pacc, "dump.name", arg); pacc->method = PCI_ACCESS_DUMP; break; #endif + case 'A': + set_pci_method(pacc, arg); + break; case 'G': pacc->debugging++; break; + case 'O': + set_pci_option(pacc, arg); + break; default: return 0; }