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