xref: /aosp_15_r20/external/pciutils/lib/params.c (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker  *	The PCI Library -- Parameters
3*c2e0c6b5SAndroid Build Coastguard Worker  *
4*c2e0c6b5SAndroid Build Coastguard Worker  *	Copyright (c) 2008--2023 Martin Mares <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker  *
6*c2e0c6b5SAndroid Build Coastguard Worker  *	Can be freely distributed and used under the terms of the GNU GPL v2+.
7*c2e0c6b5SAndroid Build Coastguard Worker  *
8*c2e0c6b5SAndroid Build Coastguard Worker  *	SPDX-License-Identifier: GPL-2.0-or-later
9*c2e0c6b5SAndroid Build Coastguard Worker  */
10*c2e0c6b5SAndroid Build Coastguard Worker 
11*c2e0c6b5SAndroid Build Coastguard Worker #include <stdio.h>
12*c2e0c6b5SAndroid Build Coastguard Worker #include <stdlib.h>
13*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
14*c2e0c6b5SAndroid Build Coastguard Worker 
15*c2e0c6b5SAndroid Build Coastguard Worker #include "internal.h"
16*c2e0c6b5SAndroid Build Coastguard Worker 
17*c2e0c6b5SAndroid Build Coastguard Worker char *
pci_get_param(struct pci_access * acc,char * param)18*c2e0c6b5SAndroid Build Coastguard Worker pci_get_param(struct pci_access *acc, char *param)
19*c2e0c6b5SAndroid Build Coastguard Worker {
20*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_param *p;
21*c2e0c6b5SAndroid Build Coastguard Worker 
22*c2e0c6b5SAndroid Build Coastguard Worker   for (p=acc->params; p; p=p->next)
23*c2e0c6b5SAndroid Build Coastguard Worker     if (!strcmp(p->param, param))
24*c2e0c6b5SAndroid Build Coastguard Worker       return p->value;
25*c2e0c6b5SAndroid Build Coastguard Worker   return NULL;
26*c2e0c6b5SAndroid Build Coastguard Worker }
27*c2e0c6b5SAndroid Build Coastguard Worker 
28*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *
pci_define_param(struct pci_access * acc,char * param,char * value,char * help)29*c2e0c6b5SAndroid Build Coastguard Worker pci_define_param(struct pci_access *acc, char *param, char *value, char *help)
30*c2e0c6b5SAndroid Build Coastguard Worker {
31*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_param *p, **pp;
32*c2e0c6b5SAndroid Build Coastguard Worker 
33*c2e0c6b5SAndroid Build Coastguard Worker   for (pp=&acc->params; p = *pp; pp=&p->next)
34*c2e0c6b5SAndroid Build Coastguard Worker     {
35*c2e0c6b5SAndroid Build Coastguard Worker       int cmp = strcmp(p->param, param);
36*c2e0c6b5SAndroid Build Coastguard Worker       if (!cmp)
37*c2e0c6b5SAndroid Build Coastguard Worker 	{
38*c2e0c6b5SAndroid Build Coastguard Worker 	  if (strcmp(p->value, value) || strcmp(p->help, help))
39*c2e0c6b5SAndroid Build Coastguard Worker 	    acc->error("Parameter %s re-defined differently", param);
40*c2e0c6b5SAndroid Build Coastguard Worker 	  return p;
41*c2e0c6b5SAndroid Build Coastguard Worker 	}
42*c2e0c6b5SAndroid Build Coastguard Worker       if (cmp > 0)
43*c2e0c6b5SAndroid Build Coastguard Worker 	break;
44*c2e0c6b5SAndroid Build Coastguard Worker     }
45*c2e0c6b5SAndroid Build Coastguard Worker 
46*c2e0c6b5SAndroid Build Coastguard Worker   p = pci_malloc(acc, sizeof(*p));
47*c2e0c6b5SAndroid Build Coastguard Worker   p->next = *pp;
48*c2e0c6b5SAndroid Build Coastguard Worker   *pp = p;
49*c2e0c6b5SAndroid Build Coastguard Worker   p->param = param;
50*c2e0c6b5SAndroid Build Coastguard Worker   p->value = value;
51*c2e0c6b5SAndroid Build Coastguard Worker   p->value_malloced = 0;
52*c2e0c6b5SAndroid Build Coastguard Worker   p->help = help;
53*c2e0c6b5SAndroid Build Coastguard Worker   return p;
54*c2e0c6b5SAndroid Build Coastguard Worker }
55*c2e0c6b5SAndroid Build Coastguard Worker 
56*c2e0c6b5SAndroid Build Coastguard Worker int
pci_set_param_internal(struct pci_access * acc,char * param,char * value,int copy)57*c2e0c6b5SAndroid Build Coastguard Worker pci_set_param_internal(struct pci_access *acc, char *param, char *value, int copy)
58*c2e0c6b5SAndroid Build Coastguard Worker {
59*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_param *p;
60*c2e0c6b5SAndroid Build Coastguard Worker 
61*c2e0c6b5SAndroid Build Coastguard Worker   for (p=acc->params; p; p=p->next)
62*c2e0c6b5SAndroid Build Coastguard Worker     if (!strcmp(p->param, param))
63*c2e0c6b5SAndroid Build Coastguard Worker       {
64*c2e0c6b5SAndroid Build Coastguard Worker 	if (p->value_malloced)
65*c2e0c6b5SAndroid Build Coastguard Worker 	  pci_mfree(p->value);
66*c2e0c6b5SAndroid Build Coastguard Worker 	p->value_malloced = copy;
67*c2e0c6b5SAndroid Build Coastguard Worker 	if (copy)
68*c2e0c6b5SAndroid Build Coastguard Worker 	  p->value = pci_strdup(acc, value);
69*c2e0c6b5SAndroid Build Coastguard Worker 	else
70*c2e0c6b5SAndroid Build Coastguard Worker 	  p->value = value;
71*c2e0c6b5SAndroid Build Coastguard Worker 	return 0;
72*c2e0c6b5SAndroid Build Coastguard Worker       }
73*c2e0c6b5SAndroid Build Coastguard Worker   return -1;
74*c2e0c6b5SAndroid Build Coastguard Worker }
75*c2e0c6b5SAndroid Build Coastguard Worker 
76*c2e0c6b5SAndroid Build Coastguard Worker int
pci_set_param(struct pci_access * acc,char * param,char * value)77*c2e0c6b5SAndroid Build Coastguard Worker pci_set_param(struct pci_access *acc, char *param, char *value)
78*c2e0c6b5SAndroid Build Coastguard Worker {
79*c2e0c6b5SAndroid Build Coastguard Worker   return pci_set_param_internal(acc, param, value, 1);
80*c2e0c6b5SAndroid Build Coastguard Worker }
81*c2e0c6b5SAndroid Build Coastguard Worker 
82*c2e0c6b5SAndroid Build Coastguard Worker void
pci_free_params(struct pci_access * acc)83*c2e0c6b5SAndroid Build Coastguard Worker pci_free_params(struct pci_access *acc)
84*c2e0c6b5SAndroid Build Coastguard Worker {
85*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_param *p;
86*c2e0c6b5SAndroid Build Coastguard Worker 
87*c2e0c6b5SAndroid Build Coastguard Worker   while (p = acc->params)
88*c2e0c6b5SAndroid Build Coastguard Worker     {
89*c2e0c6b5SAndroid Build Coastguard Worker       acc->params = p->next;
90*c2e0c6b5SAndroid Build Coastguard Worker       if (p->value_malloced)
91*c2e0c6b5SAndroid Build Coastguard Worker 	pci_mfree(p->value);
92*c2e0c6b5SAndroid Build Coastguard Worker       pci_mfree(p);
93*c2e0c6b5SAndroid Build Coastguard Worker     }
94*c2e0c6b5SAndroid Build Coastguard Worker }
95*c2e0c6b5SAndroid Build Coastguard Worker 
96*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *
pci_walk_params(struct pci_access * acc,struct pci_param * prev)97*c2e0c6b5SAndroid Build Coastguard Worker pci_walk_params(struct pci_access *acc, struct pci_param *prev)
98*c2e0c6b5SAndroid Build Coastguard Worker {
99*c2e0c6b5SAndroid Build Coastguard Worker   /* So far, the params form a simple linked list, but this can change in the future */
100*c2e0c6b5SAndroid Build Coastguard Worker   if (!prev)
101*c2e0c6b5SAndroid Build Coastguard Worker     return acc->params;
102*c2e0c6b5SAndroid Build Coastguard Worker   else
103*c2e0c6b5SAndroid Build Coastguard Worker     return prev->next;
104*c2e0c6b5SAndroid Build Coastguard Worker }
105